Compare commits

...

53 Commits
yangws ... main

Author SHA1 Message Date
zouyf a4a839931d Merge pull request 'zouyf_dev' (#397) from zouyf_dev into main
Reviewed-on: #397
2024-11-11 16:58:11 +08:00
“zouyf” 1844af01da 1 2024-11-11 16:56:56 +08:00
“zouyf” 163764cf1c Merge branch 'main' into zouyf_dev 2024-11-11 16:54:10 +08:00
“zouyf” 7273f7f835 限制题目上线 2024-11-11 16:53:56 +08:00
lyc 28ba027407 Merge pull request '打包' (#395) from lyc-dev into main 2024-11-11 16:21:50 +08:00
lyc b35daeb3c7 打包 2024-11-11 16:15:15 +08:00
baigl a7ac61e32f Merge pull request 'baigl' (#394) from baigl into main
Reviewed-on: #394
2024-11-11 15:04:18 +08:00
白了个白 f58a38dceb 1 2024-11-11 15:03:17 +08:00
“zouyf” cb910068e0 正常查询10条 2024-11-11 14:49:05 +08:00
“zouyf” 01ee2c8c85 Merge branch 'baigl' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into baigl 2024-11-11 13:43:41 +08:00
“zouyf” 768b3e7abf Revert "1"
This reverts commit f504cee74b.
2024-11-11 13:43:35 +08:00
“zouyf” f504cee74b 1 2024-11-11 13:43:09 +08:00
白了个白 6c66c97e33 1 2024-11-11 12:53:16 +08:00
白了个白 2929997d17 作业设计:课程选择过快请求添加防抖 2024-11-11 10:02:23 +08:00
zouyf 96c074d396 [作业设计] - 下拉刷新试题 2024-11-09 16:50:28 +08:00
zouyf 15633f065f 1 2024-11-09 14:30:26 +08:00
zouyf 9d45b72771 Merge branch 'baigl' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zouyf_dev 2024-11-09 12:22:55 +08:00
白了个白 f5c42958f4 1 2024-11-08 17:25:36 +08:00
白了个白 3b8e36454a 1 2024-11-08 17:22:42 +08:00
白了个白 dd64e4e085 习题查询:加上分页传参 2024-11-08 15:39:05 +08:00
“zouyf” 7740346b49 Merge branch 'main' into zouyf_dev 2024-11-08 15:08:17 +08:00
baigl dfd56d6f52 Merge pull request 'baigl' (#393) from baigl into main
Reviewed-on: #393
2024-11-08 09:58:36 +08:00
白了个白 ea3e416f8f Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into baigl 2024-11-08 09:56:47 +08:00
白了个白 5e948d9b95 作业设计:习题来源同步web端的菁优网 2024-11-08 09:51:17 +08:00
“zouyf” a75e4bcc52 Merge branch 'baigl' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zouyf_dev 2024-11-06 16:00:37 +08:00
白了个白 201b10a91e 工作台作业:逻辑更改 2024-11-06 09:56:43 +08:00
白了个白 a918aa18e9 作业批改列表:逻辑代码优化 2024-11-05 17:28:16 +08:00
“zouyf” 6c87321900 Merge branch 'baigl' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zouyf_dev 2024-11-05 14:04:35 +08:00
白了个白 1cc0bf965e 1 2024-11-05 11:15:06 +08:00
白了个白 2407e66e66 作业批改:已批改日期更改 2024-11-05 11:12:14 +08:00
zhengdegang 09914eb8f9 Merge pull request '修复bug' (#392) from zdg into main
Reviewed-on: #392
2024-11-04 21:55:00 +08:00
zdg f1cdb7b400 修复bug 2024-11-04 21:53:37 +08:00
白了个白 033c0a3b19 作业批阅:待继续完善 2024-11-04 17:31:30 +08:00
zhengdegang d4f58d8a05 Merge pull request 'zdg' (#391) from zdg into main
Reviewed-on: #391
2024-11-04 16:30:25 +08:00
zdg a4647ff828 Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zdg 2024-11-04 16:29:43 +08:00
zdg 7e18f2e9d9 ppt上课-资源更新 2024-11-04 16:29:34 +08:00
白了个白 b07a4e07b9 作业批改:需求更新,界面调整 2024-11-04 15:36:00 +08:00
白了个白 4be888e39e Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into baigl 2024-11-04 11:27:32 +08:00
白了个白 e1c8ab42d9 作业批改:需求变更修改 2024-11-04 11:25:58 +08:00
zhengdegang e79d554987 Merge pull request '优化ppt上课' (#390) from zdg into main
Reviewed-on: #390
2024-11-04 09:41:37 +08:00
zdg fbacb32940 优化ppt上课 2024-11-04 09:40:16 +08:00
zhengdegang 7d20a7ee50 Merge pull request 'zdg' (#389) from zdg into main
Reviewed-on: #389
2024-11-01 12:55:07 +08:00
zdg e494c303f0 Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zdg 2024-11-01 12:54:12 +08:00
zdg 0fcaf3f3e7 ppt 上课优化 2024-11-01 12:54:01 +08:00
zouyf 91f43987f7 Merge pull request 'zouyf_dev' (#388) from zouyf_dev into main
Reviewed-on: #388
2024-11-01 11:22:40 +08:00
“zouyf” 9ab2c17b3e Merge branch 'main' into zouyf_dev 2024-11-01 11:22:03 +08:00
“zouyf” 21dfced02e [考试分析] - 优化获取真题 2024-11-01 11:21:40 +08:00
zhengdegang c3d6c2a57b Merge pull request 'zdg' (#387) from zdg into main
Reviewed-on: #387
2024-10-31 20:17:23 +08:00
zdg 674f98a53a Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into zdg 2024-10-31 20:16:03 +08:00
zdg d4a02e85ce 自动关闭-屏蔽该功能 2024-10-31 20:15:45 +08:00
lyc 4fbd4d8f0f Merge pull request '默认用户头像' (#386) from lyc-dev into main 2024-10-31 16:54:44 +08:00
lyc 4578bbca58 默认用户头像 2024-10-31 16:55:19 +08:00
yangws 8cffee606a Merge pull request 'fix:知识点分数修改;' (#385) from yangws into main
Reviewed-on: #385
2024-10-31 16:37:26 +08:00
25 changed files with 886 additions and 1362 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "aix-win", "name": "aix-win",
"version": "2.1.21", "version": "2.1.28",
"description": "", "description": "",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": "上海交大重庆人工智能研究院", "author": "上海交大重庆人工智能研究院",

View File

@ -175,6 +175,7 @@ async function createLinkWin(data) {
data.fullPath += '?urlSource=smarttalk&t' + Date.now() data.fullPath += '?urlSource=smarttalk&t' + Date.now()
} }
linkWin[data.key].loadURL(data.fullPath) linkWin[data.key].loadURL(data.fullPath)
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') linkWin[data.key].webContents.openDevTools()
linkWin[data.key].once('ready-to-show', () => { linkWin[data.key].once('ready-to-show', () => {
linkWin[data.key].show() linkWin[data.key].show()

View File

@ -23,7 +23,9 @@ const defaultData = {
curNode: null, // 当前选中的节点 curNode: null, // 当前选中的节点
defaultExpandedKeys: [], //展开的节点 defaultExpandedKeys: [], //展开的节点
subjectTree: [] // "树结构" 章节 subjectTree: [] // "树结构" 章节
} },
env: {}, // 不走同步 Pinia - 变量
curr: {} // 不走同步 Pinia - 当前信息
}, },
local: { // 本地(永久localStorage) local: { // 本地(永久localStorage)
}, },

View File

@ -89,6 +89,13 @@ export function updateClassworkdata(data) {
data: data data: data
}) })
} }
export function updateClassWorkDataAutoFinish(data) {
return request({
url: '/education/classworkdata/updAutoFinish',
method: 'put',
data: data
})
}
// 修改classwork // 修改classwork
export function updateClasswork(data) { export function updateClasswork(data) {
@ -118,90 +125,90 @@ export function addClassworkeval(data) {
// 查询evaluationclue列表 // 查询evaluationclue列表
export function listEvaluationclue(query) { export function listEvaluationclue(query) {
return request({ return request({
url: '/education/evaluationclue/list', url: '/education/evaluationclue/list',
method: 'get', method: 'get',
params: query params: query
}) })
} }
// 查询evaluationclue详细 // 查询evaluationclue详细
export function getEvaluationclue(id) { export function getEvaluationclue(id) {
return request({ return request({
url: '/education/evaluationclue/' + id, url: '/education/evaluationclue/' + id,
method: 'get' method: 'get'
}) })
} }
// 新增evaluationclue // 新增evaluationclue
export function addEvaluationclueReturnId(data) { export function addEvaluationclueReturnId(data) {
return request({ return request({
url: '/education/evaluationclue/addReturnId', url: '/education/evaluationclue/addReturnId',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 新增evaluationclue // 新增evaluationclue
export function addEvaluationclue(data) { export function addEvaluationclue(data) {
return request({ return request({
url: '/education/evaluationclue', url: '/education/evaluationclue',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 修改evaluationclue // 修改evaluationclue
export function updateEvaluationclue(data) { export function updateEvaluationclue(data) {
return request({ return request({
url: '/education/evaluationclue', url: '/education/evaluationclue',
method: 'put', method: 'put',
data: data data: data
}) })
} }
// 删除evaluationclue // 删除evaluationclue
export function delEvaluationclue(id) { export function delEvaluationclue(id) {
return request({ return request({
url: '/education/evaluationclue/' + id, url: '/education/evaluationclue/' + id,
method: 'delete' method: 'delete'
}) })
} }
// 新增evaluationclue保存base64图片 // 新增evaluationclue保存base64图片
export function saveBase64File(data) { export function saveBase64File(data) {
return request({ return request({
url: '/education/evaluationclue/saveBase64File', url: '/education/evaluationclue/saveBase64File',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 新增evaluationclue上传 // 新增evaluationclue上传
export function saveEvaluationClueUploadFile(data) { export function saveEvaluationClueUploadFile(data) {
return request({ return request({
url: '/education/evaluationclue/saveUploadFile', url: '/education/evaluationclue/saveUploadFile',
method: 'post', method: 'post',
data: data data: data
}) })
} }
// 读取文件内容 // 读取文件内容
export function readFile(data) { export function readFile(data) {
return fetch(import.meta.env.VITE_APP_RES_FILE_PATH + data.cluelink, { return fetch(import.meta.env.VITE_APP_RES_FILE_PATH + data.cluelink, {
method: "get", method: "get",
headers: { headers: {
'Content-Type': 'text/plain', // 请求头设置为纯文本 'Content-Type': 'text/plain', // 请求头设置为纯文本
'Accept': 'text/plain' // 接受头设置为纯文本 'Accept': 'text/plain' // 接受头设置为纯文本
}, },
}) })
.then(response => response.text()) .then(response => response.text())
.then(text => { .then(text => {
return Promise.resolve(text); return Promise.resolve(text);
}) })
.catch(error => { .catch(error => {
console.error('读取文件出错:', error); console.error('读取文件出错:', error);
return Promise.reject(); return Promise.reject();
}); });
/*return request({ /*return request({
url: '/education/evaluationclue/readFile', url: '/education/evaluationclue/readFile',
method: 'post', method: 'post',

View File

@ -213,7 +213,7 @@ const delStudent = (index) => {
const onSubmit = (formEl) => { const onSubmit = (formEl) => {
if (!formEl) return if (!formEl) return
// id // id
const classRoomId = sessionStore.get('curClassRoom.id') const classRoomId = sessionStore.get('curr.curClassRoom.id')
formEl.validate((valid) => { formEl.validate((valid) => {
if (valid) { if (valid) {
/** /**

View File

@ -29,7 +29,11 @@
<div class="avatar-container"> <div class="avatar-container">
<div class="avatar-wrapper flex"> <div class="avatar-wrapper flex">
<el-dropdown class="right-menu-item hover-effect" @command="handleCommand"> <el-dropdown class="right-menu-item hover-effect" @command="handleCommand">
<img :src="dev_api + userStore.user.avatar" class="user-avatar" style="float: left" /> <el-image :src="dev_api + userStore.user.avatar" class="user-avatar" style="float: left">
<template #error>
<el-image :src="defaultUserImg" class="user-avatar" style="float: left" />
</template>
</el-image>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="changePage('/profile')">个人中心</el-dropdown-item> <el-dropdown-item @click="changePage('/profile')">个人中心</el-dropdown-item>
@ -80,6 +84,7 @@ import { updateUserInfo } from '@/api/system/user'
import logoIco from '@/assets/images/logo.png' import logoIco from '@/assets/images/logo.png'
import { listEvaluation } from '@/api/classManage/index' import { listEvaluation } from '@/api/classManage/index'
import { sessionStore } from '@/utils/store' import { sessionStore } from '@/utils/store'
import defaultUserImg from '@/assets/images/img-avatar.png'
// import Chat from '@/utils/chat' // im // import Chat from '@/utils/chat' // im
// if (!Chat.imChat) Chat.init() // if (!Chat.imChat) Chat.init()

View File

@ -10,7 +10,7 @@ import _ from 'lodash'
// import { diff } from 'jsondiffpatch' // import { diff } from 'jsondiffpatch'
// const Remote = isNode?require('@electron/remote'):{} // 远程模块 // const Remote = isNode?require('@electron/remote'):{} // 远程模块
const exArrs = ['subject'] // 不需要同步key-排除 const exArrs = ['subject','env','curr'] // 不需要同步key-排除
export function shareStorePlugin({store}) { export function shareStorePlugin({store}) {
store.$subscribe((mutation, state) => { // 自动同步 store.$subscribe((mutation, state) => { // 自动同步
@ -60,7 +60,7 @@ function stateSyncWatch(storeName, newState) {
const diffData = findDifferences(oldState, newState) const diffData = findDifferences(oldState, newState)
if(!_.keys(diffData).length) return // 没有变化就终止执行 if(!_.keys(diffData).length) return // 没有变化就终止执行
// 数据处理: 找出差异 // 数据处理: 找出差异
// console.log('state-change-diffData', diffData) // console.log('state-change-diffData', diffData, newState)
try { try {
let pinaValue = {} // store pina状态管理需要的数据格式 let pinaValue = {} // store pina状态管理需要的数据格式
// 数据转换处理 // 数据转换处理
@ -83,7 +83,7 @@ function stateSyncWatch(storeName, newState) {
// 没变化也终止执行 // 没变化也终止执行
if (_.isEqual(oldValAll, newValAll)) return if (_.isEqual(oldValAll, newValAll)) return
// 更新本地数据-session // 更新本地数据-session
sessionStore.set(key, newValAll) sessionStore.set(key, newValAll || null)
// 数据处理: pina-store // 数据处理: pina-store
const jsonStr = JSON.stringify(pinaValue) // 从新组装-json数据 const jsonStr = JSON.stringify(pinaValue) // 从新组装-json数据

View File

@ -1,28 +0,0 @@
import { defineStore } from 'pinia'
import { } from '@/api/classTask/index.js'
import { listClassmain } from '@/api/classManage/index'
const useClassTaskStore = defineStore('classTask',{
state: () => ({
classListIds: [],
}),
actions: {
listClassmain(params) {
// 获取班级列表
return new Promise((resolve, reject) => {
listClassmain(params)
.then((res) => {
this.classListIds = res.rows&&res.rows.map((item) => item.id)
resolve(res)
})
.catch((error) => {
reject(error)
})
})
},
},
persist: true
})
export default useClassTaskStore

View File

@ -6,7 +6,7 @@ import { sessionStore } from '@/utils/store'
// 默认数据 // 默认数据
const defData = sessionStore.store || {} const defData = sessionStore.store || {}
const exArrs = ['subject'] const exArrs = ['subject','env','curr']
exArrs.forEach(k => Object.keys(defData).includes(k) && (delete defData[k])) exArrs.forEach(k => Object.keys(defData).includes(k) && (delete defData[k]))
// 延时 // 延时

View File

@ -167,3 +167,61 @@ export function getTomorrow() {
return tomorrow; return tomorrow;
} }
/**
* 当前日期的 前几天
* @param {*} index 天数
* @param {*} format true 返回中国标准时间Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 格式 false 返回标准时间格式 YYYY-MM-DD
* @returns
*/
export function getTheOtherDay(index, format=true) {
let date = new Date();
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate()- index < 10 ? '0' + (date.getDate()- index) : date.getDate()- index
// 前 index 天的时间
if(format){
let tomorrow = `${year}-${month}-${day}`;
return new Date(tomorrow);
}else{
let tomorrow = `${year}-${month}-${day}`;
return tomorrow;
}
}
/**
* 当前日期的 后几天
* @param {*} index 天数
* @param {*} format true 返回中国标准时间Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 格式 false 返回标准时间格式 YYYY-MM-DD
* @returns
*/
export function getTheOtheNextDay(index, format=true) {
const date = new Date();
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate()+ index < 10 ? '0' + (date.getDate()+ index) : date.getDate()+ index
// 前 index 天的时间
if(format){
const tomorrow = `${year}-${month}-${day}`;
return new Date(tomorrow);
}else{
const tomorrow = `${year}-${month}-${day}`;
return tomorrow;
}
}
/**
* Wed Oct 02 2024 08:00:00 GMT+0800 (中国标准时间) 转为日期格式: YYYY-MM-DD
*
* @param {*} format
* @returns
*/
export const getDateFormatDate = (newDate)=> {
const now = newDate; // new Date();
const year = now.getFullYear();
const month = (now.getMonth() + 1).toString().padStart(2, '0');
const day = now.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
}

View File

@ -200,6 +200,25 @@ export const createWindow = async (type, data) => {
eventHandles(type, winChild) // 事件监听处理 eventHandles(type, winChild) // 事件监听处理
return winChild return winChild
} }
case 'open-win': { // 创建-新窗口
const option = data.option||{}
const defOption = {
show: false,
frame: true, // 无边框
autoHideMenuBar: true,
maximizable: false,
}
data.isConsole = true // 是否开启控制台
data.option = {...defOption, ...option}
const win = await toolWindow(type, data)
win.type = type // 唯一标识
win.show()
win.maximize();
// win.setFullScreen(true) // 设置窗口为全屏
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') win.webContents.openDevTools() // 打开调试工具
eventHandles(type, win) // 事件监听处理
break
}
default: default:
break break
} }
@ -360,6 +379,18 @@ const eventHandles = (type, win) => {
publicMethods(on) // 加载公共方法 publicMethods(on) // 加载公共方法
break; break;
} }
case 'open-win': { // 打开新窗口
// 监听窗口关闭事件
win.on('closed', function () {
win&&win.destroy()
});
const on = {
onClosed: () => {
}
}
publicMethods(on) // 加载公共方法
break
}
default: default:
break break
} }

View File

@ -4,20 +4,16 @@
<div class="class-reserv-tabs"> <div class="class-reserv-tabs">
<el-segmented v-model="tabActive" block :options="tabOptions" size="large" /> <el-segmented v-model="tabActive" block :options="tabOptions" size="large" />
</div> </div>
<div v-if="tabActive === '已结束'"> <div v-if="tabActive === '已批改'">
<div class="demo-date-picker"> <div class="demo-date-picker">
<div class="block"> <el-date-picker
<el-date-picker v-model="startEndDate"
v-model="EndDate" type="daterange"
type="date" start-placeholder="Start Date"
format="YYYY-MM-DD" end-placeholder="End Date"
value-format="YYYY-MM-DD" :default-time="defaultTime"
placeholder="请选择截止日期" @change="changeStartEndDate"
size="large" />
:disabled-date="disabledDate"
@change="changeEndDate"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -27,7 +23,7 @@
<div v-if="classWorkList.length > 0"> <div v-if="classWorkList.length > 0">
<task-item <task-item
v-for="(item, index) in activeDataList" v-for="(item, index) in activeDataList"
v-show="tabActive === '进行中'" v-show="tabActive === '待批改'"
:key="index" :key="index"
:item="item" :item="item"
:tabactive="tabActive" :tabactive="tabActive"
@ -36,7 +32,7 @@
></task-item> ></task-item>
<task-item <task-item
v-for="(item, index) in doneDataList" v-for="(item, index) in doneDataList"
v-show="tabActive === '已结束'" v-show="tabActive === '已批改'"
:key="index" :key="index"
:item="item" :item="item"
:tabactive="tabActive" :tabactive="tabActive"
@ -52,7 +48,6 @@
></el-empty> ></el-empty>
</div> </div>
</div> </div>
<!-- <item-dialog ref="itemDialogRef" @cle-click="closeDialog"></item-dialog> -->
</el-container> </el-container>
</template> </template>
@ -61,25 +56,29 @@ import { ref, onMounted, onUnmounted, computed, watch } from 'vue'
import { listByDeadDate, listClassworkdata } from '@/api/classTask' import { listByDeadDate, listClassworkdata } from '@/api/classTask'
import TaskItem from '@/views/classTask/container/classTask/task-item.vue' import TaskItem from '@/views/classTask/container/classTask/task-item.vue'
// import ItemDialog from '@/views/classTask/container/item-dialog.vue'
import { useToolState } from '@/store/modules/tool' import { useToolState } from '@/store/modules/tool'
import { getCurrentTime } from '@/utils/date' import { getDateFormatDate, getTheOtherDay, getTheOtheNextDay } from '@/utils/date'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import useClassTaskStore from "@/store/modules/classTask";
import {createWindow} from '@/utils/tool' import {createWindow} from '@/utils/tool'
import {sessionStore} from '@/utils/store'
import {debounce } from '@/utils/comm' import {debounce } from '@/utils/comm'
const toolState = useToolState(); const toolState = useToolState();
const classTaskStore = useClassTaskStore()
const userStore = useUserStore().user const userStore = useUserStore().user
// const itemDialogRef = ref(null)
const tabOptions = ref(['进行中', '已结束']) const tabOptions = ref(['待批改', '已批改'])
const tabActive = ref('进行中') const tabActive = ref('待批改')
const dataList = ref([]) const dataList = ref([])
const EndDate = ref(getCurrentTime('YYYY-MM-DD')) // 23
const startEndDate = ref([
getTheOtherDay(3),
getTheOtheNextDay(3),
])
const defaultTime = ref<[Date, Date]>([
getTheOtherDay(3),
getTheOtheNextDay(3),
])
// //
const classWorkList = ref([]) const classWorkList = ref([])
@ -91,23 +90,18 @@ const loading = ref(false)
const activeDataList = computed(() => { const activeDataList = computed(() => {
return classWorkList.value return classWorkList.value
}) })
const doneDataList = computed(() => {
return classWorkList.value
})
const deleteReserv = (item) => { const deleteReserv = (item) => {
console.log('删除待开发', item) console.log('删除待开发', item)
// dataList.value = dataList.value.filter((is) => { // dataList.value = dataList.value.filter((is) => {
// return is.id !== item.id // return is.id !== item.id
// }) // })
} }
const doneDataList = computed(() => {
return classWorkList.value
})
// const changeStartEndDate = (val) => {
const disabledDate = (time) => { console.log('起止日期改变', val)
return time.getTime() > Date.now()
}
//
const changeEndDate = (val) => {
console.log('截止日期改变', val)
getData() // getData() //
} }
@ -115,245 +109,202 @@ const changeEndDate = (val) => {
const getData = async () => { const getData = async () => {
classWorkList.value = [] classWorkList.value = []
loading.value = true loading.value = true
// 1 // 1
// getClassList()
// 2
await getClassWorkList() await getClassWorkList()
// 3 // 2
getStudentClassWorkData() getStudentClassWorkData()
loading.value = false loading.value = false
} }
/** /**
* 1获取班级列表数据 * 1获取班级作业
* TODO 这里暂时取班级id的list后续需要在修改
*/
const getClassList = () => {
if(classTaskStore.classListIds.length==0){
// ids idlist
classTaskStore.listClassmain({ classuserid: userStore.userId, pageSize: 100, status: 'open' })
}
}
/**
* 2获取班级作业
*/ */
const getClassWorkList = async () => { const getClassWorkList = async () => {
//if(classTaskStore.classListIds.length>0){ // homeworklist
{ const response = await listByDeadDate({
// homeworklist edituserid: userStore.userId, // id
const response = await listByDeadDate({ edustage: userStore.edustage, //
edituserid: userStore.userId, // id edusubject: userStore.edusubject,//
edustage: userStore.edustage, // startdate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[0]),
edusubject: userStore.edusubject,// deaddate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[1]),//
// deaddate: tabActive.value === ''? getTomorrow() : EndDate.value,// status: tabActive.value === '待批改'? '1' : '2', // 1-
deaddate: EndDate.value,// orderby: 'deaddate DESC',
status: '1', // 1- pageSize: 100,
orderby: 'deaddate DESC', })
pageSize: 100,
})
/** let list = response.rows || [];
* 2024-10-17 由于 后面截止时间加了 时分特加判断 for (var i = 0; i < list.length; i++) {
* 1进行中以前是以明天判断现改为传当天的日期并根据当前日期的时分与截止日期进行判断 //
* 2已结束以前默认是以明天判断现依然以明天为判断并根据当前日期时分大于截止日期时分判断 list[i].workdatalist = [] //
*/ list[i].workdatalistVisible = false
let list = []; list[i].feedtimelength = 0 //
if(tabActive.value === '进行中'){ list[i].rightAnswerCount = 0
// list[i].scoingRate = 0 + '%' //
list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate); // list[i].averagetime = 0 //
}else{
list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate); // // ----------------------------------------------
// UI
if (list[i].worktype == '学习目标定位') {
list[i].workclass = 'success'
list[i].workcodesList = JSON.parse(list[i].workcodes)
} else if (list[i].worktype == '教材研读') {
list[i].workclass = 'primary'
} else if (list[i].worktype == '框架梳理') {
list[i].workclass = 'warning'
} else if (list[i].worktype == '学科定位') {
list[i].workclass = 'info'
} else if (list[i].worktype == '习题训练') {
list[i].workclass = 'danger'
} else {
list[i].workclass = ''
} }
//
if (list[i].entpcourseworklist != '') {
for (var i = 0; i < list.length; i++) { list[i].entpcourseworklistarray = JSON.parse(
// '[' + list[i].entpcourseworklist + ']'
list[i].workdatalist = [] )
list[i].workdatacount = 0 // } else {
list[i].workdatalistVisible = false list[i].entpcourseworklistarray = []
list[i].workdatafeedbackcount = 0 //
list[i].feedtimelength = 0
list[i].rightAnswerCount = 0
list[i].scoingRate = 0 + '%' //
list[i].averagetime = 0 //
// ----------------------------------------------
// UI
if (list[i].worktype == '学习目标定位') {
list[i].workclass = 'success'
list[i].workcodesList = JSON.parse(list[i].workcodes)
} else if (list[i].worktype == '教材研读') {
list[i].workclass = 'primary'
} else if (list[i].worktype == '框架梳理') {
list[i].workclass = 'warning'
} else if (list[i].worktype == '学科定位') {
list[i].workclass = 'info'
} else if (list[i].worktype == '习题训练') {
list[i].workclass = 'danger'
} else {
list[i].workclass = ''
}
//
if (list[i].entpcourseworklist != '') {
list[i].entpcourseworklistarray = JSON.parse(
'[' + list[i].entpcourseworklist + ']'
)
} else {
list[i].entpcourseworklistarray = []
}
// classworkdatastudentids
if (
list[i].classworkdatastudentids != '' &&
list[i].classworkdatastudentids != null &&
list[i].classworkdatastudentids != 'null'
) {
const stuList = JSON.parse('[' + list[i].classworkdatastudentids + ']')
list[i].workdatacount = stuList.length
}
} }
// (workdatacount)>0
if (list && list.length > 0) {
classWorkList.value = list && list.filter((item) => item.workdatacount > 0)
//TODO total
total.value = 0
}else{
classWorkList.value = []
total.value = 0
}
loading.value = false
} }
// (workdataresultsum)>0
if (list && list.length > 0) {
classWorkList.value = list && list.filter((item) => item.workdataresultsum > 0)
//TODO total
total.value = 0
}else{
classWorkList.value = []
total.value = 0
}
loading.value = false
} }
/** /**
* 3获取多个班级学生作业数据 * 2获取多个班级学生作业数据
* 查询已交的列表
* @param workList 需要更新的作业list
* @param Refresh true 不用刷新false 需要刷新
*/ */
const getStudentClassWorkData = async() => { const getStudentClassWorkData = async(workList = [], Refresh = true) => {
// const { chapterId } = await useGetHomework(props.bookobj.node) // (workdataresultcount )
// this.entpcourseid = chapterId let SubmitClWorkList = [];
//if(classTaskStore.classListIds.length>0){ if(Refresh){
// listClassworkdataByDeadDate({ SubmitClWorkList = classWorkList.value.filter((item) => item.workdataresultcount > 0) ;
// edituserid: userStore.userId, // id }else{
// classids: classTaskStore.classListIds.join(','), SubmitClWorkList = workList;
// edusubject: userStore.edusubject,// }
// deaddate: tabActive.value === ''? getTomorrow() : EndDate.value,//
// deaddate: EndDate.value,//
// //status: '1', // 1-
// orderby: "deaddate DESC",//
// pageSize: 1000,
// })
// listClassworkdataNew({ console.log('有提交的作业', SubmitClWorkList)
// classworkids: ids, // id const ids = SubmitClWorkList&&SubmitClWorkList.map((item) => item.id).join(',');
// edituserid: userStore.userId, // id if (ids == '') {
// edusubject: userStore.edusubject,// return;
// evalStatus: 1, }
// pageSize: 1000, listClassworkdata({
// }) classworkids: ids,
pageSize: 1000,
}).then((res) => {
for (var t = 0; t < classWorkList.value.length; t++) {
for (var i = 0; i < res.rows.length; i++) {
// finishtimelength != '0'
if (res.rows[i].classworkid == classWorkList.value[t].id && res.rows[i].finishtimelength != '0') {
console.log('==================')
// /
// resultcount0
//classWorkList.value[t].workdataresultcount++
//
classWorkList.value[t].feedtimelength += parseInt(res.rows[i].finishtimelength)
{ //
const ids = classWorkList.value.map((item) => item.id).join(','); if (
if (ids == '') { res.rows[i].classworkevallist != '' &&
return; res.rows[i].classworkevallist != null &&
} res.rows[i].classworkevallist != 'null'
listClassworkdata({ ) {
classworkids: ids, let replacedString = res.rows[i].classworkevallist.replace(/""/g, '"')
pageSize: 1000, // , : "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"}"
}).then((res) => { replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist).replace(
for (var t = 0; t < classWorkList.value.length; t++) { /"(\[.*\])"/g,
for (var i = 0; i < res.rows.length; i++) { '$1'
if (res.rows[i].classworkid == classWorkList.value[t].id && res.rows[i].finishtimelength != '0') { )
console.log('==================') replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist)
// / var evalarray
// resultcount0 try {
classWorkList.value[t].workdatafeedbackcount++ evalarray = JSON.parse('[' + res.rows[i].classworkevallist + ']')
} catch {
evalarray = JSON.parse('[' + replacedString + ']')
}
// for (var e = 0; e < evalarray.length; e++) {
classWorkList.value[t].feedtimelength += parseInt(res.rows[i].finishtimelength) if (res.rows[i].worktype == '常规作业') {
evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent).replace(
// /"(\[.*\])"/g,
if ( '$1'
res.rows[i].classworkevallist != '' && )
res.rows[i].classworkevallist != null && evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent)
res.rows[i].classworkevallist != 'null'
) {
let replacedString = res.rows[i].classworkevallist.replace(/""/g, '"')
// , : "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"}"
replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist).replace(
/"(\[.*\])"/g,
'$1'
)
replacedString = escapeHtmlQuotes(res.rows[i].classworkevallist)
var evalarray
try {
evalarray = JSON.parse('[' + res.rows[i].classworkevallist + ']')
} catch {
evalarray = JSON.parse('[' + replacedString + ']')
} }
if (evalarray[e].feedcontent == evalarray[e].rightanswer) {
for (var e = 0; e < evalarray.length; e++) { //
if (res.rows[i].worktype == '常规作业') { classWorkList.value[t].rightAnswerCount++
evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent).replace(
/"(\[.*\])"/g,
'$1'
)
evalarray[e].feedcontent = escapeHtmlQuotes(evalarray[e].feedcontent)
}
if (evalarray[e].feedcontent == evalarray[e].rightanswer) {
//
classWorkList.value[t].rightAnswerCount++
}
} }
} }
} }
// workdatacount
if (res.rows[i].classworkid == classWorkList.value[t].id) {
classWorkList.value[t].workdatalist.push(res.rows[i])
}
} }
// workdatacount0 // workdataresultsum
if ( if (res.rows[i].classworkid == classWorkList.value[t].id) {
classWorkList.value[t].workdataresultcount > 0 && classWorkList.value[t].workdatalist.push(res.rows[i])
classWorkList.value[t].workdatacount > 0
) {
classWorkList.value[t].finishpercent = parseInt(
(classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdatacount) * 100
)
} else {
classWorkList.value[t].finishpercent = 0
} }
//
// 2024-04-12by jackyshen
//
if (classWorkList.value[t].workdatafeedbackcount > 0) {
classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdatafeedbackcount / 60).toFixed(0)
} else {
classWorkList.value[t].averagetime = 0
}
//
//
// /**100
if (
classWorkList.value[t].entpcourseworklistarray &&
classWorkList.value[t].entpcourseworklistarray.length > 0
) {
var dd =
(classWorkList.value[t].rightAnswerCount /
(classWorkList.value[t].entpcourseworklistarray.length *
classWorkList.value[t].workdatacount)) *
100
classWorkList.value[t].scoingRate = dd.toFixed(0) + '%'
} else {
classWorkList.value[t].scoingRate = '0%'
}
//
//
} }
})
}
// : workdataresultcount ; workdataresultsum 0;
if (classWorkList.value[t].workdataresultcount > 0 && classWorkList.value[t].workdataresultsum > 0 ) {
classWorkList.value[t].finishpercent = parseInt(
(classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdataresultsum) * 100
)
} else {
classWorkList.value[t].finishpercent = 0
}
/** 计算 已批阅进度 */
// workdataresultsum teacherrationgcount
// (-) / * 100
if (classWorkList.value[t].workdataresultsum > 0) {
classWorkList.value[t].teacherCorrectionProgress = parseInt(
((classWorkList.value[t].teacherrationgcount) / classWorkList.value[t].workdataresultsum) * 100
)
} else {
classWorkList.value[t].teacherCorrectionProgress = 0
}
//
// 2024-04-12by jackyshen
// /
if (classWorkList.value[t].workdataresultcount > 0) {
classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdataresultcount / 60).toFixed(0)
} else {
classWorkList.value[t].averagetime = 0
}
// /**100
if (
classWorkList.value[t].entpcourseworklistarray &&
classWorkList.value[t].entpcourseworklistarray.length > 0
) {
var dd =
(classWorkList.value[t].rightAnswerCount /
(classWorkList.value[t].entpcourseworklistarray.length *
classWorkList.value[t].workdataresultsum)) *
100
classWorkList.value[t].scoingRate = dd.toFixed(0) + '%'
} else {
classWorkList.value[t].scoingRate = '0%'
}
}
})
} }
@ -379,6 +330,7 @@ const getStudentClassWorkDataPolling = () => {
getStudentVisible() getStudentVisible()
// //
pollingST.value = setInterval(() => { pollingST.value = setInterval(() => {
console.log('轮询查询学生作业进度')
getStudentVisible() getStudentVisible()
}, 1000 * 10) }, 1000 * 10)
} }
@ -413,75 +365,56 @@ onUnmounted(() => {
// [] - // [] -
const getStudentVisible = async () => { const getStudentVisible = async () => {
if (classTaskStore.classListIds.length <= 0) { if(!classWorkList.value.length>0){
return return;
} }
//
const response = await listByDeadDate({ const response = await listByDeadDate({
classidarray: classTaskStore.classListIds.join(','),
edituserid: userStore.userId, // id edituserid: userStore.userId, // id
edustage: userStore.edustage,// edustage: userStore.edustage, //
edusubject: userStore.edusubject,// edusubject: userStore.edusubject,//
// deaddate: tabActive.value === ''? getTomorrow() : EndDate.value,// startdate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[0]),
deaddate: EndDate.value,// deaddate: tabActive.value === '待批改'? '' : getDateFormatDate(startEndDate.value[1]),//
status: '1', // 1- status: tabActive.value === '待批改'? '1' : '2', // 1-
// orderby: 'concat(deaddate,uniquekey) DESC',
orderby: 'deaddate DESC', orderby: 'deaddate DESC',
pageSize: 100 pageSize: 100,
}) })
/** let list = response.rows || [];
* 2024-10-17 由于 后面截止时间加了 时分特加判断
* 1进行中以前是以明天判断现改为传当天的日期并根据当前日期的时分与截止日期进行判断
* 2已结束以前默认是以明天判断现依然以明天为判断并根据当前日期时分大于截止日期时分判断
*/
let list = [];
if(tabActive.value === '进行中'){
//
list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate); //
}else{
list = response.rows&&response.rows.filter(item => item.deaddate && getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate); //
}
const curWorkList = list let newList = [];
for(let i = 0; i < classWorkList.value.length; i++){
/** // listidlistid listlist
* warn: 这里仅更新了finishpercent(进度条), 且当前作业布置推送新任务时, curWorkList中会查到新的任务与当前页面中this.classWorkList长度不一致, const isList = list.filter((item) => item.id === classWorkList.value[i].id);
* 故这里需循环this.classWorkList且只更新当前页面中的存在的任务进度 if(isList.length === 0){
*/ // listidlistidlist
for (let t = 0; t < classWorkList.value.length; t++) { classWorkList.value.splice(i,1);
// [] }
// if( getDateTime > classWorkList.value[t].deaddate ){ for(let j = 0; j < list.length; j++){
// continue; // workdataresultcount ;
// } if(classWorkList.value[i].id === list[j].id && classWorkList.value[i].workdataresultcount != list[j].workdataresultcount){
// (index) // =
let curWork = curWorkList.find((work) => work.id === classWorkList.value[t].id) newList.push(list[j]);
// workdataresultcount workdatacount0
if (curWork && curWork.workdataresultcount > 0 && classWorkList.value[t].workdatacount > 0) {
classWorkList.value[t].workdataresultcount = curWork.workdataresultcount
//
classWorkList.value[t].finishpercent = parseInt(
(classWorkList.value[t].workdataresultcount / classWorkList.value[t].workdatacount) * 100
)
//
if (classWorkList.value[t].workdatafeedbackcount > 0) {
classWorkList.value[t].averagetime = Math.ceil(classWorkList.value[t].feedtimelength / classWorkList.value[t].workdatafeedbackcount / 60).toFixed(0)
} else {
classWorkList.value[t].averagetime = 0
} }
// // teacherrationgcount
classWorkList.value[t].teacherrationgcount = curWork.teacherrationgcount if(classWorkList.value[i].id === list[j].id && classWorkList.value[i].teacherrationgcount != list[j].teacherrationgcount){
} else { //
// if (classWorkList.value[i].workdataresultsum > 0) {
if(curWork && curWork.workdataresultcount == 0){ //
// classWorkList.value[i].teacherrationgcount = list[j].teacherrationgcount;
classWorkList.value[t].teacherrationgcount = curWork.teacherrationgcount classWorkList.value[i].teacherCorrectionProgress = parseInt(
((list[j].teacherrationgcount) / list[j].workdataresultsum) * 100
)
} else {
classWorkList.value[i].teacherCorrectionProgress = 0
}
} }
classWorkList.value[t].finishpercent = 0
} }
} }
if(newList.length>0){
return 1 //
const list = newList&&newList.filter((item) => item.workdataresultcount > 0) ;
getStudentClassWorkData(list,false);
}
} }
@ -489,16 +422,27 @@ const getStudentVisible = async () => {
watch( watch(
() => [dataList, toolState.isTaskWin], () => [dataList, toolState.isTaskWin],
() => { () => {
console.log('=监听到批改窗口打开了===', toolState.isTaskWin) console.log('监听--批改窗口是否打开===', toolState.isTaskWin)
if(!toolState.isTaskWin){ if(!toolState.isTaskWin){
if(tabActive.value === '待批改'){
closeDialog();// closeDialog();//
}
} }
} }
) )
watch(tabActive, (newVal,oldVal)=>{ watch(tabActive, (newVal,oldVal)=>{
console.log('newVal',newVal); console.log('newVal',newVal);
getData() // getData() //
if(newVal === '待批改'){
//
console.log('监听---开启轮询')
closeDialog();
}else{
//
console.log('监听---关闭轮询')
clearInterval(pollingST.value);
}
}) })
</script> </script>

View File

@ -427,7 +427,7 @@ import useUserStore from '@/store/modules/user'
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
// import { Plus } from '@element-plus/icons-vue' // import { Plus } from '@element-plus/icons-vue'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import { updateClassworkeval, updateClassworkdata, getClassworkdata, updateClassworkevalList } from '@/api/classTask' import { updateClassworkeval,updateClasswork, updateClassWorkDataAutoFinish, getClassworkdata, updateClassworkevalList } from '@/api/classTask'
import { getTimeDate } from '@/utils/date' import { getTimeDate } from '@/utils/date'
import ReFilePreview from '@/components/refile-preview/index.vue' import ReFilePreview from '@/components/refile-preview/index.vue'
import { quizStrToList } from '@/utils/comm'; import { quizStrToList } from '@/utils/comm';
@ -871,6 +871,13 @@ const onSubmit = () => {
}) })
return return
} }
/** 1、 更新当前作业是否已经批阅完成 */
// TODO updateClasswork
/** 2、 更新每个学生的批阅 */
var formd = { var formd = {
id: dialogProps.value.studentObj.id, // this.activeClassWork.id; id: dialogProps.value.studentObj.id, // this.activeClassWork.id;
@ -878,7 +885,7 @@ const onSubmit = () => {
updatedate: getTimeDate(),// = year+'-'+month+'-'+day+' '+hh+':'+mm; updatedate: getTimeDate(),// = year+'-'+month+'-'+day+' '+hh+':'+mm;
}; };
// //
updateClassworkdata(formd).then(res => { updateClassWorkDataAutoFinish(formd).then(res => {
}) })
// //

View File

@ -14,31 +14,40 @@
&nbsp;|&nbsp; 截止时间{{ item.deaddate }} &nbsp;|&nbsp;{{ tabactive }} &nbsp;|&nbsp; 截止时间{{ item.deaddate }} &nbsp;|&nbsp;{{ tabactive }}
</div> </div>
</div> </div>
<div v-if=" tabactive == '待批改' " class="class-reserv-item-progress">
<el-progress :text-inside="true" :stroke-width="26" :percentage="item.finishpercent" :color="'#000fff'" style="cursor: pointer"></el-progress>
<span>
已交(
<span>
<span v-if="item.workdataresultcount!=0" style="color:#000fff; font-weight: 900; font-size: 15px">{{ item.workdataresultcount }}</span>
<span v-if="item.workdataresultcount==0">{{ item.workdataresultcount }}</span>
/{{ item.workdataresultsum }}
</span>
)
</span>
</div>
<div v-if=" tabactive == '待批改' " class="class-reserv-item-progress">
<el-progress :text-inside="true" :stroke-width="26" :percentage="item.teacherCorrectionProgress" :color="'#ff7f00'" style="cursor: pointer"></el-progress>
<span>
已批阅(<span style="color: #ff7f00; font-weight: 900; font-size: 15px">{{ item.teacherrationgcount}}</span>)
</span>
</div>
<!-- TODO 练习次数引用次数 这里随便的假数据-->
<div v-if=" tabactive == '已批改' " class="class-reserv-item-tool">
<span style="color:#000fff; font-weight: 900; font-size: 15px">{{ item.workdataresultsum }}</span>
<span>练习次数</span>
</div>
<div v-if=" tabactive == '已批改' " class="class-reserv-item-tool">
<span style="color: #ff7f00; font-weight: 900; font-size: 15px">{{ item.teacherrationgcount?item.workdataresultsum - item.teacherrationgcount:item.workdataresultsum }}</span>
<span>引用次数</span>
</div>
<div class="class-reserv-item-tool"> <div class="class-reserv-item-tool">
<span> <span>
<span v-if="item.workdataresultcount!=0" style="color:#000fff; font-weight: 900; font-size: 15px">{{ item.workdataresultcount }}</span>
<span v-if="item.workdataresultcount==0">{{ item.workdataresultcount }}</span>
/{{ item.workdatacount }}</span>
<span>已交</span>
</div>
<div class="class-reserv-item-tool">
<!-- 总人数-已批阅人数 -->
<span style="color: #ff7f00; font-weight: 900; font-size: 15px">{{ item.teacherrationgcount?item.workdatacount - item.teacherrationgcount:item.workdatacount }}</span>
<span>待批阅</span>
</div>
<div class="class-reserv-item-tool">
<span>
<!-- {{ item.averagetime?item.averagetime:0 }} -->
<!-- <span v-if=" item.averagetime<60 ">
<span style="color: #007fff; font-weight: 900; font-size: 15px">{{ item.averagetime }}</span>分钟
</span>
<span v-if=" item.averagetime==60 ">
<span style="color: #007fff; font-weight: 900; font-size: 15px">1</span>小时
</span>
<span v-if=" item.averagetime>60 ">
<span style="color: #007fff; font-weight: 900; font-size: 15px">{{ Math.floor(item.averagetime / 60)}}</span>小时
<span style="color: #007fff; font-weight: 900; font-size: 15px">{{ Math.floor(item.averagetime % 60)}}</span>分钟
</span> -->
<span style="color: #007fff; font-weight: 900; font-size: 15px">{{ item.averagetime }}</span>分钟 <span style="color: #007fff; font-weight: 900; font-size: 15px">{{ item.averagetime }}</span>分钟
</span> </span>
<span>平均用时</span> <span>平均用时</span>
@ -97,6 +106,11 @@ const props = defineProps({
} }
} }
} }
.class-reserv-item-progress {
width: 200px;
padding: 0 10px;
font-size: 14px;
}
.class-reserv-item-tool { .class-reserv-item-tool {
margin-left: 10px; margin-left: 10px;
display: flex; display: flex;

View File

@ -1,821 +0,0 @@
<template>
<el-dialog
v-model="classWorkAnalysis.open"
:modal-append-to-body="false"
class="clwk_dialog"
style="width: 90%; height: 85vh"
:show-close="false"
top="8vh"
append-to-body
destory-on-close
:before-close="onBeforeClose"
>
<template #header>
<div style="font-size: 18px; display: flex; flex-wrap: nowrap">
<div style="flex: 1">
{{ classWorkAnalysis.title }}完成情况
<el-tag :type="classWorkAnalysis.workclass" size="large" style="height: 25px">{{
classWorkAnalysis.worktype
}}</el-tag>
</div>
<!-- classWorkAnalysis.entpcourseworklistarray 当前学习任务所包含的试题ID -->
<el-row
v-if="classWorkAnalysis.entpcourseworklistarray.length > 0"
style="margin: 0 auto; flex: 1"
>
<el-button-group style="margin-bottom: 10px">
<el-button
:type="classWorkAnalysis.view == 'studentview' ? 'success' : ''"
@click="classWorkAnalysis.view = 'studentview'"
>作业批阅</el-button
>
<el-button
v-if="classWorkAnalysis.row.worktype == '习题训练'"
:type="classWorkAnalysis.view == 'quizStats' ? 'success' : ''"
@click="workHandle('quizStats')"
>逐题讲评</el-button
>
<el-button
v-if="classWorkAnalysis.row.worktype == '习题训练'"
:type="classWorkAnalysis.view == 'report' ? 'success' : ''"
@click="handleClassOverviewOpen('report')"
>训练报告</el-button
>
</el-button-group>
</el-row>
<div style="flex: 1">
<div
style="float: right; padding: 0 10px; cursor: pointer"
icon="el-icon-close"
@click="closeDialog"
>
x
</div>
</div>
</div>
</template>
<!-- 如果当前学习没有试题 :height="mainHeight"-->
<div
v-if="classWorkAnalysis.view == 'studentview'"
style="width: 100%; height:73vh; "
class="clwk_dialog_view"
>
<div class="view_table">
<el-radio-group
v-model="tableRadio.value"
style="margin-bottom: 1px"
@change="tableRadioChange"
>
<el-radio-button :value="1" :label="'已交' + '' + tableRadio.num1 + ''" />
<el-radio-button :value="0" :label="'未交' + '' + tableRadio.num0 + ''" />
</el-radio-group>
<!-- 学生列表classWorkAnalysis.classworkdata; 已交未交tableRadio.list -->
<el-table
v-loading="loading_dt_table"
:data="tableRadio.list"
row-key="id"
style="height: 69vh;"
highlight-current-row
@row-click="getStudentClassWorkDataDetail"
>
<el-table-column type="index" label="序号" width="52" reserve-selection align="center" />
<el-table-column label="姓名" prop="studentname" width="100" align="center" />
<el-table-column :label="tableRadio.value==0?'提交状态':'提交时间'" prop="updatedate" width="170" align="center">
<template #default="scope">
<span v-if="tableRadio.value==0" style="color: #2196f3">未提交</span>
<span v-if="tableRadio.value==1">{{ scope.row.updatedate }}</span>
</template>
</el-table-column>
<el-table-column :label="tableRadio.value==0?'':'得分'" prop="score" width="80" align="center" >
<template #default="scope" v-if="tableRadio.value==1">
<span style="color: #2196f3">{{scope.row.getScore || 0}}</span>
</template>
</el-table-column>
<el-table-column label="批阅状态" prop="teacherRating" align="center" width="120" sortable>
<template #default="scope">
<template v-if="scope.row.teacherRating == 0">
<span v-if="tableRadio.value==1" style="color: #2196f3">待批阅</span>
</template>
<!-- 1- 2-优减 3- 4-良减 5- -->
<template v-if="scope.row.teacherRating == 1"
><el-tag type="danger">完美</el-tag></template
>
<template v-if="scope.row.teacherRating == 2"
><el-tag type="danger">优秀</el-tag></template
>
<template v-if="scope.row.teacherRating == 3"
><el-tag type="warning">良好</el-tag></template
>
<template v-if="scope.row.teacherRating == 4"
><el-tag type="info">及格</el-tag></template
>
<template v-if="scope.row.teacherRating == 5"
><el-tag type="info">不及格</el-tag></template
>
</template>
</el-table-column>
</el-table>
</div>
<div class="view_teachrting">
<div class="classwork-score">
<div v-if="classWorkAnalysis.activeStudentQuizlist.length == 0">
<el-empty
description="点击左侧表格学生信息可查看批阅详情"
style="width: 100%; height: 500px"
></el-empty>
</div>
<div v-else>
<div v-if="isopen_dtwk_table">
<div v-show="classWorkAnalysis.activeStudentQuizlist.length > 0">
<item-dialog-score
ref="classWorkAnalysisScoreDialogRef"
@class_work_score_submit="onClassWorkScoreSubmit"
/>
</div>
</div>
<div v-else>
<el-empty
description="点击左侧表格学生信息可查看批阅详情"
style="width: 100%; height: 500px"
></el-empty>
</div>
</div>
</div>
</div>
</div>
<!-- 逐题讲评 -->
<div v-else-if="classWorkAnalysis.view == 'quizStats'">
<quiz-stats :active-data="classWorkActiveData" />
</div>
<!-- 训练报告-->
<div v-else-if="classWorkAnalysis.view == 'report'" style="overflow-y: scroll">
<!-- <ClassOverview :table-list="overviewData" :eval-id="courseObj.evalid"></ClassOverview> -->
<ClassOverview :active-data="classWorkActiveData" :table-list="overviewData"></ClassOverview>
</div>
<!-- <template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="classWorkAnalysis.open=false"> </el-button>
</div>
</template> -->
</el-dialog>
</template>
<script setup name="itemDialogRef">
import { ref, defineExpose, onMounted, reactive, computed, watch, onUnmounted, nextTick, getCurrentInstance } from 'vue'
import { addSmartClassReserv, updateSmartClassReserv, listClassmain } from '@/api/classManage'
import { listClassworkdata, listEntpcoursework, listClassworkeval } from '@/api/classTask'
import useUserStore from '@/store/modules/user'
import { ElMessage } from 'element-plus'
import { getCurrentTime, getAfterMinutes } from '@/utils/date'
import { processList } from '@/hooks/useProcessList'
import ItemDialogScore from '@/views/classTask/container/classTask/item-dialog-score.vue'
// zdg:
import quizStats from '@/views/classTask/container/quizStats.vue'
import ClassOverview from '@/views/classTask/container/classOverview.vue'
const { proxy } = getCurrentInstance()
const emit = defineEmits(['cle-click'])
const props = defineProps({
bookId: {
type: Number,
default: 0
},
})
const mainHeight = ref(document.documentElement.clientHeight - 110)
const classWorkAnalysis = reactive({
open: false
})
const tableRadio = reactive({
value: '1', //
list: [], // list
num1: 0, //
num0: 0 //
}) //
const loading_dt_table = ref(false)
const isopen_dtwk_table = ref(false)
// zdg:
const classWorkActiveData = reactive({
quizlist: [], //
studentList: [], // -
workFeedList: [], // -
timerId: 0 // id
})
//-
const classWorkAnalysisScore = reactive({
studentObj: {}, //
studentQuizAllList: [], // list
quizlist: [] // list
})
//
const overviewData = ref([])
// watch(
// // () => props.currentNode,
// (newValue, oldValue) => {
// form.name = newValue.label
// }
// )
const openDialog = (data) => {
console.log(data, '点击的item完成情况')
classWorkAnalysis.title = data.uniquekey ? data.uniquekey + '--' : ''
classWorkAnalysis.worktype = data.worktype
classWorkAnalysis.workclass = data.workclass
//
tableRadio.list = []
tableRadio.value = '1'
tableRadio.num0 = 0
tableRadio.num1 = 0
classWorkAnalysis.open = true
//
classWorkAnalysis.view = 'studentview'
// ID
classWorkAnalysis.entpcourseworklistarray = data.entpcourseworklistarray
//
classWorkAnalysis.activeStudentQuizlist = []
//
classWorkAnalysis.activeQuizAnalysisData = []
classWorkAnalysis.row = data
// window.test = this
// zdg:
const studentArr = data.classworkdatastudentids
? JSON.parse(`[${data.classworkdatastudentids}]`)
: []
classWorkActiveData.studentList = studentArr
/** 学生完成情况分析--获取作业学生list数据 */
getClassWorkStudentList(data.id)
// idlist
var ids = []
for (var i = 0; i < data.entpcourseworklistarray.length; i++) {
ids.push(data.entpcourseworklistarray[i].id)
}
//
listEntpcoursework({ ids: ids.join(','), pageSize: 500 }).then((idres) => {
for (var i = 0; i < idres.rows.length; i++) {
// // + .replace(/!@#\$%/g,'')
idres.rows[i].titletext = idres.rows[i].title.replace(/!@#\$%/g, '')
}
classWorkAnalysis.quizlist = idres.rows
classWorkActiveData.quizlist = idres.rows // zdg: 使
processList(classWorkActiveData.quizlist);
//
// + , pageSize: 100
listClassworkeval({ workid: data.id, pageSize: 1000 }).then((wevalres) => {
for (var i = 0; i < classWorkAnalysis.quizlist.length; i++) {
//
var scoingCount = 0
var feedcount = 0
//
var evalCount = 0
for (var w = 0; w < wevalres.rows.length; w++) {
if (wevalres.rows[w].entpcourseworkid == classWorkAnalysis.quizlist[i].id) {
evalCount++
//
if (wevalres.rows[w].feedcontent != '') {
//
feedcount++
//
if (wevalres.rows[w].feedcontent == wevalres.rows[w].rightanswer) {
wevalres.rows[w].scoingStatus = true
scoingCount++
// =
wevalres.rows[w].teacherRating = wevalres.rows[w].score
} else {
wevalres.rows[w].scoingStatus = false
}
}
}
}
classWorkAnalysis.quizlist[i].evalCount = evalCount
//
classWorkAnalysis.quizlist[i].feedcount = feedcount
// NaN% scoingRate
if (scoingCount == 0 && feedcount == 0) {
classWorkAnalysis.quizlist[i].scoingRate = '0%'
} else {
classWorkAnalysis.quizlist[i].scoingRate =
((scoingCount / feedcount) * 100).toFixed(0) + '%'
}
}
// zdg:
const getStudentid = (workdataid) => {
// id
const classworkdata = (classWorkAnalysis.classworkdata || []).find(
(o) => o.id === workdataid
)
return classworkdata ? classworkdata.studentid : ''
}
wevalres.rows.forEach((o) => {
o.studentid = getStudentid(o.workdataid)
})
classWorkActiveData.workFeedList = wevalres.rows
})
})
console.log(classWorkAnalysis, '点击进度后获得的数据')
}
//#region
/** 1、获取作业学生列表 */
const getClassWorkStudentList = (rowId) => {
// rowid使
localStorage.setItem('activeClassWorkRowId', rowId)
//
classWorkAnalysis.classworkdata = []
// _
loading_dt_table.value = true
// classworkdata
listClassworkdata({ classworkid: rowId, pageSize: 100 })
.then((response) => {
for (var i = 0; i < response.rows.length; i++) {
if (response.rows[i].entpcourseworklist != '') {
response.rows[i].entpcourseworkarray = JSON.parse(
'[' + response.rows[i].entpcourseworklist + ']'
)
} else {
response.rows[i].entpcourseworkarray = []
}
// 0
response.rows[i].teacherRating = 0
//
if (
response.rows[i].classworkevallist != '' &&
response.rows[i].classworkevallist != null &&
response.rows[i].classworkevallist != 'null'
) {
// , : "{\"id\":172910, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"}"
// .replace(/"(\[.*\])"/g, '$1'); eg: "feedcontent\":\"[{\"name\":\"Bliss.jpg\",\"url\":\"https://wzyzoss.3b8daa474.jpg\"}]\",
// json .replace(/""/g, '"') eg: """"
response.rows[i].classworkevallist = escapeHtmlQuotes(response.rows[i].classworkevallist)
//console.log('classworkevallist', response.rows[i].classworkevallist)
const evalarray = JSON.parse('[' + response.rows[i].classworkevallist + ']')
var scoingCount = 0
var feedcount = 0
let score = 0
for (var e = 0; e < evalarray.length; e++) {
if (evalarray[e].feedcontent != '') {
feedcount++
//
if (evalarray[e].feedcontent == evalarray[e].rightanswer) {
scoingCount++
score += evalarray[e].score;
evalarray[e].teacherRating = evalarray[e].score
}
}
}
const allScore = evalarray.reduce((acc, cur) => acc + cur.score, 0)
//console.log(evalarray, 'evalarray------------------------------------')
if (feedcount > 0) {
// : /*100
response.rows[i].scoingRate = ((score / allScore) * 100).toFixed(0) + '%'
response.rows[i].getScore = score
} else {
response.rows[i].scoingRate = '0%'
response.rows[i].getScore = 0
}
// :
if (evalarray[0].rating != '') {
response.rows[i].teacherRating = evalarray[0].rating
}
} else {
response.rows[i].scoingRate = '0%'
response.rows[i].getScore = 0
}
}
classWorkAnalysis.classworkdata = response.rows
loading_dt_table.value = false
//
tableRadio.list =
classWorkAnalysis.classworkdata &&
classWorkAnalysis.classworkdata.filter((item) => item.finishtimelength != '0')
tableRadio.value = '1'
tableRadio.num0 = classWorkAnalysis.classworkdata.length - tableRadio.list.length
tableRadio.num1 = tableRadio.list.length
tableRadio.list = tableRadio.list.map((item) => {
return {
...item,
teacherRating : checkWorkType(item)
}
})
})
.catch(() => {
loading_dt_table.value = false
})
}
const checkWorkType = (item) => {
//
const subType = classWorkActiveData.quizlist.map(item => item.worktype)
const objectiveQuestion = ['单选题','多选题','判断题']
let rating = 0
//
if(subType.every(item => objectiveQuestion.includes(item))){
//
const score = extractedNumber(item.scoingRate)
if(0<=score && score<=59){
rating = 5
}else if(60<=score && score<=69){
rating = 4
}else if(70<=score && score<=79){
rating = 3
}else if(80<=score && score<=99){
rating = 2
}else{
rating = 1
}
}
return rating
}
//
const extractedNumber = (score) => {
const match = score.match(/\d+/);
return match ? parseInt(match[0], 10) : null;
}
/** 2、查看某一个学生的学习任务完成详情*/
const getStudentClassWorkDataDetail = (row) => {
//
// this.classWorkAnalysis.quizlist
console.log(row, '点击了左侧学生')
//
classWorkAnalysisScore.studentObj = row
listClassworkeval({ workdataid: row.id, pageSize: 100 })
.then((wevalres) => {
for (var i = 0; i < classWorkAnalysis.quizlist.length; i++) {
//
for (var w = 0; w < wevalres.rows.length; w++) {
if (wevalres.rows[w].entpcourseworkid == classWorkAnalysis.quizlist[i].id) {
wevalres.rows[w].quiztitle = classWorkAnalysis.quizlist[i].title
wevalres.rows[w].quiztitletext = classWorkAnalysis.quizlist[i].title.replace(
/<[^>]*>/g,
''
)
wevalres.rows[w].score = wevalres.rows[w].score ? wevalres.rows[w].score : 0
// html
// wevalres.rows[w].rightanswer =
// wevalres.rows[w].rightanswer != '' && wevalres.rows[w].rightanswer != null
// ? wevalres.rows[w].rightanswer.replace(/<[^>]+>/g, '')
// : wevalres.rows[w].rightanswer
// // html
// wevalres.rows[w].feedcontent =
// wevalres.rows[w].feedcontent != '' && wevalres.rows[w].feedcontent != null
// ? wevalres.rows[w].feedcontent.replace(/<[^>]+>/g, '')
// : wevalres.rows[w].feedcontent
if (classWorkAnalysis.row.worktype == '常规作业') {
wevalres.rows[w].feedcontent = JSON.parse(wevalres.rows[w].feedcontent)
}
if (wevalres.rows[w].feedcontent != '') {
if (wevalres.rows[w].feedcontent == wevalres.rows[w].rightanswer) {
wevalres.rows[w].scoingStatus = true
// =
wevalres.rows[w].teacherRating = wevalres.rows[w].score
} else {
wevalres.rows[w].scoingStatus = false
}
} else {
wevalres.rows[w].scoingStatus = ''
}
//
}
// "" prop="feedcontent" width="200" align="center"></el-table-column>
// <el-table-column label="" prop="rightanswer"
// +
wevalres.rows[w].worktitle = wevalres.rows[w].worktitle.replace(/!@#\$%/g, '')
// feedcontent\r<br />
wevalres.rows[w].feedcontent = wevalres.rows[w].feedcontent.replace(/(?<!\\)\n/g, '<br />'); //\n\\n \\n
}
}
classWorkAnalysis.activeStudentQuizlist = wevalres.rows
//
isopen_dtwk_table.value = true
//
if (wevalres.rows.length > 0) {
handleClassWorkAnalysissScoreOpen(row)
} else {
ElMessage({
type: 'warning',
message: '未获取到答题信息,请稍后再看,或者联系管理员查看情况!'
})
}
})
.catch(() => {
console.log('获取完成情况失败')
ElMessage({
type: 'warning',
message: '未获取到答题信息!'
})
})
}
/** 3、教师批改后返回的方法*/
const onClassWorkScoreSubmit = () => {
console.log('批改后返回的方法')
loading_dt_table.value = true
isopen_dtwk_table.value = false
// 1table- classWorkAnalysis.classworkdata- classWorkAnalysis.activeStudentQuizlist
// -
classWorkAnalysis.classworkdata = []
classWorkAnalysis.activeStudentQuizlist = []
// 2
const rowid = localStorage.getItem('activeClassWorkRowId')
getClassWorkStudentList(rowid)
}
// ()
const handleClassWorkAnalysissScoreOpen = (row) => {
console.log(row, '所选点击的信息')
// list
classWorkAnalysisScore.studentQuizAllList = classWorkAnalysis.activeStudentQuizlist
// list
classWorkAnalysisScore.quizlist = classWorkAnalysis.quizlist
//
processList(classWorkAnalysisScore.quizlist)
//
classWorkAnalysisScore.maxheight = mainHeight.value - 100
//
nextTick(() => {
proxy.$refs.classWorkAnalysisScoreDialogRef.acceptParams(classWorkAnalysisScore)
})
}
//#endregion
/** 批阅:已交未交事件 */
const tableRadioChange = (e) => {
// ui
isopen_dtwk_table.value = false;
console.log(e,'??????')
console.log("学生列表:", classWorkAnalysis.classworkdata)
if(e=='1'){
tableRadio.list = classWorkAnalysis.classworkdata.filter(item => item.finishtimelength != '0')
tableRadio.value = '1';
tableRadio.num0 = classWorkAnalysis.classworkdata.length - tableRadio.list.length;
tableRadio.num1 = tableRadio.list.length;
}else if(e=='0'){
tableRadio.list = classWorkAnalysis.classworkdata.filter(item => item.finishtimelength == '0')
tableRadio.value = '0';
tableRadio.num0 = tableRadio.list.length;
tableRadio.num1 = classWorkAnalysis.classworkdata.length - tableRadio.list.length;
}
}
//
const escapeHtmlQuotes = (str) => {
// replace,
const regex1 = /\\+/g; //
let result = str.replace(regex1, '\\');
result = str.replace(/(?<!\\)\n/g, '<br />'); //\n\\n \\n
return result;
}
//#region
// -
const workHandle = (type) => {
// ui
isopen_dtwk_table.value = false;
classWorkAnalysis.view = type
const isClose = type != 'quizStats' && !! classWorkActiveData.timerId
const isOpen = type == 'quizStats' && !classWorkActiveData.timerId
//
if(type == 'quizStats') {
getWorkFeedList();
}
if (isClose) clearInterval(classWorkActiveData.timerId) //
if (isOpen) {
//
classWorkActiveData.timerId = setInterval(() => {
console.log('zdg: 定时执行')
getWorkFeedList()
}, 20 * 1000);
}
}
// -
const getWorkFeedList = async() =>{
const workid = classWorkAnalysis.row.id
const res = await listClassworkeval({workid, isFinish: 1, pageSize: 1000})
const getStudentid = (workdataid) => { // id
const classworkdata = (classWorkAnalysis.classworkdata||[]).find(o => o.id === workdataid)
return classworkdata ? classworkdata.studentid : ''
}
res.rows.forEach(o => { o.studentid = getStudentid(o.workdataid) })
classWorkActiveData.workFeedList = res.rows
}
//#endregion
//#regin
/*
author: yangws
time: 2024-8-06 16:35:33
function: 训练报告的处理
*/
const handleClassOverviewOpen = (type) =>{
// ui
isopen_dtwk_table.value = false;
classWorkAnalysis.view = type
const data = classWorkAnalysis.row
//
listClassworkdata({classworkid: data.id, pageSize: 100}).then((response) => {
if(response.code === 200){
response.rows.forEach(item => {
let rightAnswer = 0
let answers = 0
let score = 0
if(!item.classworkevallist) return
// 使
let replacedString = item.classworkevallist.replace(/""/g, "\"");
// , : "{\"id\":172907, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358520, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172908, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":358521, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172909, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363096, \"feedcontent\":\"\", \"score\":4, \"rightanswer\":\"\"},{\"id\":172910, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363098, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"},{\"id\":172911, \"rating\":0, \"teacherRating\":0, \"entpcourseworkid\":363100, \"feedcontent\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\", \"score\":4, \"rightanswer\":\"<bdo class=\"mathjye-underpoint2\"></bdo>\"}"
replacedString = escapeHtmlQuotes(item.classworkevallist);
let allTopic
try{
allTopic = JSON.parse(`[${item.classworkevallist}]`)
}catch{
allTopic = JSON.parse(`[${replacedString}]`)
}
if(item.classworkevallist != ''){
allTopic.forEach(itemTopic => {
if(itemTopic.feedcontent != ''){
answers ++
//
if(itemTopic.feedcontent === itemTopic.rightanswer){
rightAnswer ++
score += itemTopic.score
itemTopic.teacherRating = itemTopic.score
}
}
})
const allScore = allTopic.reduce((acc, cur) => {
return acc + cur.score;
},0)
rightAnswer > 0?item.scoingRate = (score/allScore * 100).toFixed(0):item.scoingRate = ''
}else{
item.scoingRate = ''
item.getScore = 0
}
//
const point = allTopic.reduce((acc, cur) => {
if(cur.rating !== 0){
return acc + cur.teacherRating;
}
},0)
// item.chapter = this.courseObj.evalid
item.point = point || 0
item.rating = allTopic[0].rating
})
overviewData.value = [...response.rows]
}
})
}
//#endregion
const onBeforeClose = () =>{
console.log('非正常关闭dialog?esc、dialog外部区域')
closeDialog()
}
const closeDialog = () => {
classWorkAnalysis.open = false
emit('cle-click')
}
watch(classWorkAnalysis, (newVal, oldVal) => {
if(newVal.view != 'quizStats'){
console.log('关闭zdg: 定时执行')
clearInterval(classWorkActiveData.timerId) //
}
})
onUnmounted(() => {
clearInterval(classWorkActiveData.timerId) //
})
defineExpose({
openDialog,
})
</script>
<style scoped lang="scss">
/*:deep(.reserv-date-pick) {
width: 140px;
}
:deep(.reserv-time-pick) {
width: 240px;
}*/
.clwk_dialog {
.clwk_dialog_view {
display: flex;
flex-direction: row;
justify-content: flex-start;
overflow: hidden;
}
.view_table {
flex: 0 0 auto;
height: 100%;
overflow: hidden;
}
.view_teachrting {
flex: 1;
height: 100%;
/*overflow-y: auto; */
overflow: hidden;
}
}
.clwk_dialog {
display: flex;
justify-content: center;
overflow: hidden;
}
.clwk_dialog .el-dialog {
margin: 0 auto !important;
height: 85%!important;
overflow: hidden;
}
.clwk_dialog .el-dialog__header {
/* position: absolute;
top: 0;
left: 0; */
width: 100%!important;
}
.clwk_dialog .el-dialog__body {
position: absolute;
left: 0;
top: 15px;
bottom: 1px;
right:0;
padding:5px;
z-index:1;
display: flex;
flex-direction: column;
overflow: hidden;
/* overflow:hidden;
overflow-y: auto; */
}
.clwk_dialog .el-dialog__footer{
position: absolute;
bottom: 10px;
right: 10px;
}
.clwk_dialog .classwork-score{
overflow-y: auto;
}
</style>
<style scoped>
.clwk_dialog {
display: flex;
justify-content: center;
overflow: hidden;
}
.clwk_dialog .el-dialog {
margin: 0 auto !important;
height: 85%!important;
overflow: hidden;
}
.clwk_dialog .el-dialog__header {
/* position: absolute;
top: 0;
left: 0; */
width: 100%!important;
}
.clwk_dialog .el-dialog__body {
position: absolute;
left: 0;
top: 15px;
bottom: 1px;
right:0;
padding:5px;
z-index:1;
display: flex;
flex-direction: column;
overflow: hidden;
/* overflow:hidden;
overflow-y: auto; */
}
.clwk_dialog .el-dialog__footer{
position: absolute;
bottom: 10px;
right: 10px;
}
.clwk_dialog .classwork-score{
overflow-y: auto;
}
</style>
<style src="@/assets/styles/JYStyle.css"></style>

View File

@ -89,8 +89,8 @@
</el-col> </el-col>
</el-row> </el-row>
<!-- 习题表格 --> <!-- 习题表格 -->
<div class="middle" > <div class="infinite-list-wrapper" >
<el-table :data="workResource.entpCourseWorkList" style="width: 100%; height: 100%;"> <!-- <el-table :data="workResource.entpCourseWorkList" style="width: 100%; height: 100%;">
<el-table-column type="index" width="60" /> <el-table-column type="index" width="60" />
<el-table-column align="left" > <el-table-column align="left" >
<template #header> <template #header>
@ -114,7 +114,48 @@
<el-button type="primary" @click="handleClassWorkQuizAdd('entpcourseworklist', scope.row.id)">添加</el-button> <el-button type="primary" @click="handleClassWorkQuizAdd('entpcourseworklist', scope.row.id)">添加</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table> -->
<ul
v-infinite-scroll="pageLoad"
class="infinite-list"
infinite-scroll-immediate="false"
infinite-scroll-distance='1'
infinite-scroll-delay="1000"
:infinite-scroll-disabled="pageDisabled"
>
<li v-for="(item,index) in workResource.entpCourseWorkList" :key="item" class="infinite-list-item">
<div align="left" style="width: 100%;" >
<!-- <template #header>
<div style="display: flex">
<div style="align-items: center;">题目内容</div>
</div>
</template> -->
<div @click="showExamAnalyseDrawer(item)">
<div>
<span style="width: 20px;">{{ index +1 }}. </span>
<span style="overflow: hidden; text-overflow: ellipsis" v-html="item.titleFormat"></span>
</div>
<div style="overflow: hidden; text-overflow: ellipsis; font-size: 0.9em; margin-top: 6px;" v-html="item.workdescFormat"></div>
<el-col :span="24" style="display: flex">
<div style="font-size: 1em; color: silver; padding-top: 5px">{{ item.entpname }} {{ item.editusername }}</div>
<div style="margin-left: 30px; font-size: 1em; color: silver; padding-top: 5px">{{ item.worktag }}</div>
</el-col>
</div>
</div>
<div align="right" style="width: 72px;">
<el-button type="primary" @click="handleClassWorkQuizAdd('entpcourseworklist', item.id)">添加</el-button>
</div>
</li>
</ul>
<p class="infinite-list-loading" v-if="pageParams.loading">加载中...</p>
<p class="infinite-list-noMove" v-if="pageNoMore">无更多试题...</p>
<div v-if="workResource.entpCourseWorkList.length == 0 && !pageParams.loading">
<el-empty
description="未找到相关试题"
style="width: 100%; height: 200px; margin-top: 20px;"
></el-empty>
</div>
</div> </div>
<!-- 分页 这里不用--> <!-- 分页 这里不用-->
<!-- <div style="height: 55px;"> <!-- <div style="height: 55px;">
@ -231,14 +272,14 @@
</template> </template>
<script setup> <script setup>
import { onMounted, ref, nextTick, watch, reactive, getCurrentInstance } from 'vue' import { onMounted, ref, nextTick, watch, reactive, getCurrentInstance, computed } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import {listEntpcoursework, listEntpcourseworkNew, getEntpcoursework} from '@/api/education/entpCourseWork' import {listEntpcoursework, listEntpcourseworkNew, getEntpcoursework} from '@/api/education/entpCourseWork'
import { addClassworkReturnId } from '@/api/teaching/classwork' import { addClassworkReturnId } from '@/api/teaching/classwork'
import { updateClasswork, listEvaluationclue,readFile, listClassworkeval,delClassworkeval,addClassworkeval,updateClassworkeval } from '@/api/classTask' import { updateClasswork, listEvaluationclue, listClassworkeval,delClassworkeval,addClassworkeval,updateClassworkeval } from '@/api/classTask'
import { listEvaluation } from '@/api/subject' import { listEvaluation } from '@/api/subject'
import { listEntpcoursefile } from '@/api/education/entpcoursefile' import { listEntpcoursefile } from '@/api/education/entpcoursefile'
import { listKnowledgePoint } from "@/api/knowledge/knowledgePoint"; import { listKnowledgePoint } from "@/api/knowledge/knowledgePoint";
@ -250,7 +291,9 @@ import FileUpload from "@/components/FileUpload/index.vue";
import whiteboard from '@/components/whiteboard/whiteboard.vue' import whiteboard from '@/components/whiteboard/whiteboard.vue'
import prevReadMsgDialog from '@/views/classTask/container/newTask/prevReadMsg-Dialog.vue' import prevReadMsgDialog from '@/views/classTask/container/newTask/prevReadMsg-Dialog.vue'
import examDetailsDrawer from '@/components/exam-question/examDetailsDrawer.vue' import examDetailsDrawer from '@/components/exam-question/examDetailsDrawer.vue'
import { JYApiListCT, JYApiListOriginYear, JYApiListSO} from "@/utils/examQuestion/jyeoo"
import {throttle,debounce } from '@/utils/comm'
import { useToolState } from '@/store/modules/tool' import { useToolState } from '@/store/modules/tool'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
const userStore = useUserStore().user const userStore = useUserStore().user
@ -364,6 +407,24 @@ const boardLoading = ref(false);
//---------- //----------
const fileLoading = ref(false); // loading const fileLoading = ref(false); // loading
//
const BASE_LIMIT_COUT = 50; //
const pageNoMore = computed( () => {
if (pageParams.value.total < 1) {
return false;
}
let count = BASE_LIMIT_COUT >= pageParams.value.total ? pageParams.value.total : pageParams.value.originCount+BASE_LIMIT_COUT;
return workResource.entpCourseWorkList.length >= count;
});
const pageDisabled = computed(() => pageParams.value.loading || pageNoMore.value);
const pageParams = ref({
loading: false, //
originCount: 0, //
isFirst: true, //
total: 0,
})
/*** /***
* 作业类型切换 * 作业类型切换
*/ */
@ -381,9 +442,33 @@ const changeFormType = (val) => {
const handleQueryParamFromEntpCourseWork = (queryType) => { const handleQueryParamFromEntpCourseWork = (queryType) => {
// //
// this.paginationParams = {pageNum: 1,pageSize: 10}; // this.paginationParams = {pageNum: 1,pageSize: 10};
//
initPageParams();
handleQueryFromEntpCourseWork(queryType); handleQueryFromEntpCourseWork(queryType);
}; };
let obj = {};
function Apis(key) {
obj[key] = [];
return function(task) {
return new Promise((resolve, reject) => {
obj[key].push(task);
Promise.all([...obj[key]]).then(res => {
const i = obj[key].findIndex(item => {
return item == task;
});
resolve(obj[key][i]);
//arr.splice(i, 1);
})
})
}
}
const client = new Apis('/paht');
/** /**
* @desc: 1习题训练 - 新查询试题 * @desc: 1习题训练 - 新查询试题
* @return: {*} * @return: {*}
@ -392,34 +477,40 @@ const handleQueryParamFromEntpCourseWork = (queryType) => {
* 1 - 按条件查询 * 1 - 按条件查询
* 2 - 按关键词查询 * 2 - 按关键词查询
*/ */
const handleQueryFromEntpCourseWork= (queryType) => { const t = function(name, time) {
//queryForm.pageNum = this.paginationParams.pageNum; return new Promise(resolve => {
//queryForm.pageSize = this.paginationParams.pageSize; const queryForm = {
//
currentPage: paginationParams.pageNum,
pageSize: paginationParams.pageSize,
//
eid: props.bookobj.levelSecondId,
sectionName: props.bookobj.coursetitle,
edusubject: userStore.edusubject,
edustage: userStore.edustage,
//
//
worktype: entpCourseWorkQueryParams.worktype.label,
workTypeId: entpCourseWorkQueryParams.worktype.value,
//
workgroup: entpCourseWorkQueryParams.workgroup,
//
yearStr: entpCourseWorkQueryParams.yearStr !== '-1' ? entpCourseWorkQueryParams.yearStr:'',
//
thirdId: entpCourseWorkQueryParams.point.length > 0 ? entpCourseWorkQueryParams.point[0]:'',
//
keyword: entpCourseWorkQueryParams.keyWord && entpCourseWorkQueryParams.keyWord !== '' ? entpCourseWorkQueryParams.keyWord:'',
const queryForm = { }
// const entpcourseworkres = listEntpcourseworkNew(queryForm);
eid: props.bookobj.levelSecondId,
sectionName: props.bookobj.coursetitle,
edusubject: userStore.edusubject,
edustage: userStore.edustage,
//
//
worktype: entpCourseWorkQueryParams.worktype.label,
workTypeId: entpCourseWorkQueryParams.worktype.value,
//
workgroup: entpCourseWorkQueryParams.workgroup,
//
yearStr: entpCourseWorkQueryParams.yearStr !== '-1' ? entpCourseWorkQueryParams.yearStr:'',
//
thirdId: entpCourseWorkQueryParams.point.length > 0 ? entpCourseWorkQueryParams.point[0]:'',
//
keyword: entpCourseWorkQueryParams.keyWord && entpCourseWorkQueryParams.keyWord !== '' ? entpCourseWorkQueryParams.keyWord:'',
resolve(entpcourseworkres);
})
} }
const handleQueryFromEntpCourseWork= async (queryType) => {
pageParams.value.loading = true;
//
// pageNum: paginationParams.pageNum,
// pageSize: paginationParams.pageSize,
// ( warn: ) // ( warn: )
// if (this.courseObj.edusubject=='' && this.courseObj.edustage=='') { // if (this.courseObj.edusubject=='' && this.courseObj.edustage=='') {
@ -427,35 +518,46 @@ const handleQueryFromEntpCourseWork= (queryType) => {
// queryForm.edusubject = ''; // queryForm.edusubject = '';
// } // }
listEntpcourseworkNew(queryForm).then(entpcourseworkres => { client(t('任务1', 1500)).then(res => {
// if (queryType == 1 && this.entpCourseWorkQueryParams.worktype == '') { console.log("请求返回",res);
// // , if(paginationParams.pageNum == 1){
// const allowedWorkTypes = ['', '', '', '', ''];
// workResource.entpCourseWorkList = entpcourseworkres.rows.filter(item => {
// return !allowedWorkTypes.includes(item.worktype);
// });
// } else {
// workResource.entpCourseWorkList = entpcourseworkres.rows;
// }
if(entpcourseworkres.data&&entpcourseworkres.data.length>0){
workResource.entpCourseWorkList = entpcourseworkres.data;
workResource.entpCourseWorkTotal = entpcourseworkres.data.length;
workResource.entpCourseWorkList.forEach(item=> {
if (item.worktype == '选择题') {
item.worktype = '单选题'
}
})
//
processList(workResource.entpCourseWorkList);
}else{
workResource.entpCourseWorkList = []; workResource.entpCourseWorkList = [];
workResource.entpCourseWorkTotal = 0 workResource.entpCourseWorkTotal = 0;
//
// pageParams.value.loading = false;
// pageParams.value.isFirst = true;
// pageParams.value.originCount = 0;
} }
}) const data = res.data || [];
if(data && data.length>0){
// workResource.entpCourseWorkList = entpcourseworkres.data;
// workResource.entpCourseWorkTotal = entpcourseworkres.data.length;
data.forEach(item=> {
if (item.worktype == '选择题') {
item.worktype = '单选题'
}
})
//
processList(data);
workResource.entpCourseWorkList.push(...data);
//
if (pageParams.value.isFirst) {
pageParams.value.isFirst = false;
pageParams.value.originCount = workResource.entpCourseWorkList.length;
pageParams.value.total = parseInt(res.msg);
}
}
pageParams.value.loading = false;
});
//const entpcourseworkres = await listEntpcourseworkNew(queryForm);
// const data = entpcourseworkres.data;
} }
// //
@ -876,25 +978,85 @@ const showExamAnalyseDrawer = (row) => {
} }
const pageLoad = async() => {
console.log("加载中...")
paginationParams.pageNum ++ ,
//paginationParams.pageSize = 2,
await handleQueryFromEntpCourseWork(0);
}
const initPageParams = () => {
//
workResource.entpCourseWorkList = [];
workResource.entpCourseWorkTotal = 0
//
pageParams.value.loading = false;
pageParams.value.isFirst = true;
pageParams.value.originCount = 0;
pageParams.value.total = 0;
//
paginationParams.pageNum = 1;
paginationParams.pageSize = 10;
}
onMounted(async() => {
//
const name = userStore.edustage + userStore.edusubject;
const jyCT = await JYApiListCT(proxy, name);
if (jyCT.length == 0) {
ElMessage.error('获取题型失败!');
return;
}
entpCourseWorkTypeList.value = jyCT;
//
entpCourseWorkYearList.value = JYApiListOriginYear();
entpCourseWorkGroupList.value = await JYApiListSO(proxy, name);
onMounted(() => {
}) })
// const refreshData = () => {
// console.log("")
// //
// initPageParams();
// //
// handleQueryFromEntpCourseWork(0);
// //
// getQueryFromEvaluationclue();
// //
// getEntpCourseWorkPointList();
// }
// //
// const debounceQueryData = debounce(throttle(refreshData, 1000), 1000);
//
const debounceQueryData = debounce(() => {
console.log("防抖 加载数据中...")
//
initPageParams();
//
handleQueryFromEntpCourseWork(0);
//
getQueryFromEvaluationclue();
//
getEntpCourseWorkPointList();
}, 1000);
watch(() => props.propsformobj.uniquekey, (newVal) => { watch(() => props.propsformobj.uniquekey, (newVal) => {
console.log(props.propsformobj,'propsformobj') console.log(props.propsformobj,'propsformobj')
if(props.propsformobj.uniquekey){ if(props.propsformobj.uniquekey){
classWorkForm.uniquekey = props.propsformobj.uniquekey?cloneDeep(props.propsformobj.uniquekey):''; // classWorkForm.uniquekey = props.propsformobj.uniquekey?cloneDeep(props.propsformobj.uniquekey):''; //
} }
}) })
watch(() => props.bookobj.levelSecondId, (newVal) => { watch(() => props.bookobj.levelSecondId, (newVal, oldVal) => {
console.log(props.bookobj,'课程选择') console.log(props.bookobj,'课程选择')
// debounceQueryData();
handleQueryFromEntpCourseWork(0);
//
getQueryFromEvaluationclue();
//
getEntpCourseWorkPointList();
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -982,6 +1144,46 @@ watch(() => props.bookobj.levelSecondId, (newVal) => {
box-sizing: border-box; box-sizing: border-box;
background-color: rgb(231, 231, 231) background-color: rgb(231, 231, 231)
} }
.infinite-list-wrapper{
height: 100%;
text-align: center;
overflow: auto;
.infinite-list {
padding: 0;
margin: 0;
list-style: none;
.infinite-list-item {
display: flex;
align-items: center;
//justify-content: center;
//height: 50px;
//background: var(--el-color-primary-light-9);
padding: 10px;
border-top: 1px solid #eee;
//color: var(--el-color-primary);
}
.infinite-list-item:hover {
background-color: #F3F5F8;
}
.infinite-list-item + .list-item {
margin-top: 10px;
}
}
.infinite-list-loading{
padding: 10px 0;
border-top: 1px solid #eee;
color: red;
}
.infinite-list-noMove{
padding: 10px 0;
border-top: 1px solid #eee;
color: #999;
}
}
} }
</style> </style>

View File

@ -677,9 +677,7 @@ const handleClassOverviewOpen = (type) =>{
} }
} }
}) })
const allTeacherRating = allTopic.reduce((acc, cur) => { const allTeacherRating = allTopic.reduce((acc, cur) => acc + cur.teacherRating, 0)
return acc + cur.teacherRating;
},0)
rightAnswer > 0?item.scoingRate = (score/allTeacherRating * 100).toFixed(0):item.scoingRate = '' rightAnswer > 0?item.scoingRate = (score/allTeacherRating * 100).toFixed(0):item.scoingRate = ''
item.getScore = score item.getScore = score

