Compare commits

...

12 Commits

16 changed files with 162 additions and 57 deletions

View File

@ -2,12 +2,21 @@
import request from '@/utils/request' import request from '@/utils/request'
// 查询知识点列表 // 查询知识点列表
export function listKnowlegepoint(query) { export function listKnowlegepoint(query) {
return request({ return request({
url: '/point/list', url: '/point/list',
method: 'get', method: 'get',
params: query params: query
}) })
} }
// 查询知识点列表
export function listKnowlegepointFormat(query) {
return request({
url: '/point/formatList',
method: 'get',
params: query
})
}
// 查询一级知识点查下级所有层级 // 查询一级知识点查下级所有层级

View File

@ -71,4 +71,9 @@ defineExpose({
justify-content: flex-end; justify-content: flex-end;
box-sizing: border-box; box-sizing: border-box;
} }
:deep(.format-work-desc > :is(div):first-child){
display: inline-block;
}
</style> </style>

View File

@ -102,7 +102,7 @@ const getCompletion = async (val) => {
type: 'robot', type: 'robot',
msg: answer, msg: answer,
}) })
} finally { } finally {
loaded.value = false loaded.value = false
} }
@ -117,11 +117,11 @@ const saveAdjust = (item) =>{
onMounted(() => { onMounted(() => {
let data = sessionStore.get('subject.curNode') let data = sessionStore.get('subject.curNode')
Object.assign(curNode, data); Object.assign(curNode, data);
let text = props.modeType == 1 ? '课标': props.modeType == 2 ? '教材' : '考试' let text = props.modeType == 1||props.modeType == 2 ? '课标' : '考试'
let jsonKey = `${text}-${data.edustage}-${data.edusubject}` let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
console.log(jsonKey)
params.dataset_id = dataSetJson[jsonKey] params.dataset_id = dataSetJson[jsonKey]
}) })
</script> </script>
@ -152,7 +152,7 @@ onMounted(() => {
width: 100%; width: 100%;
justify-content: flex-start; justify-content: flex-start;
flex-direction: column; flex-direction: column;
} }
.chart-item { .chart-item {
border-radius: 5px; border-radius: 5px;
@ -257,4 +257,4 @@ onMounted(() => {
transform: scale(0.01); transform: scale(0.01);
} }
} }
</style> </style>

View File

@ -56,10 +56,10 @@ const title = computed(() => {
const radio = ref(1) const radio = ref(1)
const radioList = ref([ const radioList = ref([
{ label: '浏览研读', value: 1 }, { label: '浏览研读', value: 1 },
{ label: '跨学科研读', value: 2 }, // { label: '', value: 2 },
{ label: '跨学段研读', value: 3 }, // { label: '', value: 3 },
{ label: '课标修订研读', value: 4 }, // { label: '', value: 4 },
{ label: '自由研读', value: 5 }, // { label: '', value: 5 },
]) ])
const list = ref([ const list = ref([
{ {

View File

@ -1,7 +1,7 @@
<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 @click="showDialog = true"> <el-button link @click="onClick">
{{ curNode.edustage}}{{ curNode.edusubject }}{{ type == 1 ? '课标研读': '教材分析'}}<i class="iconfont icon-xiangxia"></i> {{ curNode.edustage}}{{ curNode.edusubject }}{{ type == 1 ? '课标研读': '教材分析'}}<i class="iconfont icon-xiangxia"></i>
</el-button> </el-button>
</div> </div>
@ -20,12 +20,14 @@
</template> </template>
</el-dropdown> </el-dropdown>
<div> <div>
<el-button type="primary" link @click="onAdd"> <el-button type="primary" link @click="onAdd">
<el-icon> <el-icon>
<Plus /> <Plus />
</el-icon> </el-icon>
添加提示词 添加提示词
</el-button> </el-button>
<!-- <el-button type="danger">删除</el-button> -->
<!-- <el-button type="primary" link>保存模板</el-button> --> <!-- <el-button type="primary" link>保存模板</el-button> -->
<el-button type="primary" @click="aiRead">一键研读</el-button> <el-button type="primary" @click="aiRead">一键研读</el-button>
</div> </div>
@ -53,9 +55,7 @@ const props = defineProps({
default: 1 default: 1
} }
}) })
watch(() => props.type, (newValue) => {
console.log(newValue, 'newValue2');
}, { immediate: true });
const emit = defineEmits(['changeTemp', 'onRead']) const emit = defineEmits(['changeTemp', 'onRead'])
@ -104,6 +104,11 @@ const onAdd = () => {
wordDialog.value = true wordDialog.value = true
} }
const onClick = () =>{
if(props.type == 1) return
showDialog.value = true
}
onUnmounted(() => { onUnmounted(() => {
emitter.off('onGetMain') emitter.off('onGetMain')
}) })

View File

@ -15,6 +15,8 @@ const pdfUrl = ref('')
onMounted(async () =>{ onMounted(async () =>{
await nextTick() await nextTick()
const { fileurl } = sessionStore.get('subject.curBook') const { fileurl } = sessionStore.get('subject.curBook')
console.log(fileurl,'fileurl');
pdfUrl.value = import.meta.env.VITE_APP_RES_FILE_PATH + fileurl.replace('.txt','.pdf') pdfUrl.value = import.meta.env.VITE_APP_RES_FILE_PATH + fileurl.replace('.txt','.pdf')
}) })
</script> </script>

View File

@ -257,7 +257,7 @@ const removeItem = async (item) => {
isAdd.value = false isAdd.value = false
Object.assign(keywordItem, item) Object.assign(keywordItem, item)
isEditKeyWord.value = true isEditKeyWord.value = true
} }
// const { msg } = await removeChildTemp(item.id) // const { msg } = await removeChildTemp(item.id)
@ -269,7 +269,7 @@ const removeItem = async (item) => {
onMounted(() => { onMounted(() => {
let data = sessionStore.get('subject.curNode') let data = sessionStore.get('subject.curNode')
Object.assign(curNode, data); Object.assign(curNode, data);
let text = props.modeType == 1 ? '课标' : props.modeType == 2 ? '教材' : '考试' let text = props.modeType == 1 || props.modeType == 2 ? '课标' : '考试'
let jsonKey = `${text}-${data.edustage}-${data.edusubject}` let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
params.dataset_id = dataSetJson[jsonKey] params.dataset_id = dataSetJson[jsonKey]

View File

@ -15,7 +15,7 @@
</el-tooltip> </el-tooltip>
</div> </div>
<div class="blockBox"> <div class="blockBox">
<el-button @click="currentType = 'selection'"><el-image src="/src/assets/images/mouse-pointer.png" <el-button @click="currentType = 'selection'"><el-image src="../../../src/assets/images/mouse-pointer.png"
style="width: 14px; height: 14px; color: silver" /></el-button> style="width: 14px; height: 14px; color: silver" /></el-button>
</div> </div>
<template v-if="type == 'design'"> <template v-if="type == 'design'">
@ -123,7 +123,7 @@
<!-- 边框样式 --> <!-- 边框样式 -->
<div class="blockBox"> <div class="blockBox">
<el-dropdown @command="updateStyle('lineDash', $event)" placement="top"> <el-dropdown @command="updateStyle('lineDash', $event)" placement="top">
<el-button><el-image src="/src/assets/images/borderstyle.png" <el-button><el-image src="../../../src/assets/images/borderstyle.png"
style="width: 14px; height: 14px"></el-image></el-button> style="width: 14px; height: 14px"></el-image></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
@ -145,7 +145,7 @@
<!-- 边框粗细 --> <!-- 边框粗细 -->
<div class="blockBox"> <div class="blockBox">
<el-dropdown @command="updateStyle('lineWidth', $event)" placement="top"> <el-dropdown @command="updateStyle('lineWidth', $event)" placement="top">
<el-button><el-image src="/src/assets/images/borderwidth.png" <el-button><el-image src="../../../src/assets/images/borderwidth.png"
style="width: 14px; height: 14px"></el-image></el-button> style="width: 14px; height: 14px"></el-image></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>

View File

@ -59,14 +59,14 @@ export const processList = (row, aloneOption=false) => {
for(; j<workDescArr.length; j++){ for(; j<workDescArr.length; j++){
const char = String.fromCharCode(65+j); const char = String.fromCharCode(65+j);
if (aloneOption) { if (aloneOption) {
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`; tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
} }
else { else {
if(j%2 == 0){ if(j%2 == 0){
tmp += `<div style='width:100%;display:flex;'>`; tmp += `<div style='width:100%;display:flex;'>`;
} }
tmp += `<div style='padding-left:10px;width:50%;overflow:hidden;text-overflow:ellipsis;font-size:0.9em;'>${char}.${workDescArr[j]}</div>`; tmp += `<div class="format-work-desc" style='padding-left:10px;width:50%;overflow:hidden;text-overflow:ellipsis;font-size:0.9em;'>${char}.${workDescArr[j]}</div>`;
if(j%2 == 1){ if(j%2 == 1){
tmp += '</div>'; tmp += '</div>';
} }
@ -153,14 +153,14 @@ export const processList = (row, aloneOption=false) => {
for(; j<optionsArr.length; j++){ for(; j<optionsArr.length; j++){
const char = String.fromCharCode(65+j); const char = String.fromCharCode(65+j);
if (aloneOption) { if (aloneOption) {
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${optionsArr[j]}</div>`; tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${optionsArr[j]}</div>`;
} }
else { else {
if(j%2 == 0){ if(j%2 == 0){
tmp += `<div style='width:100%;display:flex;'>`; tmp += `<div style='width:100%;display:flex;'>`;
} }
tmp += `<div style='padding-left: 10px; width: 50%'>${char}.${optionsArr[j]}</div>`; tmp += `<div class="format-work-desc" style='padding-left: 10px; width: 50%'>${char}.${optionsArr[j]}</div>`;
if(j%2 == 1){ if(j%2 == 1){
tmp += '</div>'; tmp += '</div>';
} }
@ -280,14 +280,14 @@ export const processList = (row, aloneOption=false) => {
for(; j<workDescArr.length; j++){ for(; j<workDescArr.length; j++){
const char = String.fromCharCode(65+j); const char = String.fromCharCode(65+j);
if (aloneOption) { if (aloneOption) {
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`; tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
} }
else { else {
if(j%2 == 0){ if(j%2 == 0){
tmp += `<div style='width:100%;display:flex;'>`; tmp += `<div style='width:100%;display:flex;'>`;
} }
tmp += `<div style='padding-left: 10px; width: 50%'>${char}.${workDescArr[j]}</div>`; tmp += `<div class="format-work-desc" style='padding-left: 10px; width: 50%'>${char}.${workDescArr[j]}</div>`;
if(j%2 == 1){ if(j%2 == 1){
tmp += '</div>'; tmp += '</div>';
} }

View File

@ -488,6 +488,10 @@ watch(() => props.bookobj.levelSecondId, (newVal, oldVal) => {
width: 100%; width: 100%;
height: calc(100% - 100px); height: calc(100% - 100px);
} }
:deep(.format-work-desc > :is(div):first-child){
display: inline-block;
}
// :deep(.el-dialog .question-dialog){ // :deep(.el-dialog .question-dialog){
// height: 80vh !important; // height: 80vh !important;

View File

@ -99,6 +99,8 @@ const router = useRouter()
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const props = defineProps({ const props = defineProps({
}) })
const curLessionList = ref([]);
const activeParams = reactive({ const activeParams = reactive({
version: {}, version: {},
lession: {}, lession: {},

View File

@ -405,9 +405,10 @@
<script setup> <script setup>
import { ElMessage, ElNotification } from 'element-plus' import { ElMessage, ElNotification } from 'element-plus'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { onMounted, ref,watch, reactive, getCurrentInstance,nextTick } from 'vue' import { onMounted, ref, watch, reactive, getCurrentInstance,nextTick } from 'vue'
import { getBindlist } from '@/api/education/knowledgePoint' import { getBindlist, listKnowlegepointFormat } from '@/api/education/knowledgePoint'
import { listEvaluation } from '@/api/subject'
import { listEntpcoursework, getEntpcoursework, delEntpcoursework, addEntpcoursework, updateEntpcoursework, uploadEntpcourseworkFile } from "@/api/education/entpCourseWork"; import { listEntpcoursework, getEntpcoursework, delEntpcoursework, addEntpcoursework, updateEntpcoursework, uploadEntpcourseworkFile } from "@/api/education/entpCourseWork";
import { isJson } from "@/hooks/useProcessList"; import { isJson } from "@/hooks/useProcessList";
@ -611,10 +612,13 @@ onMounted(() => {
} }
yearList.value.push(s) yearList.value.push(s)
}; };
//
}) })
const checkBoxChange=(v)=>{ const checkBoxChange=(v)=>{
// v: [] // v: []
console.log(v,'vvvvvv') console.log(v,'vvvvvv')
@ -1666,10 +1670,56 @@ const myMessageShow=(title, msg, status)=>{
// }, // },
// }, // },
watch(() => props.bookobj.levelSecondId, (newVal, oldVal) => { /**
* @desc: 遍历原知识点数据, 将title字段转为knowTitle以供knowledgePointProps进行tree的格式转换显示
* @return: {*}
* @param {*} list
*/
const updateKnowledgePoint = (list) => {
list.forEach(item => {
if (item.title && item.title != '') {
item.knowTitle = item.title;
}
if (item.children && Array.isArray(item.children)) {
updateKnowledgePoint(item.children);
}
});
return list;
};
watch(() => props.bookobj.levelSecondId, async (newVal, oldVal) => {
console.log(props.bookobj,'课程选择') console.log(props.bookobj,'课程选择')
// props.bookobj.levelSecondId? props.bookobj.levelSecondId : props.bookobj.levelFirstId // props.bookobj.levelSecondId? props.bookobj.levelSecondId : props.bookobj.levelFirstId
lessionid.value = props.bookobj.levelSecondId? props.bookobj.levelSecondId : props.bookobj.levelFirstId; lessionid.value = props.bookobj.levelSecondId? props.bookobj.levelSecondId : props.bookobj.levelFirstId;
/**
* 格式化知识点: 分两种情况
* 1. 语文/英语: 获取学科下的所有知识点(该学科对应无章节与知识点绑定, 故只获取全知识点)
* 2. 其他: 获取当前章节下的所有知识点
*/
let id = props.bookobj.levelSecondId;
if(props.bookobj.node.edusubject == '语文' || props.bookobj.node.edusubject == '英语'){
id = props.bookobj.node.rootid;
const res = await listEvaluation({ edusubject: props.bookobj.node.edusubject, edustage: props.bookobj.node.edustage, itemkey: "subject", pageSize: 10 });
id = res.rows[0]?.id;
if (id) {
listKnowlegepointFormat({evalId: id, pageNum: 1, pageSize: 5000,}).then(res => {
//console.log('listKnowlegepointFormat->', res.rows);
curKnowledgePointList.value = updateKnowledgePoint(res.rows);
});
}
}else{
getBindlist({ eid: id }).then(res => {
if (!res.data || res.data.length < 1) {
ElMessage.warning('当前章节下未绑定知识点,暂不更新该试题知识点!');
curKnowledgePointList.value = [];
}
else {
curKnowledgePointList.value = res.data;
}
})
}
}) })
@ -1680,7 +1730,20 @@ defineExpose({
cropperFormItemCallBack, cropperFormItemCallBack,
}) })
</script> </script>
<style lang="scss">
.el-cascader-panel {
li[aria-haspopup="true"] {
.el-checkbox {
display: none;
}
}
}
</style>
<style scoped lang="scss"> <style scoped lang="scss">
.questForm-item-cover{ .questForm-item-cover{
position: relative; position: relative;
@ -1698,6 +1761,4 @@ defineExpose({
z-index: 9999; z-index: 9999;
} }
} }
</style> </style>

View File

@ -60,6 +60,7 @@ import { sessionStore } from '@/utils/store'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { dataSetJson } from '@/utils/comm.js' import { dataSetJson } from '@/utils/comm.js'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import emitter from '@/utils/mitt';
const userInfo = useUserStore().user const userInfo = useUserStore().user
const textarea = ref('') const textarea = ref('')
@ -119,7 +120,7 @@ const getCompletion = async (val) => {
type: 'robot', type: 'robot',
msg: answer, msg: answer,
}) })
} finally { } finally {
loaded.value = false loaded.value = false
} }
@ -132,6 +133,8 @@ const saveAdjust = (item) =>{
} }
const curFile = reactive({}) const curFile = reactive({})
const dataset_id = ref('') const dataset_id = ref('')
const fileList = ref([]) const fileList = ref([])
@ -144,7 +147,9 @@ const getList = () =>{
Object.assign(curFile, fileList.value[0]) Object.assign(curFile, fileList.value[0])
}) })
} }
emitter.on('curFile', (item) =>{
changeFile(item)
})
const changeFile = (val) =>{ const changeFile = (val) =>{
Object.assign(curFile, val); Object.assign(curFile, val);
@ -154,8 +159,8 @@ const changeFile = (val) =>{
onMounted(() => { onMounted(() => {
let data = sessionStore.get('subject.curNode') let data = sessionStore.get('subject.curNode')
Object.assign(curNode, data); Object.assign(curNode, data);
let text = props.modeType == 1 ? '课标': props.modeType == 2 ? '教材' : '考试' let text = props.modeType == 1 ||props.modeType == 2 ? '课标' : '考试'
let jsonKey = `${text}-${data.edustage}-${data.edusubject}` let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
params.dataset_id = dataSetJson[jsonKey] params.dataset_id = dataSetJson[jsonKey]
dataset_id.value = dataSetJson[jsonKey] dataset_id.value = dataSetJson[jsonKey]
@ -190,7 +195,7 @@ onMounted(() => {
width: 100%; width: 100%;
justify-content: flex-start; justify-content: flex-start;
flex-direction: column; flex-direction: column;
} }
.chart-item { .chart-item {
border-radius: 5px; border-radius: 5px;
@ -300,4 +305,4 @@ onMounted(() => {
display: flex; display: flex;
margin-bottom: 10px; margin-bottom: 10px;
} }
</style> </style>

View File

@ -8,16 +8,16 @@
</template> </template>
<div class="dialog-content"> <div class="dialog-content">
<div class="flex dialog-top"> <div class="flex dialog-top">
<el-radio-group v-model="radio" @change="changeRadio"> <!-- <el-radio-group v-model="radio" @change="changeRadio">
<el-radio :value="item.value" v-for="item in radioList">{{ item.label }}</el-radio> <el-radio :value="item.value" v-for="item in radioList">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group> -->
</div> </div>
<div class="content-list"> <div class="content-list">
<ul> <ul>
<li v-for="(item, index) in list" :class="activeIndex == index ? 'li-active' : ''" @click="clickItem(index)"> <li v-for="(item, index) in fileList" :class="activeIndex == index ? 'li-active' : ''" @click="clickItem(index, item)">
<el-image class="img" :src="item.url" /> <el-image class="img" :src="url" />
<span>{{ item.name }}</span> <el-text truncated>{{ item.fileName }}</el-text>
</li> </li>
</ul> </ul>
</div> </div>
@ -47,6 +47,7 @@ import { sessionStore } from '@/utils/store'
import { dataSetJson } from '@/utils/comm.js' import { dataSetJson } from '@/utils/comm.js'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import emitter from '@/utils/mitt';
const userInfo = useUserStore().user const userInfo = useUserStore().user
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload");
@ -93,11 +94,7 @@ const changeRadio = () => {
}) })
} }
} }
const activeIndex = ref(-1) const activeIndex = ref(0)
const clickItem = (index) => {
activeIndex.value = index
}
const dataset_id = ref('') const dataset_id = ref('')
@ -109,7 +106,7 @@ const onSuccess = async (response) =>{
dataset_id: dataset_id.value dataset_id: dataset_id.value
} }
const res = await completion(data) const res = await completion(data)
console.log(res)
if(res.data.code != 200) return if(res.data.code != 200) return
let docData = { let docData = {
fileUrl: response.url, fileUrl: response.url,
@ -123,19 +120,30 @@ const onSuccess = async (response) =>{
} }
const { msg } = await addDoc(docData) const { msg } = await addDoc(docData)
ElMessage.success(msg) ElMessage.success(msg)
getList()
} }
const curNode = reactive({}) const curNode = reactive({})
const fileList = ref([])
const curFile = reactive({})
const getList = () =>{ const getList = () =>{
docList({ docList({
userId: userInfo.userId, userId: userInfo.userId,
dataset_id: dataset_id.value dataset_id: dataset_id.value
}).then( res =>{ }).then( res =>{
console.log(res) fileList.value = [...res.rows]
Object.assign(curFile, fileList.value[0])
}) })
} }
const clickItem = (index, item) => {
activeIndex.value = index
Object.assign(curFile, item)
emitter.emit('curFile',item)
}
onMounted(() =>{ onMounted(() =>{
let data = sessionStore.get('subject.curNode') let data = sessionStore.get('subject.curNode')
@ -174,6 +182,7 @@ onMounted(() =>{
flex-wrap: wrap; flex-wrap: wrap;
li { li {
width: 130px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
font-size: 13px; font-size: 13px;

View File

@ -257,7 +257,7 @@ const removeItem = async (item) => {
isAdd.value = false isAdd.value = false
Object.assign(keywordItem, item) Object.assign(keywordItem, item)
isEditKeyWord.value = true isEditKeyWord.value = true
} }
// const { msg } = await removeChildTemp(item.id) // const { msg } = await removeChildTemp(item.id)
@ -269,7 +269,7 @@ const removeItem = async (item) => {
onMounted(() => { onMounted(() => {
let data = sessionStore.get('subject.curNode') let data = sessionStore.get('subject.curNode')
Object.assign(curNode, data); Object.assign(curNode, data);
let text = props.modeType == 1 ? '课标' : props.modeType == 2 ? '教材' : '考试' let text = props.modeType == 1 || props.modeType == 2? '课标' : '考试'
let jsonKey = `${text}-${data.edustage}-${data.edusubject}` let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
params.dataset_id = dataSetJson[jsonKey] params.dataset_id = dataSetJson[jsonKey]

View File

@ -7,7 +7,10 @@
"noEmit": true, "noEmit": true,
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"../*": ["./src/*"] "../*": ["./src/*"],
"@/*": [
"./src/renderer/src/*"
]
} }
} }
} }