Compare commits

...

22 Commits

Author SHA1 Message Date
zouyf 92f23a35f9 Merge branch 'main' into zouyf_dev 2024-10-20 15:04:33 +08:00
qinqing 80c38152d2 Merge pull request '屏蔽ocr识别' (#345) from qinqing_dev into main
Reviewed-on: #345
2024-10-20 12:11:50 +08:00
qinqing 0cefb94721 屏蔽ocr识别 2024-10-20 12:08:37 +08:00
yangws 5ff18bf4aa Merge pull request 'yangws' (#344) from yangws into main
Reviewed-on: #344
2024-10-20 01:36:42 +08:00
小杨 688f200d43 Merge branch 'main' of http://27.128.240.72:3000/zhuhao/AIx_Smarttalk into yangws 2024-10-20 01:35:50 +08:00
小杨 46d5078cac fix:训练报告整体修改; 2024-10-20 01:35:45 +08:00
朱浩 cf05038c0d Merge pull request 'zhuhao_dev' (#343) from zhuhao_dev into main
Reviewed-on: #343
2024-10-19 18:02:44 +08:00
朱浩 a72177d02e Merge branch 'main' into zhuhao_dev 2024-10-19 18:02:09 +08:00
朱浩 39f46a1709 生成PPT后自动打开 2024-10-19 18:01:52 +08:00
朱浩 d03e6e2fbc Merge pull request 'zhuhao_dev' (#342) from zhuhao_dev into main
Reviewed-on: #342
2024-10-19 17:34:04 +08:00
朱浩 770a847e91 默认窗口最大化 2024-10-19 17:33:11 +08:00
朱浩 6f35ad8a1a Merge branch 'main' into zhuhao_dev
# Conflicts:
#	src/renderer/src/views/classTask/container/newTask/taskTypeView.vue
2024-10-19 17:21:34 +08:00
zouyf 4e7b9f0a82 Merge pull request 'zouyf_dev' (#341) from zouyf_dev into main
Reviewed-on: #341
2024-10-19 17:20:42 +08:00
qinqing 7b4e6d0b10 Merge pull request 'qinqing_dev' (#340) from qinqing_dev into main
Reviewed-on: #340
2024-10-19 17:20:26 +08:00
qinqing 04d2e47882 Merge branch 'main' into qinqing_dev 2024-10-19 17:20:02 +08:00
qinqing ea2de75415 百度OCR识别 2024-10-19 17:18:52 +08:00
小杨 6b63235084 fix:修改字段名称以及统一逻辑; 2024-10-19 17:14:21 +08:00
朱浩 bddcf2d4ff BUG修复 2024-10-19 17:01:05 +08:00
朱浩 bed3ef96a7 Merge branch 'main' into zhuhao_dev 2024-10-19 16:59:30 +08:00
朱浩 6fe5ee5703 Merge branch 'main' into zhuhao_dev
# Conflicts:
#	src/renderer/src/views/classTask/classTaskAssign.vue
#	src/renderer/src/views/classTask/teachClassTask.vue
2024-10-19 16:42:36 +08:00
朱浩 68de31c569 Merge branch 'main' into zhuhao_dev 2024-10-18 17:12:22 +08:00
朱浩 45485c04fc BUG修复 2024-10-18 17:11:30 +08:00
17 changed files with 406 additions and 278 deletions

View File

@ -15,3 +15,5 @@ VITE_APP_UPLOAD_API = 'https://file.ysaix.com:7868/prod-api'
VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktxt/'
VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/'
VITE_SHOW_DEV_TOOLS = 'true'

View File

@ -17,3 +17,5 @@ VITE_BUILD_COMPRESS = gzip
VITE_APP_RES_FILE_PATH = 'https://prev.ysaix.com:7868/src/assets/textbook/booktxt/'
VITE_APP_BUILD_BASE_PATH = 'https://prev.ysaix.com:7868/'
VITE_SHOW_DEV_TOOLS = 'true'

View File

@ -73,8 +73,7 @@ function createLoginWindow() {
loginWindow.loadFile(join(__dirname, '../renderer/index.html'), { hash: 'login' })
updateInit(loginWindow)
}
loginWindow.webContents.openDevTools()
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') loginWindow.webContents.openDevTools()
loginWindow.once('ready-to-show', () => {
loginWindow.show()
})
@ -96,7 +95,6 @@ function createMainWindow() {
frame: false, // 无边框
autoHideMenuBar: true,
maximizable: false,
fullscreen: true,
icon: join(__dirname, '../../resources/logo2.ico'),
...(process.platform === 'linux' ? { icon } : {}),
webPreferences: {
@ -129,7 +127,7 @@ function createMainWindow() {
shell.openExternal(details.url)
return { action: 'deny' }
})
mainWindow.webContents.openDevTools()
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') mainWindow.webContents.openDevTools()
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
@ -139,6 +137,7 @@ function createMainWindow() {
// mainWindow.setAlwaysOnTop(true, "screen-saver") // 将窗口设置为顶层窗口
// mainWindow.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见
mainWindow.maximize();
// 第三步: 开启remote服务
remote.enable(mainWindow.webContents)
}

File diff suppressed because one or more lines are too long

View File

@ -138,7 +138,7 @@ export const createWindow = async (type, data) => {
wins_tool.setIgnoreMouseEvents(true, {forward: true}) // 忽略鼠标事件但是事件继续传递给窗口
wins_tool.setAlwaysOnTop(true,'screen-saver') // 将窗口设置为顶层窗口
wins_tool.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见
wins_tool.webContents.openDevTools() // 打开调试工具
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') wins_tool.webContents.openDevTools() // 打开调试工具
eventHandles(type, wins_tool) // 事件监听处理
return wins_tool
}
@ -165,7 +165,7 @@ export const createWindow = async (type, data) => {
win.type = type // 唯一标识
win.show()
win.setFullScreen(true) // 设置窗口为全屏
win.webContents.openDevTools() // 打开调试工具
if (import.meta.env.VITE_SHOW_DEV_TOOLS === 'true') win.webContents.openDevTools() // 打开调试工具
eventHandles(type, win) // 事件监听处理
winPdf=win
break

View File

@ -6,7 +6,7 @@
:collapse="isCollapse"
>
<!--左侧 教材 目录-->
<div v-if="!isCollapse" style="height: 100%;overflow: hidden;">
<div v-if="!isCollapse" style="height: 100%;overflow: hidden;">
<ChooseTextbook @change-book="getData" @node-click="getData" />
</div>
</el-menu>
@ -34,7 +34,7 @@
</el-col>
</el-row>
<!-- 作业类型:内容 -->
<div style="flex: 1;overflow: hidden;">
<div style="flex: 1;overflow: hidden;">
<el-table
ref="taskTable"
v-loading="loading"
@ -140,7 +140,7 @@
<div style="color: silver; display: flex;align-items: center;">
<div style="flex: 1;">{{ _item.worktype }}</div>
<div style="flex: 1;">分值{{ _item.score }}</div>
<div style="display: flex;align-items: center;flex: 1;justify-content: flex-end;">
<div style="display: flex;align-items: center;flex: 1;justify-content: flex-end;">
<el-button @click="prevRead(_item)">预览</el-button>
</div>
</div>
@ -188,7 +188,7 @@
</div>
</div>
</div>
<div v-else>
<div v-else>
<div v-if="workConfObj.teachFileList.length > 0">
<div style="margin: 10px 0;text-align: left; margin: auto 0; cursor: pointer;">
<span style="color: #409eff" @click="openFile">预览其他类型附件</span>
@ -220,7 +220,7 @@
<!-- 已推送历史 -->
<el-dialog v-model="pushRecordsOpen" title="推送历史记录" width="80%" append-to-body>
<div style="flex: 1;overflow: hidden; min-height: 400px;">
<div style="flex: 1;overflow: hidden; min-height: 400px;">
<el-table
ref="pushRecordsRef"
:data="pushRecordsList"
@ -287,7 +287,7 @@
<prevReadMsgDialog ref="prevReadMsgDialogRef" :bookobj="courseObj"/>
<!-- 其他附件预览框 acceptParams-->
<prevReadImgFileDialog ref="prevReadImgFileDialogRef"/>
</div>
</div>
</template>
@ -309,7 +309,7 @@ import SetHomework from '@/components/set-homework/index.vue'
import {sessionStore} from '@/utils/store'
import {createWindow} from '@/utils/tool'
import { useToolState } from '@/store/modules/tool'
import {throttle,debounce } from '@/utils/comm'
import {throttle,debounce } from '@/utils/comm'
const toolState = useToolState();
@ -343,7 +343,7 @@ const courseObj = reactive({
})
const taskList = ref([]); //
const loading = ref(false);
const loading = ref(false);
const pushRecordsList = ref([]); //
const pushRecordsOpen = ref(false); //
const pushRecordsLoading = ref(false); // loading
@ -415,7 +415,7 @@ const initHomeWork = async()=> {
}
/**
* 查看推送历史
*
*
*/
const queryPushRecords = (row) => {
//
@ -438,7 +438,7 @@ const queryPushRecords = (row) => {
// if (res.rows[i].worktype == '') {
// res.rows[i].workclass = 'success';
// res.rows[i].workcodesList = JSON.parse(res.rows[i].workcodes);
// } else
// } else
// TODO
if (res.rows[i].worktype == '课堂展示') {
res.rows[i].workclass = 'primary';
@ -477,12 +477,12 @@ const debounceOpenWin = debounce(() => {
//
const onClickItem = (item) => {
console.log('防抖开启弹窗')
// sessionStore.set('teachClassWorkItem', item); // item
// sessionStore.set('teachClassWorkItem', item); // item
localStorage.setItem('teachClassWorkItem', JSON.stringify(item));
debounceOpenWin();
}
/**
/**
* 删除按钮操作 TODO 待完善
* */
const handleDelete =() => {
@ -620,8 +620,8 @@ const handleWorkTitleEdit = (row, index, type) => {
};
/**
* 作业内容-查看详情
* */
* 作业内容-查看详情
* */
const handleWorkEdit = (row, index) =>{
console.log(row, index)
workEdit.value = true
@ -639,7 +639,7 @@ const handleWorkTitleEdit = (row, index, type) => {
if ( res.data==null || res.data==undefined ) {
return;
}
res.data.worktype = '框架梳理';
res.data.score = listCourseWork[0].score;
@ -708,7 +708,7 @@ const handleWorkTitleEdit = (row, index, type) => {
};
/**
* 作业内容-前往作业设计 编辑页面
* @param row
* @param row
*/
const handleWorkEditItem = (row) => {
editListItem(row, courseObj).then((obj) => {
@ -780,11 +780,11 @@ const handleTaskAssignToAllClass = () => {
*/
const handleNewClassWorkDialog = () => {
//
router.push({
router.push({
path: '/newClassTask',
query: {
isBack: true,
}
}
});
}
@ -880,18 +880,20 @@ watch(() => courseObj.node, (newVal,oldVal) => {
</script>
<!--
<style>
.el-table .hidden-row {
display: none !important;
/* color: #ccc !important; */
}
.el-table .father-row {
--el-table-tr-bg-color: #fff;
&#45;&#45;el-table-tr-bg-color: #fff;
}
.el-table .son-row {
--el-table-tr-bg-color: #f0f0f08a;
&#45;&#45;el-table-tr-bg-color: #f0f0f08a;
}
</style>
-->
<style lang="scss" scoped>
.page-classTaskAssign {
@ -935,4 +937,4 @@ watch(() => courseObj.node, (newVal,oldVal) => {
}
}
</style>
<style src="@/assets/styles/JYStyle.css"></style>
<style src="@/assets/styles/JYStyle.css"></style>

View File

@ -1,5 +1,5 @@
<template>
<div class="common-layout" style="width: 100%; height: 73vh;">
<div class="common-layout" style="width: 100%">
<el-container>
<el-container>
<el-header style="height: auto">
@ -7,7 +7,7 @@
<el-card>
<template #header>
<div style="font-size: 20px;font-weight: bold">
学情分布
等级分布
</div>
</template>
<Distribution></Distribution>
@ -18,7 +18,7 @@
<el-card>
<template #header>
<div style="font-size: 20px;font-weight: bold">
分析
时分析
</div>
</template>
<TimeAnalyse></TimeAnalyse>
@ -29,7 +29,7 @@
<el-card>
<template #header>
<div style="font-size: 20px;font-weight: bold">
知识点概览
价值透析
</div>
</template>
<Konwledge></Konwledge>
@ -43,12 +43,12 @@
</template>
<script setup>
import Distribution from '@/views/classTask/container/classOverview/distribution.vue'
import Konwledge from '@/views/classTask/container/classOverview/knowledge.vue'
import TimeAnalyse from '@/views/classTask/container/classOverview/timeAnalyse.vue'
import {ref,watchEffect,provide } from 'vue'
import Distribution from './classOverview/distribution.vue'
import Konwledge from './classOverview/knowledge.vue'
import TimeAnalyse from './classOverview/timeAnalyse.vue'
import {defineProps,watch} from 'vue'
import overviewStore from "@/store/modules/overview";
// import {getBindlist} from "@/api/education/knowledgePoint";
const useOverview = overviewStore()
const props = defineProps({
tableList: {
@ -57,12 +57,185 @@ const props = defineProps({
return []
}
},
// evalId:{
// type: Number,
// default: 0
// }
evalId:{
type: Number,
default: 0
},
activeData: { //
type: Object,
// required: true, //
default: () => ({
quizlist: [], //
studentList: [], // -
workFeedList: [] // -
})
},
})
let studentList = ref([]) //
const stuHasAnswers = ref([]) //
// -
const initData = () => {
console.log('xxx', props)
// window.test = activeCourse
studentList.value = props.activeData.studentList || []
const activeWorkFeedList = props.activeData.workFeedList || []
const quizlist = props.activeData.quizlist || []
//
let data = quizlist.map(o => {
//
const workdesc = o.workdesc || ''
let accSum = 0 //
let activeIds = [] //
let rightIds = [] //
let hasAnswers= [] //
let timeAnalyse = [] //
const quizFeedList = activeWorkFeedList.filter(f => f.entpcourseworkid == o.id) //
let children = []
const allStudents = [];
if (o.worktype == '单选题') { // '',''
const list = workdesc.includes('#&') ? workdesc.split('#&') : isJson(workdesc)?JSON.parse(workdesc):[];
children = list.map((v,i) => {
const code = toCode(i) // A-Z
const isOk = (isJson(workdesc)?JSON.parse(o.workanswer):o.workanswer||'').includes(i+'') // ()
// id
const studentIds = quizFeedList.filter(f => f.feedcontent==v&&f.finishtimelength!='0').map(f => f.studentid)||[];
accSum += studentIds.length;
if (isOk) {
activeIds.push(...studentIds)
}
hasAnswers.push(...studentIds)
return { def: v, code, isOk, studentIds }
})
}
else if (o.worktype == '多选题') {
//
rightIds = quizFeedList.filter(f => {
const workanswer = (isJson(o.workanswer)) ? JSON.parse(o.workanswer) : o.workanswer || [];
const res = isSame((f.feedcontent||'').split(','), workanswer);
return f.entpcourseworkid == o.id && f.finishtimelength!='0' && res;
});
const list = workdesc.includes('#&') ? workdesc.split('#&') : isJson(workdesc)?JSON.parse(workdesc):[];
children = list.map((v,i) => {
const isOne = o.worktype == '单选题'
const code = toCode(i) // A-Z
// const isOk = isOne ? i == o.workanswer : o.workanswer.includes(i) // ()
const isOk = (isJson(workdesc)?JSON.parse(o.workanswer):o.workanswer||'').includes(i+'') // ()
// id
const studentIds = quizFeedList.filter(f => f.feedcontent.includes(i)&&f.finishtimelength!='0').map(f => f.studentid)||[];
accSum += studentIds.length;
if (studentIds.length>0) {
allStudents.push(...studentIds);
}
if(isOk) {
activeIds=[...new Set(activeIds.concat(studentIds))] //
}
hasAnswers=[...new Set(hasAnswers.concat(studentIds))]
return { def: v, code, isOk, studentIds }
})
}
else if (o.worktype == '填空题') { //
const regex = /<!--BA-->(.*?)<!--EA-->/g // <!--BA-->xxx<!--EA-->
children = (o.title||'').match(regex).map((v,i) => {
const def = `填空项 ${i+1}`
//const code = '(&emsp;)'
const code = '(略)', txt=v
// id
const studentIds = quizFeedList.filter(f => !!(f.feedcontent||'').replace(/#$/,'').split('#')[i] && f.finishtimelength!='0').map(f => f.studentid)||[]
activeIds=[...new Set(activeIds.concat(studentIds))] //
hasAnswers=[...new Set(hasAnswers.concat(studentIds))]
accSum = activeIds.length
return { def, code, txt, isOk:true, studentIds }
})
} else if (o.worktype == '判断题') { //
const list = ['正确', '错误'];
children = list.map((v,i) => {
const workanswer = o.workanswer
.replace('×', '0')
.replace('√', '1')
.replace('错误', '0')
.replace('正确', '1')
.replace('正确。', '1')
.replace('F', '0')
.replace('T', '1')
.replace('错', '0')
.replace('对', '1');
const workanswerFormat = isJson(workanswer) ? JSON.parse(workanswer) : workanswer||''
const code = v=='正确' ? '1' : '0'
let isOk = (workanswerFormat).includes(code)
// warn:
// if (workanswerFormat == '0') {
// isOk = !isOk;
// }
// id
const studentIds = quizFeedList.filter(f => {
const feedcontent = f.feedcontent
.replace('×', '0')
.replace('√', '1')
.replace('错误', '0')
.replace('正确', '1')
.replace('正确。', '1')
.replace('F', '0')
.replace('T', '1')
.replace('错', '0')
.replace('对', '1');
if(feedcontent == code&&f.finishtimelength!='0'){
return f
}
}).map(f => f.studentid)||[];
accSum += studentIds.length;
if(isOk) activeIds.push(...studentIds)
hasAnswers.push(...studentIds)
return { def: v, code: v, isOk, studentIds }
})
} else { //
// code = '(&emsp;)'
const code = '(略)', def = '解答内容'
const studentIds = quizFeedList.filter(f => !!(f.feedcontent||'').replace(/#$/,'')&&f.finishtimelength!='0').map(f => f.studentid)||[]
activeIds=[...new Set(activeIds.concat(studentIds))] //
hasAnswers=[...new Set(hasAnswers.concat(studentIds))]
accSum = activeIds.length
children = [{ def, code, isOk:true, studentIds }]
}
const studentSum = studentList.value.length || 0 //
let points = percent((activeIds.length / (studentSum||1)).toFixed(2)) //
let rightSum = activeIds.length; //
//
if (o.worktype == '多选题') {
//
const uniqueTmpStuents = [...new Set(allStudents)];
accSum = uniqueTmpStuents.length;
//
points = percent((rightIds.length / (studentSum||1)).toFixed(2)) //
//
rightSum = rightIds.length;
}
// def: type active: points: , accSum
return { def: o, id: o.id, type: o.worktype, active: [], points, accSum, rightSum, children,hasAnswers }
})
console.log('获取数据: ', data)
stuHasAnswers.value = [...data[0].hasAnswers]
provide('hasAnswer', stuHasAnswers.value)
}
// 0-100
const percent = v => v > 1 ? 1 : v < 0 ? 0 : Math.round(v * 100)
// Unicode 65
const toCode = (v, b) => b ? v.charCodeAt() - 65 : String.fromCharCode(v + 65)
// json
const isJson = str => {if(typeof str == 'string'){
try {
const res = JSON.parse(str)
if(typeof res == 'object' && res) return true
} catch (error) {}}return false
}
watch(() => props.tableList,() => {
useOverview.getTableList(props.tableList)
},{deep:true})
// === ===
watchEffect(() => { initData() })
</script>

View File

@ -1,32 +1,40 @@
<template>
<div className="chart-container">
<div ref="chartRef" className="chart"></div>
<div class="chart-container">
<div ref="chartRef" class="chart"></div>
</div>
</template>
<script setup>
import {ref,nextTick,watch} from 'vue';
import { ref, nextTick, watch, inject,watchEffect } from 'vue';
import * as echarts from 'echarts';
import overviewStore from '@/store/modules/overview'
const useOverview = overviewStore()
import overviewStore from '@/store/modules/overview';
const useOverview = overviewStore();
//
const chartRef = ref(null);
//
const dataList = ref([
{name: '完美', value: 0,rating:1,max:100,min:100,},
{name: '优秀', value: 0,rating:2,max:99,min:80,},
{name: '良好', value: 0,rating:3,max:79,min:70,},
{name: '及格', value: 0,rating:4,max:69,min:60,},
{name: '不及格', value: 0,rating:5,max:59,min:0,},
{ name: '完美', value: 0, rating: 1, max: 100, min: 100 },
{ name: '优秀', value: 0, rating: 2, max: 99, min: 80 },
{ name: '良好', value: 0, rating: 3, max: 79, min: 70 },
{ name: '及格', value: 0, rating: 4, max: 69, min: 60 },
{ name: '不及格', value: 0, rating: 5, max: 59, min: 0 },
]);
//
const hasAnswersData = ref([]);
const hasStudents = ref([])
//
function getColor(index) {
//
const colors = ['#d14a61','#675bba', '#e89110','#008c8c','#5793f3'];
return colors[index];
function getColor(name) {
const colorMap = {
'完美': '#d14a61',
'优秀': '#675bba',
'良好': '#e89110',
'及格': '#008c8c',
'不及格': '#5793f3'
};
return colorMap[name];
}
//
@ -34,75 +42,81 @@ function initChart() {
const myChart = echarts.init(chartRef.value);
const total = dataList.value.reduce((acc, cur) => acc + cur.value, 0); //
// 0
const filteredData = dataList.value.filter(item => item.value > 0);
const options = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
trigger: 'item',
formatter: params => {
const value = params.value;
const percentage = value ? ((value / total) * 100).toFixed(2) : 0; //
return `${params.name}: ${value}人 (${percentage}%)`; //
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: dataList.value.map(item => item.name),
axisTick: {
alignWithLabel: true
}
},
yAxis: {
type: 'value'
},
series: [{
name: '数据',
type: 'bar',
barWidth: '30%',
data: dataList.value.map(item => item.value),
itemStyle: {
color: function (params) {
//
return getColor(params.dataIndex);
type: 'pie',
radius: '50%', //
data: filteredData.map(item => ({
name: item.name,
value: item.value,
itemStyle: {
color: getColor(item.name)
}
},
//
})),
label: {
show: true,
position: 'top',
position: 'inside', //
formatter: params => {
const value = dataList.value[params.dataIndex].value;
const percentage = value ? ((value / total) * 100).toFixed() : 0; //
return `${value}${percentage}%`; //
const value = params.value;
const percentage = value ? ((value / total) * 100).toFixed(2) : 0; //
return `${params.name}\n${value}(${percentage}%)`; //
},
color: '#333',
fontSize: 12
},
labelLine: {
show: false // 线
}
}]
};
myChart.setOption(options);
}
//
const showEcharts =() => {
useOverview.tableList.forEach((item,index) => {
if(item.rating === 0) return //
dataList.value.forEach((item1,index1) => {
if(item1.min <= Number(item.scoingRate) && Number(item.scoingRate) <= item1.max ){
item1.value ++
}
})
})
const showEcharts = () => {
hasStudents.value.forEach((item, index) => {
if (item.rating === 0) {
dataList.value.forEach((item1, index1) => {
if (item1.min <= Number(item.scoingRate) && Number(item.scoingRate) <= item1.max) {
item1.value++;
}
});
} else {
dataList.value.forEach((item1, index1) => {
if (item1.rating === item.rating) {
item1.value++;
}
});
}
});
}
watch(() => useOverview.tableList,() => {
showEcharts()
//
watch(() => useOverview.tableList, () => {
hasStudents.value = useOverview.tableList.filter(item => hasAnswersData.value.includes(item.studentid)).map(item => item);
showEcharts();
nextTick(() => {
initChart();
})
})
});
},{deep: true})
//
watchEffect(() => {
const stus = inject('hasAnswer');
if (!stus) return;
hasAnswersData.value = [...stus]
});
</script>
<style scoped>
@ -115,4 +129,4 @@ watch(() => useOverview.tableList,() => {
width: 100%;
height: 100%;
}
</style>
</style>

View File

@ -16,11 +16,14 @@
</template>
<script setup>
import {nextTick, ref, watch} from 'vue'
import {nextTick, ref, watch,inject,watchEffect} from 'vue'
import overviewStore from '@/store/modules/overview'
const useOverview = overviewStore()
const tabPosition = ref('left')
//
const hasAnswersData = ref([])
const hasStudents = ref([])
const leftList = ref([
{
label:'完美',
@ -65,17 +68,27 @@ const handelChange = (item) => {
}
//
const showStudents = (index) => {
leftList.value[index].stuList = useOverview.tableList.filter(item => {
if(item.rating > 0){
leftList.value[index].stuList = hasStudents.value.filter(item => {
if(item.rating === 0){
if(leftList.value[index].min <= Number(item.scoingRate || 0) && Number(item.scoingRate || 0) <= leftList.value[index].max ){
return item
}
}else{
if(item.rating == leftList.value[index].rating){
return item
}
}
})
}
watch(() => useOverview.tableList,() => {
watch(() => useOverview.tableList, () => {
hasStudents.value = useOverview.tableList.filter(item => hasAnswersData.value.includes(item.studentid)).map(item => item);
showStudents(0)
})
},{deep: true})
watchEffect(() => {
const stus = inject('hasAnswer')
if(!stus) return
hasAnswersData.value = [...stus]
})
</script>
<style scoped>

View File

@ -318,6 +318,7 @@
<div
v-for="(score, index) in teacherRatingList"
:key="index"
style="white-space: nowrap;"
:class="[
'score-circle',
{ active: classWorkFormScore.rating == score.ratingKey }
@ -501,11 +502,11 @@ const classWorkFormScore = reactive({
teacherremark: '' //
})
const teacherRatingList = ref([
{ ratingKey: '1', ratingValue: '' },
{ ratingKey: '2', ratingValue: '优-' },
{ ratingKey: '3', ratingValue: '良' },
{ ratingKey: '4', ratingValue: '良-' },
{ ratingKey: '5', ratingValue: '' }
{ ratingKey: '1', ratingValue: '完美' },
{ ratingKey: '2', ratingValue: '优' },
{ ratingKey: '3', ratingValue: '良' },
{ ratingKey: '4', ratingValue: '及格' },
{ ratingKey: '5', ratingValue: '不及格' }
])
// 线
//#region

View File

@ -94,19 +94,19 @@
</template>
<!-- 1- 2-优减 3- 4-良减 5- -->
<template v-if="scope.row.teacherRating == 1"
><el-tag type="danger"></el-tag></template
><el-tag type="danger">完美</el-tag></template
>
<template v-if="scope.row.teacherRating == 2"
><el-tag type="danger">-</el-tag></template
><el-tag type="danger"></el-tag></template
>
<template v-if="scope.row.teacherRating == 3"
><el-tag type="warning"></el-tag></template
><el-tag type="warning"></el-tag></template
>
<template v-if="scope.row.teacherRating == 4"
><el-tag type="info">-</el-tag></template
><el-tag type="info">及格</el-tag></template
>
<template v-if="scope.row.teacherRating == 5"
><el-tag type="info"></el-tag></template
><el-tag type="info">不及格</el-tag></template
>
</template>
</el-table-column>
@ -656,8 +656,6 @@ defineExpose({
})
</script>
<style src="@/assets/styles/JYStyle.css"></style>
<style scoped lang="scss">
/*:deep(.reserv-date-pick) {
width: 140px;
@ -765,3 +763,4 @@ defineExpose({
overflow-y: auto;
}
</style>
<style src="@/assets/styles/JYStyle.css"></style>

View File

@ -29,7 +29,7 @@
<whiteboard ref="boardref" :height="mainHeight - 150" :isShowSave="false" :data="classWorkForm.whiteboardObj"/>
</div>
</div>
<div v-else class="el-form-work-list">
<div v-else class="el-form-work-list">
<el-form-item label="作业资源:" class="el-form-work-list">
<!-- 左侧作业资源 -->
<el-col :span="15" class="work-left">
@ -54,7 +54,7 @@
</el-col>
<el-col :span="11">
<el-form-item label="知识点" label-width="70">
<el-cascader
<el-cascader
v-model="entpCourseWorkQueryParams.point"
clearable
style="width: 100%"
@ -80,8 +80,8 @@
<el-col :span="15">
<el-form-item label="关键词" label-width="70">
<el-input
v-model="entpCourseWorkQueryParams.keyWord"
style="width: 70%" type="text"
v-model="entpCourseWorkQueryParams.keyWord"
style="width: 70%" type="text"
placeholder="请输入关键词"
/>
<el-button @click="handleQueryParamFromEntpCourseWork(1)"><el-icon><Search /></el-icon> </el-button>
@ -89,7 +89,7 @@
</el-col>
</el-row>
<!-- 习题表格 -->
<div class="middle" >
<div class="middle" >
<el-table :data="workResource.entpCourseWorkList" style="width: 100%; height: 100%;">
<el-table-column type="index" width="60" />
<el-table-column align="left" >
@ -119,10 +119,10 @@
<!-- 分页 这里不用-->
<!-- <div style="height: 55px;">
<pagination
v-show="entpCourseWorkTotal > 0"
v-model:page="paginationParams.pageNum"
v-show="entpCourseWorkTotal > 0"
v-model:page="paginationParams.pageNum"
v-model:limit="paginationParams.pageSize"
:total="entpCourseWorkTotal"
:total="entpCourseWorkTotal"
:style="{ position: 'relative', 'margin-top': '5px' }"
@pagination="getPaginationList" />
</div> -->
@ -189,7 +189,7 @@
<el-form-item label="分值">
<el-input-number v-model="item.score" :min="1" :max="100" size="small"></el-input-number >
</el-form-item>
<div style="display: flex;align-items: center;flex: 1;justify-content: flex-end;">
<div style="display: flex;align-items: center;flex: 1;justify-content: flex-end;">
<el-button @click="prevRead(item)">预览</el-button>
<el-button type="danger" @click="deleteClassWorkAddOfResource(item)">删除</el-button>
</div>
@ -364,7 +364,7 @@ const fileLoading = ref(false); // 常规作业loading
* 作业类型切换
*/
const changeFormType = (val) => {
classWorkForm.worktype = val;
classWorkForm.worktype = val;
}
/**
@ -373,7 +373,7 @@ const changeFormType = (val) => {
* @param {*} queryType
* 1 - 按条件查询
* 2 - 按关键词查询
*/
*/
const handleQueryParamFromEntpCourseWork = (queryType) => {
//
// this.paginationParams = {pageNum: 1,pageSize: 10};
@ -412,7 +412,7 @@ const handleQueryFromEntpCourseWork= (queryType) => {
keyword: entpCourseWorkQueryParams.keyWord && entpCourseWorkQueryParams.keyWord !== '' ? entpCourseWorkQueryParams.keyWord:'',
}
//
// pageNum: paginationParams.pageNum,
// pageSize: paginationParams.pageSize,
@ -422,7 +422,7 @@ const handleQueryFromEntpCourseWork= (queryType) => {
// // [+][+]
// queryForm.edusubject = '';
// }
listEntpcourseworkNew(queryForm).then(entpcourseworkres => {
// if (queryType == 1 && this.entpCourseWorkQueryParams.worktype == '') {
// // ,
@ -433,7 +433,7 @@ const handleQueryFromEntpCourseWork= (queryType) => {
// } else {
// workResource.entpCourseWorkList = entpcourseworkres.rows;
// }
if(entpcourseworkres.data&&entpcourseworkres.data.length>0){
workResource.entpCourseWorkList = entpcourseworkres.data;
workResource.entpCourseWorkTotal = entpcourseworkres.data.length;
@ -511,7 +511,7 @@ const getEntpCourseWorkPointList = () => {
/**
* 添加资源
* @param fromsrc - 试题来源
* @param entpcourseworkid
* @param entpcourseworkid
*/
const handleClassWorkQuizAdd = (fromsrc, entpcourseworkid) => {
var exist = false;
@ -610,11 +610,11 @@ const handleClassWorkSave = async () => {
uniquekey: classWorkForm.uniquekey,//
classid: 0,
classcourseid: 0,
entpcourseid: chapterId, //
entpcourseid: chapterId, //
slideid: 0,
title: classWorkForm.title, //
workcodes: JSON.stringify(classWorkForm.workcodes), //
edusubject: userStore.edusubject, //
edusubject: userStore.edusubject, //
evalid: props.bookobj.levelSecondId, //userStore.evalid, // // ID
edustage: userStore.edustage, // ,,
status: '10', //2024-09-11
@ -630,17 +630,17 @@ const handleClassWorkSave = async () => {
return;
}
if (classWorkForm.worktype === "课堂展示") {
boardLoading.value = true
let canvasJson = proxy.$refs.boardref.getCanvasJson()
let canvasBase64 = await proxy.$refs.boardref.getCanvasBase64()
//
cform.worktag = classWorkForm.question;
cform.title = classWorkForm.title;
cform.worktag = classWorkForm.question;
cform.title = classWorkForm.title;
cform.workcodes = JSON.stringify({json: canvasJson, base64: canvasBase64});
cform.entpcourseworklist = JSON.stringify([{'id':-1, 'score': '10'}]);
try {
@ -656,13 +656,13 @@ const handleClassWorkSave = async () => {
//
classWorkForm.chooseWorkLists = []; // list
classWorkForm.whiteboardObj = ''; // ? //
boardLoading.value = false
})
} finally {
boardLoading.value = false
}
}
}
else if(classWorkForm.worktype === "常规作业"){
fileLoading.value = true
cform.workcodes = JSON.stringify(classWorkForm.fileHomeworkList);
@ -710,7 +710,7 @@ const handleClassWorkSave = async () => {
}
console.log(cform,'提交的数据');
if(cform.entpcourseworklist == '') return ElMessage({ type: 'warning', message: '请先添加作业资源!'});
addClassworkReturnId(cform).then(workres => {
ElMessage({ type: 'success', message: '作业设计成功!'});
//
@ -728,7 +728,7 @@ const handleClassWorkSave = async () => {
})
}
if(props.isback){
//
router.back();
@ -767,20 +767,20 @@ const editWork = async (cform) =>{
//
if (classWorkForm.worktype=='习题训练'){
// 1.
let needUplEval = false;
if (classWorkForm.quizlist.length != props.propsformobj.quizlist.length) {
needUplEval = true;
}else {
//
needUplEval = classWorkForm.quizlist.some(cur =>
!props.propsformobj.quizlist.some(last =>
needUplEval = classWorkForm.quizlist.some(cur =>
!props.propsformobj.quizlist.some(last =>
last.id === cur.id && last.score === cur.score
)
);
}
// 2.eval
if (needUplEval) {
// : , ,
@ -791,7 +791,7 @@ const editWork = async (cform) =>{
arrEvalids.push(element.id);
});
const ids = arrEvalids.join(',');
// 2.2.
const delRes = await delClassworkeval(ids);
@ -822,8 +822,8 @@ const editWork = async (cform) =>{
needUplEval = true;
}else {
//
needUplEval = classWorkForm.chooseWorkLists.some(cur =>
!props.propsformobj.chooseWorkLists.some(last =>
needUplEval = classWorkForm.chooseWorkLists.some(cur =>
!props.propsformobj.chooseWorkLists.some(last =>
last.id === cur.id && last.score === cur.score
)
);
@ -888,15 +888,15 @@ watch(() => props.bookobj.levelSecondId, (newVal) => {
.container {
display: flex;
flex-direction: column;
height: 100%;
height: 100%;
}
.top, .bottom {
flex: 0 0 auto;
flex: 0 0 auto;
}
.middle {
flex: 1;
flex: 1;
height: 100%;
overflow: hidden;
}
@ -923,8 +923,8 @@ watch(() => props.bookobj.levelSecondId, (newVal) => {
.work-right {
height: 100%;
padding: 0 0 0 5px;
overflow: auto;
padding: 0 0 0 5px;
overflow: auto;
line-height: 26px;
overflow: hidden;
}
@ -935,19 +935,19 @@ watch(() => props.bookobj.levelSecondId, (newVal) => {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 5px;
margin-bottom: 5px;
.choose-work-title{
font-size: 1.2em;
font-size: 1.2em;
font-weight: bold;
margin-right: 5px
}
.choose-work-content{
width: 100%;
width: 100%;
display: flex;
justify-content: space-around;
flex-direction: column;
flex-direction: column;
flex: 1;
:deep(.el-form-item__label){
width: 50px !important;

View File

@ -6,7 +6,7 @@
:collapse="isCollapse"
>
<!--左侧 教材 目录-->
<div v-if="!isCollapse" style="height: 100%;overflow: hidden;">
<div v-if="!isCollapse" style="height: 100%;overflow: hidden;">
<ChooseTextbook @change-book="getData" @node-click="getData" />
</div>
</el-menu>

View File

@ -84,19 +84,19 @@
</template>
<!-- 1- 2-优减 3- 4-良减 5- -->
<template v-if="scope.row.teacherRating == 1"
><el-tag type="danger"></el-tag></template
><el-tag type="danger">完美</el-tag></template
>
<template v-if="scope.row.teacherRating == 2"
><el-tag type="danger">-</el-tag></template
><el-tag type="danger"></el-tag></template
>
<template v-if="scope.row.teacherRating == 3"
><el-tag type="warning"></el-tag></template
><el-tag type="warning"></el-tag></template
>
<template v-if="scope.row.teacherRating == 4"
><el-tag type="info">-</el-tag></template
><el-tag type="info">及格</el-tag></template
>
<template v-if="scope.row.teacherRating == 5"
><el-tag type="info"></el-tag></template
><el-tag type="info">不及格</el-tag></template
>
</template>
</el-table-column>
@ -139,7 +139,7 @@
<!-- 训练报告-->
<div v-else-if="classWorkAnalysis.view == 'report'" style="width: 100%;overflow-y: scroll">
<!-- <ClassOverview :table-list="overviewData" :eval-id="courseObj.evalid"></ClassOverview> -->
<ClassOverview :table-list="overviewData" style="width: 100%;"></ClassOverview>
<ClassOverview :active-data="classWorkActiveData" :table-list="overviewData" style="width: 100%;"></ClassOverview>
</div>
</div>
@ -633,7 +633,7 @@ const closeDialog = () => {
}
onMounted(() => {
const data = JSON.parse(localStorage.getItem('teachClassWorkItem'));
// const data = sessionStore.get('teachClassWorkItem');
// const data = localStorage.getItem('teachClassWorkItem');
@ -658,8 +658,6 @@ onUnmounted(() => {
// })
</script>
<style src="@/assets/styles/JYStyle.css"></style>
<style scoped lang="scss">
.teachClassTask{
height: 100%;
@ -705,94 +703,6 @@ onUnmounted(() => {
}
}
}
// .clwk_dialog {
// }
// .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

@ -14,7 +14,7 @@
</template>
</el-popover>
<div style="margin-top: 7px">&nbsp;&nbsp;<el-icon><ArrowRight /></el-icon>&nbsp;&nbsp;</div>
<el-popover disabled placement="top-start" title="考点分析" trigger="hover" content="勾画、圈点,添加标记等,整理出本课的重点与难点,用于老师讲解和学生自主预习">
<template #reference>
<el-button-group>
@ -24,7 +24,7 @@
</template>
</el-popover>
<div style="margin-top: 7px">&nbsp;&nbsp;<el-icon><ArrowRight /></el-icon>&nbsp;&nbsp;</div>
<el-popover disabled placement="top-start" title="模拟命题" trigger="hover" content="勾画、圈点,添加标记等,整理出本课的重点与难点,用于老师讲解和学生自主预习">
<template #reference>
<el-button-group>
@ -51,15 +51,15 @@
<examReview
:loading="loading"
:listExamQuestion="listExamQuestion"
v-if="curTask.viewkey=='真题回顾' "
v-if="curTask.viewkey=='真题回顾' "
/>
<pointAnalysis
v-else-if="curTask.viewkey=='考点分析' "
<pointAnalysis
v-else-if="curTask.viewkey=='考点分析' "
/>
<examMocks
v-else
<examMocks
v-else
/>
</div>
</div>
@ -88,9 +88,9 @@ const sourceStore = useResoureStore();
const viewportHeight = ref(0);
const viewportWidth = ref(0);
//
const curNode = ref({});
//
const listExamQuestion = ref([]);
const curNode = ref({});
//
const listExamQuestion = ref([]);
const loading = ref(false);
const curTask = reactive({
viewkey: '真题回顾',
@ -299,4 +299,4 @@ onMounted(() => {
}
</style>
<style src="@/assets/styles/JYStyle.css"></style>
<style src="@/assets/styles/JYStyle.css"></style>

View File

@ -98,7 +98,7 @@ import FileImage from '@/components/file-image/index.vue'
import { asyncLocalFile } from '@/utils/talkFile'
import { toTimeText } from '@/utils/date'
import { ElMessage, ElMessageBox } from 'element-plus'
import { deleteSmarttalk, updateSmarttalk, getPrepareById } from '@/api/file'
import { deleteSmarttalk, updateSmarttalk, getPrepareById, getSmarttalkPage } from '@/api/file'
import useUserStore from '@/store/modules/user'
import outLink from '@/utils/linkConfig'
import { sessionStore } from '@/utils/store'
@ -208,6 +208,7 @@ export default {
}
if (action === 'cancel'){
//
console.log(obj.bookImg)
if (obj.bookImg) {
//PPT
listEntpcourse({
@ -241,9 +242,20 @@ export default {
}
})
}else {
//APT
this.$emit('on-start-class', item, obj)
done()
console.log(obj)
getSmarttalkPage({fileId: obj.entpcoursefileid}).then(res2=>{
console.log(res2)
//APT
if (res2&&res2.rows.length>0) {
this.$emit('on-start-class', res2.rows[0], obj)
}else {
ElMessage({
message: '该文件未关联PPT无法打开',
type: 'warning'
})
}
done()
})
}
}
if (action === 'close') {

View File

@ -106,7 +106,7 @@
:item="item"
:index="index"
@on-set="openSet"
@on-reSet="openReSet"
@on-reSet="openReSet"
@on-delhomework="delhomework"
>
</file-list-item>
@ -291,6 +291,7 @@ export default {
methods: {
addAiPPT(item) {
this.currentFileList.unshift(item.resData)
KjListItem.methods.openFileWin(item.resData);
this.pptDialog = false
},
// test() {
@ -657,7 +658,7 @@ export default {
this.$refs['reservDialog'].openDialog()
},
//
//
// handleOutLink(key) {
// if (key == 'homeWork') {
// this.isOpenHomework = true
@ -689,11 +690,11 @@ export default {
//
goNewClassTask(){
// router.push({ path: '/newClassTask' });
this.$router.push({
this.$router.push({
path: '/newClassTask',
query: {
isBack: true,
}
}
});
},
getWeekday1(date) {
@ -730,7 +731,7 @@ export default {
}
});
//---------------------
//
//
// this.isOpenHomework = true;
// // key linkConfig.js
// let configObj = outLink()['homeWork']