View File

@ -14,14 +14,15 @@
<div class="class-left flex"> <div class="class-left flex">
<div class="class-name flex"> <div class="class-name flex">
<span class="name">{{ item.uniquekey }}</span> <span class="name">{{ item.uniquekey }}</span>
<el-tag class="tag" round :type="tagType(item.deaddate)" effect="dark" size="small">{{ <!-- <el-tag class="tag" round :type="tagType(item.deaddate)" effect="dark" size="small">{{
getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate ? '已结束' : '进行中' }}</el-tag> getCurrentTime('YYYY-MM-DD HH:mm') > item.deaddate ? '已批改' : '待批改' }}</el-tag> -->
<el-tag :type="item.workclass" size="large">{{ item.worktype }}</el-tag> <el-tag class="tag" round :type="tagType(item.deaddate)" effect="dark" size="small">待批改</el-tag>
<el-tag :type="item.workclass" size="large">{{ item.worktype }}</el-tag>
</div> </div>
<div class="class-time">{{ item.classcaption }} | 截止时间{{ item.deaddate }} </div> <div class="class-time">{{ item.classcaption }} | 截止时间{{ item.deaddate }} </div>
</div> </div>
<div class="class-right"> <div class="class-right">
<div><span class="num">{{ item.workdataresultcount }}</span> / {{ item.workdatacount }}</div> <div><span class="num">{{ item.workdataresultcount }}</span> / {{ item.workdataresultsum }}</div>
<div>已交</div> <div>已交</div>
</div> </div>
</li> </li>
@ -52,9 +53,10 @@ const getHomework = async () => {
const { edustage, edusubject } = user const { edustage, edusubject } = user
try { try {
const { rows } = await homeworklist({ edituserid: user.userId, edustage, edusubject, deaddate: getTomorrow(), status: '1', orderby: 'deaddate DESC', pageSize: 500 }) const { rows } = await homeworklist({ edituserid: user.userId, edustage, edusubject, deaddate: getTomorrow(), status: '1', orderby: 'deaddate DESC', pageSize: 500 })
// //
homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate) // //homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getCurrentTime('YYYY-MM-DD HH:mm') < item.deaddate) //
// homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getTomorrow() <= item.deaddate) // // homeworkList.value = rows.filter(item => item.deaddate && item.uniquekey && getTomorrow() <= item.deaddate) //
homeworkList.value = rows || [];
homeworkList.value.forEach((item) => { homeworkList.value.forEach((item) => {
// UI // UI
if (item.worktype == '学习目标定位') { if (item.worktype == '学习目标定位') {
@ -72,7 +74,6 @@ const getHomework = async () => {
item.workclass = '' item.workclass = ''
} }
item.workdatacount = JSON.parse('[' + item.classworkdatastudentids + ']').length
// //
if (item.entpcourseworklist != '') { if (item.entpcourseworklist != '') {
item.entpcourseworklistarray = JSON.parse( item.entpcourseworklistarray = JSON.parse(
@ -102,7 +103,8 @@ const onClickItem = (item) => {
} }
const tagType = (time) => { const tagType = (time) => {
return getCurrentTime('YYYY-MM-DD HH:mm') > time ? 'info' : 'warning' return 'warning';
//return getCurrentTime('YYYY-MM-DD HH:mm') > time ? 'info' : 'warning'
} }

View File

@ -161,7 +161,7 @@ const getData = async (data) => {
const params = { const params = {
eid: curNode.value.id, eid: curNode.value.id,
workgroup: '1', workgroup: '1',
worktype: '不限', worktype: '999', // 使
workTypeId: '0', workTypeId: '0',
edusubject: curNode.value.edusubject, edusubject: curNode.value.edusubject,
edustage: curNode.value.edustage, edustage: curNode.value.edustage,

View File

@ -18,7 +18,10 @@ const loadPdfAnimation = (path) => {
},2000) },2000)
} }
onMounted(() => { onMounted(() => {
const bookpath = localStorage.getItem('PDF-LOCAL-PATH') const pdfUrl1 = localStorage.getItem('PDF-TOOL-PATH')
const pdfUrl2 = localStorage.getItem('PDF-LOCAL-PATH')
console.log('tool-pdf 地址: ',pdfUrl1, pdfUrl2)
const bookpath = pdfUrl1 || pdfUrl2
// const filepath = import.meta.env.VITE_APP_RES_FILE_PATH + bookpath // const filepath = import.meta.env.VITE_APP_RES_FILE_PATH + bookpath
// const isDev = process.env.NODE_ENV == 'development' // const isDev = process.env.NODE_ENV == 'development'
// if (isDev) // if (isDev)
@ -28,7 +31,7 @@ onMounted(() => {
// const newpath = getStaticUrl(bookpath, 'user', 'selfFile', true) // const newpath = getStaticUrl(bookpath, 'user', 'selfFile', true)
loadPdfAnimation(bookpath) loadPdfAnimation(bookpath)
// pdfUrl.value = filepath // pdfUrl.value = filepath
// console.log('',newpath); // console.log('',bookpath);
}) })
</script> </script>
<style> <style>

View File

@ -636,6 +636,10 @@ export default {
const path = await this.getBookPathFromServer(data.textBook.curBookPath) const path = await this.getBookPathFromServer(data.textBook.curBookPath)
const localpath = getAppInstallUrl('pdfjs-dist/web/viewer.html', 'user', '\\out\\renderer', true) + "?file=" const localpath = getAppInstallUrl('pdfjs-dist/web/viewer.html', 'user', '\\out\\renderer', true) + "?file="
localStorage.setItem('PDF-LOCAL-PATH',localpath + encodeURIComponent(import.meta.env.VITE_APP_RES_FILE_PATH + path)) localStorage.setItem('PDF-LOCAL-PATH',localpath + encodeURIComponent(import.meta.env.VITE_APP_RES_FILE_PATH + path))
// session
sessionStore.set('curr.textBook', data.textBook)
sessionStore.set('env.pdfBasePath', localpath)
sessionStore.set('env.fileBasePath', import.meta.env.VITE_APP_RES_FILE_PATH)
this.checkFileList = [] this.checkFileList = []
this.currentWorkList = [] this.currentWorkList = []
let cata = parseCataByNode(data.node) let cata = parseCataByNode(data.node)

View File

@ -129,7 +129,7 @@ const sendHomework = (row,type) => {
} }
// //
const closeHomework = async() => { const closeHomework = async() => {
ipcMsgSend('tool-sphere:set:ignore', true) // ipcMsgSend('tool-sphere:set:ignore', true)
} }

View File

@ -26,6 +26,23 @@
<div class="content" v-if="isVisible"> <div class="content" v-if="isVisible">
<slot name="content"> <slot name="content">
<homework v-if="activeObj?.prop === 'resource'" :curNode="curNode" @closeActive="closeActive" /> <homework v-if="activeObj?.prop === 'resource'" :curNode="curNode" @closeActive="closeActive" />
<template v-else-if="activeObj?.prop === 'book'">
<div class="item">
<div class="item-title">
<h3>{{ curNode.label }}</h3>
<span class="sub">{{ curNode.edusubject }}</span>
</div>
<div class="item-content" v-loading="loading">
<el-scrollbar height="300px">
<div class="item-content-item" v-for="item in cData">
<el-tag effect="dark">{{ item.tag }}</el-tag>
<span>{{ item.name }}</span>
<el-button :color="item.color||'#349d44'" size="small" @click="openFile(item)">打开</el-button>
</div>
</el-scrollbar>
</div>
</div>
</template>
<span v-else style="color:red;">{{activeObj}}</span> <span v-else style="color:red;">{{activeObj}}</span>
</slot> </slot>
</div> </div>
@ -37,6 +54,8 @@
import { computed, defineProps, ref, reactive, watchEffect, onMounted} from 'vue' import { computed, defineProps, ref, reactive, watchEffect, onMounted} from 'vue'
import { sessionStore } from '@/utils/store' import { sessionStore } from '@/utils/store'
import homework from './homework.vue'; import homework from './homework.vue';
import { ElMessage } from 'element-plus';
import { toRoter, createWindow } from '@/utils/tool' //
// - // -
const colors = ['#409EFF','#00f389', '#ff7f00', '#ffff00', '#00baff', '#13b189', '#F56C6C'] const colors = ['#409EFF','#00f389', '#ff7f00', '#ffff00', '#00baff', '#13b189', '#F56C6C']
@ -49,7 +68,7 @@ const props = defineProps({
data: { // data: { //
type: Array, type: Array,
default: () => [ default: () => [
{ label: '课件', prop: 'book', isExtra: true, icon: 'icon--kejian' }, { label: '资源', prop: 'book', icon: 'icon--kejian' },
{ label: '活动', prop: 'resource', icon: 'icon-kechengziyuan1' }, { label: '活动', prop: 'resource', icon: 'icon-kechengziyuan1' },
// { label: '', prop: 'interact', icon: 'icon-hudong' }, // { label: '', prop: 'interact', icon: 'icon-hudong' },
// { label: '', prop: 'win', icon: 'icon-tubiaozhizuomobanyihuifu-' }, // { label: '', prop: 'win', icon: 'icon-tubiaozhizuomobanyihuifu-' },
@ -61,10 +80,11 @@ const isVisible = ref(false) // 是否显示内容
const activeObj = ref(null) // const activeObj = ref(null) //
const btnRef = ref(null) // -ref const btnRef = ref(null) // -ref
const topPos = ref(30) // - const topPos = ref(30) // -
const hPost = ref(0) // - const hPost = ref(0) // -
const isFold = ref(false) // const isFold = ref(false) //
const cData = ref(null) //
const loading = ref(false) //
let posBtnAll = {} // let posBtnAll = {} //
let curNode = null // let curNode = null //
// === === // === ===
const list = computed(() => props.data.map((o,i) => { const list = computed(() => props.data.map((o,i) => {
@ -74,6 +94,7 @@ const list = computed(() => props.data.map((o,i) => {
onMounted(() => { onMounted(() => {
posBtnAll = btnRef.value.getBoundingClientRect() posBtnAll = btnRef.value.getBoundingClientRect()
hPost.value = Math.round(posBtnAll.height) hPost.value = Math.round(posBtnAll.height)
// btnRef.value.style.marginTop = -hPost.value / 2 + 'px'
curNode = sessionStore?.get?.('subject.curNode') curNode = sessionStore?.get?.('subject.curNode')
}) })
// === === // === ===
@ -88,7 +109,16 @@ const getStyle = (style,index) => {
return `${style}${style.endsWith(';')?'':';'}color:${color};` return `${style}${style.endsWith(';')?'':';'}color:${color};`
} }
} }
// //
const getContent = o => {
loading.value = true
const { roottitle, edustage, edusubject } = curNode
const textbook = { type: 'book', tag: '教材', name: roottitle }
const course = { type: 'course', tag: '课标', name: `${edustage}-${edusubject}-课标` }
cData.value = [textbook, course]
loading.value = false
}
// :
const clickHandel = (o, e) => { const clickHandel = (o, e) => {
if (!o.isExtra) { // : if (!o.isExtra) { // :
const node = e.target.parentNode.getBoundingClientRect() const node = e.target.parentNode.getBoundingClientRect()
@ -97,12 +127,42 @@ const clickHandel = (o, e) => {
activeObj.value = o activeObj.value = o
const nodeH = parseInt(node.height / 2) // const nodeH = parseInt(node.height / 2) //
topPos.value = Math.round(parseInt(node.top) - posBtnAll.top + nodeH) topPos.value = Math.round(parseInt(node.top) - posBtnAll.top + nodeH)
//
if (['book'].includes(o.prop)) getContent(o)
} }
emit('change', o) emit('change', o)
} }
const closeActive = () =>{ // :
isVisible.value = false const openFile = item => {
if (['book', 'course'].includes(item.type)) {
const isBool = sessionStore.has('curr.textBook')
if (!isBool) return ElMessage.error('打开失败,请重试!')
const textBook = sessionStore.get('curr.textBook')
const pdfBasePath = sessionStore.get('env.pdfBasePath')
const fileBasePath = sessionStore.get('env.fileBasePath')
let path = ''
if (item.type == 'book') path = (textBook.curBookPath||'').replace('.txt', '.pdf')
else path = textBook.curBookPath.replace(/([^-]*)$/, '课标.pdf')
const url = pdfBasePath + encodeURIComponent(`${fileBasePath}${path}`)
console.log(url)
localStorage.setItem('PDF-TOOL-PATH', url)
//
// toRoter(`${process.env['ELECTRON_RENDERER_URL']}/#/fullscreenpdf`)
console.log('pdf_old:' + localStorage.getItem('PDF-LOCAL-PATH'))
console.log('pdf_new:' + localStorage.getItem('PDF-TOOL-PATH'))
// emit('change', { prop: 'bookOpen' })
createWindow('open-win', {url: '/fullscreenpdf'})
}
} }
// :
const closeActive = () =>{
if (isVisible.value) { //
isVisible.value = false
emit('change', { prop: 'close' })
}
}
defineExpose({closeActive}) defineExpose({closeActive})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -111,8 +171,8 @@ defineExpose({closeActive})
position: fixed; position: fixed;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
z-index: 1;
right: 10px; right: 10px;
//min-height: 40vh;
min-width: 4em; min-width: 4em;
border-radius: 4em; border-radius: 4em;
background-color: rgba(18,18,18,0.3); background-color: rgba(18,18,18,0.3);
@ -173,5 +233,33 @@ defineExpose({closeActive})
top: var(--top); top: var(--top);
transform: rotate(45deg); transform: rotate(45deg);
} }
.content{
//
.item{
margin: 0 15px;
&-title{
margin-bottom: 20px;
h3{
font-size: 20px;
font-weight: bold;
color: #fff;
}
.sub{
color: #cecece;
font-size: 15px;
}
}
&-content-item{
display: flex;
background-color: #384342;
padding: 15px 10px;
margin-bottom: 10px;
justify-content: space-between;
align-items: center;
color: #fff;
border-radius: 5px;
}
}
}
} }
</style> </style>

View File

@ -43,6 +43,15 @@ export const createHomework = ({ uniquekey, evalid, data, entpcourseid }) => {
let classWorkList = [] let classWorkList = []
// 将标签中的双引号增加转义
let escapeHtmlQuotes = (str) => {
// 后端已replace双引号, 故前端不用在处理
const regex1 = /\\+/g; // 匹配多个反斜杠
let result = str.replace(regex1, '\\');
result = str.replace(/(?<!\\)\n/g, '<br />'); //替换\n而不替换\\n 为 \\n
return result;
}
/** /**
* 获取班级作业 * 获取班级作业
*/ */
@ -52,8 +61,8 @@ export const getClassWorkList = async (id) => {
/** /**
* 2024-10-17 由于 后面截止时间加了 时分特加判断 * 2024-10-17 由于 后面截止时间加了 时分特加判断
* 1进行中以前是以明天判断现改为传当天的日期并根据当前日期的时分与截止日期进行判断 * 1待批改以前是以明天判断现改为传当天的日期并根据当前日期的时分与截止日期进行判断
* 2结束以前默认是以明天判断现依然以明天为判断并根据当前日期时分大于截止日期时分判断 * 2批改以前默认是以明天判断现依然以明天为判断并根据当前日期时分大于截止日期时分判断
*/ */
let list = response.rows let list = response.rows
@ -61,7 +70,6 @@ export const getClassWorkList = async (id) => {
for (var i = 0; i < list.length; i++) { for (var i = 0; i < list.length; i++) {
// 初始化部分新增字段值 // 初始化部分新增字段值
list[i].workdatalist = [] list[i].workdatalist = []
list[i].workdatacount = 0 // 人数
list[i].workdatalistVisible = false list[i].workdatalistVisible = false
list[i].workdatafeedbackcount = 0 // 已交人数 list[i].workdatafeedbackcount = 0 // 已交人数
list[i].feedtimelength = 0 list[i].feedtimelength = 0
@ -91,19 +99,10 @@ export const getClassWorkList = async (id) => {
} else { } else {
list[i].entpcourseworklistarray = [] list[i].entpcourseworklistarray = []
} }
// 根据 classworkdatastudentids 初始化判断分配的人数
if (
list[i].classworkdatastudentids != '' &&
list[i].classworkdatastudentids != null &&
list[i].classworkdatastudentids != 'null'
) {
const stuList = JSON.parse('[' + list[i].classworkdatastudentids + ']')
list[i].workdatacount = stuList.length
}
} }
// 显示分配人数(workdatacount)>0 的 // 显示分配人数(workdataresultsum)>0 的
if (list && list.length > 0) { if (list && list.length > 0) {
classWorkList = list && list.filter((item) => item.workdatacount > 0) classWorkList = list && list.filter((item) => item.workdataresultsum > 0)
//TODO 这里没分页,貌似这个 total 不重要,后续看 //TODO 这里没分页,貌似这个 total 不重要,后续看
} else { } else {
classWorkList = [] classWorkList = []
@ -171,18 +170,18 @@ export const getStudentClassWorkData = async () => {
} }
} }
} }
// 当前这个学习任务共推送给了几个学生workdatacount // 当前这个学习任务共推送给了几个学生workdataresultsum
if (res.rows[i].classworkid == classWorkList[t].id) { if (res.rows[i].classworkid == classWorkList[t].id) {
classWorkList[t].workdatalist.push(res.rows[i]) classWorkList[t].workdatalist.push(res.rows[i])
} }
} }
// 计算完成进度 workdatacount人数要大于0 // 计算完成进度 workdataresultsum 人数要大于0
if ( if (
classWorkList[t].workdataresultcount > 0 && classWorkList[t].workdataresultcount > 0 &&
classWorkList[t].workdatacount > 0 classWorkList[t].workdataresultsum > 0
) { ) {
classWorkList[t].finishpercent = parseInt( classWorkList[t].finishpercent = parseInt(
(classWorkList[t].workdataresultcount / classWorkList[t].workdatacount) * 100 (classWorkList[t].workdataresultcount / classWorkList[t].workdataresultsum) * 100
) )
} else { } else {
classWorkList[t].finishpercent = 0 classWorkList[t].finishpercent = 0
@ -211,7 +210,7 @@ export const getStudentClassWorkData = async () => {
var dd = var dd =
(classWorkList[t].rightAnswerCount / (classWorkList[t].rightAnswerCount /
(classWorkList[t].entpcourseworklistarray.length * (classWorkList[t].entpcourseworklistarray.length *
classWorkList[t].workdatacount)) * classWorkList[t].workdataresultsum)) *
100 100
classWorkList[t].scoingRate = dd.toFixed(0) + '%' classWorkList[t].scoingRate = dd.toFixed(0) + '%'
} else { } else {

View File

@ -1,5 +1,7 @@
<template> <template>
<div class="warp-all"> <div class="warp-all">
<!-- 遮罩层 -->
<div class="mask" v-show="isMask" @click="maskChange(true)"></div>
<!-- 画板 --> <!-- 画板 -->
<board-vue v-model="tabActive" v-show="isShow" ref="boardVueRef"></board-vue> <board-vue v-model="tabActive" v-show="isShow" ref="boardVueRef"></board-vue>
@ -62,7 +64,8 @@ const isDrag = ref(false) // 开始拖拽
const dragtime = ref(0) // - const dragtime = ref(0) // -
const isShow = ref(false) // - const isShow = ref(false) // -
const isOver = ref(false) // const isOver = ref(false) //
const isOpenBook = ref(false) const isOpenBook = ref(false) // pdf
const isMask = ref(false) //
const toolStore = useToolState() // const toolStore = useToolState() //
const boardVueRef=ref(null) // ref const boardVueRef=ref(null) // ref
const upvoteRef = ref(null) // ref const upvoteRef = ref(null) // ref
@ -93,7 +96,6 @@ onMounted(async() => {
// window.test1 = toolStore // window.test1 = toolStore
getClassInfo() // ex3 getClassInfo() // ex3
resetStatus() // - resetStatus() // -
}) })
// ==== === // ==== ===
@ -101,7 +103,7 @@ onMounted(async() => {
const getClassInfo = async () => { const getClassInfo = async () => {
const { data } = await classManageApi.getClassInfo(classObj.id) const { data } = await classManageApi.getClassInfo(classObj.id)
classObj.data = data classObj.data = data
sessionStore.set('curClassRoom', classObj) // - sessionStore.set('curr.curClassRoom', classObj) // -
// id // id
let timGroupId = data?.ex3 || '' let timGroupId = data?.ex3 || ''
console.log('获取群ID:', timGroupId) console.log('获取群ID:', timGroupId)
@ -143,7 +145,7 @@ const logoHandle = (e,t) => {
// -穿 // -穿
const mouseChange = (bool) => { const mouseChange = (bool) => {
let resBool = false let resBool = false
console.log('mouseChange:', bool, resBool) // console.log('mouseChange:', bool, resBool)
if (!bool) return setIgnore(resBool) // 穿 if (!bool) return setIgnore(resBool) // 穿
if (tabActive.value == 'select') resBool = !!bool if (tabActive.value == 'select') resBool = !!bool
else { else {
@ -152,12 +154,10 @@ const mouseChange = (bool) => {
const isPdf = !resBool && toolStore.isPdfWin const isPdf = !resBool && toolStore.isPdfWin
if (isPdf) resBool = true if (isPdf) resBool = true
} }
console.log('mouseChange:', bool, resBool) // console.log('mouseChange:', bool, resBool)
setIgnore(resBool) setIgnore(resBool)
} }
const touchChange = (e) => {
console.log(e)
}
// im-chat: {type, data} // im-chat: {type, data}
const chatChange = (type, data, ...args) => { const chatChange = (type, data, ...args) => {
if (type == 'createGroup') { // - if (type == 'createGroup') { // -
@ -189,14 +189,6 @@ const setIgnore = (bool) => {ipcMsgSend('tool-sphere:set:ignore', bool)}
// : | // : |
const resetStatus = () => { const resetStatus = () => {
if (toolStore.isToolWin) return // - if (toolStore.isToolWin) return // -
// -
// ipcMain?.removeHandler('tool-sphere:reset') //
// ipcMain?.handle?.('tool-sphere:reset', () => {
// setTimeout(() => {
// boardVueRef.value.handleMode(tabActive.value)
// mouseChange(1)
// }, 500)
// })
toolStore.isToolWin = true // toolStore.isToolWin = true //
} }
// : // :
@ -206,21 +198,16 @@ const sideMouse = e => {
setIgnore(false) // -穿 setIgnore(false) // -穿
return return
} }
mouseChange(type == 'mouseleave') //
// const bool = isMask.value && type =='mouseleave'
if (type == 'mouseleave') { if (bool) mouseChange(false) // 穿
timingSide = setTimeout(() => { else mouseChange(type == 'mouseleave')
sideVueRef.value.closeActive()
}, 500)
} else { //
if (!!timingSide) clearTimeout(timingSide)
}
} }
// : // :
const sideChange = async o => { const sideChange = async o => {
// console.log(o) // console.log(o)
switch(o.prop) { switch(o.prop) {
case 'book': case 'bookOpen':
if(isOpenBook.value) { if(isOpenBook.value) {
isOpenBook.value = false isOpenBook.value = false
ElMessage.info('已经打开课本了哦') ElMessage.info('已经打开课本了哦')
@ -230,7 +217,14 @@ const sideChange = async o => {
isOpenBook.value = true isOpenBook.value = true
} }
break break
case 'book':
isMask.value = !isMask.value
break
case 'close': //
maskChange(false)
break
case 'resource': // case 'resource': //
isMask.value = !isMask.value
break break
case 'interact': // case 'interact': //
break break
@ -267,6 +261,13 @@ const sideChange = async o => {
} }
} }
// -
const maskChange = (bool) => {
isMask.value = false
bool && sideVueRef.value.closeActive() //
mouseChange(true) // 穿
}
// === === // === ===
watchEffect(() => { watchEffect(() => {
if (isOver.value) return // , if (isOver.value) return // ,
@ -286,6 +287,12 @@ watchEffect(() => {
.warp-all{ .warp-all{
position: relative; position: relative;
} }
//
.mask{
position: fixed;
inset: 0;
background: rgba(1, 1, 1, 0.3);
}
// //
.tool-bottom-all{ .tool-bottom-all{
// width: 45vw; // width: 45vw;
@ -328,6 +335,7 @@ watchEffect(() => {
} }
} }
} }
//
.a-fade-leave-active,.a-fade-enter-active{ .a-fade-leave-active,.a-fade-enter-active{
transition: all .3s; transition: all .3s;
} }