This commit is contained in:
parent
756d7fdaa1
commit
c3ef8d881e
|
@ -1,8 +1,8 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "iconfont"; /* Project id 4723712 */
|
font-family: "iconfont"; /* Project id 4723712 */
|
||||||
src: url('iconfont.woff2?t=1730884302716') format('woff2'),
|
src: url('iconfont.woff2?t=1731315402630') format('woff2'),
|
||||||
url('iconfont.woff?t=1730884302716') format('woff'),
|
url('iconfont.woff?t=1731315402630') format('woff'),
|
||||||
url('iconfont.ttf?t=1730884302716') format('truetype');
|
url('iconfont.ttf?t=1731315402630') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
|
@ -13,6 +13,22 @@
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-ai1:before {
|
||||||
|
content: "\e70a";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-duihua:before {
|
||||||
|
content: "\e60d";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-bianji1:before {
|
||||||
|
content: "\e678";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-a-ziyuan91:before {
|
||||||
|
content: "\e611";
|
||||||
|
}
|
||||||
|
|
||||||
.icon-ai:before {
|
.icon-ai:before {
|
||||||
content: "\e626";
|
content: "\e626";
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,34 @@
|
||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "",
|
"description": "",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "41844021",
|
||||||
|
"name": "ai",
|
||||||
|
"font_class": "ai1",
|
||||||
|
"unicode": "e70a",
|
||||||
|
"unicode_decimal": 59146
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "2286510",
|
||||||
|
"name": "对话",
|
||||||
|
"font_class": "duihua",
|
||||||
|
"unicode": "e60d",
|
||||||
|
"unicode_decimal": 58893
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "4093249",
|
||||||
|
"name": "编辑",
|
||||||
|
"font_class": "bianji1",
|
||||||
|
"unicode": "e678",
|
||||||
|
"unicode_decimal": 59000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39732311",
|
||||||
|
"name": "AI分析",
|
||||||
|
"font_class": "a-ziyuan91",
|
||||||
|
"unicode": "e611",
|
||||||
|
"unicode_decimal": 58897
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "41784801",
|
"icon_id": "41784801",
|
||||||
"name": "ai",
|
"name": "ai",
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,135 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog v-model="isDialog" :show-close="false" width="900">
|
||||||
|
<template #header>
|
||||||
|
<div class="custom-header flex">
|
||||||
|
<span>选择{{ title }}</span>
|
||||||
|
<i class="iconfont icon-guanbi" @click="isDialog = false"></i>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="dialog-content">
|
||||||
|
<div class="flex">
|
||||||
|
<el-radio-group v-model="radio" @change="changeRadio">
|
||||||
|
<el-radio :value="item.value" v-for="item in radioList">{{ item.label }}</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
<div class="content-list">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(item, index) in list" :class="activeIndex == index ? 'li-active' : ''" @click="clickItem(index)">
|
||||||
|
<el-image class="img" :src="item.url" />
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button @click="isDialog = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="isDialog = false">
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed } from 'vue'
|
||||||
|
|
||||||
|
const url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2F11044b08-04c1-41a0-a453-1fd20b58a614%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1732953359&t=7ab1d1b3a903db85b1149914407aea35'
|
||||||
|
|
||||||
|
const isDialog = defineModel()
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
model: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const title = computed(() => {
|
||||||
|
if (props.model == 1) return '课标';
|
||||||
|
if (props.model == 2) return '教材';
|
||||||
|
if (props.model == 3) return '考试';
|
||||||
|
})
|
||||||
|
|
||||||
|
const radio = ref(1)
|
||||||
|
const radioList = ref([
|
||||||
|
{ label: '浏览研读', value: 1 },
|
||||||
|
{ label: '跨学科研读', value: 2 },
|
||||||
|
{ label: '跨学段研读', value: 3 },
|
||||||
|
{ label: '课标修订研读', value: 4 },
|
||||||
|
{ label: '自由研读', value: 5 },
|
||||||
|
])
|
||||||
|
const list = ref([
|
||||||
|
{
|
||||||
|
name: '高中语文课程标准',
|
||||||
|
url
|
||||||
|
}
|
||||||
|
])
|
||||||
|
const changeRadio = () => {
|
||||||
|
list.value = []
|
||||||
|
for (let i = 0; i < Math.floor(Math.random() * 5) + 1; i++) {
|
||||||
|
list.value.push({
|
||||||
|
name: '高中语文课程标准',
|
||||||
|
url
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const activeIndex = ref(-1)
|
||||||
|
|
||||||
|
const clickItem = (index) => {
|
||||||
|
activeIndex.value = index
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.custom-header {
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.icon-guanbi {
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-content {
|
||||||
|
padding-top: 10px;
|
||||||
|
.content-list {
|
||||||
|
padding-top: 10px;
|
||||||
|
ul {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.img {
|
||||||
|
width: 100px;
|
||||||
|
height: 130px;
|
||||||
|
border: solid #ccc 1px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #E0EAFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.li-active {
|
||||||
|
background: #E0EAFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,20 +1,97 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="container-header flex">
|
<div class="container-header flex">
|
||||||
<div class="header-left flex">
|
<div class="header-left flex">
|
||||||
<el-button link>
|
<el-button link @click="showDialog = true">
|
||||||
高中语文课程标准<i class="iconfont icon-xiangxia"></i>
|
高中语文课程标准<i class="iconfont icon-xiangxia"></i>
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="header-right flex">
|
<div class="header-right flex">
|
||||||
<el-button link>
|
<el-dropdown @command="changeTemplate" :hide-on-click="false">
|
||||||
课标研读模板一<i class="iconfont icon-xiangxia"></i>
|
<span class="el-dropdown-link">
|
||||||
</el-button>
|
{{ curTemplate.name }}
|
||||||
|
<i class="iconfont icon-xiangxia" </i>
|
||||||
|
</span>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu>
|
||||||
|
<el-dropdown-item v-for="item in templateList" :command="item" :key="item.id">{{ item.name
|
||||||
|
}}</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
<div>
|
||||||
|
<el-button type="primary" link>
|
||||||
|
<el-icon>
|
||||||
|
<Plus />
|
||||||
|
</el-icon>
|
||||||
|
添加提示词
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" link>保存模板</el-button>
|
||||||
|
<el-button type="primary" @click="aiRead">一键研读</el-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<Dialog v-model="showDialog" :model="model" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
|
import { Plus } from '@element-plus/icons-vue'
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
import { modelList } from '@/api/mode/index'
|
||||||
|
import Dialog from './dialog.vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
model: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const emit = defineEmits(['changeTemp', 'onRead'])
|
||||||
|
|
||||||
|
const showDialog = ref(false)
|
||||||
|
|
||||||
|
const aiRead = () => {
|
||||||
|
emit('onRead')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 当前模板名称
|
||||||
|
const curTemplate = reactive({ name: '', id: '' })
|
||||||
|
// 模板列表
|
||||||
|
const templateList = ref([])
|
||||||
|
// 获取模板列表
|
||||||
|
const getTemplateList = () => {
|
||||||
|
modelList({ model: 1, type: 1 }).then(res => {
|
||||||
|
templateList.value = res.rows
|
||||||
|
Object.assign(curTemplate, res.rows[0]);
|
||||||
|
emit('changeTemp', res.rows[0].id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 模板切换
|
||||||
|
const changeTemplate = (val) => {
|
||||||
|
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
'切换模板将清除当前研读结果?',
|
||||||
|
'提示',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
Object.assign(curTemplate, val);
|
||||||
|
emit('changeTemp', curTemplate.id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getTemplateList()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -29,11 +106,19 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-right {
|
||||||
|
width: 50%;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.icon-xiangxia {
|
.icon-xiangxia {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<template>
|
||||||
|
<div class="container-pdf">
|
||||||
|
<PDF :url="pdfUrl" :showCatalog="false" v-if="pdfUrl" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, onMounted, nextTick } from 'vue';
|
||||||
|
import PDF from '@/components/PdfJs/index.vue'
|
||||||
|
import { sessionStore } from '@/utils/store'
|
||||||
|
|
||||||
|
const pdfUrl = ref('')
|
||||||
|
|
||||||
|
onMounted(async () =>{
|
||||||
|
await nextTick()
|
||||||
|
const { fileurl } = sessionStore.get('subject.curBook')
|
||||||
|
pdfUrl.value = import.meta.env.VITE_APP_RES_FILE_PATH + fileurl.replace('.txt','.pdf')
|
||||||
|
console.log('pdfUrl.value', pdfUrl.value)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.container-pdf{
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,356 @@
|
||||||
|
<template>
|
||||||
|
<div class="read-container">
|
||||||
|
|
||||||
|
<el-scrollbar height="100%">
|
||||||
|
<div class="template-list">
|
||||||
|
<el-row v-for="item in childTempList">
|
||||||
|
<el-col :span="24">
|
||||||
|
<div class="template-item" v-loading="item.loading">
|
||||||
|
<div class="item-header"><span class="blue">#</span>{{ item.name }}</div>
|
||||||
|
<div class="item-text">
|
||||||
|
{{ item.prompt }}
|
||||||
|
</div>
|
||||||
|
<div class="item-text text-answer" v-if="item.answer">
|
||||||
|
<div class="item-icon">
|
||||||
|
<i class="iconfont icon-ai"></i>
|
||||||
|
</div>
|
||||||
|
<div class="item-answer" v-html="item.answer"></div>
|
||||||
|
</div>
|
||||||
|
<div class="ai-btn" v-if="item.answer">
|
||||||
|
<el-button type="primary" link>
|
||||||
|
<i class="iconfont icon-ai1"></i>
|
||||||
|
重新研读
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" link>
|
||||||
|
<i class="iconfont icon-duihua"></i>
|
||||||
|
AI对话调整
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" link>
|
||||||
|
<i class="iconfont icon-bianji1"></i>
|
||||||
|
手动编辑结果
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</el-scrollbar>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, reactive, onMounted, watch } from 'vue';
|
||||||
|
import { sessionStore } from '@/utils/store'
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
|
import { conversation, completion } from '@/api/mode/index'
|
||||||
|
import { modelList } from '@/api/mode/index'
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
curTemp: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tempId: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 获取子模板
|
||||||
|
const tempLoading = ref(false)
|
||||||
|
const childTempList = ref([])
|
||||||
|
const getChildTemplate = () => {
|
||||||
|
tempLoading.value = true
|
||||||
|
modelList({ model: props.model, type: 2, parentId: props.tempId }).then(res => {
|
||||||
|
childTempList.value = res.rows
|
||||||
|
console.log('res.rows=====>', res.rows)
|
||||||
|
|
||||||
|
}).finally(() => {
|
||||||
|
tempLoading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(() => props.tempId, (newVal) => {
|
||||||
|
if (newVal) {
|
||||||
|
getChildTemplate()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
// 获取会话ID
|
||||||
|
const params = reactive(
|
||||||
|
{
|
||||||
|
"conversation_id": "",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"quote": false,
|
||||||
|
"stream": false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
const isAiDeal = ref(false)
|
||||||
|
const curNode = reactive({})
|
||||||
|
const getConversation = async () => {
|
||||||
|
|
||||||
|
const { user: { userId } } = userStore
|
||||||
|
const result = await conversation({ user_id: String(userId) })
|
||||||
|
params.conversation_id = result.data.data.id
|
||||||
|
|
||||||
|
|
||||||
|
getCompletion()
|
||||||
|
}
|
||||||
|
// 大模型对话
|
||||||
|
const resultList = ref([])
|
||||||
|
const getCompletion = async () => {
|
||||||
|
console.log('params=====>', params)
|
||||||
|
|
||||||
|
for (let item of childTempList.value) {
|
||||||
|
try {
|
||||||
|
item.loading = true
|
||||||
|
params.messages[0].content = `根据${curNode.edustage}语文课标,提炼出${item.name}`
|
||||||
|
const res = await completion(params)
|
||||||
|
console.log('对话结果===》', res)
|
||||||
|
let answer = res.data.data.answer
|
||||||
|
item.answer = getResult(answer);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
item.loading = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 分析获取课标对话结果
|
||||||
|
let getResult = (text) => {
|
||||||
|
text = text.replace(/^\n\n(.*?)\n\n$/s, '<div>$1</div>');
|
||||||
|
text = text.replace(/^\n(.*?)\n$/s, '<p>$1</p>');
|
||||||
|
text = text.replace(/\*\*(.*?)\*\*/g, "<div class='text-tit'>$1</div>");
|
||||||
|
text = text.replace(/(\d+\..*?)\n/g, "<div class='text-num'>$1</div>\n");
|
||||||
|
return text
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
let data = sessionStore.get('subject.curNode')
|
||||||
|
Object.assign(curNode, data);
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
getConversation
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.read-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 100%;
|
||||||
|
padding: 15px 0;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.el-scrollbar {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dropdown-link {
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
.el-icon--right {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.read-header {
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.add-btn {
|
||||||
|
font-size: 13px;
|
||||||
|
|
||||||
|
.icon-jiahao {
|
||||||
|
margin-right: 3px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-con {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.template-list {
|
||||||
|
|
||||||
|
.template-item {
|
||||||
|
background: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
.item-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
.blue {
|
||||||
|
font-size: 22px;
|
||||||
|
color: #409eff;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-text {
|
||||||
|
display: flex;
|
||||||
|
margin-top: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
color: #606266;
|
||||||
|
|
||||||
|
.item-icon {
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
background: #F6F6F6;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 10px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-answer {
|
||||||
|
flex-direction: column;
|
||||||
|
padding-top: 5px;
|
||||||
|
|
||||||
|
:deep(.text-tit) {
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.text-num) {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.text-answer{
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
.ai-btn{
|
||||||
|
margin-top: 10px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
.iconfont{
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
:deep(.el-button){
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.icon-ai1{
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.template-item-result {
|
||||||
|
background: #DDEAFD !important;
|
||||||
|
|
||||||
|
.result-item-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #3D3D3D;
|
||||||
|
|
||||||
|
.icon-xiaoxi {
|
||||||
|
color: #5881D5;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-icon-btn {
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 5px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 10px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #cfe0fa
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfont {
|
||||||
|
margin-right: 3px;
|
||||||
|
color: #3498fc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
height: 1px;
|
||||||
|
background: #D8D8D8;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.other-msg {
|
||||||
|
font-size: 13px;
|
||||||
|
|
||||||
|
.other-user {
|
||||||
|
align-items: center;
|
||||||
|
color: #BA4B0F;
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
.icon-touxiang {
|
||||||
|
color: #BA4B0F;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.other-text {
|
||||||
|
color: #191919;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pl-25 {
|
||||||
|
padding-left: 25px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,13 +1,44 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="page-template">
|
<div class="page-template flex">
|
||||||
<Header/>
|
<!--头部-->
|
||||||
|
<Header @changeTemp="changeTemp" @onRead="onRead"/>
|
||||||
|
<el-row :gutter="20" class="tempalte-main">
|
||||||
|
<el-col :span="12">
|
||||||
|
<!--左侧pdf-->
|
||||||
|
<Pdf />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<!--右侧模板研读-->
|
||||||
|
<Result ref="resultRef" :tempId="tempId"/>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref } from 'vue'
|
||||||
import Header from './container/header.vue'
|
import Header from './container/header.vue'
|
||||||
|
import Pdf from './container/pdf.vue'
|
||||||
|
import Result from './container/result.vue'
|
||||||
|
|
||||||
|
const resultRef = ref()
|
||||||
|
const tempId = ref('')
|
||||||
|
const changeTemp = (id) =>{
|
||||||
|
tempId.value = id
|
||||||
|
}
|
||||||
|
|
||||||
|
const onRead = () =>{
|
||||||
|
resultRef.value.getConversation()
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.page-template {
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
.tempalte-main {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -2,8 +2,8 @@
|
||||||
<div>
|
<div>
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<el-button type="primary" @click="onchange('/model/curriculum')">课标研读</el-button>
|
<el-button type="primary" @click="onchange('/model/curriculum')">课标研读</el-button>
|
||||||
<el-button type="success" @click="onchange('/model/teaching')">教材研读</el-button>
|
<!-- <el-button type="success" @click="onchange('/model/teaching')">教材研读</el-button> -->
|
||||||
<el-button type="info" @click="onchange('/model/examination')">考试分析</el-button>
|
<!-- <el-button type="info" @click="onchange('/model/examination')">考试分析</el-button> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
Loading…
Reference in New Issue