Commit e371f2dca0d39d5e80f13bc3d8a20351a3c8a051

Authored by 梁保满
1 parent d703d72c

软件下载,学校,班级老师等报表导入导出,学生画像接口联调

Showing 32 changed files with 2043 additions and 2261 deletions
src/api/apis/apis.js
@@ -443,6 +443,50 @@ export default { @@ -443,6 +443,50 @@ export default {
443 data, 443 data,
444 }); 444 });
445 }, 445 },
  446 + // 导入学生答题器文件上传
  447 + importStudentClicker(data) {
  448 + return service({
  449 + url: setUpUrls.importStudentClicker,
  450 + method: "POST",
  451 + data,
  452 + });
  453 + },
  454 + // 班级名册模板下载
  455 + classAndStudentTemplate(data) {
  456 + return service({
  457 + url: setUpUrls.classAndStudentTemplate,
  458 + method: "POST",
  459 + data,
  460 + responseType: 'arraybuffer',
  461 + });
  462 + },
  463 + // 班级名册导出
  464 + exportClassAndStudent(data) {
  465 + return service({
  466 + url: setUpUrls.exportClassAndStudent,
  467 + method: "POST",
  468 + data,
  469 + responseType: 'arraybuffer',
  470 + });
  471 + },
  472 + // 教师模板下载
  473 + teacherTemplate(data) {
  474 + return service({
  475 + url: setUpUrls.teacherTemplate,
  476 + method: "POST",
  477 + data,
  478 + });
  479 + },
  480 + // 教师导出
  481 + exportTeacher(data) {
  482 + return service({
  483 + url: setUpUrls.exportTeacher,
  484 + method: "POST",
  485 + data,
  486 + responseType: 'arraybuffer',
  487 + });
  488 + },
  489 +
446 // 删除学生 490 // 删除学生
447 delStudent(data) { 491 delStudent(data) {
448 return service({ 492 return service({
@@ -938,9 +982,9 @@ export default { @@ -938,9 +982,9 @@ export default {
938 }); 982 });
939 }, 983 },
940 // 分页查询课时报表列表 984 // 分页查询课时报表列表
941 - pPersonal(data) { 985 + pPeriodReportList(data) {
942 return service({ 986 return service({
943 - url: setUpUrls.pPersonal, 987 + url: setUpUrls.pPeriodReportList,
944 method: "POST", 988 method: "POST",
945 data 989 data
946 }); 990 });
@@ -1177,6 +1221,14 @@ export default { @@ -1177,6 +1221,14 @@ export default {
1177 data 1221 data
1178 }); 1222 });
1179 }, 1223 },
  1224 + //删除授课端版本
  1225 + delVersion(data) {
  1226 + return service({
  1227 + url: setUpUrls.delVersion,
  1228 + method: "POST",
  1229 + data
  1230 + });
  1231 + },
1180 //基站统计数据 1232 //基站统计数据
1181 pStationReport(data) { 1233 pStationReport(data) {
1182 return service({ 1234 return service({
@@ -1234,7 +1286,7 @@ export default { @@ -1234,7 +1286,7 @@ export default {
1234 responseType: 'arraybuffer', 1286 responseType: 'arraybuffer',
1235 }); 1287 });
1236 }, 1288 },
1237 - //班级名册导出 1289 + //上传图片
1238 puploadImg(data) { 1290 puploadImg(data) {
1239 return service({ 1291 return service({
1240 url: setUpUrls.uploadImg, 1292 url: setUpUrls.uploadImg,
@@ -1242,4 +1294,28 @@ export default { @@ -1242,4 +1294,28 @@ export default {
1242 data, 1294 data,
1243 }); 1295 });
1244 }, 1296 },
  1297 + //学生测练统计
  1298 + studentExamReport(data) {
  1299 + return service({
  1300 + url: setUpUrls.studentExamReport,
  1301 + method: "POST",
  1302 + data,
  1303 + });
  1304 + },
  1305 + //查询最新的授课端应用版本
  1306 + pLatestVersion(data) {
  1307 + return service({
  1308 + url: setUpUrls.pLatestVersion,
  1309 + method: "POST",
  1310 + data,
  1311 + });
  1312 + },
  1313 + //载指定版本授课端
  1314 + pGetAppDownloadUrl(data) {
  1315 + return service({
  1316 + url: setUpUrls.pGetAppDownloadUrl,
  1317 + method: "POST",
  1318 + data,
  1319 + });
  1320 + },
1245 }; 1321 };
src/api/urls/apis.js
@@ -24,7 +24,7 @@ export default { @@ -24,7 +24,7 @@ export default {
24 cTExportPhaseInteractiveReport: "/api_html/class/manager/exportPhaseInteractiveReport", 24 cTExportPhaseInteractiveReport: "/api_html/class/manager/exportPhaseInteractiveReport",
25 //班主任- 导出阶段测练报表 25 //班主任- 导出阶段测练报表
26 cTExportPhaseExamReport: "/api_html/class/manager/exportPhaseExamReport", 26 cTExportPhaseExamReport: "/api_html/class/manager/exportPhaseExamReport",
27 - 27 +
28 //任课老师-查询管理班级 28 //任课老师-查询管理班级
29 tClassList: "/api_html/teaching/classList", 29 tClassList: "/api_html/teaching/classList",
30 //任课老师-查询管理班级授课科目 30 //任课老师-查询管理班级授课科目
@@ -110,6 +110,19 @@ export default { @@ -110,6 +110,19 @@ export default {
110 addStudent: "/api_html/school/manager/addStudent", 110 addStudent: "/api_html/school/manager/addStudent",
111 // 导入学生答题器绑定模板下载地址 111 // 导入学生答题器绑定模板下载地址
112 studentClickerTemplateUrl: "/api_html/school/manager/studentClickerTemplateUrl", 112 studentClickerTemplateUrl: "/api_html/school/manager/studentClickerTemplateUrl",
  113 + // 导入学生答题器文件上传
  114 + importStudentClicker: "/api_html/school/manager/importStudentClicker",
  115 + // 班级名册模板下载
  116 + classAndStudentTemplate: "/api_html/school/manager/classAndStudentTemplate",
  117 + // 班级名册导出
  118 + exportClassAndStudent: "/api_html/school/manager/exportClassAndStudent",
  119 + // 教师模板下载
  120 + teacherTemplate: "/api_html/school/manager/teacherTemplate",
  121 + // 教师导入
  122 + importTeacher: "/api_html/school/manager/importTeacher",
  123 + // 教师导出
  124 + exportTeacher: "/api_html/school/manager/exportTeacher",
  125 +
113 // 删除学生 126 // 删除学生
114 delStudent: "/api_html/school/manager/delStudent", 127 delStudent: "/api_html/school/manager/delStudent",
115 // 查询学校教师列表 128 // 查询学校教师列表
@@ -201,121 +214,129 @@ export default { @@ -201,121 +214,129 @@ export default {
201 syncUser: "/api_html/tenant/syncUser", 214 syncUser: "/api_html/tenant/syncUser",
202 215
203 216
204 - // 个人版首页统计数据  
205 - personalIndex:"/api_html/personal/index",  
206 - // 个人信息  
207 - getInfo:"/api_html/personal/personalInfo",  
208 - // 修改个人信息  
209 - modifyInfo:"/api_html/personal/modifyInfo",  
210 - // 查询班级列表  
211 - pClassList:"/api_html/personal/classList",  
212 - // 查询科目列表  
213 - pSubjectList:"/api_html/personal/subjectList",  
214 - // 查询学生列表  
215 - pStudentList:"/api_html/personal/studentList",  
216 - // 新增或修改班级  
217 - pSaveClass:"/api_html/personal/saveClass",  
218 - // 删除班级  
219 - pDelClass:"/api_html/personal/delClass",  
220 - // 增加学生  
221 - pAddStudent:"/api_html/personal/addStudent",  
222 - // 删除学生  
223 - pDelStudent:"/api_html/personal/delStudent",  
224 - // 查询答题卡类型列表  
225 - pPaperTagList:"/api_html/personal/paperTagList",  
226 - // 查询答题卡列表  
227 - pPaperList:"/api_html/personal/paperList",  
228 - // 查询答题卡详情  
229 - pPaperDetail:"/api_html/personal/paperDetail",  
230 - // 增加答题卡  
231 - pAddPaper:"/api_html/personal/addPaper",  
232 - // 修改答题卡  
233 - pModifyPaper:"/api_html/personal/modifyPaper",  
234 - // 删除答题卡  
235 - pDelPaper:"/api_html/personal/delPaper",  
236 - // 增加答题卡类型  
237 - pAddPaperType:"/api_html/personal/addPaperType",  
238 - // 修改答题卡类型  
239 - pModifyPaperType:"/api_html/personal/modifyPaperType",  
240 - // 删除答题卡类型  
241 - pDelPaperType:"/api_html/personal/delPaperType",  
242 - // 分页查询课时报表列表  
243 - pPeriodReportList:"/api_html/personal/periodReportList",  
244 - // 查询阶段问答报表  
245 - pPhaseAnswerReport:"/api_html/personal/phaseAnswerReport",  
246 - // 查询阶段互动报表  
247 - pPhaseInteractiveReport:"/api_html/personal/phaseInteractiveReport",  
248 - // 查询课时题目列表  
249 - pPeriodQuestionList:"/api_html/personal/periodQuestionList",  
250 - // 设置课时报表答案  
251 - pSetPeriodAnswer:"/api_html/personal/setPeriodAnswer",  
252 - // 查询课时报表详情  
253 - pPeriodDetail:"/api_html/personal/periodDetail",  
254 - // 分页查询课时题目统计列表  
255 - pPeriodQuestionReport:"/api_html/personal/periodQuestionReport",  
256 - // 查询课时学生答题明细  
257 - pPeriodStudentReport:"/api_html/personal/periodStudentReport",  
258 - // 导出阶段报表  
259 - pExportPhaseReport:"/api_html/personal/exportPhaseReport",  
260 - // 分页查询即时测报表  
261 - pExamReportList:"/api_html/personal/examReportList",  
262 - // 查询阶段测练报表  
263 - pPhaseExamReport:"/api_html/personal/phaseExamReport",  
264 - // 查询即时测报表题目列表  
265 - pExamQuestionList:"/api_html/personal/examQuestionList",  
266 - // 设置即时测报表答案  
267 - pSetExamAnswer:"/api_html/personal/setExamAnswer",  
268 - // 查询即时测报表详情  
269 - pExamDetail:"/api_html/personal/examDetail",  
270 - // 下载导入主观题分模板  
271 - pSubjectiveScoreTemplate:"/api_html/personal/subjectiveScoreTemplate",  
272 - // 导入主观题得分  
273 - pImportSubjectiveScore:"/api_html/personal/importSubjectiveScore",  
274 - // 分页查询即时测题目统计  
275 - pExamQuestionReport:"/api_html/personal/examQuestionReport",  
276 - // 查询即时测学生统计  
277 - pExamStudentReport:"/api_html/personal/examStudentReport",  
278 - // 重新判分  
279 - pReScore:"/api_html/personal/reScore",  
280 - // 导出单课时报表  
281 - pExportPeriodReport:"/api_html/personal/exportPeriodReport",  
282 - // 导出阶段测练报表  
283 - pExportPhaseExamReport:"/api_html/personal/exportPhaseExamReport",  
284 - // 导出单卷测练报表  
285 - pExportExamReport:"/api_html/personal/exportExamReport",  
286 - // 数据导出  
287 - pExportData:"/api_html/personal/exportData",  
288 - // 数据导入  
289 - pImportData:"/api_html/personal/importData", 217 + // 个人版首页统计数据
  218 + personalIndex: "/api_html/personal/index",
  219 + // 个人信息
  220 + getInfo: "/api_html/personal/personalInfo",
  221 + // 修改个人信息
  222 + modifyInfo: "/api_html/personal/modifyInfo",
  223 + // 查询班级列表
  224 + pClassList: "/api_html/personal/classList",
  225 + // 查询科目列表
  226 + pSubjectList: "/api_html/personal/subjectList",
  227 + // 查询学生列表
  228 + pStudentList: "/api_html/personal/studentList",
  229 + // 新增或修改班级
  230 + pSaveClass: "/api_html/personal/saveClass",
  231 + // 删除班级
  232 + pDelClass: "/api_html/personal/delClass",
  233 + // 增加学生
  234 + pAddStudent: "/api_html/personal/addStudent",
  235 + // 删除学生
  236 + pDelStudent: "/api_html/personal/delStudent",
  237 + // 查询答题卡类型列表
  238 + pPaperTagList: "/api_html/personal/paperTagList",
  239 + // 查询答题卡列表
  240 + pPaperList: "/api_html/personal/paperList",
  241 + // 查询答题卡详情
  242 + pPaperDetail: "/api_html/personal/paperDetail",
  243 + // 增加答题卡
  244 + pAddPaper: "/api_html/personal/addPaper",
  245 + // 修改答题卡
  246 + pModifyPaper: "/api_html/personal/modifyPaper",
  247 + // 删除答题卡
  248 + pDelPaper: "/api_html/personal/delPaper",
  249 + // 增加答题卡类型
  250 + pAddPaperType: "/api_html/personal/addPaperType",
  251 + // 修改答题卡类型
  252 + pModifyPaperType: "/api_html/personal/modifyPaperType",
  253 + // 删除答题卡类型
  254 + pDelPaperType: "/api_html/personal/delPaperType",
  255 + // 分页查询课时报表列表
  256 + pPeriodReportList: "/api_html/personal/periodReportList",
  257 + // 查询阶段问答报表
  258 + pPhaseAnswerReport: "/api_html/personal/phaseAnswerReport",
  259 + // 查询阶段互动报表
  260 + pPhaseInteractiveReport: "/api_html/personal/phaseInteractiveReport",
  261 + // 查询课时题目列表
  262 + pPeriodQuestionList: "/api_html/personal/periodQuestionList",
  263 + // 设置课时报表答案
  264 + pSetPeriodAnswer: "/api_html/personal/setPeriodAnswer",
  265 + // 查询课时报表详情
  266 + pPeriodDetail: "/api_html/personal/periodDetail",
  267 + // 分页查询课时题目统计列表
  268 + pPeriodQuestionReport: "/api_html/personal/periodQuestionReport",
  269 + // 查询课时学生答题明细
  270 + pPeriodStudentReport: "/api_html/personal/periodStudentReport",
  271 + // 导出阶段报表
  272 + pExportPhaseReport: "/api_html/personal/exportPhaseReport",
  273 + // 分页查询即时测报表
  274 + pExamReportList: "/api_html/personal/examReportList",
  275 + // 查询阶段测练报表
  276 + pPhaseExamReport: "/api_html/personal/phaseExamReport",
  277 + // 查询即时测报表题目列表
  278 + pExamQuestionList: "/api_html/personal/examQuestionList",
  279 + // 设置即时测报表答案
  280 + pSetExamAnswer: "/api_html/personal/setExamAnswer",
  281 + // 查询即时测报表详情
  282 + pExamDetail: "/api_html/personal/examDetail",
  283 + // 下载导入主观题分模板
  284 + pSubjectiveScoreTemplate: "/api_html/personal/subjectiveScoreTemplate",
  285 + // 导入主观题得分
  286 + pImportSubjectiveScore: "/api_html/personal/importSubjectiveScore",
  287 + // 分页查询即时测题目统计
  288 + pExamQuestionReport: "/api_html/personal/examQuestionReport",
  289 + // 查询即时测学生统计
  290 + pExamStudentReport: "/api_html/personal/examStudentReport",
  291 + // 重新判分
  292 + pReScore: "/api_html/personal/reScore",
  293 + // 导出单课时报表
  294 + pExportPeriodReport: "/api_html/personal/exportPeriodReport",
  295 + // 导出阶段测练报表
  296 + pExportPhaseExamReport: "/api_html/personal/exportPhaseExamReport",
  297 + // 导出单卷测练报表
  298 + pExportExamReport: "/api_html/personal/exportExamReport",
  299 + // 数据导出
  300 + pExportData: "/api_html/personal/exportData",
  301 + // 数据导入
  302 + pImportData: "/api_html/personal/importData",
290 303
291 304
292 - /** 平台管理 */  
293 - //账户管理  
294 - tenantPage:"/api_html/system/tenantPage",  
295 - //修改账号  
296 - updateTenant:"/api_html/system/updateTenant",  
297 - //新增租户账号  
298 - addTenant:"/api_html/system/addTenant",  
299 - // 授课端版本管理  
300 - versionPage:"/api_html/system/versionPage",  
301 - // 新增授课端版本  
302 - addVersion:"/api_html/system/addVersion",  
303 - // 基站统计数据  
304 - pStationReport:"/api_html/system/stationReport",  
305 - // 答题器统计数据  
306 - pKeyboardReport:"/api_html/system/keyboardReport",  
307 - // 查询设备列表  
308 - pDeviceList:"/api_html/system/deviceList",  
309 - // 查询设备详情  
310 - pDeviceDetail:"/api_html/system/deviceDetail",  
311 - // 查询设备日志列表  
312 - pDeviceLogList:"/api_html/system/deviceLogList",  
313 - // 文件上传  
314 - uploadApp:"/file/uploadApp",  
315 - // 图片上传  
316 - uploadImg:"/file/uploadImg",  
317 - // 班级名册导入  
318 - studentTemplateUrl:"/api_html/personal/studentTemplateUrl",  
319 - // 班级名册导出  
320 - exportStudent:"/api_html/personal/exportStudent", 305 + /** 平台管理 */
  306 + //账户管理
  307 + tenantPage: "/api_html/system/tenantPage",
  308 + //修改账号
  309 + updateTenant: "/api_html/system/updateTenant",
  310 + //新增租户账号
  311 + addTenant: "/api_html/system/addTenant",
  312 + // 授课端版本管理
  313 + versionPage: "/api_html/system/versionPage",
  314 + // 新增授课端版本
  315 + addVersion: "/api_html/system/addVersion",
  316 + // 删除授课端版本
  317 + delVersion: "/api_html/system/delVersion",
  318 + // 基站统计数据
  319 + pStationReport: "/api_html/system/stationReport",
  320 + // 答题器统计数据
  321 + pKeyboardReport: "/api_html/system/keyboardReport",
  322 + // 查询设备列表
  323 + pDeviceList: "/api_html/system/deviceList",
  324 + // 查询设备详情
  325 + pDeviceDetail: "/api_html/system/deviceDetail",
  326 + // 查询设备日志列表
  327 + pDeviceLogList: "/api_html/system/deviceLogList",
  328 + // 文件上传
  329 + uploadApp: "/file/uploadApp",
  330 + // 图片上传
  331 + uploadImg: "/file/uploadImg",
  332 + // 班级名册导入
  333 + studentTemplateUrl: "/api_html/personal/studentTemplateUrl",
  334 + // 班级名册导出
  335 + exportStudent: "/api_html/personal/exportStudent",
  336 + // 学生测练统计
  337 + studentExamReport: "/api_html/personal/studentExamReport",
  338 + // 查询最新的授课端应用版本
  339 + pLatestVersion: "/api_html/personal/latestVersion",
  340 + // 载指定版本授课端
  341 + pGetAppDownloadUrl: "/api_html/personal/getAppDownloadUrl",
321 } 342 }
src/assets/img404/bg404.jpg renamed to src/assets/images/img404/bg404.jpg

35.8 KB

src/assets/img404/i404.png renamed to src/assets/images/img404/i404.png

16.8 KB

src/assets/img404/sign.png renamed to src/assets/images/img404/sign.png

423 KB

src/router/index.js
@@ -8,10 +8,14 @@ import HomeMain from "@/views/index/mainIndex" @@ -8,10 +8,14 @@ import HomeMain from "@/views/index/mainIndex"
8 8
9 // 不是必须加载的组件使用懒加载 9 // 不是必须加载的组件使用懒加载
10 const NotFound = () => import("@/views/page404") 10 const NotFound = () => import("@/views/page404")
11 -const ExaminationPaper = () => import("@/views/standard/examinationPaper/index")  
12 -const ExaminationPaperAdd = () => import("@/views/standard/examinationPaper/add")  
13 -const ExaminationPaperEdit = () => import("@/views/standard/examinationPaper/edit")  
14 -const ExaminationPaperRecycle = () => import("@/views/standard/examinationPaper/recycle") 11 +const ExaminationPaper = () => import("@/views/examinationPaper/index")
  12 +const ExaminationPaperAdd = () => import("@/views/examinationPaper/add")
  13 +const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit")
  14 +const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle")
  15 +const Portrait = () => import("@/views/portrait/index")
  16 +const PortraitDetail = () => import("@/views/portrait/detail")
  17 +
  18 +
15 const Ask = () => import("@/views/standard/ask/index") 19 const Ask = () => import("@/views/standard/ask/index")
16 const AskAnalysis = () => import("@/views/standard/ask/analysis") 20 const AskAnalysis = () => import("@/views/standard/ask/analysis")
17 const Test = () => import("@/views/standard/test/index") 21 const Test = () => import("@/views/standard/test/index")
@@ -29,17 +33,11 @@ const SetUpSchool = () => import("@/views/standard/setUp/school") @@ -29,17 +33,11 @@ const SetUpSchool = () => import("@/views/standard/setUp/school")
29 const SetUpStudent = () => import("@/views/standard/setUp/student") 33 const SetUpStudent = () => import("@/views/standard/setUp/student")
30 const SetUpTeacher = () => import("@/views/standard/setUp/teacher") 34 const SetUpTeacher = () => import("@/views/standard/setUp/teacher")
31 35
32 -const PersonalExaminationPaper = () => import("@/views/personal/examinationPaper/index")  
33 -const PersonalExaminationPaperAdd = () => import("@/views/personal/examinationPaper/add")  
34 -const PersonalExaminationPaperEdit = () => import("@/views/personal/examinationPaper/edit")  
35 -const PersonalExaminationPaperRecycle = () => import("@/views/personal/examinationPaper/recycle")  
36 const PersonalAsk = () => import("@/views/personal/ask/index") 36 const PersonalAsk = () => import("@/views/personal/ask/index")
37 const PersonalAskAnalysis = () => import("@/views/personal/ask/analysis") 37 const PersonalAskAnalysis = () => import("@/views/personal/ask/analysis")
38 const PersonalTest = () => import("@/views/personal/test/index") 38 const PersonalTest = () => import("@/views/personal/test/index")
39 const PersonalTestAnalysis = () => import("@/views/personal/test/analysis") 39 const PersonalTestAnalysis = () => import("@/views/personal/test/analysis")
40 const PersonalDataSync = () => import("@/views/personal/dataSync/index") 40 const PersonalDataSync = () => import("@/views/personal/dataSync/index")
41 -const PersonalPortrait = () => import("@/views/personal/portrait/index")  
42 -const PersonalPortraitDetail = () => import("@/views/personal/portrait/detail")  
43 const PersonalSetUpStudent = () => import("@/views/personal/setUp/student") 41 const PersonalSetUpStudent = () => import("@/views/personal/setUp/student")
44 const PersonalDown = () => import("@/views/personal/down/index") 42 const PersonalDown = () => import("@/views/personal/down/index")
45 const PersonalUserInfo = () => import("@/views/personal/userInfo/index") 43 const PersonalUserInfo = () => import("@/views/personal/userInfo/index")
@@ -371,6 +369,33 @@ let addrouters = [ //测试用,后续后端获取 @@ -371,6 +369,33 @@ let addrouters = [ //测试用,后续后端获取
371 } 369 }
372 ] 370 ]
373 }, 371 },
  372 + {
  373 + path: "/portrait",
  374 + iconCls: "fa fa-users", // 图标样式class
  375 + name: "学生画像",
  376 + component: Layout,
  377 + alone: true,
  378 + children: [
  379 + {
  380 + path: "/portrait",
  381 + iconCls: "fa fa-users", // 图标样式class
  382 + name: "",
  383 + component: Portrait,
  384 + meta: {
  385 + keepAlive: true,
  386 + },
  387 + children: []
  388 + },
  389 + {
  390 + path: "/portraitDetail",
  391 + iconCls: "", // 图标样式class
  392 + name: "授课端软件",
  393 + component: PortraitDetail,
  394 + parent: "down",
  395 + children: []
  396 + }
  397 + ]
  398 + },
374 ] 399 ]
375 400
376 const addroutersPersonal = [ 401 const addroutersPersonal = [
@@ -401,14 +426,14 @@ const addroutersPersonal = [ @@ -401,14 +426,14 @@ const addroutersPersonal = [
401 path: "/examinationPaper", 426 path: "/examinationPaper",
402 iconCls: "fa fa-file-text", // 图标样式class 427 iconCls: "fa fa-file-text", // 图标样式class
403 name: "examinationPaper", 428 name: "examinationPaper",
404 - component: PersonalExaminationPaper, 429 + component: ExaminationPaper,
405 children: [] 430 children: []
406 }, 431 },
407 { 432 {
408 path: "/examinationPaperAdd", 433 path: "/examinationPaperAdd",
409 iconCls: "", // 图标样式class 434 iconCls: "", // 图标样式class
410 name: "examinationPaperAdd", 435 name: "examinationPaperAdd",
411 - component: PersonalExaminationPaperAdd, 436 + component: ExaminationPaperAdd,
412 parent: "examinationPaper", 437 parent: "examinationPaper",
413 children: [] 438 children: []
414 }, 439 },
@@ -416,7 +441,7 @@ const addroutersPersonal = [ @@ -416,7 +441,7 @@ const addroutersPersonal = [
416 path: "/examinationPaperEdit", 441 path: "/examinationPaperEdit",
417 iconCls: "", // 图标样式class 442 iconCls: "", // 图标样式class
418 name: "修改答题卡", 443 name: "修改答题卡",
419 - component: PersonalExaminationPaperEdit, 444 + component: ExaminationPaperEdit,
420 parent: "examinationPaper", 445 parent: "examinationPaper",
421 children: [] 446 children: []
422 }, 447 },
@@ -424,7 +449,7 @@ const addroutersPersonal = [ @@ -424,7 +449,7 @@ const addroutersPersonal = [
424 path: "/examinationPaperRecycle", 449 path: "/examinationPaperRecycle",
425 iconCls: "", // 图标样式class 450 iconCls: "", // 图标样式class
426 name: "已归档答题卡", 451 name: "已归档答题卡",
427 - component: PersonalExaminationPaperRecycle, 452 + component: ExaminationPaperRecycle,
428 parent: "examinationPaper", 453 parent: "examinationPaper",
429 children: [] 454 children: []
430 }, 455 },
@@ -498,7 +523,7 @@ const addroutersPersonal = [ @@ -498,7 +523,7 @@ const addroutersPersonal = [
498 path: "/portrait", 523 path: "/portrait",
499 iconCls: "fa fa-users", // 图标样式class 524 iconCls: "fa fa-users", // 图标样式class
500 name: "", 525 name: "",
501 - component: PersonalPortrait, 526 + component: Portrait,
502 meta: { 527 meta: {
503 keepAlive: true, 528 keepAlive: true,
504 }, 529 },
@@ -508,7 +533,7 @@ const addroutersPersonal = [ @@ -508,7 +533,7 @@ const addroutersPersonal = [
508 path: "/portraitDetail", 533 path: "/portraitDetail",
509 iconCls: "", // 图标样式class 534 iconCls: "", // 图标样式class
510 name: "授课端软件", 535 name: "授课端软件",
511 - component: PersonalPortraitDetail, 536 + component: PortraitDetail,
512 parent: "down", 537 parent: "down",
513 children: [] 538 children: []
514 } 539 }
src/utils/index.js
@@ -197,7 +197,7 @@ export function b64DecodeUnicode(str) { @@ -197,7 +197,7 @@ export function b64DecodeUnicode(str) {
197 }) 197 })
198 .join("") 198 .join("")
199 ); 199 );
200 - } catch (e) {} 200 + } catch (e) { }
201 return uni; 201 return uni;
202 } 202 }
203 203
@@ -568,7 +568,7 @@ function setSectionName(num) { @@ -568,7 +568,7 @@ function setSectionName(num) {
568 } 568 }
569 return txt; 569 return txt;
570 } 570 }
571 -function setGradeName(num) { 571 +export function setGradeName(num) {
572 let txt = ""; 572 let txt = "";
573 switch (num) { 573 switch (num) {
574 case 1: 574 case 1:
@@ -619,6 +619,9 @@ function setGradeName(num) { @@ -619,6 +619,9 @@ function setGradeName(num) {
619 case 16: 619 case 16:
620 txt = "大四"; 620 txt = "大四";
621 break; 621 break;
  622 + default:
  623 + txt = "未知";
  624 + break;
622 } 625 }
623 return txt; 626 return txt;
624 } 627 }
@@ -724,7 +727,7 @@ export function formatGradeNameClass(data) { @@ -724,7 +727,7 @@ export function formatGradeNameClass(data) {
724 { 727 {
725 value: item.id, 728 value: item.id,
726 label: item.className, 729 label: item.className,
727 - leaf:true 730 + leaf: true
728 }, 731 },
729 ], 732 ],
730 }); 733 });
@@ -738,7 +741,7 @@ export function formatGradeNameClass(data) { @@ -738,7 +741,7 @@ export function formatGradeNameClass(data) {
738 gradeNameArr[gradeIndex].children.push({ 741 gradeNameArr[gradeIndex].children.push({
739 value: item.id, 742 value: item.id,
740 label: item.className, 743 label: item.className,
741 - leaf:true 744 + leaf: true
742 }); 745 });
743 } 746 }
744 }); 747 });
src/views/admin/clientVersion/components/upLoad.vue
@@ -8,15 +8,15 @@ @@ -8,15 +8,15 @@
8 :action="url" 8 :action="url"
9 :multiple="false" 9 :multiple="false"
10 :data="{ ...query }" 10 :data="{ ...query }"
11 - :with-credentials="true"  
12 :limit="1" 11 :limit="1"
13 :on-change="change" 12 :on-change="change"
14 :on-success="upSuccess" 13 :on-success="upSuccess"
15 :on-error="upError" 14 :on-error="upError"
  15 + accept=".zip"
16 > 16 >
17 <!-- accept="application/vnd.ms-excel" --> 17 <!-- accept="application/vnd.ms-excel" -->
18 <div class="upload-btn"> 18 <div class="upload-btn">
19 - <el-button class="btn" size="mini" type="primary">选择文件</el-button> 19 + <el-button class="btn" size="mini" type="primary">选择zip文件</el-button>
20 </div> 20 </div>
21 </el-upload> 21 </el-upload>
22 </div> 22 </div>
src/views/admin/clientVersion/components/upLoadImg.vue
@@ -7,10 +7,10 @@ @@ -7,10 +7,10 @@
7 :action="url" 7 :action="url"
8 :multiple="false" 8 :multiple="false"
9 :data="{ ...query }" 9 :data="{ ...query }"
10 - :with-credentials="true"  
11 :limit="1" 10 :limit="1"
12 :on-success="upSuccess" 11 :on-success="upSuccess"
13 :on-error="upError" 12 :on-error="upError"
  13 + accept="image/*"
14 > 14 >
15 <!-- accept="application/vnd.ms-excel" --> 15 <!-- accept="application/vnd.ms-excel" -->
16 <img v-if="imageUrl" :src="imageUrl" class="avatar" /> 16 <img v-if="imageUrl" :src="imageUrl" class="avatar" />
src/views/admin/clientVersion/index.vue
@@ -75,7 +75,12 @@ @@ -75,7 +75,12 @@
75 </el-pagination> 75 </el-pagination>
76 </div> 76 </div>
77 </div> 77 </div>
78 - <el-dialog title="添加账号" :visible.sync="diaAdd" width="400"> 78 + <el-dialog
  79 + title="添加账号"
  80 + :visible.sync="diaAdd"
  81 + v-if="diaAdd"
  82 + width="400"
  83 + >
79 <el-form 84 <el-form
80 class="form-box" 85 class="form-box"
81 :model="formAdd" 86 :model="formAdd"
@@ -93,7 +98,7 @@ @@ -93,7 +98,7 @@
93 </el-input> 98 </el-input>
94 </el-col> 99 </el-col>
95 </el-form-item> 100 </el-form-item>
96 - <el-form-item label="版本号:" prop="versionNumber"> 101 + <el-form-item label="版本号:">
97 <el-col :span="12"> 102 <el-col :span="12">
98 <el-input 103 <el-input
99 placeholder="请输入版本号" 104 placeholder="请输入版本号"
@@ -103,19 +108,19 @@ @@ -103,19 +108,19 @@
103 </el-input> 108 </el-input>
104 </el-col> 109 </el-col>
105 </el-form-item> 110 </el-form-item>
106 - <el-form-item label="软件图标:" prop="logo"> 111 + <el-form-item label="软件图标:">
107 <el-col :span="12"> 112 <el-col :span="12">
108 - <upLoadImg :url="url" @upSuccess="logoSuccess"/> 113 + <upLoadImg url="/file/uploadImg" @upSuccess="logoSuccess" />
109 </el-col> 114 </el-col>
110 </el-form-item> 115 </el-form-item>
111 - <el-form-item label="上传全量文件包:" prop="appfiles"> 116 + <el-form-item label="上传全量文件包:" prop="filePath">
112 <el-col :span="12"> 117 <el-col :span="12">
113 - <upLoad :url="url" @upSuccess="appfilesSuccess"/> 118 + <upLoad :url="url" @upSuccess="appfilesSuccess" />
114 </el-col> 119 </el-col>
115 </el-form-item> 120 </el-form-item>
116 - <el-form-item label="上传增量文件包:" prop="addfiles"> 121 + <el-form-item label="上传增量文件包:" prop="incrementFilePath">
117 <el-col :span="12"> 122 <el-col :span="12">
118 - <upLoad :url="url" @upSuccess="addfilesSuccess"/> 123 + <upLoad :url="url" @upSuccess="addfilesSuccess" />
119 </el-col> 124 </el-col>
120 </el-form-item> 125 </el-form-item>
121 <el-form-item label="更新描述:" prop="description"> 126 <el-form-item label="更新描述:" prop="description">
@@ -138,17 +143,18 @@ @@ -138,17 +143,18 @@
138 </template> 143 </template>
139 144
140 <script> 145 <script>
141 -import upLoad from "./components/upLoad.vue"  
142 -import upLoadImg from "./components/upLoadImg.vue" 146 +import upLoad from "./components/upLoad.vue";
  147 +import upLoadImg from "./components/upLoadImg.vue";
143 export default { 148 export default {
144 - components:{ 149 + components: {
145 upLoad, 150 upLoad,
146 - upLoadImg 151 + upLoadImg,
147 }, 152 },
148 data() { 153 data() {
149 return { 154 return {
150 url: "/file/uploadApp", 155 url: "/file/uploadApp",
151 loading: false, 156 loading: false,
  157 + addLoading: false,
152 diaAdd: false, 158 diaAdd: false,
153 tableData: [], 159 tableData: [],
154 formAdd: { 160 formAdd: {
@@ -163,12 +169,6 @@ export default { @@ -163,12 +169,6 @@ export default {
163 versionName: [ 169 versionName: [
164 { required: true, message: "请输入版本名称", trigger: "blur" }, 170 { required: true, message: "请输入版本名称", trigger: "blur" },
165 ], 171 ],
166 - versionNumber: [  
167 - { required: true, message: "请输入版本号", trigger: "blur" },  
168 - ],  
169 - appImage: [  
170 - { required: true, message: "请上传软件图标", trigger: "blur" },  
171 - ],  
172 filePath: [ 172 filePath: [
173 { required: true, message: "请上传全量文件包", trigger: "blur" }, 173 { required: true, message: "请上传全量文件包", trigger: "blur" },
174 ], 174 ],
@@ -198,17 +198,42 @@ export default { @@ -198,17 +198,42 @@ export default {
198 this.page = page; 198 this.page = page;
199 this._QueryData(); 199 this._QueryData();
200 }, 200 },
201 - remove(obj) {},  
202 - logoSuccess(res){  
203 - this.formAdd.appImage = res.data; 201 + async remove(obj) {
  202 + const { data, status, info } = await this.$request.delVersion({
  203 + id: obj.id,
  204 + });
  205 + if (status === 0) {
  206 + this.$message.success("删除成功~");
  207 + this._QueryData();
  208 + } else {
  209 + this.$message.error(info);
  210 + }
  211 + },
  212 + logoSuccess(res) {
  213 + this.formAdd.appImage = res.data.resId;
204 }, 214 },
205 - appfilesSuccess(res){ 215 + appfilesSuccess(res) {
206 this.formAdd.filePath = res.data; 216 this.formAdd.filePath = res.data;
207 }, 217 },
208 - addfilesSuccess(res){ 218 + addfilesSuccess(res) {
209 this.formAdd.incrementFilePath = res.data; 219 this.formAdd.incrementFilePath = res.data;
210 }, 220 },
211 - save() {}, 221 + async save() {
  222 + if (this.addLoading) return;
  223 + this.addLoading = true;
  224 + const { data, status, info } = await this.$request.addVersion({
  225 + ...this.formAdd,
  226 + });
  227 +
  228 + this.addLoading = false;
  229 + if (status === 0) {
  230 + this.diaAdd = false;
  231 + this.$message.success("添加成功~");
  232 + this._QueryData();
  233 + } else {
  234 + this.$message.error(info);
  235 + }
  236 + },
212 async _QueryData() { 237 async _QueryData() {
213 this.loading = true; 238 this.loading = true;
214 this.tableData = []; 239 this.tableData = [];
src/views/admin/device/index.vue
@@ -27,27 +27,27 @@ @@ -27,27 +27,27 @@
27 <div class="answer-header"> 27 <div class="answer-header">
28 <div class="sel-box"> 28 <div class="sel-box">
29 <el-input 29 <el-input
30 - placeholder="请输入租户" 30 + placeholder="请输入学校"
31 v-model="query.schoolName" 31 v-model="query.schoolName"
32 class="input-with-select" 32 class="input-with-select"
33 - @keyup.enter.native="_QueryData(true)" 33 + @keyup.enter.native="query.loginName='',_QueryData(true)"
34 > 34 >
35 <el-button 35 <el-button
36 slot="append" 36 slot="append"
37 icon="el-icon-search" 37 icon="el-icon-search"
38 - @click="_QueryData(true)" 38 + @click="query.loginName='',_QueryData(true)"
39 ></el-button> 39 ></el-button>
40 </el-input> 40 </el-input>
41 <el-input 41 <el-input
42 placeholder="请输入租户" 42 placeholder="请输入租户"
43 - v-model="query.sn" 43 + v-model="query.loginName"
44 class="input-with-select" 44 class="input-with-select"
45 - @keyup.enter.native="_QueryData(true)" 45 + @keyup.enter.native="query.schoolName='',_QueryData(true)"
46 > 46 >
47 <el-button 47 <el-button
48 slot="append" 48 slot="append"
49 icon="el-icon-search" 49 icon="el-icon-search"
50 - @click="_QueryData(true)" 50 + @click="query.schoolName='',_QueryData(true)"
51 ></el-button> 51 ></el-button>
52 </el-input> 52 </el-input>
53 <el-button class="serach-box" round @click="_QueryData(true)" 53 <el-button class="serach-box" round @click="_QueryData(true)"
@@ -135,30 +135,28 @@ @@ -135,30 +135,28 @@
135 <div class="table-box"> 135 <div class="table-box">
136 <div class="answer-header"> 136 <div class="answer-header">
137 <div class="sel-box"> 137 <div class="sel-box">
138 - <el-select  
139 - class="sel"  
140 - v-model="query.school"  
141 - placeholder="选择学校"  
142 - @change="_QueryData(true)" 138 + <el-input
  139 + placeholder="请输入学校"
  140 + v-model="query.schoolName"
  141 + class="input-with-select"
  142 + @keyup.enter.native="query.loginName='',_QueryData(true)"
143 > 143 >
144 - <el-option  
145 - v-for="item in schoolList"  
146 - :key="item.value"  
147 - :label="item.label"  
148 - :value="item.value"  
149 - >  
150 - </el-option>  
151 - </el-select> 144 + <el-button
  145 + slot="append"
  146 + icon="el-icon-search"
  147 + @click="query.loginName='',_QueryData(true)"
  148 + ></el-button>
  149 + </el-input>
152 <el-input 150 <el-input
153 placeholder="请输入租户" 151 placeholder="请输入租户"
154 - v-model="query.sn" 152 + v-model="query.loginName"
155 class="input-with-select" 153 class="input-with-select"
156 - @keyup.enter.native="_QueryData(true)" 154 + @keyup.enter.native="query.schoolName='',_QueryData(true)"
157 > 155 >
158 <el-button 156 <el-button
159 slot="append" 157 slot="append"
160 icon="el-icon-search" 158 icon="el-icon-search"
161 - @click="_QueryData(true)" 159 + @click="query.schoolName='',_QueryData(true)"
162 ></el-button> 160 ></el-button>
163 </el-input> 161 </el-input>
164 <el-button class="serach-box" round @click="_QueryData(true)" 162 <el-button class="serach-box" round @click="_QueryData(true)"
@@ -255,7 +253,6 @@ export default { @@ -255,7 +253,6 @@ export default {
255 this.page = 1; 253 this.page = 1;
256 this.total = 0; 254 this.total = 0;
257 this.count = 0; 255 this.count = 0;
258 - this.query.onlineStatus = "";  
259 this.query.schoolName = ""; 256 this.query.schoolName = "";
260 this.query.loginName = ""; 257 this.query.loginName = "";
261 if (val == 1) { 258 if (val == 1) {
@@ -275,7 +272,6 @@ export default { @@ -275,7 +272,6 @@ export default {
275 query: { 272 query: {
276 schoolName: "", 273 schoolName: "",
277 loginName: "", 274 loginName: "",
278 - onlineStatus: "",  
279 }, 275 },
280 tableData: [], 276 tableData: [],
281 total: 0, 277 total: 0,
@@ -377,13 +373,6 @@ export default { @@ -377,13 +373,6 @@ export default {
377 query[key] = this.query[key]; 373 query[key] = this.query[key];
378 } 374 }
379 } 375 }
380 - if (query.loginName) {  
381 - delete query.schoolName;  
382 - delete query.onlineStatus;  
383 - } else if (query.schoolName) {  
384 - delete query.loginName;  
385 - delete query.onlineStatus;  
386 - }  
387 if (isRef) { 376 if (isRef) {
388 this.page = 1; 377 this.page = 1;
389 } 378 }
src/views/admin/device/log.vue
@@ -296,7 +296,7 @@ export default { @@ -296,7 +296,7 @@ export default {
296 data = {}, 296 data = {},
297 status, 297 status,
298 info, 298 info,
299 - } = await this.$request.deviceLogList({ 299 + } = await this.$request.pDeviceLogList({
300 ...query, 300 ...query,
301 deviceId: Number(this.id), 301 deviceId: Number(this.id),
302 page: this.page, 302 page: this.page,
src/views/personal/examinationPaper/add.vue renamed to src/views/examinationPaper/add.vue
@@ -55,6 +55,26 @@ @@ -55,6 +55,26 @@
55 @click="openTagDia" 55 @click="openTagDia"
56 ></el-button> 56 ></el-button>
57 </el-form-item> 57 </el-form-item>
  58 + <el-form-item
  59 + v-if="role != 'ROLE_PERSONAL'"
  60 + label="年级:"
  61 + prop="gradeName"
  62 + >
  63 + <el-select
  64 + class="sel"
  65 + v-model="form.gradeName"
  66 + placeholder=""
  67 + @change="changeGrade"
  68 + >
  69 + <el-option
  70 + v-for="item in gradeList"
  71 + :key="item"
  72 + :label="item"
  73 + :value="item"
  74 + >
  75 + </el-option>
  76 + </el-select>
  77 + </el-form-item>
58 <el-form-item label="科目:" prop="subjectName"> 78 <el-form-item label="科目:" prop="subjectName">
59 <el-select class="sel" v-model="form.subjectName" placeholder=""> 79 <el-select class="sel" v-model="form.subjectName" placeholder="">
60 <el-option 80 <el-option
@@ -77,6 +97,16 @@ @@ -77,6 +97,16 @@
77 label="考试时长" 97 label="考试时长"
78 ></el-input-number> 98 ></el-input-number>
79 </el-form-item> 99 </el-form-item>
  100 + <el-form-item
  101 + v-if="role != 'ROLE_PERSONAL'"
  102 + label="分享范围:"
  103 + prop="sharingType"
  104 + >
  105 + <el-radio-group v-model="form.sharingType">
  106 + <el-radio :label="0">任课班级分享</el-radio>
  107 + <el-radio :label="1">全年级分享</el-radio>
  108 + </el-radio-group>
  109 + </el-form-item>
80 </el-form> 110 </el-form>
81 <div class="btn-box"> 111 <div class="btn-box">
82 <el-button type="danger" plain round @click="linkBack" 112 <el-button type="danger" plain round @click="linkBack"
@@ -830,23 +860,29 @@ @@ -830,23 +860,29 @@
830 </div> 860 </div>
831 </div> 861 </div>
832 <el-dialog 862 <el-dialog
833 - :title="upLoadType == 1 ? '上传题干' : '上传题目解析'" 863 + :title="stem.type == 1 ? '上传题干' : '上传题目解析'"
834 :visible.sync="dialogStem" 864 :visible.sync="dialogStem"
  865 + v-if="dialogStem"
835 width="500" 866 width="500"
836 > 867 >
837 - <div>  
838 - <img class="stem-pic" :src="stem.screenshot" alt="" /> 868 + <div class="upload-box">
  869 + <img
  870 + v-if="stem.screenshot || stem.answerScreenshot"
  871 + :src="
  872 + stem.type == 1 ? stem.screenshotSrc : stem.answerScreenshotSrc
  873 + "
  874 + class="stem-pic"
  875 + />
839 <el-upload 876 <el-upload
840 class="upload-demo" 877 class="upload-demo"
841 action="http://121.40.127.171/file/uploadImg" 878 action="http://121.40.127.171/file/uploadImg"
842 :limit="1" 879 :limit="1"
843 - :with-credentials="true"  
844 :on-success="upSuccess" 880 :on-success="upSuccess"
845 :on-error="upError" 881 :on-error="upError"
846 accept="image/*" 882 accept="image/*"
847 > 883 >
848 <el-button size="small" type="primary">{{ 884 <el-button size="small" type="primary">{{
849 - stem.src ? "重新上传" : "选择照片" 885 + stem.screenshot || stem.answerScreenshot ? "重新上传" : "选择照片"
850 }}</el-button> 886 }}</el-button>
851 </el-upload> 887 </el-upload>
852 </div> 888 </div>
@@ -930,43 +966,8 @@ export default { @@ -930,43 +966,8 @@ export default {
930 }, 966 },
931 data() { 967 data() {
932 return { 968 return {
933 - dialogStem: false,  
934 - dialogTag: false,  
935 - upLoadType: 1,  
936 - stem: {  
937 - id: "",  
938 - type: 1,  
939 - index: 0,  
940 - indexs: 0,  
941 - screenshot: "", //题干图片地址  
942 - answerScreenshot: "", //题干解析图片地址  
943 - difficultyFactor: 0, //题目难度  
944 - knowledge: [], //知识点  
945 - },  
946 - type: 1, //1-创建,2-复制答题卡  
947 - dialogVisible: false, //测验类型设置弹窗  
948 - addQuestionVisible: false, //添加大题弹窗  
949 - questionForm: { ...questionForm },  
950 - questionFormRules: {  
951 - questionTitle: [  
952 - { required: true, message: "请输入大题名称", trigger: "blur" },  
953 - {  
954 - min: 1,  
955 - max: 30,  
956 - message: "长度在 1 到 30 个字符",  
957 - trigger: "blur",  
958 - },  
959 - ],  
960 - },  
961 - questionOptions: [  
962 - { label: "单选题", value: 2 },  
963 - { label: "多选题", value: 3 },  
964 - { label: "判断题", value: 4 },  
965 - { label: "主观题", value: 5 },  
966 - ],  
967 - rightOptions: ["A", "B", "C", "D", "E", "F", "G"],  
968 - addSubQuestionsType: "",  
969 - step: 1, //步骤 969 + role: "",
  970 + step: 0, //步骤
970 gradeList: [], //年级 971 gradeList: [], //年级
971 subjectList: [], //科目 972 subjectList: [], //科目
972 answerTypeList: [], //测验类型 973 answerTypeList: [], //测验类型
@@ -978,6 +979,8 @@ export default { @@ -978,6 +979,8 @@ export default {
978 subjectName: "", 979 subjectName: "",
979 examsDuration: 90, 980 examsDuration: 90,
980 questionList: [], 981 questionList: [],
  982 + gradeName: "",
  983 + sharingType: 0,
981 }, 984 },
982 formRules: { 985 formRules: {
983 //答题卡验证 986 //答题卡验证
@@ -998,7 +1001,9 @@ export default { @@ -998,7 +1001,9 @@ export default {
998 ], 1001 ],
999 }, 1002 },
1000 tagList: [], 1003 tagList: [],
1001 - diaSetAns: false, 1004 + diaSetAns: false, //答案开关
  1005 + dialogStem: false, //截图开关
  1006 + dialogTag: false, //打标开关
1002 formAns: { 1007 formAns: {
1003 listIndex: 0, //大题位置 1008 listIndex: 0, //大题位置
1004 endIndex: 0, //相同题目最后一位题目的questionIndex 1009 endIndex: 0, //相同题目最后一位题目的questionIndex
@@ -1008,10 +1013,53 @@ export default { @@ -1008,10 +1013,53 @@ export default {
1008 answerOptions: [], //答案选项 1013 answerOptions: [], //答案选项
1009 answerList: "", //答案列表-字符串 1014 answerList: "", //答案列表-字符串
1010 }, 1015 },
  1016 + stem: {
  1017 + type: 1, //类型
  1018 + index: 0, //大题位置
  1019 + indexs: 0, //小题位置
  1020 + screenshot: "", //题干图片id
  1021 + answerScreenshot: "", //题干解析图片id
  1022 + screenshotSrc: "", //题干图片地址显示用保存时删除
  1023 + answerScreenshotSrc: "", //题干解析图片地址显示用保存时删除
  1024 + difficultyFactor: 0, //题目难度
  1025 + knowledge: null, //知识点
  1026 + },
  1027 + type: 1, //1-创建,2-复制答题卡
  1028 + dialogVisible: false, //测验类型设置弹窗
  1029 + addQuestionVisible: false, //添加大题弹窗
  1030 + questionForm: { ...questionForm },
  1031 + questionFormRules: {
  1032 + questionTitle: [
  1033 + { required: true, message: "请输入大题名称", trigger: "blur" },
  1034 + {
  1035 + min: 1,
  1036 + max: 30,
  1037 + message: "长度在 1 到 30 个字符",
  1038 + trigger: "blur",
  1039 + },
  1040 + ],
  1041 + },
  1042 + questionOptions: [
  1043 + { label: "单选题", value: 2 },
  1044 + { label: "多选题", value: 3 },
  1045 + { label: "判断题", value: 4 },
  1046 + { label: "主观题", value: 5 },
  1047 + ],
  1048 + rightOptions: ["A", "B", "C", "D", "E", "F", "G"],
  1049 + addSubQuestionsType: "",
1011 }; 1050 };
1012 }, 1051 },
1013 async created() { 1052 async created() {
1014 this.type = this.$route.query.type ? this.$route.query.type : 1; 1053 this.type = this.$route.query.type ? this.$route.query.type : 1;
  1054 + this.role =
  1055 + this.$store.getters.info.showRole ||
  1056 + this.$store.getters.info.permissions[0].role;
  1057 + if (this.role != "ROLE_PERSONAL") {
  1058 + this.formRules.gradeName = [
  1059 + { required: true, message: "请选择年级", trigger: "blur" },
  1060 + ];
  1061 + await this._GradeList();
  1062 + }
1015 await this._QuerySubjectList(this.gradeList[0]); 1063 await this._QuerySubjectList(this.gradeList[0]);
1016 await this._TypeList(); 1064 await this._TypeList();
1017 if (this.type == 2) { 1065 if (this.type == 2) {
@@ -1021,18 +1069,25 @@ export default { @@ -1021,18 +1069,25 @@ export default {
1021 methods: { 1069 methods: {
1022 openStem(obj, type, index, indexs) { 1070 openStem(obj, type, index, indexs) {
1023 //上传截图 1071 //上传截图
1024 - this.upLoadType = type;  
1025 - this.stem.id = obj.id;  
1026 this.stem.type = type; 1072 this.stem.type = type;
1027 this.stem.index = index; 1073 this.stem.index = index;
1028 this.stem.indexs = indexs; 1074 this.stem.indexs = indexs;
1029 - this.stem.screenshot = type == 1 ? obj.screenshot : obj.answerScreenshot; 1075 + if (type == 1) {
  1076 + this.stem.screenshot = obj.screenshot || "";
  1077 + this.stem.screenshotSrc = obj.screenshotSrc || "";
  1078 + this.stem.answerScreenshot = "";
  1079 + this.stem.answerScreenshotSrc = "";
  1080 + } else {
  1081 + this.stem.screenshot = "";
  1082 + this.stem.screenshotSrc = "";
  1083 + this.stem.answerScreenshot = obj.answerScreenshot || "";
  1084 + this.stem.answerScreenshotSrc = obj.answerScreenshotSrc || "";
  1085 + }
1030 this.dialogStem = true; 1086 this.dialogStem = true;
1031 }, 1087 },
1032 openTag(obj, type, index, indexs) { 1088 openTag(obj, type, index, indexs) {
1033 //难度,知识点 1089 //难度,知识点
1034 this.stem = { ...this.stem, obj }; 1090 this.stem = { ...this.stem, obj };
1035 - this.stem.id = obj.id;  
1036 this.stem.type = type; 1091 this.stem.type = type;
1037 this.stem.index = index; 1092 this.stem.index = index;
1038 this.stem.indexs = indexs; 1093 this.stem.indexs = indexs;
@@ -1040,14 +1095,18 @@ export default { @@ -1040,14 +1095,18 @@ export default {
1040 this.stem.difficultyFactor = obj.difficultyFactor || ""; 1095 this.stem.difficultyFactor = obj.difficultyFactor || "";
1041 this.dialogTag = true; 1096 this.dialogTag = true;
1042 }, 1097 },
1043 - upSuccess(res) { 1098 + upSuccess(res, file) {
1044 //图片上传成功 1099 //图片上传成功
1045 if (res && res.status == 0) { 1100 if (res && res.status == 0) {
1046 - this.dialogStem = false;  
1047 let keys = this.stem.type == 1 ? "screenshot" : "answerScreenshot"; 1101 let keys = this.stem.type == 1 ? "screenshot" : "answerScreenshot";
  1102 + this.stem[keys + "Src"] = res.data.url;
  1103 + this.stem[keys] = res.data.resId;
1048 this.form.questionList[this.stem.index].subQuestions[this.stem.indexs][ 1104 this.form.questionList[this.stem.index].subQuestions[this.stem.indexs][
1049 keys 1105 keys
1050 ] = this.stem[keys]; 1106 ] = this.stem[keys];
  1107 + this.form.questionList[this.stem.index].subQuestions[this.stem.indexs][
  1108 + keys + "Src"
  1109 + ] = this.stem[keys + "Src"];
1051 this.$message.success("上传成功"); 1110 this.$message.success("上传成功");
1052 } else { 1111 } else {
1053 this.$message.error(res.info); 1112 this.$message.error(res.info);
@@ -1175,7 +1234,6 @@ export default { @@ -1175,7 +1234,6 @@ export default {
1175 val 1234 val
1176 ); 1235 );
1177 } else { 1236 } else {
1178 - console.log(this.questionForm.answerList.split(","));  
1179 this.questionForm.answerList = this.questionForm.answerList 1237 this.questionForm.answerList = this.questionForm.answerList
1180 .split(",") 1238 .split(",")
1181 .splice(0, val) 1239 .splice(0, val)
@@ -1431,12 +1489,12 @@ export default { @@ -1431,12 +1489,12 @@ export default {
1431 ); 1489 );
1432 } 1490 }
1433 } 1491 }
1434 - console.log(types);  
1435 }); 1492 });
1436 this.step = 2; 1493 this.step = 2;
1437 return; 1494 return;
1438 }, 1495 },
1439 formatQuestionList() { 1496 formatQuestionList() {
  1497 + //删除批量操作数据
1440 for (let i = 0; i < this.form.questionList.length; i++) { 1498 for (let i = 0; i < this.form.questionList.length; i++) {
1441 for ( 1499 for (
1442 let j = 0; 1500 let j = 0;
@@ -1627,7 +1685,11 @@ export default { @@ -1627,7 +1685,11 @@ export default {
1627 return; 1685 return;
1628 } 1686 }
1629 //修改测验类型 1687 //修改测验类型
1630 - const { data, status, info } = await this.$request.pModifyPaperType({ 1688 + let editPaperType =
  1689 + this.role == "ROLE_PERSONAL"
  1690 + ? this.$request.pModifyPaperType
  1691 + : this.$request.editPaperType;
  1692 + const { data, status, info } = await editPaperType({
1631 tagId: obj.id, 1693 tagId: obj.id,
1632 tag: obj.typeName, 1694 tag: obj.typeName,
1633 }); 1695 });
@@ -1641,7 +1703,11 @@ export default { @@ -1641,7 +1703,11 @@ export default {
1641 }, 1703 },
1642 async removeTypeName(obj) { 1704 async removeTypeName(obj) {
1643 //删除测验类型 1705 //删除测验类型
1644 - const { data, status, info } = await this.$request.pDelPaperType({ 1706 + let delPaperType =
  1707 + this.role == "ROLE_PERSONAL"
  1708 + ? this.$request.pDelPaperType
  1709 + : this.$request.delPaperType;
  1710 + const { data, status, info } = await delPaperType({
1645 tagId: obj.id, 1711 tagId: obj.id,
1646 }); 1712 });
1647 if (status == 0) { 1713 if (status == 0) {
@@ -1669,7 +1735,11 @@ export default { @@ -1669,7 +1735,11 @@ export default {
1669 return; 1735 return;
1670 } 1736 }
1671 //添加测验类型 1737 //添加测验类型
1672 - const { data, status, info } = await this.$request.pAddPaperType({ 1738 + let addPaperType =
  1739 + this.role == "ROLE_PERSONAL"
  1740 + ? this.$request.pAddPaperType
  1741 + : this.$request.addPaperType;
  1742 + const { data, status, info } = await addPaperType({
1673 tag: this.answerTypeName, 1743 tag: this.answerTypeName,
1674 }); 1744 });
1675 if (status == 0) { 1745 if (status == 0) {
@@ -1689,8 +1759,21 @@ export default { @@ -1689,8 +1759,21 @@ export default {
1689 let formDatas = deepClone(this.form); 1759 let formDatas = deepClone(this.form);
1690 for (let i = 0; i < formDatas.questionList.length; i++) { 1760 for (let i = 0; i < formDatas.questionList.length; i++) {
1691 delete formDatas.questionList[i].show; 1761 delete formDatas.questionList[i].show;
  1762 + for (let j = 0; j < formDatas.questionList[i].subQuestions; j++) {
  1763 + if (!!formDatas.questionList[i].subQuestions[j].answerScreenshotSrc) {
  1764 + delete formDatas.questionList[i].subQuestions[j]
  1765 + .answerScreenshotSrc;
  1766 + }
  1767 + if (!!formDatas.questionList[i].subQuestions[j].screenshotSrc) {
  1768 + delete formDatas.questionList[i].subQuestions[j].screenshotSrc;
  1769 + }
  1770 + }
1692 } 1771 }
1693 - const { data, status, info } = await this.$request.pAddPaper({ 1772 + let addPaper =
  1773 + this.role == "ROLE_PERSONAL"
  1774 + ? this.$request.pAddPaper
  1775 + : this.$request.addPaper;
  1776 + const { data, status, info } = await addPaper({
1694 ...formDatas, 1777 ...formDatas,
1695 }); 1778 });
1696 this.saveLoading = false; 1779 this.saveLoading = false;
@@ -1702,9 +1785,17 @@ export default { @@ -1702,9 +1785,17 @@ export default {
1702 this.$message.error(info); 1785 this.$message.error(info);
1703 } 1786 }
1704 }, 1787 },
  1788 + async changeGrade() {
  1789 + //切换年级查询科目
  1790 + this._QuerySubjectList(this.form.gradeName);
  1791 + },
1705 async _TypeList() { 1792 async _TypeList() {
1706 //测验类型查询 1793 //测验类型查询
1707 - const { data, status, info } = await this.$request.pPaperTagList({ 1794 + let fetchTypeNames =
  1795 + this.role == "ROLE_PERSONAL"
  1796 + ? this.$request.pPaperTagList
  1797 + : this.$request.fetchTypeNames;
  1798 + const { data, status, info } = await fetchTypeNames({
1708 type: 1, 1799 type: 1,
1709 }); 1800 });
1710 if (status == 0) { 1801 if (status == 0) {
@@ -1722,30 +1813,51 @@ export default { @@ -1722,30 +1813,51 @@ export default {
1722 this.$message.error(info); 1813 this.$message.error(info);
1723 } 1814 }
1724 }, 1815 },
1725 -  
1726 - async _QuerySubjectList() { 1816 + async _GradeList() {
  1817 + //查询年级列表
  1818 + const { data, status, info } = await this.$request.fetchGradeList();
  1819 + if (status == 0) {
  1820 + this.gradeList = (data.gradeNames && [...data.gradeNames]) || [];
  1821 + if (this.type != 2) {
  1822 + this.form.gradeName = this.gradeList[0];
  1823 + }
  1824 + } else {
  1825 + this.$message.error(info);
  1826 + }
  1827 + },
  1828 + async _QuerySubjectList(grade) {
1727 //查询科目列表 1829 //查询科目列表
1728 - const { data, status, info } = await this.$request.pSubjectList(); 1830 + let query = {};
  1831 + let fetchSubjectList =
  1832 + this.role == "ROLE_PERSONAL"
  1833 + ? this.$request.pSubjectList
  1834 + : this.$request.fetchSubjectList;
  1835 + if (this.role != "ROLE_PERSONAL") {
  1836 + query.gradeName = grade;
  1837 + }
  1838 + const { data, status, info } = await fetchSubjectList({ ...query });
1729 if (status === 0) { 1839 if (status === 0) {
1730 this.subjectList = 1840 this.subjectList =
1731 data.subjectNames?.map((item) => { 1841 data.subjectNames?.map((item) => {
1732 return { 1842 return {
1733 - value: item.subjectName,  
1734 - label: item.subjectName, 1843 + value: this.role == "ROLE_PERSONAL" ?item.subjectName: item ,
  1844 + label: this.role == "ROLE_PERSONAL" ?item.subjectName: item ,
1735 }; 1845 };
1736 }) || []; 1846 }) || [];
1737 - console.log(this.subjectList);  
1738 if (this.subjectList.length) { 1847 if (this.subjectList.length) {
1739 this.form.subjectName = this.subjectList[0].value; 1848 this.form.subjectName = this.subjectList[0].value;
1740 } 1849 }
1741 - console.log(this.form);  
1742 } else { 1850 } else {
1743 this.$message.error(info); 1851 this.$message.error(info);
1744 } 1852 }
1745 }, 1853 },
1746 async _QueryDetail() { 1854 async _QueryDetail() {
1747 //查询答题卡详情 1855 //查询答题卡详情
1748 - const { data, status, info } = await this.$request.pPaperDetail({ 1856 + let fetchPaperDetail =
  1857 + this.role == "ROLE_PERSONAL"
  1858 + ? this.$request.pPaperDetail
  1859 + : this.$request.fetchPaperDetail;
  1860 + const { data, status, info } = await fetchPaperDetail({
1749 paperId: this.$route.query.paperId, 1861 paperId: this.$route.query.paperId,
1750 }); 1862 });
1751 if (status == 0) { 1863 if (status == 0) {
@@ -1753,6 +1865,10 @@ export default { @@ -1753,6 +1865,10 @@ export default {
1753 this.form.tagId = data.tagId === 0 ? "" : data.tagId; 1865 this.form.tagId = data.tagId === 0 ? "" : data.tagId;
1754 this.form.subjectName = data.subjectName; 1866 this.form.subjectName = data.subjectName;
1755 this.form.examsDuration = data.examsDuration; 1867 this.form.examsDuration = data.examsDuration;
  1868 + if (this.role != "ROLE_PERSONAL") {
  1869 + this.form.sharingType = data.sharingType;
  1870 + this.form.gradeName = data.gradeName;
  1871 + }
1756 this.form.questionList = data.questionList?.map((item) => { 1872 this.form.questionList = data.questionList?.map((item) => {
1757 let subQuestions = 1873 let subQuestions =
1758 item.subQuestions?.map((items) => { 1874 item.subQuestions?.map((items) => {
@@ -1763,6 +1879,12 @@ export default { @@ -1763,6 +1879,12 @@ export default {
1763 selectNum: items.answerOptions.split(",").length, 1879 selectNum: items.answerOptions.split(",").length,
1764 answerOptions: items.answerOptions || "A,B,C,D", 1880 answerOptions: items.answerOptions || "A,B,C,D",
1765 correctAnswer: items.correctAnswer, 1881 correctAnswer: items.correctAnswer,
  1882 + screenshot: items.screenshot || "",
  1883 + screenshotSrc: items.screenshot || "",
  1884 + answerScreenshot: items.answerScreenshot || "",
  1885 + answerScreenshotSrc: items.answerScreenshot || "",
  1886 + difficultyFactor: items.difficultyFactor || "", //题目难度
  1887 + knowledge: items.knowledge || null, //知识点
1766 }; 1888 };
1767 }) || []; 1889 }) || [];
1768 return { 1890 return {
@@ -1800,7 +1922,7 @@ export default { @@ -1800,7 +1922,7 @@ export default {
1800 .delButton { 1922 .delButton {
1801 text-indent: -9999999px; 1923 text-indent: -9999999px;
1802 border-color: #ff6868; 1924 border-color: #ff6868;
1803 - background: #ff6868 url("../../../assets/images/arrow.png") no-repeat center; 1925 + background: #ff6868 url("../../assets/images/arrow.png") no-repeat center;
1804 background-size: 19px; 1926 background-size: 19px;
1805 color: transparent; 1927 color: transparent;
1806 } 1928 }
@@ -2048,10 +2170,15 @@ export default { @@ -2048,10 +2170,15 @@ export default {
2048 } 2170 }
2049 } 2171 }
2050 } 2172 }
2051 -.upload-demo {  
2052 - text-align: center;  
2053 -}  
2054 -.stem-pic {  
2055 - width: 100%; 2173 +.upload-box {
  2174 + .upload-demo {
  2175 + text-align: center;
  2176 + }
  2177 + .stem-pic {
  2178 + display: block;
  2179 + margin: 0 auto 20px;
  2180 + height: 200px;
  2181 + object-fit: cover;
  2182 + }
2056 } 2183 }
2057 </style> 2184 </style>
2058 \ No newline at end of file 2185 \ No newline at end of file
src/views/personal/examinationPaper/edit.vue renamed to src/views/examinationPaper/edit.vue
@@ -418,23 +418,31 @@ @@ -418,23 +418,31 @@
418 </div> 418 </div>
419 </el-dialog> 419 </el-dialog>
420 <el-dialog 420 <el-dialog
421 - :title="upLoadType == 1 ? '上传题干' : '上传题目解析'" 421 + :title="stem.type == 1 ? '上传题干' : '上传题目解析'"
422 :visible.sync="dialogStem" 422 :visible.sync="dialogStem"
  423 + v-if="dialogStem"
423 width="500" 424 width="500"
424 > 425 >
425 - <div>  
426 - <img class="stem-pic" :src="stem.screenshot" alt="" /> 426 + <div class="upload-box">
  427 + <img
  428 + v-if="stem.screenshot || stem.answerScreenshot"
  429 + :src="
  430 + stem.type == 1
  431 + ? stem.screenshotSrc || stem.screenshot
  432 + : stem.answerScreenshotSrc || stem.answerScreenshot
  433 + "
  434 + class="stem-pic"
  435 + />
427 <el-upload 436 <el-upload
428 class="upload-demo" 437 class="upload-demo"
429 action="http://121.40.127.171/file/uploadImg" 438 action="http://121.40.127.171/file/uploadImg"
430 :limit="1" 439 :limit="1"
431 - :with-credentials="true"  
432 :on-success="upSuccess" 440 :on-success="upSuccess"
433 :on-error="upError" 441 :on-error="upError"
434 accept="image/*" 442 accept="image/*"
435 > 443 >
436 <el-button size="small" type="primary">{{ 444 <el-button size="small" type="primary">{{
437 - stem.src ? "重新上传" : "选择照片" 445 + stem.screenshot || stem.answerScreenshot ? "重新上传" : "选择照片"
438 }}</el-button> 446 }}</el-button>
439 </el-upload> 447 </el-upload>
440 </div> 448 </div>
@@ -483,16 +491,17 @@ import { deepClone, checkAnswer } from &quot;utils&quot;; @@ -483,16 +491,17 @@ import { deepClone, checkAnswer } from &quot;utils&quot;;
483 export default { 491 export default {
484 data() { 492 data() {
485 return { 493 return {
  494 + role: "",
486 dialogStem: false, 495 dialogStem: false,
487 dialogTag: false, 496 dialogTag: false,
488 - upLoadType: 1,  
489 stem: { 497 stem: {
490 - id: "",  
491 - type: 1,  
492 - index: 0,  
493 - indexs: 0,  
494 - screenshot: "", //题干图片地址  
495 - answerScreenshot: "", //题干解析图片地址 498 + type: 1, //类型
  499 + index: 0, //大题位置
  500 + indexs: 0, //小题位置
  501 + screenshot: "", //题干图片id
  502 + answerScreenshot: "", //题干解析图片id
  503 + screenshotSrc: "", //题干图片地址显示用保存时删除
  504 + answerScreenshotSrc: "", //题干解析图片地址显示用保存时删除
496 difficultyFactor: 0, //题目难度 505 difficultyFactor: 0, //题目难度
497 knowledge: [], //知识点 506 knowledge: [], //知识点
498 }, 507 },
@@ -541,6 +550,9 @@ export default { @@ -541,6 +550,9 @@ export default {
541 }, 550 },
542 }, 551 },
543 created() { 552 created() {
  553 + this.role =
  554 + this.$store.getters.info.showRole ||
  555 + this.$store.getters.info.permissions[0].role;
544 this.type = this.$route.query.type || 1; 556 this.type = this.$route.query.type || 1;
545 this.title = this.$route.query.title || ""; 557 this.title = this.$route.query.title || "";
546 this._QueryDetail(); 558 this._QueryDetail();
@@ -548,18 +560,25 @@ export default { @@ -548,18 +560,25 @@ export default {
548 methods: { 560 methods: {
549 openStem(obj, type, index, indexs) { 561 openStem(obj, type, index, indexs) {
550 //上传截图 562 //上传截图
551 - this.upLoadType = type;  
552 - this.stem.id = obj.id;  
553 this.stem.type = type; 563 this.stem.type = type;
554 this.stem.index = index; 564 this.stem.index = index;
555 this.stem.indexs = indexs; 565 this.stem.indexs = indexs;
556 - this.stem.screenshot = type == 1 ? obj.screenshot : obj.answerScreenshot; 566 + if (type == 1) {
  567 + this.stem.screenshot = obj.screenshot || "";
  568 + this.stem.screenshotSrc = obj.screenshotSrc || "";
  569 + this.stem.answerScreenshot = "";
  570 + this.stem.answerScreenshotSrc = "";
  571 + } else {
  572 + this.stem.screenshot = "";
  573 + this.stem.screenshotSrc = "";
  574 + this.stem.answerScreenshot = obj.answerScreenshot || "";
  575 + this.stem.answerScreenshotSrc = obj.answerScreenshotSrc || "";
  576 + }
557 this.dialogStem = true; 577 this.dialogStem = true;
558 }, 578 },
559 openTag(obj, type, index, indexs) { 579 openTag(obj, type, index, indexs) {
560 //难度,知识点 580 //难度,知识点
561 this.stem = { ...this.stem, obj }; 581 this.stem = { ...this.stem, obj };
562 - this.stem.id = obj.id;  
563 this.stem.type = type; 582 this.stem.type = type;
564 this.stem.index = index; 583 this.stem.index = index;
565 this.stem.indexs = indexs; 584 this.stem.indexs = indexs;
@@ -567,19 +586,24 @@ export default { @@ -567,19 +586,24 @@ export default {
567 this.stem.difficultyFactor = obj.difficultyFactor || ""; 586 this.stem.difficultyFactor = obj.difficultyFactor || "";
568 this.dialogTag = true; 587 this.dialogTag = true;
569 }, 588 },
570 - upSuccess(res) { 589 + upSuccess(res, file) {
571 //图片上传成功 590 //图片上传成功
572 if (res && res.status == 0) { 591 if (res && res.status == 0) {
573 - this.dialogStem = false;  
574 let keys = this.stem.type == 1 ? "screenshot" : "answerScreenshot"; 592 let keys = this.stem.type == 1 ? "screenshot" : "answerScreenshot";
575 - if (typeof this.stem.indexs != undefined) { 593 + this.stem[keys + "Src"] = res.data.url;
  594 + this.stem[keys] = res.data.resId;
  595 + if (this.questionList[0].subQuestions) {
576 this.questionList[this.stem.index].subQuestions[this.stem.indexs][ 596 this.questionList[this.stem.index].subQuestions[this.stem.indexs][
577 keys 597 keys
578 ] = this.stem[keys]; 598 ] = this.stem[keys];
  599 + this.questionList[this.stem.index].subQuestions[this.stem.indexs][
  600 + keys + "Src"
  601 + ] = this.stem[keys + "Src"];
579 } else { 602 } else {
580 this.questionList[this.stem.index][keys] = this.stem[keys]; 603 this.questionList[this.stem.index][keys] = this.stem[keys];
  604 + this.questionList[this.stem.index][keys + "Src"] =
  605 + this.stem[keys + "Src"];
581 } 606 }
582 -  
583 this.$message.success("上传成功"); 607 this.$message.success("上传成功");
584 } else { 608 } else {
585 this.$message.error(res.info); 609 this.$message.error(res.info);
@@ -847,12 +871,25 @@ export default { @@ -847,12 +871,25 @@ export default {
847 for (let j = 0; j < this.questionList[i].subQuestions.length; j++) { 871 for (let j = 0; j < this.questionList[i].subQuestions.length; j++) {
848 if (this.questionList[i].subQuestions[j].qusType) { 872 if (this.questionList[i].subQuestions[j].qusType) {
849 this.questionList[i].subQuestions.splice(j, 1); 873 this.questionList[i].subQuestions.splice(j, 1);
  874 + } else {
  875 + if (!!this.questionList[i].subQuestions[j].answerScreenshotSrc) {
  876 + delete this.questionList[i].subQuestions[j].answerScreenshotSrc;
  877 + }
  878 + if (!!this.questionList[i].subQuestions[j].screenshotSrc) {
  879 + delete this.questionList[i].subQuestions[j].screenshotSrc;
  880 + }
850 } 881 }
851 } 882 }
852 } else { 883 } else {
853 if (this.questionList[i].qusType) { 884 if (this.questionList[i].qusType) {
854 this.questionList.splice(i, 1); 885 this.questionList.splice(i, 1);
855 i--; 886 i--;
  887 + if (!!this.questionList[i].answerScreenshotSrc) {
  888 + delete this.questionList[i].answerScreenshotSrc;
  889 + }
  890 + if (!!this.questionList[i].screenshotSrc) {
  891 + delete this.questionList[i].screenshotSrc;
  892 + }
856 } 893 }
857 } 894 }
858 } 895 }
@@ -865,19 +902,28 @@ export default { @@ -865,19 +902,28 @@ export default {
865 //更新答题卡 902 //更新答题卡
866 let modifyPaper, params; 903 let modifyPaper, params;
867 if (this.type == 1) { 904 if (this.type == 1) {
868 - modifyPaper = this.$request.pModifyPaper; 905 + modifyPaper =
  906 + this.role == "ROLE_PERSONAL"
  907 + ? this.$request.pModifyPaper
  908 + : this.$request.modifyPaper;
869 params = { 909 params = {
870 paperId: this.$route.query.paperId, 910 paperId: this.$route.query.paperId,
871 questionList: questionList, 911 questionList: questionList,
872 }; 912 };
873 } else if (this.type == 2) { 913 } else if (this.type == 2) {
874 - modifyPaper = this.$request.pSetExamAnswer; 914 + modifyPaper =
  915 + this.role == "ROLE_PERSONAL"
  916 + ? this.$request.pSetExamAnswer
  917 + : this.$request.setExamAnswer;
875 params = { 918 params = {
876 examId: this.$route.query.paperId, 919 examId: this.$route.query.paperId,
877 questionList: questionList, 920 questionList: questionList,
878 }; 921 };
879 } else { 922 } else {
880 - modifyPaper = this.$request.pSetPeriodAnswer; 923 + modifyPaper =
  924 + this.role == "ROLE_PERSONAL"
  925 + ? this.$request.pSetPeriodAnswer
  926 + : this.$request.setPeriodAnswer;
881 params = { 927 params = {
882 periodId: this.$route.query.paperId, 928 periodId: this.$route.query.paperId,
883 questionList: questionList, 929 questionList: questionList,
@@ -892,12 +938,22 @@ export default { @@ -892,12 +938,22 @@ export default {
892 }, 938 },
893 async _QueryDetail() { 939 async _QueryDetail() {
894 //查询详情 940 //查询详情
895 - let detail =  
896 - this.type == 1  
897 - ? this.$request.pPaperDetail  
898 - : this.type == 2  
899 - ? this.$request.pExamQuestionList  
900 - : this.$request.pPeriodQuestionList; 941 + let detail;
  942 + if (this.role == "ROLE_PERSONAL") {
  943 + detail =
  944 + this.type == 1
  945 + ? this.$request.pPaperDetail
  946 + : this.type == 2
  947 + ? this.$request.pExamQuestionList
  948 + : this.$request.pPeriodQuestionList;
  949 + } else {
  950 + detail =
  951 + this.type == 1
  952 + ? this.$request.paperDetail
  953 + : this.type == 2
  954 + ? this.$request.examQuestionList
  955 + : this.$request.periodQuestionList;
  956 + }
901 let params = 957 let params =
902 this.type == 1 958 this.type == 1
903 ? { paperId: this.$route.query.paperId } 959 ? { paperId: this.$route.query.paperId }
@@ -1190,10 +1246,15 @@ export default { @@ -1190,10 +1246,15 @@ export default {
1190 } 1246 }
1191 } 1247 }
1192 } 1248 }
1193 -.upload-demo {  
1194 - text-align: center;  
1195 -}  
1196 -.stem-pic {  
1197 - width: 100%; 1249 +.upload-box {
  1250 + .upload-demo {
  1251 + text-align: center;
  1252 + }
  1253 + .stem-pic {
  1254 + display: block;
  1255 + margin: 0 auto 20px;
  1256 + height: 200px;
  1257 + object-fit: cover;
  1258 + }
1198 } 1259 }
1199 </style> 1260 </style>
1200 \ No newline at end of file 1261 \ No newline at end of file
src/views/personal/examinationPaper/index.vue renamed to src/views/examinationPaper/index.vue
@@ -95,6 +95,31 @@ @@ -95,6 +95,31 @@
95 <em class="s-line">|</em> 95 <em class="s-line">|</em>
96 预计时长:{{ item.examsDuration }} 96 预计时长:{{ item.examsDuration }}
97 <em class="s-line">|</em> 97 <em class="s-line">|</em>
  98 + <template v-if="role != 'ROLE_PERSONAL'">
  99 + 授课端同步:
  100 + <span
  101 + class="clazz"
  102 + v-for="(clazzChild, indexs) in item.classList"
  103 + :key="clazzChild.classId"
  104 + :class="clazzChild.keepStatus == 1 ? 'active' : ''"
  105 + >{{
  106 + `${clazzChild.className}${
  107 + indexs != item.classList.length - 1 ? "、" : ""
  108 + }`
  109 + }}
  110 + <i v-if="clazzChild.keepStatus == 1" class="el-icon-success"></i
  111 + ></span>
  112 + <el-tooltip
  113 + effect="dark"
  114 + content="刷新同步状态"
  115 + placement="right"
  116 + >
  117 + <i
  118 + class="icon-refresh el-icon-refresh"
  119 + @click="refreshStic"
  120 + ></i>
  121 + </el-tooltip>
  122 + </template>
98 </p> 123 </p>
99 <p class="person"> 124 <p class="person">
100 {{ item.realName }}<em class="s-line">|</em 125 {{ item.realName }}<em class="s-line">|</em
@@ -123,6 +148,11 @@ @@ -123,6 +148,11 @@
123 icon="el-icon-more" 148 icon="el-icon-more"
124 ></el-button> 149 ></el-button>
125 <el-dropdown-menu slot="dropdown"> 150 <el-dropdown-menu slot="dropdown">
  151 + <el-dropdown-item
  152 + :command="1"
  153 + v-if="userName == item.realName && role != 'ROLE_PERSONAL'"
  154 + >修改分享范围</el-dropdown-item
  155 + >
126 <el-dropdown-item :command="2">复制</el-dropdown-item> 156 <el-dropdown-item :command="2">复制</el-dropdown-item>
127 <el-dropdown-item :command="3">归档</el-dropdown-item> 157 <el-dropdown-item :command="3">归档</el-dropdown-item>
128 </el-dropdown-menu> 158 </el-dropdown-menu>
@@ -147,7 +177,20 @@ @@ -147,7 +177,20 @@
147 content="没有更多数据" 177 content="没有更多数据"
148 :image-size="100" 178 :image-size="100"
149 ></el-empty> 179 ></el-empty>
150 - 180 + <el-dialog title="选择分享范围" :visible.sync="dialogVisible" width="400">
  181 + <el-form :model="shareForm" :rules="shareRulesForm" label-width="160px">
  182 + <el-form-item prop="share" label="分享范围:">
  183 + <el-radio-group v-model="shareForm.sharingType">
  184 + <el-radio :label="0">任课班级分享</el-radio>
  185 + <el-radio :label="1">全年级分享</el-radio>
  186 + </el-radio-group>
  187 + </el-form-item>
  188 + </el-form>
  189 + <div slot="footer" class="dialog-footer">
  190 + <el-button type="primary" @click="saveShare">确 定</el-button>
  191 + <el-button @click="dialogVisible = false">取 消</el-button>
  192 + </div>
  193 + </el-dialog>
151 </div> 194 </div>
152 </template> 195 </template>
153 196
@@ -158,6 +201,7 @@ export default { @@ -158,6 +201,7 @@ export default {
158 return { 201 return {
159 loading: false, 202 loading: false,
160 userName: "", 203 userName: "",
  204 + dialogVisible: false,
161 query: { 205 query: {
162 classId: "", 206 classId: "",
163 subjectName: "", 207 subjectName: "",
@@ -169,12 +213,24 @@ export default { @@ -169,12 +213,24 @@ export default {
169 typeList: [], 213 typeList: [],
170 archivedTotal: 0, //已归档答题卡数量 214 archivedTotal: 0, //已归档答题卡数量
171 tableData: null, 215 tableData: null,
  216 + shareForm: {
  217 + id: "",
  218 + sharingType: 0, //0-任课班级/1-全年级
  219 + },
  220 + shareRulesForm: {
  221 + sharingType: [
  222 + { required: true, message: "选择分享范围", trigger: "blur" },
  223 + ],
  224 + },
172 total: 0, 225 total: 0,
173 page: 1, 226 page: 1,
174 size: 20, 227 size: 20,
175 }; 228 };
176 }, 229 },
177 async created() { 230 async created() {
  231 + this.role =
  232 + this.$store.getters.info.showRole ||
  233 + this.$store.getters.info.permissions[0].role;
178 this.userName = this.$store.getters.info.name || ""; 234 this.userName = this.$store.getters.info.name || "";
179 await this._QueryClassList(); 235 await this._QueryClassList();
180 await this._QuerySubjectList(); 236 await this._QuerySubjectList();
@@ -182,6 +238,11 @@ export default { @@ -182,6 +238,11 @@ export default {
182 this._QueryTypeList(); 238 this._QueryTypeList();
183 }, 239 },
184 methods: { 240 methods: {
  241 + refreshStic() {
  242 + setTimeout(function () {
  243 + window.location.reload();
  244 + }, 500);
  245 + },
185 toAdd(query) { 246 toAdd(query) {
186 let routerItem = { 247 let routerItem = {
187 path: "/examinationPaperAdd", 248 path: "/examinationPaperAdd",
@@ -201,6 +262,12 @@ export default { @@ -201,6 +262,12 @@ export default {
201 //更多 262 //更多
202 const that = this; 263 const that = this;
203 switch (value) { 264 switch (value) {
  265 + case 1:
  266 + //修改分享范围
  267 + that.shareForm.id = item.id;
  268 + that.shareForm.sharingType = item.sharingType;
  269 + that.dialogVisible = true;
  270 + break;
204 case 2: 271 case 2:
205 //复制 272 //复制
206 that.toAdd({ type: 2, paperId: item.id }); 273 that.toAdd({ type: 2, paperId: item.id });
@@ -215,9 +282,29 @@ export default { @@ -215,9 +282,29 @@ export default {
215 this.page = page; 282 this.page = page;
216 this._QueryData(this.query.title); 283 this._QueryData(this.query.title);
217 }, 284 },
  285 + async saveShare() {
  286 + //修改分享范围
  287 + const { data, status, info } = await this.$request.modifyPaper({
  288 + paperId: this.shareForm.id,
  289 + sharingType: this.shareForm.sharingType,
  290 + });
  291 + if (status === 0) {
  292 + this.shareForm.id = "";
  293 + this.shareForm.sharingType = 1;
  294 + this.dialogVisible = false;
  295 + this.$message.success(info);
  296 + this._QueryData(this.query.title == "");
  297 + } else {
  298 + this.$message.error(info);
  299 + }
  300 + },
218 async recovery(item) { 301 async recovery(item) {
219 //归档 302 //归档
220 - const { data, status, info } = await this.$request.pModifyPaper({ 303 + let modifyPaper =
  304 + this.role == "ROLE_PERSONAL"
  305 + ? this.$request.pModifyPaper
  306 + : this.$request.modifyPaper;
  307 + const { data, status, info } = await modifyPaper({
221 paperId: item.id, 308 paperId: item.id,
222 status: 2, 309 status: 2,
223 }); 310 });
@@ -232,12 +319,16 @@ export default { @@ -232,12 +319,16 @@ export default {
232 //切换班级 319 //切换班级
233 async changClazz() { 320 async changClazz() {
234 await this._QuerySubjectList(); 321 await this._QuerySubjectList();
235 - this._QueryTypeList()  
236 this._QueryData(false); 322 this._QueryData(false);
237 }, 323 },
238 // 查找答题卡类型 324 // 查找答题卡类型
239 async _QueryTypeList() { 325 async _QueryTypeList() {
240 - const { data, status, info } = await this.$request.pPaperTagList({ 326 + let fetchTypeNames =
  327 + this.role == "ROLE_PERSONAL"
  328 + ? this.$request.pPaperTagList
  329 + : this.$request.fetchTypeNames;
  330 +
  331 + const { data, status, info } = await fetchTypeNames({
241 classId: this.query.classId, 332 classId: this.query.classId,
242 type: 0, 333 type: 0,
243 }); 334 });
@@ -251,7 +342,7 @@ export default { @@ -251,7 +342,7 @@ export default {
251 }) || []; 342 }) || [];
252 this.typeList.unshift({ 343 this.typeList.unshift({
253 value: "", 344 value: "",
254 - label: "全部", 345 + label: "请选择标签",
255 }); 346 });
256 } else { 347 } else {
257 this.$message.error(info); 348 this.$message.error(info);
@@ -260,14 +351,19 @@ export default { @@ -260,14 +351,19 @@ export default {
260 // 查找班级 351 // 查找班级
261 async _QueryClassList() { 352 async _QueryClassList() {
262 this.loading = true; 353 this.loading = true;
263 - const { data, status, info } = await this.$request.pClassList(); 354 + let fetchClassList =
  355 + this.role == "ROLE_PERSONAL"
  356 + ? this.$request.pClassList
  357 + : this.$request.fetchClassList;
  358 +
  359 + const { data, status, info } = await fetchClassList();
264 console.log(status); 360 console.log(status);
265 if (status === 0) { 361 if (status === 0) {
266 if (!!data.list) { 362 if (!!data.list) {
267 this.classList = 363 this.classList =
268 data.list?.map((item) => { 364 data.list?.map((item) => {
269 return { 365 return {
270 - value: item.id, 366 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
271 label: item.className, 367 label: item.className,
272 }; 368 };
273 }) || []; 369 }) || [];
@@ -279,7 +375,12 @@ export default { @@ -279,7 +375,12 @@ export default {
279 }, 375 },
280 // 查找科目 376 // 查找科目
281 async _QuerySubjectList() { 377 async _QuerySubjectList() {
282 - const { data, status, info } = await this.$request.pSubjectList({ 378 + let fetchSubjectList =
  379 + this.role == "ROLE_PERSONAL"
  380 + ? this.$request.pSubjectList
  381 + : this.$request.fetchSubjectList;
  382 +
  383 + const { data, status, info } = await fetchSubjectList({
283 classId: this.query.classId, 384 classId: this.query.classId,
284 }); 385 });
285 if (status === 0) { 386 if (status === 0) {
@@ -321,7 +422,12 @@ export default { @@ -321,7 +422,12 @@ export default {
321 return; 422 return;
322 } 423 }
323 this.loading = true; 424 this.loading = true;
324 - const { data, status, info } = await this.$request.pPaperList({ 425 + let fetchPaperList =
  426 + this.role == "ROLE_PERSONAL"
  427 + ? this.$request.pPaperList
  428 + : this.$request.fetchPaperList;
  429 +
  430 + const { data, status, info } = await fetchPaperList({
325 ...query, 431 ...query,
326 status: 1, 432 status: 1,
327 page: this.page, 433 page: this.page,
@@ -439,11 +545,11 @@ export default { @@ -439,11 +545,11 @@ export default {
439 margin-right: 12px; 545 margin-right: 12px;
440 } 546 }
441 } 547 }
442 - .icon-refresh{  
443 - margin-left:20px; 548 + .icon-refresh {
  549 + margin-left: 20px;
444 cursor: pointer; 550 cursor: pointer;
445 - &:hover{  
446 - color:#2e9afe 551 + &:hover {
  552 + color: #2e9afe;
447 } 553 }
448 } 554 }
449 } 555 }
src/views/personal/examinationPaper/recycle.vue renamed to src/views/examinationPaper/recycle.vue
@@ -149,6 +149,7 @@ @@ -149,6 +149,7 @@
149 export default { 149 export default {
150 data() { 150 data() {
151 return { 151 return {
  152 + role: "",
152 loading: false, 153 loading: false,
153 props: { multiple: true, checkStrictly: true }, 154 props: { multiple: true, checkStrictly: true },
154 options: [ 155 options: [
@@ -197,6 +198,9 @@ export default { @@ -197,6 +198,9 @@ export default {
197 }; 198 };
198 }, 199 },
199 async created() { 200 async created() {
  201 + this.role =
  202 + this.$store.getters.info.showRole ||
  203 + this.$store.getters.info.permissions[0].role;
200 await this._QueryClassList(); 204 await this._QueryClassList();
201 await this._QuerySubjectList(); 205 await this._QuerySubjectList();
202 this._QueryTypeList(); 206 this._QueryTypeList();
@@ -205,7 +209,11 @@ export default { @@ -205,7 +209,11 @@ export default {
205 methods: { 209 methods: {
206 async modify(obj) { 210 async modify(obj) {
207 //恢复答题卡 211 //恢复答题卡
208 - const { data, status, info } = await this.$request.pModifyPaper({ 212 + let modifyPaper =
  213 + this.role == "ROLE_PERSONAL"
  214 + ? this.$request.pModifyPaper
  215 + : this.$request.modifyPaper;
  216 + const { data, status, info } = await modifyPaper({
209 paperId: obj.id, 217 paperId: obj.id,
210 status: 1, 218 status: 1,
211 }); 219 });
@@ -218,7 +226,11 @@ export default { @@ -218,7 +226,11 @@ export default {
218 }, 226 },
219 async remove(obj) { 227 async remove(obj) {
220 //删除答题卡 228 //删除答题卡
221 - const { data, status, info } = await this.$request.pDelPaper({ 229 + let delPaper =
  230 + this.role == "ROLE_PERSONAL"
  231 + ? this.$request.pDelPaper
  232 + : this.$request.delPaper;
  233 + const { data, status, info } = await delPaper({
222 paperId: obj.id, 234 paperId: obj.id,
223 }); 235 });
224 if (status == 0) { 236 if (status == 0) {
@@ -255,7 +267,11 @@ export default { @@ -255,7 +267,11 @@ export default {
255 query[key] = null; 267 query[key] = null;
256 } 268 }
257 } 269 }
258 - const { data, status, info } = await this.$request.pPaperList({ 270 + let fetchPaperList =
  271 + this.role == "ROLE_PERSONAL"
  272 + ? this.$request.pPaperList
  273 + : this.$request.fetchPaperList;
  274 + const { data, status, info } = await fetchPaperList({
259 ...query, 275 ...query,
260 status: 2, 276 status: 2,
261 page: this.page, 277 page: this.page,
@@ -271,14 +287,18 @@ export default { @@ -271,14 +287,18 @@ export default {
271 }, 287 },
272 // 查找班级 288 // 查找班级
273 async _QueryClassList() { 289 async _QueryClassList() {
274 - const { data, status, info } = await this.$request.pClassList(); 290 + let fetchClassList =
  291 + this.role == "ROLE_PERSONAL"
  292 + ? this.$request.pClassList
  293 + : this.$request.fetchClassList;
  294 + const { data, status, info } = await fetchClassList();
275 console.log(status); 295 console.log(status);
276 if (status === 0) { 296 if (status === 0) {
277 if (!!data.list) { 297 if (!!data.list) {
278 this.classList = 298 this.classList =
279 data.list?.map((item) => { 299 data.list?.map((item) => {
280 return { 300 return {
281 - value: item.id, 301 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
282 label: item.className, 302 label: item.className,
283 }; 303 };
284 }) || []; 304 }) || [];
@@ -290,7 +310,12 @@ export default { @@ -290,7 +310,12 @@ export default {
290 }, 310 },
291 // 查找科目 311 // 查找科目
292 async _QuerySubjectList() { 312 async _QuerySubjectList() {
293 - const { data, status, info } = await this.$request.pSubjectList({ 313 + let fetchSubjectList =
  314 + this.role == "ROLE_PERSONAL"
  315 + ? this.$request.pSubjectList
  316 + : this.$request.fetchSubjectList;
  317 +
  318 + const { data, status, info } = await fetchSubjectList({
294 classId: this.query.classId, 319 classId: this.query.classId,
295 }); 320 });
296 if (status === 0) { 321 if (status === 0) {
@@ -308,7 +333,12 @@ export default { @@ -308,7 +333,12 @@ export default {
308 }, 333 },
309 // 查找答题卡类型 334 // 查找答题卡类型
310 async _QueryTypeList() { 335 async _QueryTypeList() {
311 - const { data, status, info } = await this.$request.pPaperTagList({ 336 + let fetchTypeNames =
  337 + this.role == "ROLE_PERSONAL"
  338 + ? this.$request.pPaperTagList
  339 + : this.$request.fetchTypeNames;
  340 +
  341 + const { data, status, info } = await fetchTypeNames({
312 classId: this.query.classId, 342 classId: this.query.classId,
313 tyle: 0, 343 tyle: 0,
314 }); 344 });
src/views/index/mainIndex.vue
@@ -194,7 +194,7 @@ @@ -194,7 +194,7 @@
194 对{{ dataInfo.classPeriodCount }}套随堂问答题记录分析 194 对{{ dataInfo.classPeriodCount }}套随堂问答题记录分析
195 </p> 195 </p>
196 </div> 196 </div>
197 - <div class="nav-item item1 item-child2" @click="links('/test')"> 197 + <div class="nav-item item1 item-child3" @click="links('/test')">
198 <img class="icon" src="../../assets/nav/analysis.png" alt="" /> 198 <img class="icon" src="../../assets/nav/analysis.png" alt="" />
199 <p class="p1">即时测报表</p> 199 <p class="p1">即时测报表</p>
200 <p class="p2" v-if="dataInfo.examCount"> 200 <p class="p2" v-if="dataInfo.examCount">
@@ -403,6 +403,7 @@ export default { @@ -403,6 +403,7 @@ export default {
403 height: calc(50% - 8px); 403 height: calc(50% - 8px);
404 flex-wrap: wrap; 404 flex-wrap: wrap;
405 padding: 12px 0 12px 30px; 405 padding: 12px 0 12px 30px;
  406 + margin-right:20px;
406 .icon { 407 .icon {
407 width: 60px; 408 width: 60px;
408 height: 60px; 409 height: 60px;
@@ -419,6 +420,23 @@ export default { @@ -419,6 +420,23 @@ export default {
419 margin-right: 0; 420 margin-right: 0;
420 } 421 }
421 } 422 }
  423 + &.item-child3 {
  424 + height: calc(50% - 8px);
  425 + flex-wrap: wrap;
  426 + padding: 12px 0 12px 30px;
  427 + .icon {
  428 + width: 60px;
  429 + height: 60px;
  430 + }
  431 + .p1 {
  432 + flex: 1;
  433 + line-height: 60px;
  434 + margin-bottom: 0;
  435 + }
  436 + .p2 {
  437 + width: 100%;
  438 + }
  439 + }
422 } 440 }
423 .item2 { 441 .item2 {
424 width: calc(50% - 10px); 442 width: calc(50% - 10px);
@@ -447,6 +465,7 @@ export default { @@ -447,6 +465,7 @@ export default {
447 height: 240px; 465 height: 240px;
448 display: flex; 466 display: flex;
449 flex-wrap: wrap; 467 flex-wrap: wrap;
  468 +
450 } 469 }
451 .item4 { 470 .item4 {
452 width: calc(50% - 10px); 471 width: calc(50% - 10px);
src/views/personal/ask/index.vue
@@ -88,202 +88,209 @@ @@ -88,202 +88,209 @@
88 > 88 >
89 </el-radio-group> 89 </el-radio-group>
90 <div class="table-cont" v-loading="loading"> 90 <div class="table-cont" v-loading="loading">
91 - <div v-show="tabIndex == 1">  
92 - <el-table  
93 - :data="tableData"  
94 - border  
95 - style="width: 100%"  
96 - @sort-change="sortChange"  
97 - >  
98 - <el-table-column  
99 - prop="title"  
100 - label="课时"  
101 - align="center"  
102 - ></el-table-column>  
103 - <el-table-column  
104 - prop="questionNum"  
105 - label="题目总数"  
106 - align="center"  
107 - width="100"  
108 - ></el-table-column>  
109 - <el-table-column  
110 - prop="startTime"  
111 - label="上课时间"  
112 - align="center"  
113 - ></el-table-column>  
114 - <el-table-column  
115 - prop="participationRate"  
116 - label="参与度"  
117 - sortable="custom"  
118 - align="center"  
119 - >  
120 - <template slot-scope="scoped"  
121 - >{{ scoped.row.participationRate }}%</template  
122 - ></el-table-column  
123 - >  
124 - <el-table-column  
125 - prop="answerCorrectRate"  
126 - label="已答总正确率"  
127 - sortable="custom"  
128 - align="center"  
129 - >  
130 - <template slot-scope="scoped"  
131 - >{{ scoped.row.answerCorrectRate }}%</template  
132 - >  
133 - </el-table-column>  
134 - <el-table-column  
135 - prop="classCorrectRate"  
136 - label="班级总正确率"  
137 - sortable="custom"  
138 - align="center"  
139 - ><template slot-scope="scoped"  
140 - >{{ scoped.row.classCorrectRate }}%</template  
141 - ></el-table-column  
142 - >  
143 - <el-table-column label="操作" align="center">  
144 - <template slot-scope="scoped">  
145 - <el-tooltip  
146 - effect="dark"  
147 - v-if="scoped.row.answerNum == 0"  
148 - content="设置答案"  
149 - placement="top"  
150 - >  
151 - <el-button  
152 - type="primary"  
153 - circle  
154 - size="mini"  
155 - icon="fa fa-file-text"  
156 - @click="edit(scoped.row)"  
157 - ></el-button>  
158 - </el-tooltip>  
159 - <el-tooltip v-else effect="dark" content="详情" placement="top">  
160 - <el-button  
161 - type="primary"  
162 - circle  
163 - size="mini"  
164 - icon="fa fa-arrow-right"  
165 - @click="linkTo(scoped.row)"  
166 - ></el-button>  
167 - </el-tooltip>  
168 - </template>  
169 - </el-table-column>  
170 - </el-table>  
171 - </div>  
172 - <div v-show="tabIndex == 2">  
173 - <el-table  
174 - id="print-content2"  
175 - :max-height="tableMaxHeight"  
176 - :data="tableData"  
177 - border  
178 - style="width: 100%"  
179 - >  
180 - <el-table-column  
181 - prop="studentCode"  
182 - label="学号"  
183 - align="center"  
184 - fixed  
185 - ></el-table-column>  
186 - <el-table-column  
187 - prop="studentName"  
188 - label="姓名"  
189 - align="center"  
190 - fixed  
191 - width="100"  
192 - ></el-table-column>  
193 - <el-table-column  
194 - v-for="(item, index) in phaseOption"  
195 - :key="index"  
196 - :label="item"  
197 - align="center" 91 + <div id="print-content">
  92 + <div v-show="tabIndex == 1">
  93 + <el-table
  94 + :data="tableData"
  95 + border
  96 + style="width: 100%"
  97 + @sort-change="sortChange"
198 > 98 >
199 <el-table-column 99 <el-table-column
  100 + prop="title"
  101 + label="课时"
200 align="center" 102 align="center"
201 - :label="index == 0 ? '总课时数' : '课时数'"  
202 - :prop="'periodCount' + item"  
203 - >  
204 - </el-table-column> 103 + ></el-table-column>
  104 + <el-table-column
  105 + prop="questionNum"
  106 + label="题目总数"
  107 + align="center"
  108 + width="100"
  109 + ></el-table-column>
  110 + <el-table-column
  111 + prop="startTime"
  112 + label="上课时间"
  113 + align="center"
  114 + ></el-table-column>
205 <el-table-column 115 <el-table-column
  116 + prop="participationRate"
  117 + label="参与度"
  118 + sortable="custom"
206 align="center" 119 align="center"
207 - :label="index == 0 ? '总出题数' : '出题数'"  
208 - :prop="'questionNum' + item"  
209 > 120 >
210 - </el-table-column> 121 + <template slot-scope="scoped"
  122 + >{{ scoped.row.participationRate }}%</template
  123 + ></el-table-column
  124 + >
211 <el-table-column 125 <el-table-column
  126 + prop="answerCorrectRate"
  127 + label="已答总正确率"
  128 + sortable="custom"
212 align="center" 129 align="center"
213 - :label="index == 0 ? '总参与度' : '参与度'"  
214 - :prop="'participationRate' + item"  
215 - ><template slot-scope="scoped"  
216 - >{{ scoped.row["participationRate" + item] }}%</template 130 + >
  131 + <template slot-scope="scoped"
  132 + >{{ scoped.row.answerCorrectRate }}%</template
217 > 133 >
218 </el-table-column> 134 </el-table-column>
219 <el-table-column 135 <el-table-column
  136 + prop="classCorrectRate"
  137 + label="班级总正确率"
  138 + sortable="custom"
220 align="center" 139 align="center"
221 - :label="index == 0 ? '总正确率' : '正确率'"  
222 - :prop="'correctRate' + item"  
223 ><template slot-scope="scoped" 140 ><template slot-scope="scoped"
224 - >{{ scoped.row["correctRate" + item] }}%</template  
225 - > 141 + >{{ scoped.row.classCorrectRate }}%</template
  142 + ></el-table-column
  143 + >
  144 + <el-table-column label="操作" align="center">
  145 + <template slot-scope="scoped">
  146 + <el-tooltip
  147 + effect="dark"
  148 + v-if="scoped.row.answerNum == 0"
  149 + content="设置答案"
  150 + placement="top"
  151 + >
  152 + <el-button
  153 + type="primary"
  154 + circle
  155 + size="mini"
  156 + icon="fa fa-file-text"
  157 + @click="edit(scoped.row)"
  158 + ></el-button>
  159 + </el-tooltip>
  160 + <el-tooltip
  161 + v-else
  162 + effect="dark"
  163 + content="详情"
  164 + placement="top"
  165 + >
  166 + <el-button
  167 + type="primary"
  168 + circle
  169 + size="mini"
  170 + icon="fa fa-arrow-right"
  171 + @click="linkTo(scoped.row)"
  172 + ></el-button>
  173 + </el-tooltip>
  174 + </template>
226 </el-table-column> 175 </el-table-column>
227 - </el-table-column>  
228 - </el-table>  
229 - </div>  
230 - <div v-show="tabIndex == 3">  
231 - <el-table  
232 - id="print-content3"  
233 - :max-height="tableMaxHeight"  
234 - :data="tableData"  
235 - border  
236 - style="width: 100%"  
237 - >  
238 - <el-table-column  
239 - prop="studentCode"  
240 - label="学号"  
241 - align="center"  
242 - ></el-table-column>  
243 - <el-table-column  
244 - prop="studentName"  
245 - label="姓名"  
246 - align="center"  
247 - width="100"  
248 - ></el-table-column>  
249 - <el-table-column  
250 - v-for="(item, index) in phaseInter"  
251 - :key="index"  
252 - :label="item"  
253 - align="center" 176 + </el-table>
  177 + </div>
  178 + <div v-show="tabIndex == 2">
  179 + <el-table
  180 + id="print-content2"
  181 + :max-height="tableMaxHeight"
  182 + :data="tableData"
  183 + border
  184 + style="width: 100%"
254 > 185 >
255 <el-table-column 186 <el-table-column
  187 + prop="studentCode"
  188 + label="学号"
256 align="center" 189 align="center"
257 - v-if="index == 0"  
258 - label="参与分"  
259 - sortable  
260 - :prop="'interactionsNum' + item"  
261 - >  
262 - </el-table-column> 190 + fixed
  191 + ></el-table-column>
263 <el-table-column 192 <el-table-column
264 - v-else 193 + prop="studentName"
  194 + label="姓名"
265 align="center" 195 align="center"
266 - label="互动数"  
267 - :prop="'interactionsNum' + item"  
268 - >  
269 - </el-table-column> 196 + fixed
  197 + width="100"
  198 + ></el-table-column>
270 <el-table-column 199 <el-table-column
271 - v-if="index == 0" 200 + v-for="(item, index) in phaseOption"
  201 + :key="index"
  202 + :label="item"
272 align="center" 203 align="center"
273 - label="对错分"  
274 - sortable  
275 - :prop="'interactionsCorrectNum' + item"  
276 > 204 >
  205 + <el-table-column
  206 + align="center"
  207 + :label="index == 0 ? '总课时数' : '课时数'"
  208 + :prop="'periodCount' + item"
  209 + >
  210 + </el-table-column>
  211 + <el-table-column
  212 + align="center"
  213 + :label="index == 0 ? '总出题数' : '出题数'"
  214 + :prop="'questionNum' + item"
  215 + >
  216 + </el-table-column>
  217 + <el-table-column
  218 + align="center"
  219 + :label="index == 0 ? '总参与度' : '参与度'"
  220 + :prop="'participationRate' + item"
  221 + ><template slot-scope="scoped"
  222 + >{{ scoped.row["participationRate" + item] }}%</template
  223 + >
  224 + </el-table-column>
  225 + <el-table-column
  226 + align="center"
  227 + :label="index == 0 ? '总正确率' : '正确率'"
  228 + :prop="'correctRate' + item"
  229 + ><template slot-scope="scoped"
  230 + >{{ scoped.row["correctRate" + item] }}%</template
  231 + >
  232 + </el-table-column>
277 </el-table-column> 233 </el-table-column>
  234 + </el-table>
  235 + </div>
  236 + <div v-show="tabIndex == 3">
  237 + <el-table
  238 + id="print-content3"
  239 + :max-height="tableMaxHeight"
  240 + :data="tableData"
  241 + border
  242 + style="width: 100%"
  243 + >
278 <el-table-column 244 <el-table-column
279 - v-else 245 + prop="studentCode"
  246 + label="学号"
  247 + align="center"
  248 + ></el-table-column>
  249 + <el-table-column
  250 + prop="studentName"
  251 + label="姓名"
  252 + align="center"
  253 + width="100"
  254 + ></el-table-column>
  255 + <el-table-column
  256 + v-for="(item, index) in phaseInter"
  257 + :key="index"
  258 + :label="item"
280 align="center" 259 align="center"
281 - label="参与数"  
282 - :prop="'interactionsCorrectNum' + item"  
283 > 260 >
  261 + <el-table-column
  262 + align="center"
  263 + v-if="index == 0"
  264 + label="参与分"
  265 + sortable
  266 + :prop="'interactionsNum' + item"
  267 + >
  268 + </el-table-column>
  269 + <el-table-column
  270 + v-else
  271 + align="center"
  272 + label="互动数"
  273 + :prop="'interactionsNum' + item"
  274 + >
  275 + </el-table-column>
  276 + <el-table-column
  277 + v-if="index == 0"
  278 + align="center"
  279 + label="对错分"
  280 + sortable
  281 + :prop="'interactionsCorrectNum' + item"
  282 + >
  283 + </el-table-column>
  284 + <el-table-column
  285 + v-else
  286 + align="center"
  287 + label="参与数"
  288 + :prop="'interactionsCorrectNum' + item"
  289 + >
  290 + </el-table-column>
284 </el-table-column> 291 </el-table-column>
285 - </el-table-column>  
286 - </el-table> 292 + </el-table>
  293 + </div>
287 </div> 294 </div>
288 <div class="pagination-box" v-show="tabIndex == 1"> 295 <div class="pagination-box" v-show="tabIndex == 1">
289 <el-pagination 296 <el-pagination
@@ -381,7 +388,7 @@ export default { @@ -381,7 +388,7 @@ export default {
381 }); 388 });
382 }, 389 },
383 methods: { 390 methods: {
384 - print() { 391 + print() {
385 tablePrint("print-content"); 392 tablePrint("print-content");
386 }, 393 },
387 changeSub(val) { 394 changeSub(val) {
@@ -521,7 +528,7 @@ export default { @@ -521,7 +528,7 @@ export default {
521 if (status === 0) { 528 if (status === 0) {
522 this.classList = data.list.map((item) => { 529 this.classList = data.list.map((item) => {
523 return { 530 return {
524 - value: item.classId, 531 + value: item.id,
525 label: item.className, 532 label: item.className,
526 }; 533 };
527 }); 534 });
@@ -683,11 +690,10 @@ export default { @@ -683,11 +690,10 @@ export default {
683 this.$message.warning("请选择科目"); 690 this.$message.warning("请选择科目");
684 return; 691 return;
685 } 692 }
686 - const { data, status, info } = await this.$request.pPhaseInteractiveReport(  
687 - { 693 + const { data, status, info } =
  694 + await this.$request.pPhaseInteractiveReport({
688 ...query, 695 ...query,
689 - }  
690 - ); 696 + });
691 this.loading = false; 697 this.loading = false;
692 if (status === 0) { 698 if (status === 0) {
693 let subjectName = []; 699 let subjectName = [];
src/views/personal/down/index.vue
@@ -8,9 +8,11 @@ @@ -8,9 +8,11 @@
8 <div class="down-box" v-loading="loading"> 8 <div class="down-box" v-loading="loading">
9 <img class="logo" src="" alt="" /> 9 <img class="logo" src="" alt="" />
10 <div class="txt"> 10 <div class="txt">
11 - <p class="p1">中天易教授课端 V1.3.4</p>  
12 - <p class="p2">文件大小:35M</p>  
13 - <p class="p2">最近更新:2022-12-03 13:30</p> 11 + <p class="p1">
  12 + {{ `${info.appName || ""} ${info.versionName || ""}` }}
  13 + </p>
  14 + <p class="p2">文件大小:{{ `${info.fileSize}` }}M</p>
  15 + <p class="p2">最近更新:{{ info.modifiedTime }}</p>
14 </div> 16 </div>
15 <el-button type="primary" @click="downCard">立即下载</el-button> 17 <el-button type="primary" @click="downCard">立即下载</el-button>
16 </div> 18 </div>
@@ -22,13 +24,38 @@ export default { @@ -22,13 +24,38 @@ export default {
22 data() { 24 data() {
23 return { 25 return {
24 loading: false, 26 loading: false,
  27 + info: {
  28 + id:"",
  29 + appName: "",
  30 + appImage: "",
  31 + versionName: "",
  32 + fileSize: "",
  33 + modifiedTime: "",
  34 + },
25 }; 35 };
26 }, 36 },
  37 + created() {
  38 + this.latestVersion();
  39 + },
27 methods: { 40 methods: {
  41 + async latestVersion() {
  42 + const { data, status, info } = await this.$request.pLatestVersion();
  43 + if (status == 0) {
  44 + this.info = { ...data };
  45 + this.info.fileSize =
  46 + (this.info.fileSize &&
  47 + (this.info.fileSize / 1024 / 1024).toFixed(2)) ||
  48 + "--";
  49 + } else {
  50 + this.$message.error(info);
  51 + }
  52 + },
28 async downCard() { 53 async downCard() {
29 if (this.loading == true) return; 54 if (this.loading == true) return;
30 this.loading = true; 55 this.loading = true;
31 - const { data, status, info } = await this.$request.latestClickersApp(); 56 + const { data, status, info } = await this.$request.pGetAppDownloadUrl({
  57 + versionId:this.info.id
  58 + });
32 this.loading = false; 59 this.loading = false;
33 if (status == 0) { 60 if (status == 0) {
34 const a = document.createElement("a"); 61 const a = document.createElement("a");
@@ -51,7 +78,7 @@ export default { @@ -51,7 +78,7 @@ export default {
51 } 78 }
52 79
53 .down-box { 80 .down-box {
54 - padding:20px 50px; 81 + padding: 20px 50px;
55 display: flex; 82 display: flex;
56 align-items: center; 83 align-items: center;
57 } 84 }
src/views/personal/setUp/student.vue
@@ -450,15 +450,9 @@ export default { @@ -450,15 +450,9 @@ export default {
450 let { data, info, status } = await this.$request.studentTemplateUrl(); 450 let { data, info, status } = await this.$request.studentTemplateUrl();
451 this.loadingDown = false; 451 this.loadingDown = false;
452 if (status == 0) { 452 if (status == 0) {
453 - // getBlob(data.downloadUrl).then((res) => {  
454 - // downloadFile("学生模板", res);  
455 - // });  
456 - const a = document.createElement("a");  
457 - a.href = data.downloadUrl;  
458 - a.download = data.appName;  
459 - document.body.appendChild(a);  
460 - a.click();  
461 - a.remove(); 453 + getBlob(data.downloadUrl).then((res) => {
  454 + downloadFile("学生模板", res);
  455 + });
462 } else { 456 } else {
463 this.$message.error(info); 457 this.$message.error(info);
464 } 458 }
src/views/personal/test/index.vue
@@ -517,6 +517,8 @@ export default { @@ -517,6 +517,8 @@ export default {
517 id: obj.studentId, 517 id: obj.studentId,
518 classId: obj.classId, 518 classId: obj.classId,
519 subjectNames: subjectNames.join(","), 519 subjectNames: subjectNames.join(","),
  520 + studentName:obj.studentName,
  521 + studentCode:obj.studentCode,
520 }, 522 },
521 }); 523 });
522 }, 524 },
@@ -648,7 +650,7 @@ export default { @@ -648,7 +650,7 @@ export default {
648 if (status === 0) { 650 if (status === 0) {
649 this.classList = data.list.map((item) => { 651 this.classList = data.list.map((item) => {
650 return { 652 return {
651 - value: item.classId, 653 + value: item.id,
652 label: item.className, 654 label: item.className,
653 }; 655 };
654 }); 656 });
src/views/personal/portrait/detail.vue renamed to src/views/portrait/detail.vue
@@ -60,8 +60,10 @@ @@ -60,8 +60,10 @@
60 </div> 60 </div>
61 </div> 61 </div>
62 <div class="page-content"> 62 <div class="page-content">
63 - <p class="tips">张三 (学号:1301) 测练总次数:16</p>  
64 - <div class="chart"> 63 + <p class="tips">
  64 + {{ studentName }}(学号:{{ studentCode }}) 测练总次数:{{ count }}
  65 + </p>
  66 + <div class="chart" v-if="tableData.length">
65 <template v-if="type == 1"> 67 <template v-if="type == 1">
66 <radarChart id="radarChart" :params="radarChartData" /> 68 <radarChart id="radarChart" :params="radarChartData" />
67 </template> 69 </template>
@@ -69,6 +71,7 @@ @@ -69,6 +71,7 @@
69 <lineChart id="lineChart" :params="lineChartData" :xAxis="xAxis" /> 71 <lineChart id="lineChart" :params="lineChartData" :xAxis="xAxis" />
70 </template> 72 </template>
71 </div> 73 </div>
  74 +
72 <div class="tab-box"> 75 <div class="tab-box">
73 <el-table 76 <el-table
74 v-show="type == 1" 77 v-show="type == 1"
@@ -82,22 +85,22 @@ @@ -82,22 +85,22 @@
82 align="center" 85 align="center"
83 ></el-table-column> 86 ></el-table-column>
84 <el-table-column 87 <el-table-column
85 - prop="cl" 88 + prop="examCount"
86 label="参与测练数" 89 label="参与测练数"
87 align="center" 90 align="center"
88 ></el-table-column> 91 ></el-table-column>
89 <el-table-column 92 <el-table-column
90 - prop="bg" 93 + prop="highestScore"
91 label="班最高分" 94 label="班最高分"
92 align="center" 95 align="center"
93 ></el-table-column> 96 ></el-table-column>
94 <el-table-column 97 <el-table-column
95 - prop="bp" 98 + prop="avgScore"
96 label="班平均分" 99 label="班平均分"
97 align="center" 100 align="center"
98 ></el-table-column> 101 ></el-table-column>
99 <el-table-column 102 <el-table-column
100 - prop="br" 103 + prop="examScore"
101 label="个人得分" 104 label="个人得分"
102 align="center" 105 align="center"
103 ></el-table-column> 106 ></el-table-column>
@@ -109,22 +112,22 @@ @@ -109,22 +112,22 @@
109 style="width: 100%" 112 style="width: 100%"
110 > 113 >
111 <el-table-column 114 <el-table-column
112 - prop="subjectName" 115 + prop="title"
113 label="课堂测练" 116 label="课堂测练"
114 align="center" 117 align="center"
115 ></el-table-column> 118 ></el-table-column>
116 <el-table-column 119 <el-table-column
117 - prop="br" 120 + prop="examScore"
118 label="个人成绩" 121 label="个人成绩"
119 align="center" 122 align="center"
120 ></el-table-column> 123 ></el-table-column>
121 <el-table-column 124 <el-table-column
122 - prop="bp" 125 + prop="avgScore"
123 label="平均成绩" 126 label="平均成绩"
124 align="center" 127 align="center"
125 ></el-table-column> 128 ></el-table-column>
126 <el-table-column 129 <el-table-column
127 - prop="pm" 130 + prop="classRank"
128 label="班级排名" 131 label="班级排名"
129 align="center" 132 align="center"
130 ></el-table-column> 133 ></el-table-column>
@@ -143,6 +146,8 @@ export default { @@ -143,6 +146,8 @@ export default {
143 data() { 146 data() {
144 return { 147 return {
145 id: "", 148 id: "",
  149 + studentName: "",
  150 + studentCode: "",
146 classId: "", 151 classId: "",
147 subjectNames: [], 152 subjectNames: [],
148 type: 1, 153 type: 1,
@@ -156,28 +161,8 @@ export default { @@ -156,28 +161,8 @@ export default {
156 date: "", 161 date: "",
157 subjectList: [], //科目 162 subjectList: [], //科目
158 radarChartData: { 163 radarChartData: {
159 - indicator: [  
160 - { name: "语文" },  
161 - { name: "数学" },  
162 - { name: "地理" },  
163 - { name: "物理" },  
164 - { name: "化学" },  
165 - { name: "生物" },  
166 - ],  
167 - num: [  
168 - {  
169 - name: "班最高分",  
170 - value: [100, 99, 98, 99, 100, 100],  
171 - },  
172 - {  
173 - name: "班平均分",  
174 - value: [95, 85, 90, 86, 92, 87],  
175 - },  
176 - {  
177 - name: "本人得分",  
178 - value: [90, 80, 95, 82, 95, 89],  
179 - },  
180 - ], 164 + indicator: [],
  165 + num: [],
181 }, 166 },
182 lineChartData: [ 167 lineChartData: [
183 { 168 {
@@ -194,24 +179,16 @@ export default { @@ -194,24 +179,16 @@ export default {
194 }, 179 },
195 ], 180 ],
196 xAxis: ["卷1", "卷2", "卷3", "卷4", "卷5"], 181 xAxis: ["卷1", "卷2", "卷3", "卷4", "卷5"],
197 - tableData: [  
198 - {  
199 - subjectName: "语文",  
200 - cl: 5,  
201 - bg: 100,  
202 - bp: 90,  
203 - br: 95,  
204 - pm: 1,  
205 - },  
206 - ], 182 + tableData: [],
  183 + count: 0, //测练数
207 }; 184 };
208 }, 185 },
209 async created() { 186 async created() {
210 this.id = this.$route.query.id; 187 this.id = this.$route.query.id;
211 this.classId = this.$route.query.classId; 188 this.classId = this.$route.query.classId;
  189 + this.studentCode = this.$route.query.studentCode;
  190 + this.studentName = this.$route.query.studentName;
212 this.subjectNames = this.$route.query.subjectNames?.split(",") || []; 191 this.subjectNames = this.$route.query.subjectNames?.split(",") || [];
213 - this.type =  
214 - this.subjectNames.length > 1 || this.subjectNames.length == 0 ? 1 : 2;  
215 await this._QuerySubjectList(); 192 await this._QuerySubjectList();
216 await this.setDate(1); 193 await this.setDate(1);
217 let startDay = this.query?.startDay; 194 let startDay = this.query?.startDay;
@@ -231,8 +208,9 @@ export default { @@ -231,8 +208,9 @@ export default {
231 return sub != "全部" ? item != "全部" : item == "全部"; 208 return sub != "全部" ? item != "全部" : item == "全部";
232 }); 209 });
233 this.type = 210 this.type =
234 - this.query.subjectNames.length > 1 ||  
235 - this.query.subjectNames.length == 0 211 + this.query.subjectNames.length > 1
  212 + ? 1
  213 + : this.query.subjectNames[0] == "全部" && this.subjectList.length != 2
236 ? 1 214 ? 1
237 : 2; 215 : 2;
238 }, 216 },
@@ -324,7 +302,16 @@ export default { @@ -324,7 +302,16 @@ export default {
324 }); 302 });
325 if (this.subjectNames.length == 0) { 303 if (this.subjectNames.length == 0) {
326 this.query.subjectNames.push(this.subjectList[0]?.value); 304 this.query.subjectNames.push(this.subjectList[0]?.value);
  305 + } else {
  306 + this.query.subjectNames = [...this.subjectNames];
327 } 307 }
  308 + this.type =
  309 + this.query.subjectNames.length > 1
  310 + ? 1
  311 + : this.query.subjectNames[0] == "全部" &&
  312 + this.subjectList.length != 2
  313 + ? 1
  314 + : 2;
328 } else { 315 } else {
329 this.$message.error(info); 316 this.$message.error(info);
330 } 317 }
@@ -337,12 +324,62 @@ export default { @@ -337,12 +324,62 @@ export default {
337 query[key] = this.query[key]; 324 query[key] = this.query[key];
338 } 325 }
339 } 326 }
340 - return;  
341 - const { data, status, info } = await this.$request.studentList({ 327 + delete query.subjectNames;
  328 + let subjectNames;
  329 + if (
  330 + this.query.subjectNames.length == 1 &&
  331 + this.query.subjectNames[0] == "全部"
  332 + ) {
  333 + subjectNames = this.subjectList
  334 + .filter((item) => {
  335 + return item.value != "全部";
  336 + })
  337 + .map((item) => {
  338 + return item.value;
  339 + });
  340 + } else {
  341 + subjectNames = [...this.query.subjectNames];
  342 + }
  343 + const { data, status, info } = await this.$request.studentExamReport({
  344 + studentId: this.id,
  345 + subjectNames: subjectNames,
342 ...query, 346 ...query,
343 }); 347 });
344 this.loading = false; 348 this.loading = false;
345 if (status === 0) { 349 if (status === 0) {
  350 + this.count = 0;
  351 + this.tableData = data.list || [];
  352 + if (this.type == 1) {
  353 + this.radarChartData.indicator = [];
  354 + this.radarChartData.num = [
  355 + { name: "班最高分", value: [] },
  356 + { name: "班平均分", value: [] },
  357 + { name: "本人得分", value: [] },
  358 + ];
  359 + this.tableData.map((item) => {
  360 + this.count += item.examCount;
  361 + this.radarChartData.indicator.push({
  362 + name: item.subjectName,
  363 + });
  364 + this.radarChartData.num[0].value.push(item.highestScore);
  365 + this.radarChartData.num[1].value.push(item.avgScore);
  366 + this.radarChartData.num[2].value.push(item.examScore);
  367 + });
  368 + } else {
  369 + this.count = data.count;
  370 + this.xAxis = [];
  371 + this.lineChartData = [
  372 + { name: "班平均分", value: [] },
  373 + { name: "个人成绩", value: [] },
  374 + { name: "班级排名", value: [] },
  375 + ];
  376 + this.tableData.map((item) => {
  377 + this.xAxis.push(item.title);
  378 + this.lineChartData[0].value.push(item.avgScore);
  379 + this.lineChartData[1].value.push(item.examScore);
  380 + this.lineChartData[2].value.push(item.classRank);
  381 + });
  382 + }
346 } else { 383 } else {
347 this.$message.error(info); 384 this.$message.error(info);
348 } 385 }
src/views/personal/portrait/index.vue renamed to src/views/portrait/index.vue
@@ -69,8 +69,8 @@ @@ -69,8 +69,8 @@
69 {{ item.studentName }} <i class="fa fa-calculator"></i> 69 {{ item.studentName }} <i class="fa fa-calculator"></i>
70 {{ item.clickerSn }} 70 {{ item.clickerSn }}
71 </p> 71 </p>
72 - <p class="p2">{{ item.sectionName + item.className }}</p>  
73 - <p class="p3">最近活跃:{{ item.time }}</p> 72 + <p class="p2">{{ gradeName(item.grade) }}</p>
  73 + <p class="p3">最近活跃:{{ item.modifiedTime }}</p>
74 </div> 74 </div>
75 <el-button 75 <el-button
76 class="btn" 76 class="btn"
@@ -87,11 +87,12 @@ @@ -87,11 +87,12 @@
87 </template> 87 </template>
88 88
89 <script> 89 <script>
90 -import { formatDate } from "utils"; 90 +import { formatDate, setGradeName } from "utils";
91 import BusEvent from "@/utils/busEvent"; 91 import BusEvent from "@/utils/busEvent";
92 export default { 92 export default {
93 data() { 93 data() {
94 return { 94 return {
  95 + role: "",
95 query: { 96 query: {
96 //搜索条件 97 //搜索条件
97 classId: "", 98 classId: "",
@@ -101,24 +102,16 @@ export default { @@ -101,24 +102,16 @@ export default {
101 }, 102 },
102 date: "", 103 date: "",
103 classList: [], 104 classList: [],
104 - tableData: [  
105 - {  
106 - studentId: "111",  
107 - studentName: "丁方菲",  
108 - studentCode: 123321,  
109 - clickerSn: 32312,  
110 - sectionName: "初一",  
111 - className: "三班",  
112 - classId:12,  
113 - time: "2022-11-04 18:09:49",  
114 - },  
115 - ], 105 + tableData: [],
116 page: 1, 106 page: 1,
117 size: 20, 107 size: 20,
118 total: 0, 108 total: 0,
119 }; 109 };
120 }, 110 },
121 async created() { 111 async created() {
  112 + this.role =
  113 + this.$store.getters.info.showRole ||
  114 + this.$store.getters.info.permissions[0].role;
122 await this._QueryClassList(); 115 await this._QueryClassList();
123 await this.setDate(1); 116 await this.setDate(1);
124 let startDay = this.query?.startDay; 117 let startDay = this.query?.startDay;
@@ -140,12 +133,17 @@ export default { @@ -140,12 +133,17 @@ export default {
140 }); 133 });
141 }, 134 },
142 methods: { 135 methods: {
  136 + gradeName(type) {
  137 + return setGradeName(type);
  138 + },
143 linkDetail(obj) { 139 linkDetail(obj) {
144 this.$router.push({ 140 this.$router.push({
145 path: "/portraitDetail", 141 path: "/portraitDetail",
146 query: { 142 query: {
147 - id: obj.studentId,  
148 - classId:obj.classId, 143 + studentName: obj.studentName,
  144 + studentCode: obj.studentCode,
  145 + id: obj.id,
  146 + classId: this.query.classId,
149 }, 147 },
150 }); 148 });
151 }, 149 },
@@ -224,11 +222,16 @@ export default { @@ -224,11 +222,16 @@ export default {
224 } 222 }
225 }, 223 },
226 async _QueryClassList() { 224 async _QueryClassList() {
227 - const { data, status, info } = await this.$request.pClassList(); 225 + let fetchClassList =
  226 + this.role == "ROLE_PERSONAL"
  227 + ? this.$request.pClassList
  228 + : this.$request.fetchClassList;
  229 +
  230 + const { data, status, info } = await fetchClassList();
228 if (status === 0) { 231 if (status === 0) {
229 this.classList = data.list.map((item) => { 232 this.classList = data.list.map((item) => {
230 return { 233 return {
231 - value: item.classId, 234 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
232 label: item.className, 235 label: item.className,
233 }; 236 };
234 }); 237 });
@@ -245,8 +248,11 @@ export default { @@ -245,8 +248,11 @@ export default {
245 query[key] = this.query[key]; 248 query[key] = this.query[key];
246 } 249 }
247 } 250 }
248 - return;  
249 - const { data, status, info } = await this.$request.pStudentList({ 251 + let studentList =
  252 + this.role == "ROLE_PERSONAL"
  253 + ? this.$request.pStudentList
  254 + : this.$request.tStudentList;
  255 + const { data, status, info } = await studentList({
250 ...query, 256 ...query,
251 page: this.page, 257 page: this.page,
252 size: this.size, 258 size: this.size,
src/views/standard/ask/analysis.vue
@@ -53,75 +53,85 @@ @@ -53,75 +53,85 @@
53 反馈时长:{{ setDuration(detail.consumingDuration) }} 53 反馈时长:{{ setDuration(detail.consumingDuration) }}
54 </li> 54 </li>
55 </ul> 55 </ul>
56 - <el-table v-if="type == 1" :data="tableData" border style="width: 100%">  
57 - <el-table-column prop="questionIndex" label="题号" align="center"  
58 - ><template slot-scope="scoped"  
59 - >Q{{ scoped.row.questionIndex }}</template  
60 - ></el-table-column 56 + <div id="print-content">
  57 + <el-table
  58 + v-if="type == 1"
  59 + :data="tableData"
  60 + border
  61 + style="width: 100%"
61 > 62 >
62 - <el-table-column prop="questionType" label="题型" align="center">  
63 - <template slot-scope="scoped">{{  
64 - setSubPro(scoped.row.questionType)  
65 - }}</template>  
66 - </el-table-column>  
67 - <el-table-column  
68 - prop="answeredNum"  
69 - label="答题人数"  
70 - sortable  
71 - align="center"  
72 - ></el-table-column>  
73 - <el-table-column  
74 - prop="correctAnswerNum"  
75 - label="答对人数"  
76 - sortable  
77 - align="center"  
78 - ></el-table-column>  
79 - <el-table-column  
80 - prop="participationRate"  
81 - label="班级参与度"  
82 - sortable  
83 - align="center"  
84 - ><template slot-scope="scoped"  
85 - >{{ scoped.row.participationRate }}%</template  
86 - ></el-table-column  
87 - >  
88 - <el-table-column  
89 - prop="classCorrectRate"  
90 - label="班级正确率"  
91 - sortable  
92 - align="center"  
93 - ><template slot-scope="scoped"  
94 - >{{ scoped.row.classCorrectRate }}%</template  
95 - ></el-table-column  
96 - >  
97 - <el-table-column  
98 - prop="answerCorrectRate"  
99 - label="已答正确率"  
100 - sortable  
101 - align="center"  
102 - ><template slot-scope="scoped"  
103 - >{{ scoped.row.answerCorrectRate }}%</template  
104 - ></el-table-column  
105 - >  
106 - <el-table-column prop="correctAnswer" label="正确答案" align="center">  
107 - <template slot-scope="scoped">{{  
108 - scoped.row.correctAnswer == 1  
109 - ? "✓"  
110 - : scoped.row.correctAnswer == 2  
111 - ? "✗"  
112 - : scoped.row.correctAnswer  
113 - }}</template></el-table-column  
114 - >  
115 - <el-table-column prop="fallible" label="干扰答案" align="center"  
116 - ><template slot-scope="scoped">{{  
117 - scoped.row.fallible == 1  
118 - ? "✓"  
119 - : scoped.row.fallible == 2  
120 - ? "✗"  
121 - : scoped.row.fallible  
122 - }}</template></el-table-column  
123 - >  
124 - <!-- <el-table-column prop="screenshot" label="题干" align="center"> 63 + <el-table-column prop="questionIndex" label="题号" align="center"
  64 + ><template slot-scope="scoped"
  65 + >Q{{ scoped.row.questionIndex }}</template
  66 + ></el-table-column
  67 + >
  68 + <el-table-column prop="questionType" label="题型" align="center">
  69 + <template slot-scope="scoped">{{
  70 + setSubPro(scoped.row.questionType)
  71 + }}</template>
  72 + </el-table-column>
  73 + <el-table-column
  74 + prop="answeredNum"
  75 + label="答题人数"
  76 + sortable
  77 + align="center"
  78 + ></el-table-column>
  79 + <el-table-column
  80 + prop="correctAnswerNum"
  81 + label="答对人数"
  82 + sortable
  83 + align="center"
  84 + ></el-table-column>
  85 + <el-table-column
  86 + prop="participationRate"
  87 + label="班级参与度"
  88 + sortable
  89 + align="center"
  90 + ><template slot-scope="scoped"
  91 + >{{ scoped.row.participationRate }}%</template
  92 + ></el-table-column
  93 + >
  94 + <el-table-column
  95 + prop="classCorrectRate"
  96 + label="班级正确率"
  97 + sortable
  98 + align="center"
  99 + ><template slot-scope="scoped"
  100 + >{{ scoped.row.classCorrectRate }}%</template
  101 + ></el-table-column
  102 + >
  103 + <el-table-column
  104 + prop="answerCorrectRate"
  105 + label="已答正确率"
  106 + sortable
  107 + align="center"
  108 + ><template slot-scope="scoped"
  109 + >{{ scoped.row.answerCorrectRate }}%</template
  110 + ></el-table-column
  111 + >
  112 + <el-table-column
  113 + prop="correctAnswer"
  114 + label="正确答案"
  115 + align="center"
  116 + >
  117 + <template slot-scope="scoped">{{
  118 + scoped.row.correctAnswer == 1
  119 + ? "✓"
  120 + : scoped.row.correctAnswer == 2
  121 + ? "✗"
  122 + : scoped.row.correctAnswer
  123 + }}</template></el-table-column
  124 + >
  125 + <el-table-column prop="fallible" label="干扰答案" align="center"
  126 + ><template slot-scope="scoped">{{
  127 + scoped.row.fallible == 1
  128 + ? "✓"
  129 + : scoped.row.fallible == 2
  130 + ? "✗"
  131 + : scoped.row.fallible
  132 + }}</template></el-table-column
  133 + >
  134 + <!-- <el-table-column prop="screenshot" label="题干" align="center">
125 <template slot-scope="scoped"> 135 <template slot-scope="scoped">
126 <el-image 136 <el-image
127 v-if="scoped.row.screenshot" 137 v-if="scoped.row.screenshot"
@@ -131,139 +141,158 @@ @@ -131,139 +141,158 @@
131 > 141 >
132 </el-image><span v-else>暂无</span></template 142 </el-image><span v-else>暂无</span></template
133 ></el-table-column> --> 143 ></el-table-column> -->
134 - </el-table>  
135 - <el-table v-if="type == 2" :data="tableData" border style="width: 100%">  
136 - <el-table-column  
137 - prop="studentCode"  
138 - label="学号"  
139 - align="center"  
140 - ></el-table-column>  
141 - <el-table-column  
142 - prop="studentName"  
143 - label="姓名"  
144 - align="center"  
145 - ></el-table-column>  
146 - <el-table-column  
147 - prop="answerTimes"  
148 - label="答题次数"  
149 - align="center"  
150 - ></el-table-column>  
151 - <el-table-column  
152 - prop="consumingDuration"  
153 - label="答题耗时"  
154 - align="center"  
155 - ><template slot-scope="scoped">{{setDuration(scoped.row.consumingDuration)}}</template></el-table-column>  
156 - <el-table-column  
157 - prop="correctAnswerTimes"  
158 - label="答对次数"  
159 - align="center"  
160 - ></el-table-column>  
161 - <el-table-column  
162 - prop="participationRate"  
163 - label="参与度"  
164 - sortable  
165 - align="center"  
166 - ><template slot-scope="scoped"  
167 - >{{ scoped.row.participationRate }}%</template  
168 - ></el-table-column 144 + </el-table>
  145 + <el-table
  146 + v-if="type == 2"
  147 + :data="tableData"
  148 + border
  149 + style="width: 100%"
169 > 150 >
170 - <el-table-column  
171 - prop="correctRate"  
172 - label="正确率"  
173 - sortable  
174 - align="center"  
175 - ><template slot-scope="scoped"  
176 - >{{ scoped.row.correctRate }}%</template  
177 - ></el-table-column 151 + <el-table-column
  152 + prop="studentCode"
  153 + label="学号"
  154 + align="center"
  155 + ></el-table-column>
  156 + <el-table-column
  157 + prop="studentName"
  158 + label="姓名"
  159 + align="center"
  160 + ></el-table-column>
  161 + <el-table-column
  162 + prop="answerTimes"
  163 + label="答题次数"
  164 + align="center"
  165 + ></el-table-column>
  166 + <el-table-column
  167 + prop="consumingDuration"
  168 + label="答题耗时"
  169 + align="center"
  170 + ><template slot-scope="scoped">{{
  171 + setDuration(scoped.row.consumingDuration)
  172 + }}</template></el-table-column
  173 + >
  174 + <el-table-column
  175 + prop="correctAnswerTimes"
  176 + label="答对次数"
  177 + align="center"
  178 + ></el-table-column>
  179 + <el-table-column
  180 + prop="participationRate"
  181 + label="参与度"
  182 + sortable
  183 + align="center"
  184 + ><template slot-scope="scoped"
  185 + >{{ scoped.row.participationRate }}%</template
  186 + ></el-table-column
  187 + >
  188 + <el-table-column
  189 + prop="correctRate"
  190 + label="正确率"
  191 + sortable
  192 + align="center"
  193 + ><template slot-scope="scoped"
  194 + >{{ scoped.row.correctRate }}%</template
  195 + ></el-table-column
  196 + >
  197 + <el-table-column
  198 + prop="answerCorrectRate"
  199 + label="已答正确率"
  200 + sortable
  201 + align="center"
  202 + ><template slot-scope="scoped"
  203 + >{{ scoped.row.answerCorrectRate }}%</template
  204 + ></el-table-column
  205 + >
  206 + <el-table-column
  207 + v-for="(item, index) in optionsList"
  208 + :key="index"
  209 + :label="'Q' + (index + 1)"
  210 + align="center"
  211 + ><template slot-scope="scoped">
  212 + <span :class="scoped.row['isRight' + index] ? '' : 'red'">{{
  213 + scoped.row["answer" + index]
  214 + }}</span>
  215 + </template>
  216 + </el-table-column>
  217 + </el-table>
  218 + <el-table
  219 + v-if="type == 3"
  220 + :data="tableData"
  221 + border
  222 + style="width: 100%"
178 > 223 >
179 - <el-table-column  
180 - prop="answerCorrectRate"  
181 - label="已答正确率"  
182 - sortable  
183 - align="center"  
184 - ><template slot-scope="scoped"  
185 - >{{ scoped.row.answerCorrectRate }}%</template  
186 - ></el-table-column 224 + <el-table-column
  225 + prop="studentCode"
  226 + label="学号"
  227 + align="center"
  228 + ></el-table-column>
  229 + <el-table-column
  230 + prop="studentName"
  231 + label="姓名"
  232 + align="center"
  233 + ></el-table-column>
  234 + <el-table-column
  235 + prop="rushAnswerTimes"
  236 + label="抢答成功次数"
  237 + sortable
  238 + align="center"
  239 + ></el-table-column>
  240 + <el-table-column
  241 + prop="rushAnswerCorrectTimes"
  242 + label="答对次数"
  243 + sortable
  244 + align="center"
  245 + ></el-table-column>
  246 + <el-table-column
  247 + prop="checkAnswerTimes"
  248 + label="抽答次数"
  249 + sortable
  250 + align="center"
  251 + ></el-table-column>
  252 + <el-table-column
  253 + prop="checkAnswerCorrectTimes"
  254 + label="抽答答对次数"
  255 + sortable
  256 + align="center"
  257 + ></el-table-column>
  258 + <el-table-column
  259 + prop="interactionsNum"
  260 + label="参与得分"
  261 + sortable
  262 + align="center"
  263 + ></el-table-column>
  264 + <el-table-column
  265 + prop="interactionsCorrectNum"
  266 + label="对错得分"
  267 + sortable
  268 + align="center"
  269 + ></el-table-column>
  270 + </el-table>
  271 + <el-table
  272 + v-if="type == 4"
  273 + :data="tableData"
  274 + border
  275 + style="width: 100%"
187 > 276 >
188 - <el-table-column  
189 - v-for="(item, index) in optionsList"  
190 - :key="index"  
191 - :label="'Q' + (index + 1)"  
192 - align="center"  
193 - ><template slot-scope="scoped">  
194 - <span :class="scoped.row['isRight' + index] ? '' : 'red'">{{  
195 - scoped.row["answer" + index]  
196 - }}</span>  
197 - </template>  
198 - </el-table-column>  
199 - </el-table>  
200 - <el-table v-if="type == 3" :data="tableData" border style="width: 100%">  
201 - <el-table-column  
202 - prop="studentCode"  
203 - label="学号"  
204 - align="center"  
205 - ></el-table-column>  
206 - <el-table-column  
207 - prop="studentName"  
208 - label="姓名"  
209 - align="center"  
210 - ></el-table-column>  
211 - <el-table-column  
212 - prop="rushAnswerTimes"  
213 - label="抢答成功次数"  
214 - sortable  
215 - align="center"  
216 - ></el-table-column>  
217 - <el-table-column  
218 - prop="rushAnswerCorrectTimes"  
219 - label="答对次数"  
220 - sortable  
221 - align="center"  
222 - ></el-table-column>  
223 - <el-table-column  
224 - prop="checkAnswerTimes"  
225 - label="抽答次数"  
226 - sortable  
227 - align="center"  
228 - ></el-table-column>  
229 - <el-table-column  
230 - prop="checkAnswerCorrectTimes"  
231 - label="抽答答对次数"  
232 - sortable  
233 - align="center"  
234 - ></el-table-column>  
235 - <el-table-column  
236 - prop="interactionsNum"  
237 - label="参与得分"  
238 - sortable  
239 - align="center"  
240 - ></el-table-column>  
241 - <el-table-column  
242 - prop="interactionsCorrectNum"  
243 - label="对错得分"  
244 - sortable  
245 - align="center"  
246 - ></el-table-column>  
247 - </el-table>  
248 - <el-table v-if="type == 4" :data="tableData" border style="width: 100%">  
249 - <el-table-column  
250 - prop="studentName"  
251 - label="姓名"  
252 - align="center"  
253 - ></el-table-column>  
254 - <el-table-column  
255 - prop="checkInTime"  
256 - label="签到时间"  
257 - sortable  
258 - align="center"  
259 - ></el-table-column>  
260 - <el-table-column  
261 - prop="makeUpTime"  
262 - label="补签时间"  
263 - sortable  
264 - align="center"  
265 - ></el-table-column>  
266 - </el-table> 277 + <el-table-column
  278 + prop="studentName"
  279 + label="姓名"
  280 + align="center"
  281 + ></el-table-column>
  282 + <el-table-column
  283 + prop="checkInTime"
  284 + label="签到时间"
  285 + sortable
  286 + align="center"
  287 + ></el-table-column>
  288 + <el-table-column
  289 + prop="makeUpTime"
  290 + label="补签时间"
  291 + sortable
  292 + align="center"
  293 + ></el-table-column>
  294 + </el-table>
  295 + </div>
267 <div class="pagination-box" v-show="type == 1"> 296 <div class="pagination-box" v-show="type == 1">
268 <el-pagination 297 <el-pagination
269 small="" 298 small=""
@@ -285,6 +314,14 @@ @@ -285,6 +314,14 @@
285 icon="fa fa-cloud-download" 314 icon="fa fa-cloud-download"
286 >导出报表</el-button 315 >导出报表</el-button
287 > 316 >
  317 + <el-button
  318 + @click="print"
  319 + type="primary"
  320 + plain
  321 + round
  322 + icon="el-icon-printer"
  323 + >打印</el-button
  324 + >
288 <!-- <el-button @click="edit" type="primary" round>修改答案</el-button> --> 325 <!-- <el-button @click="edit" type="primary" round>修改答案</el-button> -->
289 </p> 326 </p>
290 </div> 327 </div>
@@ -301,7 +338,7 @@ @@ -301,7 +338,7 @@
301 </template> 338 </template>
302 339
303 <script> 340 <script>
304 -import { downloadFile } from "@/utils"; 341 +import { downloadFile,tablePrint } from "@/utils";
305 export default { 342 export default {
306 data() { 343 data() {
307 return { 344 return {
@@ -327,28 +364,31 @@ export default { @@ -327,28 +364,31 @@ export default {
327 this.periodDetail(); 364 this.periodDetail();
328 }, 365 },
329 methods: { 366 methods: {
  367 + print() {
  368 + tablePrint("print-content");
  369 + },
330 setType(type) { 370 setType(type) {
331 this.type = type; 371 this.type = type;
332 this.page = 1; 372 this.page = 1;
333 this._QueryData(); 373 this._QueryData();
334 }, 374 },
335 - setDuration(times){  
336 - let m = parseInt(times/1000 / 60)  
337 - let s = parseInt((times/1000)%60)  
338 - let ms = times 375 + setDuration(times) {
  376 + let m = parseInt(times / 1000 / 60);
  377 + let s = parseInt((times / 1000) % 60);
  378 + let ms = times;
339 let aTime; 379 let aTime;
340 - if(times==0){  
341 - aTime = `0`  
342 - }else{  
343 - if(m==0&&s==0){  
344 - aTime = `${ms}毫秒`  
345 - }else if(m==0&&s!=0){  
346 - aTime = `${s}秒`  
347 - }else if(m!=0&&s!=0){  
348 - aTime = `${m}分${s}秒` 380 + if (times == 0) {
  381 + aTime = `0`;
  382 + } else {
  383 + if (m == 0 && s == 0) {
  384 + aTime = `${ms}毫秒`;
  385 + } else if (m == 0 && s != 0) {
  386 + aTime = `${s}秒`;
  387 + } else if (m != 0 && s != 0) {
  388 + aTime = `${m}分${s}秒`;
349 } 389 }
350 } 390 }
351 - return aTime 391 + return aTime;
352 }, 392 },
353 setSubPro(type) { 393 setSubPro(type) {
354 let tit; 394 let tit;
@@ -458,8 +498,8 @@ export default { @@ -458,8 +498,8 @@ export default {
458 }); 498 });
459 this.optionsList = [...optionsList]; 499 this.optionsList = [...optionsList];
460 } else { 500 } else {
461 - this.tableData = data?.list.sort((a,b)=>{  
462 - return a.questionIndex-b.questionIndex 501 + this.tableData = data?.list.sort((a, b) => {
  502 + return a.questionIndex - b.questionIndex;
463 }); 503 });
464 } 504 }
465 this.total = data.count; 505 this.total = data.count;
@@ -504,7 +544,9 @@ div::-webkit-scrollbar-thumb { @@ -504,7 +544,9 @@ div::-webkit-scrollbar-thumb {
504 display: flex; 544 display: flex;
505 justify-content: space-between; 545 justify-content: space-between;
506 } 546 }
507 -.red{color:#f30} 547 +.red {
  548 + color: #f30;
  549 +}
508 .page-content { 550 .page-content {
509 padding: 20px 20px 0; 551 padding: 20px 20px 0;
510 } 552 }
src/views/standard/ask/index.vue
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 </el-option> 22 </el-option>
23 </el-select> 23 </el-select>
24 <el-select 24 <el-select
25 - v-if="role == 'ROLE_BANZHUREN'" 25 + v-if="role == 'ROLE_BANZHUREN' || role == 'ROLE_PERSONAL'"
26 class="sel" 26 class="sel"
27 multiple 27 multiple
28 v-model="query.subjectNames" 28 v-model="query.subjectNames"
@@ -104,333 +104,340 @@ @@ -104,333 +104,340 @@
104 >阶段互动报表</el-radio-button 104 >阶段互动报表</el-radio-button
105 > 105 >
106 </el-radio-group> 106 </el-radio-group>
107 - <!-- <p class="table-tit" v-if="tabIndex != 1">  
108 - <span>总课时数:10</span>  
109 - <span>互动总数:22</span>  
110 - </p> -->  
111 <div class="table-cont" v-loading="loading"> 107 <div class="table-cont" v-loading="loading">
112 - <div v-show="tabIndex == 1">  
113 - <el-table  
114 - :data="tableData"  
115 - border  
116 - style="width: 100%"  
117 - @sort-change="sortChange"  
118 - >  
119 - <el-table-column  
120 - prop="title"  
121 - label="课时"  
122 - align="center"  
123 - ></el-table-column>  
124 - <el-table-column  
125 - prop="questionNum"  
126 - label="题目总数"  
127 - align="center"  
128 - width="100"  
129 - ></el-table-column>  
130 - <el-table-column  
131 - prop="startTime"  
132 - label="上课时间"  
133 - align="center"  
134 - ></el-table-column>  
135 - <el-table-column  
136 - prop="participationRate"  
137 - label="参与度"  
138 - sortable="custom"  
139 - align="center"  
140 - >  
141 - <template slot-scope="scoped"  
142 - >{{ scoped.row.participationRate }}%</template  
143 - ></el-table-column 108 + <div id="print-content">
  109 + <div v-show="tabIndex == 1">
  110 + <el-table
  111 + :data="tableData"
  112 + border
  113 + style="width: 100%"
  114 + @sort-change="sortChange"
144 > 115 >
145 - <el-table-column  
146 - prop="answerCorrectRate"  
147 - label="已答总正确率"  
148 - sortable="custom"  
149 - align="center"  
150 - >  
151 - <template slot-scope="scoped"  
152 - >{{ scoped.row.answerCorrectRate }}%</template 116 + <el-table-column
  117 + prop="title"
  118 + label="课时"
  119 + align="center"
  120 + ></el-table-column>
  121 + <el-table-column
  122 + prop="questionNum"
  123 + label="题目总数"
  124 + align="center"
  125 + width="100"
  126 + ></el-table-column>
  127 + <el-table-column
  128 + prop="startTime"
  129 + label="上课时间"
  130 + align="center"
  131 + ></el-table-column>
  132 + <el-table-column
  133 + prop="participationRate"
  134 + label="参与度"
  135 + sortable="custom"
  136 + align="center"
153 > 137 >
154 - </el-table-column>  
155 - <el-table-column  
156 - prop="classCorrectRate"  
157 - label="班级总正确率"  
158 - sortable="custom"  
159 - align="center"  
160 - ><template slot-scope="scoped"  
161 - >{{ scoped.row.classCorrectRate }}%</template  
162 - ></el-table-column  
163 - >  
164 - <el-table-column label="操作" align="center">  
165 - <template slot-scope="scoped">  
166 - <el-tooltip  
167 - effect="dark"  
168 - v-if="scoped.row.answerNum == 0"  
169 - content="设置答案"  
170 - placement="top"  
171 - >  
172 - <el-button  
173 - type="primary"  
174 - circle  
175 - size="mini"  
176 - icon="fa fa-file-text"  
177 - @click="edit(scoped.row)"  
178 - ></el-button>  
179 - </el-tooltip>  
180 - <el-tooltip v-else effect="dark" content="详情" placement="top">  
181 - <el-button  
182 - type="primary"  
183 - circle  
184 - size="mini"  
185 - icon="fa fa-arrow-right"  
186 - @click="linkTo(scoped.row)"  
187 - ></el-button>  
188 - </el-tooltip>  
189 - </template>  
190 - </el-table-column>  
191 - </el-table>  
192 - </div>  
193 - <div v-show="tabIndex == 2">  
194 - <el-table  
195 - v-if="role == 'ROLE_JIAOSHI'"  
196 - :max-height="tableMaxHeight"  
197 - :data="tableData"  
198 - border  
199 - style="width: 100%"  
200 - >  
201 - <el-table-column  
202 - prop="studentCode"  
203 - label="学号"  
204 - fixed  
205 - align="center"  
206 - ></el-table-column>  
207 - <el-table-column  
208 - prop="studentName"  
209 - label="姓名"  
210 - fixed  
211 - align="center"  
212 - width="100"  
213 - ></el-table-column>  
214 - <el-table-column  
215 - prop="answerTimes"  
216 - label="累计答题次数"  
217 - sortable  
218 - align="center"  
219 - ></el-table-column>  
220 - <el-table-column  
221 - prop="correctAnswerTimes"  
222 - label="累计答对次数"  
223 - sortable  
224 - align="center"  
225 - ></el-table-column>  
226 - <el-table-column  
227 - prop="participationRate"  
228 - label="总参与度"  
229 - sortable  
230 - align="center"  
231 - >  
232 - <template slot-scope="scoped"  
233 - >{{ scoped.row.participationRate }}%</template  
234 - ></el-table-column  
235 - >  
236 - <el-table-column  
237 - prop="correctRate"  
238 - label="总正确率"  
239 - sortable  
240 - align="center"  
241 - >  
242 - <template slot-scope="scoped"  
243 - >{{ scoped.row.correctRate }}%</template  
244 - ></el-table-column  
245 - >  
246 - <el-table-column  
247 - prop="answerCorrectRate"  
248 - label="已答总正确率"  
249 - sortable  
250 - align="center"  
251 - >  
252 - <template slot-scope="scoped"  
253 - >{{ scoped.row.answerCorrectRate }}%</template 138 + <template slot-scope="scoped"
  139 + >{{ scoped.row.participationRate }}%</template
  140 + ></el-table-column
254 > 141 >
255 - </el-table-column>  
256 - <el-table-column  
257 - prop="classRank"  
258 - label="总正确率班排名"  
259 - sortable  
260 - align="center"  
261 - ></el-table-column>  
262 - </el-table>  
263 - <el-table  
264 - :max-height="tableMaxHeight"  
265 - v-else  
266 - :data="tableData"  
267 - border  
268 - style="width: 100%"  
269 - >  
270 - <el-table-column  
271 - prop="studentCode"  
272 - label="学号"  
273 - align="center"  
274 - fixed  
275 - ></el-table-column>  
276 - <el-table-column  
277 - prop="studentName"  
278 - label="姓名"  
279 - align="center"  
280 - fixed  
281 - width="100"  
282 - ></el-table-column>  
283 - <el-table-column  
284 - v-for="(item, index) in phaseOption"  
285 - :key="index"  
286 - :label="item"  
287 - align="center"  
288 - >  
289 <el-table-column 142 <el-table-column
  143 + prop="answerCorrectRate"
  144 + label="已答总正确率"
  145 + sortable="custom"
290 align="center" 146 align="center"
291 - :label="index == 0 ? '总课时数' : '课时数'"  
292 - :prop="'periodCount' + item"  
293 > 147 >
  148 + <template slot-scope="scoped"
  149 + >{{ scoped.row.answerCorrectRate }}%</template
  150 + >
294 </el-table-column> 151 </el-table-column>
295 <el-table-column 152 <el-table-column
  153 + prop="classCorrectRate"
  154 + label="班级总正确率"
  155 + sortable="custom"
296 align="center" 156 align="center"
297 - :label="index == 0 ? '总出题数' : '出题数'"  
298 - :prop="'questionNum' + item" 157 + ><template slot-scope="scoped"
  158 + >{{ scoped.row.classCorrectRate }}%</template
  159 + ></el-table-column
299 > 160 >
  161 + <el-table-column label="操作" align="center">
  162 + <template slot-scope="scoped">
  163 + <el-tooltip
  164 + effect="dark"
  165 + v-if="scoped.row.answerNum == 0"
  166 + content="设置答案"
  167 + placement="top"
  168 + >
  169 + <el-button
  170 + type="primary"
  171 + circle
  172 + size="mini"
  173 + icon="fa fa-file-text"
  174 + @click="edit(scoped.row)"
  175 + ></el-button>
  176 + </el-tooltip>
  177 + <el-tooltip
  178 + v-else
  179 + effect="dark"
  180 + content="详情"
  181 + placement="top"
  182 + >
  183 + <el-button
  184 + type="primary"
  185 + circle
  186 + size="mini"
  187 + icon="fa fa-arrow-right"
  188 + @click="linkTo(scoped.row)"
  189 + ></el-button>
  190 + </el-tooltip>
  191 + </template>
300 </el-table-column> 192 </el-table-column>
  193 + </el-table>
  194 + </div>
  195 + <div v-show="tabIndex == 2">
  196 + <el-table
  197 + id="print-content2"
  198 + v-if="role == 'ROLE_JIAOSHI'"
  199 + :max-height="tableMaxHeight"
  200 + :data="tableData"
  201 + border
  202 + style="width: 100%"
  203 + >
301 <el-table-column 204 <el-table-column
  205 + prop="studentCode"
  206 + label="学号"
  207 + fixed
302 align="center" 208 align="center"
303 - :label="index == 0 ? '总参与度' : '参与度'"  
304 - :prop="'participationRate' + item"  
305 - ><template slot-scope="scoped"  
306 - >{{ scoped.row["participationRate" + item] }}%</template 209 + ></el-table-column>
  210 + <el-table-column
  211 + prop="studentName"
  212 + label="姓名"
  213 + fixed
  214 + align="center"
  215 + width="100"
  216 + ></el-table-column>
  217 + <el-table-column
  218 + prop="answerTimes"
  219 + label="累计答题次数"
  220 + sortable
  221 + align="center"
  222 + ></el-table-column>
  223 + <el-table-column
  224 + prop="correctAnswerTimes"
  225 + label="累计答对次数"
  226 + sortable
  227 + align="center"
  228 + ></el-table-column>
  229 + <el-table-column
  230 + prop="participationRate"
  231 + label="总参与度"
  232 + sortable
  233 + align="center"
  234 + >
  235 + <template slot-scope="scoped"
  236 + >{{ scoped.row.participationRate }}%</template
  237 + ></el-table-column
  238 + >
  239 + <el-table-column
  240 + prop="correctRate"
  241 + label="总正确率"
  242 + sortable
  243 + align="center"
  244 + >
  245 + <template slot-scope="scoped"
  246 + >{{ scoped.row.correctRate }}%</template
  247 + ></el-table-column
  248 + >
  249 + <el-table-column
  250 + prop="answerCorrectRate"
  251 + label="已答总正确率"
  252 + sortable
  253 + align="center"
  254 + >
  255 + <template slot-scope="scoped"
  256 + >{{ scoped.row.answerCorrectRate }}%</template
307 > 257 >
308 </el-table-column> 258 </el-table-column>
309 <el-table-column 259 <el-table-column
  260 + prop="classRank"
  261 + label="总正确率班排名"
  262 + sortable
310 align="center" 263 align="center"
311 - :label="index == 0 ? '总正确率' : '正确率'"  
312 - :prop="'correctRate' + item"  
313 - ><template slot-scope="scoped"  
314 - >{{ scoped.row["correctRate" + item] }}%</template 264 + ></el-table-column>
  265 + </el-table>
  266 + <el-table
  267 + id="print-content2"
  268 + :max-height="tableMaxHeight"
  269 + v-else
  270 + :data="tableData"
  271 + border
  272 + style="width: 100%"
  273 + >
  274 + <el-table-column
  275 + prop="studentCode"
  276 + label="学号"
  277 + align="center"
  278 + fixed
  279 + ></el-table-column>
  280 + <el-table-column
  281 + prop="studentName"
  282 + label="姓名"
  283 + align="center"
  284 + fixed
  285 + width="100"
  286 + ></el-table-column>
  287 + <el-table-column
  288 + v-for="(item, index) in phaseOption"
  289 + :key="index"
  290 + :label="item"
  291 + align="center"
  292 + >
  293 + <el-table-column
  294 + align="center"
  295 + :label="index == 0 ? '总课时数' : '课时数'"
  296 + :prop="'periodCount' + item"
315 > 297 >
  298 + </el-table-column>
  299 + <el-table-column
  300 + align="center"
  301 + :label="index == 0 ? '总出题数' : '出题数'"
  302 + :prop="'questionNum' + item"
  303 + >
  304 + </el-table-column>
  305 + <el-table-column
  306 + align="center"
  307 + :label="index == 0 ? '总参与度' : '参与度'"
  308 + :prop="'participationRate' + item"
  309 + ><template slot-scope="scoped"
  310 + >{{ scoped.row["participationRate" + item] }}%</template
  311 + >
  312 + </el-table-column>
  313 + <el-table-column
  314 + align="center"
  315 + :label="index == 0 ? '总正确率' : '正确率'"
  316 + :prop="'correctRate' + item"
  317 + ><template slot-scope="scoped"
  318 + >{{ scoped.row["correctRate" + item] }}%</template
  319 + >
  320 + </el-table-column>
316 </el-table-column> 321 </el-table-column>
317 - </el-table-column>  
318 - </el-table>  
319 - </div>  
320 - <div v-show="tabIndex == 3">  
321 - <el-table  
322 - v-if="role == 'ROLE_JIAOSHI'"  
323 - :max-height="tableMaxHeight"  
324 - :data="tableData"  
325 - border  
326 - style="width: 100%"  
327 - >  
328 - <el-table-column  
329 - prop="studentCode"  
330 - label="学号"  
331 - fixed  
332 - align="center"  
333 - ></el-table-column>  
334 - <el-table-column  
335 - prop="studentName"  
336 - label="姓名"  
337 - fixed  
338 - align="center"  
339 - width="100"  
340 - ></el-table-column>  
341 - <el-table-column  
342 - prop="rushAnswerTimes"  
343 - label="抢答成功次数"  
344 - sortable  
345 - align="center"  
346 - ></el-table-column>  
347 - <el-table-column  
348 - prop="rushAnswerCorrectTimes"  
349 - label="抢答答对次数"  
350 - sortable  
351 - align="center"  
352 - ></el-table-column>  
353 - <el-table-column  
354 - prop="checkAnswerTimes"  
355 - label="抽答次数"  
356 - sortable  
357 - align="center"  
358 - ></el-table-column>  
359 - <el-table-column  
360 - prop="checkAnswerCorrectTimes"  
361 - label="抽答答对次数"  
362 - sortable  
363 - align="center"  
364 - ></el-table-column>  
365 - <el-table-column  
366 - prop="interactionsNum"  
367 - label="参与得分"  
368 - sortable  
369 - align="center"  
370 - ></el-table-column>  
371 - <el-table-column  
372 - prop="interactionsCorrectNum"  
373 - label="对错得分"  
374 - sortable  
375 - align="center"  
376 - ></el-table-column>  
377 - </el-table>  
378 - <el-table  
379 - v-else  
380 - :max-height="tableMaxHeight"  
381 - :data="tableData"  
382 - border  
383 - style="width: 100%"  
384 - >  
385 - <el-table-column  
386 - prop="studentCode"  
387 - label="学号"  
388 - align="center"  
389 - ></el-table-column>  
390 - <el-table-column  
391 - prop="studentName"  
392 - label="姓名"  
393 - align="center"  
394 - width="100"  
395 - ></el-table-column>  
396 - <el-table-column  
397 - v-for="(item, index) in phaseInter"  
398 - :key="index"  
399 - :label="item"  
400 - align="center" 322 + </el-table>
  323 + </div>
  324 + <div v-show="tabIndex == 3">
  325 + <el-table
  326 + id="print-content3"
  327 + v-if="role == 'ROLE_JIAOSHI'"
  328 + :max-height="tableMaxHeight"
  329 + :data="tableData"
  330 + border
  331 + style="width: 100%"
401 > 332 >
402 <el-table-column 333 <el-table-column
  334 + prop="studentCode"
  335 + label="学号"
  336 + fixed
  337 + align="center"
  338 + ></el-table-column>
  339 + <el-table-column
  340 + prop="studentName"
  341 + label="姓名"
  342 + fixed
403 align="center" 343 align="center"
404 - v-if="index == 0"  
405 - label="参与分" 344 + width="100"
  345 + ></el-table-column>
  346 + <el-table-column
  347 + prop="rushAnswerTimes"
  348 + label="抢答成功次数"
406 sortable 349 sortable
407 - :prop="'interactionsNum' + item"  
408 - >  
409 - </el-table-column> 350 + align="center"
  351 + ></el-table-column>
410 <el-table-column 352 <el-table-column
411 - v-else 353 + prop="rushAnswerCorrectTimes"
  354 + label="抢答答对次数"
  355 + sortable
412 align="center" 356 align="center"
413 - label="互动数"  
414 - :prop="'interactionsNum' + item"  
415 - >  
416 - </el-table-column> 357 + ></el-table-column>
417 <el-table-column 358 <el-table-column
418 - v-if="index == 0" 359 + prop="checkAnswerTimes"
  360 + label="抽答次数"
  361 + sortable
419 align="center" 362 align="center"
420 - label="对错分" 363 + ></el-table-column>
  364 + <el-table-column
  365 + prop="checkAnswerCorrectTimes"
  366 + label="抽答答对次数"
421 sortable 367 sortable
422 - :prop="'interactionsCorrectNum' + item"  
423 - >  
424 - </el-table-column> 368 + align="center"
  369 + ></el-table-column>
  370 + <el-table-column
  371 + prop="interactionsNum"
  372 + label="参与得分"
  373 + sortable
  374 + align="center"
  375 + ></el-table-column>
425 <el-table-column 376 <el-table-column
426 - v-else 377 + prop="interactionsCorrectNum"
  378 + label="对错得分"
  379 + sortable
  380 + align="center"
  381 + ></el-table-column>
  382 + </el-table>
  383 + <el-table
  384 + id="print-content3"
  385 + v-else
  386 + :max-height="tableMaxHeight"
  387 + :data="tableData"
  388 + border
  389 + style="width: 100%"
  390 + >
  391 + <el-table-column
  392 + prop="studentCode"
  393 + label="学号"
  394 + align="center"
  395 + ></el-table-column>
  396 + <el-table-column
  397 + prop="studentName"
  398 + label="姓名"
  399 + align="center"
  400 + width="100"
  401 + ></el-table-column>
  402 + <el-table-column
  403 + v-for="(item, index) in phaseInter"
  404 + :key="index"
  405 + :label="item"
427 align="center" 406 align="center"
428 - label="参与数"  
429 - :prop="'interactionsCorrectNum' + item"  
430 > 407 >
  408 + <el-table-column
  409 + align="center"
  410 + v-if="index == 0"
  411 + label="参与分"
  412 + sortable
  413 + :prop="'interactionsNum' + item"
  414 + >
  415 + </el-table-column>
  416 + <el-table-column
  417 + v-else
  418 + align="center"
  419 + label="互动数"
  420 + :prop="'interactionsNum' + item"
  421 + >
  422 + </el-table-column>
  423 + <el-table-column
  424 + v-if="index == 0"
  425 + align="center"
  426 + label="对错分"
  427 + sortable
  428 + :prop="'interactionsCorrectNum' + item"
  429 + >
  430 + </el-table-column>
  431 + <el-table-column
  432 + v-else
  433 + align="center"
  434 + label="参与数"
  435 + :prop="'interactionsCorrectNum' + item"
  436 + >
  437 + </el-table-column>
431 </el-table-column> 438 </el-table-column>
432 - </el-table-column>  
433 - </el-table> 439 + </el-table>
  440 + </div>
434 </div> 441 </div>
435 <div class="pagination-box" v-show="tabIndex == 1"> 442 <div class="pagination-box" v-show="tabIndex == 1">
436 <el-pagination 443 <el-pagination
@@ -456,21 +463,22 @@ @@ -456,21 +463,22 @@
456 icon="fa fa-cloud-download" 463 icon="fa fa-cloud-download"
457 >导出报表</el-button 464 >导出报表</el-button
458 > 465 >
  466 + <el-button
  467 + @click="print"
  468 + type="primary"
  469 + plain
  470 + round
  471 + icon="el-icon-printer"
  472 + >打印</el-button
  473 + >
459 </p> 474 </p>
460 </div> 475 </div>
461 </div> 476 </div>
462 - <set-answer  
463 - :diaVisible="dialogVisible"  
464 - :questionList="form.questionList"  
465 - :paperId="form.id"  
466 - @saveSuccess="handleSuccess"  
467 - @cancel="cancel"  
468 - />  
469 </div> 477 </div>
470 </template> 478 </template>
471 479
472 <script> 480 <script>
473 -import { formatDate, deepClone, downloadFile } from "utils"; 481 +import { formatDate, deepClone, downloadFile, tablePrint } from "utils";
474 import BusEvent from "@/utils/busEvent"; 482 import BusEvent from "@/utils/busEvent";
475 export default { 483 export default {
476 data() { 484 data() {
@@ -478,8 +486,6 @@ export default { @@ -478,8 +486,6 @@ export default {
478 tableMaxHeight: 300, 486 tableMaxHeight: 300,
479 role: "", 487 role: "",
480 loading: false, 488 loading: false,
481 - dialogVisible: false,  
482 - form: { questionList: [] },  
483 date: "", //今天-昨天-本周 489 date: "", //今天-昨天-本周
484 query: { 490 query: {
485 //搜索条件 491 //搜索条件
@@ -506,7 +512,9 @@ export default { @@ -506,7 +512,9 @@ export default {
506 }; 512 };
507 }, 513 },
508 async created() { 514 async created() {
509 - this.role = this.$store.getters.info.showRole || this.$store.getters.info.permissions[0].role; 515 + this.role =
  516 + this.$store.getters.info.showRole ||
  517 + this.$store.getters.info.permissions[0].role;
510 this.query.subjectNames = this.role == "ROLE_BANZHUREN" ? [] : ""; 518 this.query.subjectNames = this.role == "ROLE_BANZHUREN" ? [] : "";
511 await this._QueryClassList(); 519 await this._QueryClassList();
512 await this._QuerySubjectList(); 520 await this._QuerySubjectList();
@@ -532,6 +540,9 @@ export default { @@ -532,6 +540,9 @@ export default {
532 }); 540 });
533 }, 541 },
534 methods: { 542 methods: {
  543 + print() {
  544 + tablePrint("print-content");
  545 + },
535 changeSub(val) { 546 changeSub(val) {
536 let sub; 547 let sub;
537 if (val && val.length) { 548 if (val && val.length) {
@@ -623,26 +634,14 @@ export default { @@ -623,26 +634,14 @@ export default {
623 } 634 }
624 }, 635 },
625 async edit(item) { 636 async edit(item) {
626 - if (this.editLoading) return;  
627 - this.editLoading = true;  
628 - const { data, status, info } = await this.$request.periodQuestionList({  
629 - periodId: item.id, 637 + this.$router.push({
  638 + path: "/examinationPaperEdit",
  639 + query: {
  640 + paperId: item.id,
  641 + title: item.title,
  642 + type: 3,
  643 + },
630 }); 644 });
631 - this.editLoading = false;  
632 - if (status === 0) {  
633 - this.form.id = item.id;  
634 - this.form.questionList = (data.list && [...data.list]) || [];  
635 - this.dialogVisible = true;  
636 - } else {  
637 - this.$message.error(info);  
638 - }  
639 - },  
640 - cancel() {  
641 - this.dialogVisible = false;  
642 - },  
643 - handleSuccess() {  
644 - this.dialogVisible = false;  
645 - this._QueryData();  
646 }, 645 },
647 tabChange() { 646 tabChange() {
648 this.tableMaxHeight = this.$refs.main.offsetHeight; 647 this.tableMaxHeight = this.$refs.main.offsetHeight;
src/views/standard/setUp/school.vue
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <span>学校设置</span> 5 <span>学校设置</span>
6 </template> 6 </template>
7 <template slot="btns" v-if="!code"> 7 <template slot="btns" v-if="!code">
8 - <el-tooltip effect="dark" content="导入学校名单" placement="bottom"> 8 + <el-tooltip effect="dark" content="导入班级名单" placement="bottom">
9 <el-button 9 <el-button
10 type="primary" 10 type="primary"
11 icon="el-icon-upload2" 11 icon="el-icon-upload2"
@@ -15,6 +15,16 @@ @@ -15,6 +15,16 @@
15 @click="diaUp = true" 15 @click="diaUp = true"
16 ></el-button> 16 ></el-button>
17 </el-tooltip> 17 </el-tooltip>
  18 + <el-tooltip effect="dark" content="导出班级名单" placement="bottom">
  19 + <el-button
  20 + type="primary"
  21 + icon="el-icon-download"
  22 + size="mini"
  23 + plain
  24 + circle
  25 + @click="exportClazzExl"
  26 + ></el-button>
  27 + </el-tooltip>
18 </template> 28 </template>
19 </back-box> 29 </back-box>
20 <div class="page-content"> 30 <div class="page-content">
@@ -81,9 +91,14 @@ @@ -81,9 +91,14 @@
81 </div> 91 </div>
82 </div> 92 </div>
83 <el-dialog title="导入学校名单" :visible.sync="diaUp" width="400"> 93 <el-dialog title="导入学校名单" :visible.sync="diaUp" width="400">
84 - <up-load id="downDevice" :url="url" @upSuccess="upSuccess" fileName="学校名单"> 94 + <up-load
  95 + id="downDevice"
  96 + :url="url"
  97 + @upSuccess="upSuccess"
  98 + fileName="学校名单"
  99 + >
85 <p class="down-txt" slot="down"> 100 <p class="down-txt" slot="down">
86 - 通过Excel名单导入学校名单,点击 101 + 通过Excel导入学校全部班级名单,点击
87 <el-link type="danger" @click="downExcel">模板下载</el-link> 。 102 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
88 </p> 103 </p>
89 </up-load> 104 </up-load>
@@ -230,9 +245,9 @@ export default { @@ -230,9 +245,9 @@ export default {
230 }, 245 },
231 data() { 246 data() {
232 return { 247 return {
233 - code: "",//长水跳转标志 248 + code: "", //长水跳转标志
234 loading: false, 249 loading: false,
235 - url: "xxx", 250 + url: "/api_html/school/manager/importClassAndStudent",
236 diaUp: false, 251 diaUp: false,
237 diaSchool: false, 252 diaSchool: false,
238 diaGrade: false, 253 diaGrade: false,
@@ -246,7 +261,8 @@ export default { @@ -246,7 +261,8 @@ export default {
246 tenantName: "", 261 tenantName: "",
247 }, 262 },
248 tableData: [], 263 tableData: [],
249 - formSchool: {//修改学校 264 + formSchool: {
  265 + //修改学校
250 sections: "", 266 sections: "",
251 managePwd: "", 267 managePwd: "",
252 contactPerson: "", 268 contactPerson: "",
@@ -264,7 +280,8 @@ export default { @@ -264,7 +280,8 @@ export default {
264 }, 280 },
265 ], 281 ],
266 }, 282 },
267 - formGrade: {//修改年级 283 + formGrade: {
  284 + //修改年级
268 gradeName: "", 285 gradeName: "",
269 subjectNames: [], 286 subjectNames: [],
270 classList: [], 287 classList: [],
@@ -292,23 +309,26 @@ export default { @@ -292,23 +309,26 @@ export default {
292 this._QuerySubject(); 309 this._QuerySubject();
293 }, 310 },
294 methods: { 311 methods: {
295 - upSuccess(){//导入成功  
296 - this.diaUp = false 312 + upSuccess() {
  313 + //导入成功
  314 + this.diaUp = false;
297 this._QueryDataSchool(); 315 this._QueryDataSchool();
298 this._QueryDataGrade(); 316 this._QueryDataGrade();
299 }, 317 },
300 - setGrade(obj) {//打开年级设置 318 + setGrade(obj) {
  319 + //打开年级设置
301 this.formGrade.subjectNames = obj.subjectNames; 320 this.formGrade.subjectNames = obj.subjectNames;
302 this.formGrade.classList = obj.classList; 321 this.formGrade.classList = obj.classList;
303 this.formGrade.gradeName = obj.gradeName; 322 this.formGrade.gradeName = obj.gradeName;
304 this.showAll = false; 323 this.showAll = false;
305 this.diaGrade = true; 324 this.diaGrade = true;
306 }, 325 },
307 - addSubjectName() {//添加科目 326 + addSubjectName() {
  327 + //添加科目
308 if (!this.subjectName) { 328 if (!this.subjectName) {
309 this.$message.warning("请填写科目名称"); 329 this.$message.warning("请填写科目名称");
310 return; 330 return;
311 - }else if(this.subjectList.includes(this.subjectName)){ 331 + } else if (this.subjectList.includes(this.subjectName)) {
312 this.$message.warning("科目已存在,请重新填写~"); 332 this.$message.warning("科目已存在,请重新填写~");
313 return; 333 return;
314 } 334 }
@@ -316,7 +336,8 @@ export default { @@ -316,7 +336,8 @@ export default {
316 this.formGrade.subjectNames.push(this.subjectName); 336 this.formGrade.subjectNames.push(this.subjectName);
317 this.subjectName = ""; 337 this.subjectName = "";
318 }, 338 },
319 - editSchool() {//保存修改学校信息 339 + editSchool() {
  340 + //保存修改学校信息
320 if (!this.formSchool.sections.length) { 341 if (!this.formSchool.sections.length) {
321 this.$message.error("请选择学段!"); 342 this.$message.error("请选择学段!");
322 return; 343 return;
@@ -349,7 +370,8 @@ export default { @@ -349,7 +370,8 @@ export default {
349 } 370 }
350 }); 371 });
351 }, 372 },
352 - async editGrade() {//保存修改年级信息 373 + async editGrade() {
  374 + //保存修改年级信息
353 if (!this.formGrade.subjectNames.length) { 375 if (!this.formGrade.subjectNames.length) {
354 this.$message.error("请选择科目!"); 376 this.$message.error("请选择科目!");
355 return; 377 return;
@@ -371,7 +393,8 @@ export default { @@ -371,7 +393,8 @@ export default {
371 this.$message.error(info); 393 this.$message.error(info);
372 } 394 }
373 }, 395 },
374 - async _QueryDataSchool() {//学校详情 396 + async _QueryDataSchool() {
  397 + //学校详情
375 this.loading = true; 398 this.loading = true;
376 const { data, status, info } = await this.$request.schoolDetail(); 399 const { data, status, info } = await this.$request.schoolDetail();
377 this.loading = false; 400 this.loading = false;
@@ -406,18 +429,29 @@ export default { @@ -406,18 +429,29 @@ export default {
406 } 429 }
407 }, 430 },
408 async downExcel() { 431 async downExcel() {
409 - let data = await this.$request.downDevice({  
410 - id: this.id,  
411 - }); 432 + let data = await this.$request.classAndStudentTemplate();
412 if (data && !data.code) { 433 if (data && !data.code) {
413 let blob = new Blob([data], { 434 let blob = new Blob([data], {
414 type: "application/vnd.ms-excel;charset=utf-8", 435 type: "application/vnd.ms-excel;charset=utf-8",
415 }); 436 });
416 - downloadFile(`设备信息.xlsx`, blob); 437 + downloadFile(`班级名单模版.xlsx`, blob);
417 } else { 438 } else {
418 this.$message.error(data.info); 439 this.$message.error(data.info);
419 } 440 }
420 }, 441 },
  442 + async exportClazzExl() {
  443 + this.loadingDown = true;
  444 + let data = await this.$request.exportClassAndStudent();
  445 + this.loadingDown = false;
  446 + if (data) {
  447 + let blob = new Blob([data], {
  448 + type: "application/vnd.ms-excel;charset=utf-8",
  449 + });
  450 + downloadFile(`班级名单.xlsx`, blob);
  451 + } else {
  452 + this.$message.error("下载失败");
  453 + }
  454 + },
421 }, 455 },
422 }; 456 };
423 </script> 457 </script>
src/views/standard/setUp/student.vue
@@ -347,19 +347,6 @@ export default { @@ -347,19 +347,6 @@ export default {
347 this.diaUp = false; 347 this.diaUp = false;
348 this._QueryData(3); 348 this._QueryData(3);
349 }, 349 },
350 - async downExcel() {  
351 - this.loadingDown = true;  
352 - let { data, info, status } =  
353 - await this.$request.studentClickerTemplateUrl();  
354 - this.loadingDown = false;  
355 - if (status == 0) {  
356 - getBlob(data.downloadUrl).then((res) => {  
357 - downloadFile("学生答题器绑定模板", res);  
358 - });  
359 - } else {  
360 - this.$message.error(info);  
361 - }  
362 - },  
363 async removeStu(obj, index) { 350 async removeStu(obj, index) {
364 const { data, status, info } = await this.$request.delStudent({ 351 const { data, status, info } = await this.$request.delStudent({
365 studentId: obj.id, 352 studentId: obj.id,
@@ -470,6 +457,19 @@ export default { @@ -470,6 +457,19 @@ export default {
470 this.$message.error(info); 457 this.$message.error(info);
471 } 458 }
472 }, 459 },
  460 + async downExcel() {
  461 + this.loadingDown = true;
  462 + let { data, info, status } =
  463 + await this.$request.studentClickerTemplateUrl();
  464 + this.loadingDown = false;
  465 + if (status == 0) {
  466 + getBlob(data.downloadUrl).then((res) => {
  467 + downloadFile("学生答题器绑定模板", res);
  468 + });
  469 + } else {
  470 + this.$message.error(info);
  471 + }
  472 + },
473 }, 473 },
474 }; 474 };
475 </script> 475 </script>
src/views/standard/setUp/teacher.vue
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <span>教师管理</span> 5 <span>教师管理</span>
6 </template> 6 </template>
7 <template slot="btns" v-if="!code"> 7 <template slot="btns" v-if="!code">
8 - <!-- <el-tooltip effect="dark" content="导入教师名单" placement="bottom"> 8 + <el-tooltip effect="dark" content="导入教师名单" placement="bottom">
9 <el-button 9 <el-button
10 type="primary" 10 type="primary"
11 icon="el-icon-upload2" 11 icon="el-icon-upload2"
@@ -14,7 +14,17 @@ @@ -14,7 +14,17 @@
14 circle 14 circle
15 @click="diaUp = true" 15 @click="diaUp = true"
16 ></el-button> 16 ></el-button>
17 - </el-tooltip> --> 17 + </el-tooltip>
  18 + <el-tooltip effect="dark" content="导出教师名单" placement="bottom">
  19 + <el-button
  20 + type="primary"
  21 + icon="el-icon-download"
  22 + size="mini"
  23 + plain
  24 + circle
  25 + @click="exportTeacherExl"
  26 + ></el-button>
  27 + </el-tooltip>
18 <el-tooltip effect="dark" content="添加教师" placement="bottom"> 28 <el-tooltip effect="dark" content="添加教师" placement="bottom">
19 <el-button 29 <el-button
20 type="primary" 30 type="primary"
@@ -217,7 +227,12 @@ @@ -217,7 +227,12 @@
217 </div> 227 </div>
218 </div> 228 </div>
219 <el-dialog title="导入教师名单" :visible.sync="diaUp" width="600"> 229 <el-dialog title="导入教师名单" :visible.sync="diaUp" width="600">
220 - <up-load id="downTeacher" :url="url" @upSuccess="upSuccess" fileName="教师名单"> 230 + <up-load
  231 + id="downTeacher"
  232 + :url="url"
  233 + @upSuccess="upSuccess"
  234 + fileName="教师名单"
  235 + >
221 <p class="down-txt" slot="down"> 236 <p class="down-txt" slot="down">
222 通过Excel名单导入教师名单,点击 237 通过Excel名单导入教师名单,点击
223 <el-link type="danger" @click="downExcel">模板下载</el-link> 。 238 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
@@ -300,7 +315,8 @@ @@ -300,7 +315,8 @@
300 > 315 >
301 </el-option> 316 </el-option>
302 </el-select> 317 </el-select>
303 - <el-cascader size="small" 318 + <el-cascader
  319 + size="small"
304 v-if="item.roleId == 6" 320 v-if="item.roleId == 6"
305 class="sel-t" 321 class="sel-t"
306 collapse 322 collapse
@@ -310,7 +326,8 @@ @@ -310,7 +326,8 @@
310 :options="gradeClassList" 326 :options="gradeClassList"
311 :props="{ expandTrigger: 'hover' }" 327 :props="{ expandTrigger: 'hover' }"
312 ></el-cascader> 328 ></el-cascader>
313 - <el-cascader size="small" 329 + <el-cascader
  330 + size="small"
314 v-if="item.roleId == 7" 331 v-if="item.roleId == 7"
315 class="sel-t" 332 class="sel-t"
316 collapse 333 collapse
@@ -320,7 +337,8 @@ @@ -320,7 +337,8 @@
320 :options="classList" 337 :options="classList"
321 :props="{ expandTrigger: 'hover' }" 338 :props="{ expandTrigger: 'hover' }"
322 ></el-cascader> 339 ></el-cascader>
323 - <el-cascader size="small" 340 + <el-cascader
  341 + size="small"
324 v-if="item.roleId == 8" 342 v-if="item.roleId == 8"
325 class="sel-t" 343 class="sel-t"
326 collapse 344 collapse
@@ -346,13 +364,13 @@ @@ -346,13 +364,13 @@
346 </template> 364 </template>
347 365
348 <script> 366 <script>
349 -import { downloadFile, formatGradeClass, randomWord } from "@/utils"; 367 +import { downloadFile, formatGradeClass, randomWord, getBlob } from "@/utils";
350 export default { 368 export default {
351 data() { 369 data() {
352 return { 370 return {
353 code: "", 371 code: "",
354 loading: false, 372 loading: false,
355 - url: "", 373 + url: "/api_html/school/manager/importTeacher",
356 diaUp: false, 374 diaUp: false,
357 diaTeacher: false, 375 diaTeacher: false,
358 isAdd: false, 376 isAdd: false,
@@ -423,8 +441,9 @@ export default { @@ -423,8 +441,9 @@ export default {
423 await this._QueryClass(); 441 await this._QueryClass();
424 }, 442 },
425 methods: { 443 methods: {
426 - upSuccess(){//导入成功  
427 - this.diaUp = false 444 + upSuccess() {
  445 + //导入成功
  446 + this.diaUp = false;
428 this._QueryData(10); 447 this._QueryData(10);
429 }, 448 },
430 addRoleList() { 449 addRoleList() {
@@ -494,7 +513,6 @@ export default { @@ -494,7 +513,6 @@ export default {
494 ...obj, 513 ...obj,
495 }); 514 });
496 } else { 515 } else {
497 -  
498 res = await this.$request.updateTeacher({ 516 res = await this.$request.updateTeacher({
499 teacherId: this.formTeacher.id, 517 teacherId: this.formTeacher.id,
500 teacherName: this.formTeacher.teacherName, 518 teacherName: this.formTeacher.teacherName,
@@ -626,7 +644,7 @@ export default { @@ -626,7 +644,7 @@ export default {
626 //角色 644 //角色
627 const { data, status, info } = await this.$request.delTeacherManager({ 645 const { data, status, info } = await this.$request.delTeacherManager({
628 teacherId: obj.teacherId, 646 teacherId: obj.teacherId,
629 - ...query 647 + ...query,
630 }); 648 });
631 if (status === 0) { 649 if (status === 0) {
632 this._QueryData(10); 650 this._QueryData(10);
@@ -755,16 +773,27 @@ export default { @@ -755,16 +773,27 @@ export default {
755 } 773 }
756 }, 774 },
757 async downExcel() { 775 async downExcel() {
758 - let data = await this.$request.downDevice({  
759 - id: this.id,  
760 - });  
761 - if (data && !data.code) { 776 + let { data, status, info } = await this.$request.teacherTemplate();
  777 + debugger;
  778 + if (status == 0) {
  779 + getBlob(data.downloadUrl).then((res) => {
  780 + downloadFile("教师名单模板", res);
  781 + });
  782 + } else {
  783 + this.$message.error(info);
  784 + }
  785 + },
  786 + async exportTeacherExl() {
  787 + this.loadingDown = true;
  788 + let data = await this.$request.exportTeacher();
  789 + this.loadingDown = false;
  790 + if (data) {
762 let blob = new Blob([data], { 791 let blob = new Blob([data], {
763 type: "application/vnd.ms-excel;charset=utf-8", 792 type: "application/vnd.ms-excel;charset=utf-8",
764 }); 793 });
765 downloadFile(`教师名单.xlsx`, blob); 794 downloadFile(`教师名单.xlsx`, blob);
766 } else { 795 } else {
767 - this.$message.error(data.info); 796 + this.$message.error("下载失败");
768 } 797 }
769 }, 798 },
770 }, 799 },
src/views/standard/test/analysis.vue
1 <template> 1 <template>
2 - <div ref="main" class="page-container" :class="dialogVisible ? 'active' : ''"> 2 + <div ref="main" class="page-container">
3 <back-box> 3 <back-box>
4 <template slot="title"> 4 <template slot="title">
5 <span>单卷分析</span> 5 <span>单卷分析</span>
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 >作答明细表</span 53 >作答明细表</span
54 > 54 >
55 </div> 55 </div>
56 - <div class="table-box" v-loading="loading"> 56 + <div id="print-content" class="table-box" v-loading="loading">
57 <el-table 57 <el-table
58 :max-height="tableMaxHeight" 58 :max-height="tableMaxHeight"
59 v-show="type == 1" 59 v-show="type == 1"
@@ -131,15 +131,19 @@ @@ -131,15 +131,19 @@
131 :label="item.title" 131 :label="item.title"
132 :prop="'count' + index" 132 :prop="'count' + index"
133 align="center" 133 align="center"
134 - ><template slot-scope="scope"><p class="persent">{{  
135 - scope.row.questionType == "5"  
136 - ? ""  
137 - : scope.row["option" + index]  
138 - ? `${scope.row["option" + index]}(${  
139 - scope.row["persent" + index]  
140 - })`  
141 - : ""  
142 - }}</p></template> 134 + ><template slot-scope="scope"
  135 + ><p class="persent">
  136 + {{
  137 + scope.row.questionType == "5"
  138 + ? ""
  139 + : scope.row["option" + index]
  140 + ? `${scope.row["option" + index]}(${
  141 + scope.row["persent" + index]
  142 + })`
  143 + : ""
  144 + }}
  145 + </p></template
  146 + >
143 </el-table-column> 147 </el-table-column>
144 </el-table> 148 </el-table>
145 <div class="hui-box" v-show="type == 1"> 149 <div class="hui-box" v-show="type == 1">
@@ -340,9 +344,7 @@ @@ -340,9 +344,7 @@
340 :label="'Q' + item.id" 344 :label="'Q' + item.id"
341 > 345 >
342 <template slot-scope="scope"> 346 <template slot-scope="scope">
343 - <span  
344 - v-if="tableData[index]?.questionType==5"  
345 - >*</span> 347 + <span v-if="tableData[index]?.questionType == 5">*</span>
346 <span 348 <span
347 v-else-if="scope.row['answer' + item.id]" 349 v-else-if="scope.row['answer' + item.id]"
348 :class="scope.row['isRight' + item.id] ? '' : 'error'" 350 :class="scope.row['isRight' + item.id] ? '' : 'error'"
@@ -352,11 +354,14 @@ @@ -352,11 +354,14 @@
352 <span 354 <span
353 v-else 355 v-else
354 :class="scope.row['questionType' + item.id] == 5 ? '' : 'error'" 356 :class="scope.row['questionType' + item.id] == 5 ? '' : 'error'"
355 - >-</span> 357 + >-</span
  358 + >
356 </template> 359 </template>
357 </el-table-column> 360 </el-table-column>
358 </el-table> 361 </el-table>
359 - <div class="down"> 362 + </div>
  363 + <div class="down">
  364 + <div>
360 <el-button 365 <el-button
361 @click="exportData" 366 @click="exportData"
362 type="primary" 367 type="primary"
@@ -365,33 +370,32 @@ @@ -365,33 +370,32 @@
365 icon="fa fa-cloud-download" 370 icon="fa fa-cloud-download"
366 >导出报表</el-button 371 >导出报表</el-button
367 > 372 >
368 - <div>  
369 - <el-button  
370 - v-if="examReport.subjectiveScore != 0"  
371 - @click="diaUp = true"  
372 - type="primary"  
373 - round  
374 - v-loading="exportLoading"  
375 - >导入主观题分数</el-button  
376 - >  
377 - <el-button  
378 - @click="edit"  
379 - type="primary"  
380 - v-if="examReport.subjectiveScore != examReport.examPaperScore"  
381 - round  
382 - >修改答案</el-button  
383 - >  
384 - </div> 373 + <el-button
  374 + @click="print"
  375 + type="primary"
  376 + plain
  377 + round
  378 + icon="el-icon-printer"
  379 + >打印</el-button
  380 + >
  381 + </div>
  382 + <div>
  383 + <el-button
  384 + v-if="examReport.subjectiveScore != 0"
  385 + @click="diaUp = true"
  386 + type="primary"
  387 + round
  388 + v-loading="exportLoading"
  389 + >导入主观题分数</el-button
  390 + >
  391 + <el-button
  392 + @click="edit"
  393 + type="primary"
  394 + v-if="examReport.subjectiveScore != examReport.examPaperScore"
  395 + round
  396 + >查看题目</el-button
  397 + >
385 </div> 398 </div>
386 - </div>  
387 - <div class="edit-dia" v-show="dialogVisible" height="100%">  
388 - <editAnswer  
389 - ref="editAnswer"  
390 - :title="title"  
391 - :score="score"  
392 - @cancel="cancel"  
393 - @saveSuccess="saveSuccess"  
394 - />  
395 </div> 399 </div>
396 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600"> 400 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600">
397 <up-load 401 <up-load
@@ -417,17 +421,14 @@ @@ -417,17 +421,14 @@
417 </template> 421 </template>
418 422
419 <script> 423 <script>
420 -import { downloadFile } from "@/utils";  
421 -import editAnswer from "./editAnswer.vue"; 424 +import { downloadFile, tablePrint } from "@/utils";
422 export default { 425 export default {
423 - components: { editAnswer },  
424 data() { 426 data() {
425 return { 427 return {
426 tableMaxHeight: 600, 428 tableMaxHeight: 600,
427 loading: false, 429 loading: false,
428 exportLoading: false, 430 exportLoading: false,
429 diaUp: false, 431 diaUp: false,
430 - dialogVisible: false,  
431 url: "/api_html/teaching/importSubjectiveScore", 432 url: "/api_html/teaching/importSubjectiveScore",
432 id: "", 433 id: "",
433 title: "", 434 title: "",
@@ -466,10 +467,12 @@ export default { @@ -466,10 +467,12 @@ export default {
466 created() { 467 created() {
467 this.id = this.$route.query.id; 468 this.id = this.$route.query.id;
468 this.title = this.$route.query.title || ""; 469 this.title = this.$route.query.title || "";
469 - this.score = this.$route.query.score || "";  
470 this._QueryData(); 470 this._QueryData();
471 }, 471 },
472 methods: { 472 methods: {
  473 + print() {
  474 + tablePrint("print-content");
  475 + },
473 upSuccess() { 476 upSuccess() {
474 //导入成功 477 //导入成功
475 this.diaUp = false; 478 this.diaUp = false;
@@ -499,15 +502,14 @@ export default { @@ -499,15 +502,14 @@ export default {
499 return tit; 502 return tit;
500 }, 503 },
501 edit() { 504 edit() {
502 - this.$refs.editAnswer.edit(this.id);  
503 - this.dialogVisible = true;  
504 - },  
505 - cancel() {  
506 - this.dialogVisible = false;  
507 - },  
508 - saveSuccess() {  
509 - this.dialogVisible = false;  
510 - this._QueryData(); 505 + this.$router.push({
  506 + path: "/examinationPaperEdit",
  507 + query: {
  508 + paperId: this.id,
  509 + title: this.title,
  510 + type: 2,
  511 + },
  512 + });
511 }, 513 },
512 changePage(page) { 514 changePage(page) {
513 this.page = page; 515 this.page = page;
@@ -568,7 +570,9 @@ export default { @@ -568,7 +570,9 @@ export default {
568 } 570 }
569 detail.map((items, index) => { 571 detail.map((items, index) => {
570 params["que" + items.id] = items.id; 572 params["que" + items.id] = items.id;
571 - params["score" + items.id] = String(items.score).includes('.')?Number(items.score).toFixed(2):items.score; 573 + params["score" + items.id] = String(items.score).includes(".")
  574 + ? Number(items.score).toFixed(2)
  575 + : items.score;
572 params["answer" + items.id] = 576 params["answer" + items.id] =
573 items.answer == 1 ? "✓" : items.answer == 2 ? "✗" : items.answer; 577 items.answer == 1 ? "✓" : items.answer == 2 ? "✗" : items.answer;
574 params["isRight" + items.id] = items.isRight; 578 params["isRight" + items.id] = items.isRight;
@@ -608,13 +612,17 @@ export default { @@ -608,13 +612,17 @@ export default {
608 let defaultArr = detail?.filter((item) => { 612 let defaultArr = detail?.filter((item) => {
609 return item.option != "未答"; 613 return item.option != "未答";
610 }); 614 });
611 - 615 +
612 optionsList.map((items, index) => { 616 optionsList.map((items, index) => {
613 if (index != 4) { 617 if (index != 4) {
614 params["count" + index] = 618 params["count" + index] =
615 - defaultArr[index]?.option != "未答" ? defaultArr[index]?.count : ""; 619 + defaultArr[index]?.option != "未答"
  620 + ? defaultArr[index]?.count
  621 + : "";
616 params["persent" + index] = 622 params["persent" + index] =
617 - defaultArr[index]?.option != "未答" ? defaultArr[index]?.persent : ""; 623 + defaultArr[index]?.option != "未答"
  624 + ? defaultArr[index]?.persent
  625 + : "";
618 params["option" + index] = 626 params["option" + index] =
619 defaultArr[index]?.option != "未答" 627 defaultArr[index]?.option != "未答"
620 ? defaultArr[index]?.option == 1 628 ? defaultArr[index]?.option == 1
@@ -651,17 +659,14 @@ export default { @@ -651,17 +659,14 @@ export default {
651 if (this.exportLoading == true) return; 659 if (this.exportLoading == true) return;
652 this.exportLoading = true; 660 this.exportLoading = true;
653 const data = await this.$request.exportExamReport({ 661 const data = await this.$request.exportExamReport({
654 - examId:this.id 662 + examId: this.id,
655 }); 663 });
656 this.exportLoading = false; 664 this.exportLoading = false;
657 if (data) { 665 if (data) {
658 - let blob = new Blob([data], { 666 + let blob = new Blob([data], {
659 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 667 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
660 }); 668 });
661 - downloadFile(  
662 - "即时测-单卷测练报表.xlsx",  
663 - blob  
664 - ); 669 + downloadFile("即时测-单卷测练报表.xlsx", blob);
665 } else { 670 } else {
666 this.$message.error("下载失败"); 671 this.$message.error("下载失败");
667 } 672 }
@@ -715,7 +720,7 @@ div::-webkit-scrollbar-thumb { @@ -715,7 +720,7 @@ div::-webkit-scrollbar-thumb {
715 z-index: 10; 720 z-index: 10;
716 } 721 }
717 } 722 }
718 -.persent{ 723 +.persent {
719 white-space: nowrap; 724 white-space: nowrap;
720 } 725 }
721 .error { 726 .error {
src/views/standard/test/editAnswer.vue deleted
1 -<template>  
2 - <div>  
3 - <div class="back">  
4 - <div class="back-l" @click="cancel">  
5 - <i class="fa fa-mail-reply-all"></i>  
6 - <p>修改答案</p>  
7 - </div>  
8 - </div>  
9 - <div class="form-box">  
10 - <div class="answer-title">  
11 - <p class="name">{{ title }}</p>  
12 - <p class="totals">卷面总分:{{ score }}分</p>  
13 - </div>  
14 - <div v-if="questionList && questionList.length">  
15 - <template v-if="questionList[0].subQuestions">  
16 - <div v-for="(question, index) in questionList" :key="index">  
17 - <p class="question-title">  
18 - <span>{{ setBigNum(index) }}、</span>  
19 - <span class="title-txt">{{ question.questionTitle }}</span>  
20 - <span>共 {{ question.score }} 分</span>  
21 - </p>  
22 - <ul class="questions-ul">  
23 - <li class="sub-questions">  
24 - <div class="qs-num">题号</div>  
25 - <div class="qs-type">题型</div>  
26 - <div class="qs-score">分数</div>  
27 - <div class="qs-partScore">漏选得分</div>  
28 - <div class="qs-options qs-options2">选项设置</div>  
29 - </li>  
30 - <li  
31 - v-for="(subQuestions, indexs) in question.subQuestions"  
32 - :key="indexs"  
33 - >  
34 - <p  
35 - class="set-ans-btn"  
36 - v-if="  
37 - subQuestions.qusType &&  
38 - subQuestions.subNum &&  
39 - subQuestions.subNum > 4  
40 - "  
41 - >  
42 - <el-button type="primary" @click="setFormAns(indexs, index)"  
43 - >批量设置答案</el-button  
44 - >  
45 - </p>  
46 - <div v-else class="sub-questions">  
47 - <div class="qs-num">{{ subQuestions.questionIndex }}</div>  
48 - <div class="qs-type">  
49 - {{ setSubPro(subQuestions.questionType) }}  
50 - </div>  
51 - <div class="qs-score">  
52 - {{ subQuestions.score }}  
53 - </div>  
54 - <div class="qs-partScore">  
55 - <p v-if="subQuestions.questionType != 3">--</p>  
56 - <el-input-number  
57 - class="number-ipt"  
58 - v-else  
59 - size="medium"  
60 - :min="0"  
61 - :precision="2"  
62 - :max="subQuestions.score"  
63 - :step="0.5"  
64 - v-model="subQuestions.partScore"  
65 - label="漏选得分"  
66 - ></el-input-number>  
67 - </div>  
68 - <div class="qs-options qs-options2">  
69 - <p v-if="subQuestions.questionType == 5">--</p>  
70 - <p v-if="subQuestions.questionType == 4" class="answer-box">  
71 - <span  
72 - class="answer-s"  
73 - :class="subQuestions.correctAnswer == 1 ? 'active' : ''"  
74 - @click="subQuestions.correctAnswer = 1"  
75 - >✓</span  
76 - >  
77 - <span  
78 - class="answer-s"  
79 - :class="subQuestions.correctAnswer == 2 ? 'active' : ''"  
80 - @click="subQuestions.correctAnswer = 2"  
81 - >✗</span  
82 - >  
83 - </p>  
84 - <p v-if="subQuestions.questionType == 3" class="answer-box">  
85 - <template  
86 - v-for="option in subQuestions.answerOptions.split(',')"  
87 - >  
88 - <span  
89 - v-if="option"  
90 - class="answer-s"  
91 - :class="  
92 - subQuestions.correctAnswer.includes(option)  
93 - ? 'active'  
94 - : ''  
95 - "  
96 - :key="option"  
97 - @click="changAnswer(subQuestions, option)"  
98 - >{{ option }}</span  
99 - >  
100 - </template>  
101 - </p>  
102 - <p v-if="subQuestions.questionType == 2" class="answer-box">  
103 - <template  
104 - v-for="option in subQuestions.answerOptions.split(',')"  
105 - >  
106 - <span  
107 - class="answer-s"  
108 - v-if="option"  
109 - :class="  
110 - subQuestions.correctAnswer == option ? 'active' : ''  
111 - "  
112 - :key="option"  
113 - @click="subQuestions.correctAnswer = option"  
114 - >{{ option }}</span  
115 - >  
116 - </template>  
117 - </p>  
118 - </div>  
119 - </div>  
120 - </li>  
121 - </ul>  
122 - </div>  
123 - </template>  
124 - <ul class="questions-ul" v-else>  
125 - <li class="sub-questions">  
126 - <div class="qs-num">题号</div>  
127 - <div class="qs-type">题型</div>  
128 - <div class="qs-score">分数</div>  
129 - <div class="qs-partScore">漏选得分</div>  
130 - <div class="qs-options qs-options2">选项设置</div>  
131 - </li>  
132 - <li v-for="(subQuestions, indexs) in questionList" :key="indexs">  
133 - <p  
134 - class="set-ans-btn"  
135 - v-if="  
136 - subQuestions.qusType &&  
137 - subQuestions.subNum &&  
138 - subQuestions.subNum > 4  
139 - "  
140 - >  
141 - <el-button type="primary" @click="setFormAns(indexs)"  
142 - >批量设置答案</el-button  
143 - >  
144 - </p>  
145 - <div v-else class="sub-questions">  
146 - <div class="qs-num">{{ subQuestions.questionIndex }}</div>  
147 - <div class="qs-type">  
148 - {{ setSubPro(subQuestions.questionType) }}  
149 - </div>  
150 - <div class="qs-score">  
151 - {{ subQuestions.score }}  
152 - </div>  
153 - <div class="qs-partScore">  
154 - <p v-if="subQuestions.questionType != 3">--</p>  
155 - <el-input-number  
156 - class="number-ipt"  
157 - v-else  
158 - size="medium"  
159 - :min="0"  
160 - :precision="2"  
161 - :max="subQuestions.score"  
162 - :step="0.5"  
163 - v-model="subQuestions.partScore"  
164 - label="漏选得分"  
165 - ></el-input-number>  
166 - </div>  
167 - <div class="qs-options qs-options2">  
168 - <p v-if="subQuestions.questionType == 5">--</p>  
169 - <p v-if="subQuestions.questionType == 4" class="answer-box">  
170 - <span  
171 - class="answer-s"  
172 - :class="subQuestions.correctAnswer == 1 ? 'active' : ''"  
173 - @click="subQuestions.correctAnswer = 1"  
174 - >✓</span  
175 - >  
176 - <span  
177 - class="answer-s"  
178 - :class="subQuestions.correctAnswer == 2 ? 'active' : ''"  
179 - @click="subQuestions.correctAnswer = 2"  
180 - >✗</span  
181 - >  
182 - </p>  
183 - <p v-if="subQuestions.questionType == 3" class="answer-box">  
184 - <template  
185 - v-for="option in subQuestions.answerOptions.split(',')"  
186 - >  
187 - <span  
188 - v-if="option"  
189 - class="answer-s"  
190 - :class="  
191 - subQuestions.correctAnswer.includes(option)  
192 - ? 'active'  
193 - : ''  
194 - "  
195 - :key="option"  
196 - @click="changAnswer(subQuestions, option)"  
197 - >{{ option }}</span  
198 - >  
199 - </template>  
200 - </p>  
201 - <p v-if="subQuestions.questionType == 2" class="answer-box">  
202 - <template  
203 - v-for="option in subQuestions.answerOptions.split(',')"  
204 - >  
205 - <span  
206 - class="answer-s"  
207 - v-if="option"  
208 - :class="  
209 - subQuestions.correctAnswer == option ? 'active' : ''  
210 - "  
211 - :key="option"  
212 - @click="subQuestions.correctAnswer = option"  
213 - >{{ option }}</span  
214 - >  
215 - </template>  
216 - </p>  
217 - </div>  
218 - </div>  
219 - </li>  
220 - </ul>  
221 - </div>  
222 - <div class="btn-box">  
223 - <el-button type="danger" plain round @click="cancel">取消</el-button>  
224 - <el-button type="primary" round @click="saveAnswer">保存</el-button>  
225 - </div>  
226 - </div>  
227 - <el-dialog  
228 - title="批量设置答案"  
229 - :close-on-click-modal="false"  
230 - :visible.sync="diaSetAns"  
231 - width="400"  
232 - :modal-append-to-body="false"  
233 - >  
234 - <div class="qs-options">  
235 - <p class="dia-tips">  
236 - 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD”  
237 - </p>  
238 - <p>{{ setSubPro(formAns.qusType) }}:</p>  
239 - <p class="ipt">  
240 - <el-input  
241 - ref="formAnsIpt"  
242 - v-if="formAns.qusType == 2 || formAns.qusType == 3"  
243 - v-model="formAns.answerList"  
244 - @keydown.native="keydownAnswer($event, formAns.qusType)"  
245 - @input="setAllAnswer($event, formAns.qusType)"  
246 - ></el-input>  
247 - <el-input  
248 - v-if="formAns.qusType == 4"  
249 - v-model="formAns.answerList"  
250 - readonly=""  
251 - ></el-input>  
252 - </p>  
253 - <p class="answer-box">  
254 - <template v-if="formAns.qusType == 4">  
255 - <span  
256 - class="answer-s active"  
257 - @click="  
258 - formAns.answerList.length < formAns.subNum  
259 - ? (formAns.answerList += '✓')  
260 - : ''  
261 - "  
262 - >✓</span  
263 - >  
264 - <span  
265 - class="answer-s active"  
266 - @click="  
267 - formAns.answerList.length < formAns.subNum  
268 - ? (formAns.answerList += '✗')  
269 - : ''  
270 - "  
271 - >✗</span  
272 - >  
273 - </template>  
274 - <template v-if="formAns.qusType == 3">  
275 - <span  
276 - class="answer-s active"  
277 - v-for="option in formAns.answerOptions.split(',')"  
278 - :key="option"  
279 - @click="setMultiple(formAns, option)"  
280 - >{{ option }}</span  
281 - >  
282 - <span  
283 - class="answer-s active"  
284 - @click="setMultiple(formAns, ',')"  
285 - >,</span  
286 - >  
287 - </template>  
288 - <template v-if="formAns.qusType == 2">  
289 - <span  
290 - class="answer-s active"  
291 - v-for="option in formAns.answerOptions.split(',')"  
292 - :key="option"  
293 - @click="  
294 - formAns.answerList.length < formAns.subNum  
295 - ? (formAns.answerList += option)  
296 - : ''  
297 - "  
298 - >{{ option }}</span  
299 - >  
300 - </template>  
301 - <span  
302 - class="answer-s delButton"  
303 - @click="formAns.answerList = formAns.answerList.slice(0, -1)"  
304 - >x</span  
305 - >  
306 - <span class="answer-s ac" @click="formAns.answerList = ''">ac</span>  
307 - </p>  
308 - </div>  
309 - <div class="dialog-footer" slot="footer">  
310 - <el-button @click="saveFormAns">确 定</el-button>  
311 - <el-button @click="diaSetAns = false">取 消</el-button>  
312 - </div>  
313 - </el-dialog>  
314 - </div>  
315 -</template>  
316 -  
317 -<script>  
318 -import { deepClone, checkAnswer } from "utils";  
319 -export default {  
320 - props: {  
321 - title: "",  
322 - score: "",  
323 - },  
324 - watch: {  
325 - // id: {  
326 - // handler: function (val) {  
327 - // if (val) {  
328 - // this.edit();  
329 - // }  
330 - // },  
331 - // immediate: true,  
332 - // },  
333 - },  
334 - data() {  
335 - return {  
336 - id: "",  
337 - diaSetAns: false,  
338 - form: {},  
339 - questionList: [],  
340 - formAns: {  
341 - listIndex: 0, //大题位置  
342 - endIndex: 0, //相同题目最后一位题目的questionIndex  
343 - index:0,  
344 - qusType: "", //题目类型  
345 - subNum: 0, //数量  
346 - answerOptions: [], //答案选项  
347 - answerList: "", //答案列表-字符串  
348 - },  
349 - };  
350 - },  
351 - created() {  
352 - // this.edit();  
353 - },  
354 - methods: {  
355 - cancel() {  
356 - this.$emit("cancel");  
357 - },  
358 - setSubPro(type) {  
359 - let tit;  
360 - switch (type) {  
361 - case 2:  
362 - tit = "单选题";  
363 - break;  
364 - case 3:  
365 - tit = "多选题";  
366 - break;  
367 - case 4:  
368 - tit = "判断题";  
369 - break;  
370 - case 5:  
371 - tit = "主观题";  
372 - break;  
373 - }  
374 - return tit;  
375 - },  
376 - setBigNum(num) {//转题号格式  
377 - let txt = "";  
378 - let bigNum = [  
379 - "一",  
380 - "二",  
381 - "三",  
382 - "四",  
383 - "五",  
384 - "六",  
385 - "七",  
386 - "八",  
387 - "九",  
388 - "十",  
389 - "十一",  
390 - "十二",  
391 - "十三",  
392 - "十四",  
393 - "十五",  
394 - "十六",  
395 - "十七",  
396 - "十八",  
397 - "十九",  
398 - "二十",  
399 - ];  
400 - txt = bigNum[num];  
401 -  
402 - return txt;  
403 - },  
404 - keydownAnswer(event, type) {  
405 - let answerA = "ABCDEFG";  
406 - let answer_a = "abcdefg";  
407 - answerA = answerA.substring(0, this.formAns.subNum);  
408 - answer_a = answer_a.substring(0, this.formAns.subNum);  
409 - answerA += answer_a;  
410 - answerA = type == 2 ? answerA : answerA + ",";  
411 - if (  
412 - event.key == "Meta" ||  
413 - event.key == "CapsLock" ||  
414 - event.key == "Shift" ||  
415 - event.key == "Enter" ||  
416 - event.key == "Alt" ||  
417 - event.key == "Backspace" ||  
418 - event.key == "Delete" ||  
419 - event.key == "ArrowUp" ||  
420 - event.key == "ArrowDown" ||  
421 - event.key == "ArrowLeft" ||  
422 - event.key == "v" ||  
423 - event.key == "V" ||  
424 - event.key == "ArrowRight"  
425 - )  
426 - return;  
427 - if (!answerA.includes(event.key)) {  
428 - event.returnValue = "";  
429 - }  
430 - },  
431 - setAllAnswer(event, type) {//批量设置答案输入格式化答案  
432 - let str = this.formAns.answerList;  
433 - let str2 = checkAnswer(  
434 - str,  
435 - type,  
436 - this.formAns.answerOptions.split(",").length,  
437 - this.formAns.subNum  
438 - );  
439 - this.formAns.answerList = str2;  
440 - },  
441 - setAnswer(type, ans) {//答案显示格式  
442 - let txt = "";  
443 - if (type == 2) {  
444 - txt = ans;  
445 - } else if (type == 3) {  
446 - txt = ans + ",";  
447 - } else if (type == 4) {  
448 - txt = ans == 1 ? "✓" : ans == 2 ? "✗" : "";  
449 - }  
450 - return txt;  
451 - },  
452 - insertTxtAndSetcursor(answerList, str) {//调整重新设置答案后的光标位置  
453 - let element = this.$refs.formAnsIpt.$el.children[0]; // 获取到指定标签  
454 - let startPos = element.selectionStart; // 获取光标开始的位置  
455 - if (startPos === undefined) {  
456 - // 如果没有光标位置 不操作  
457 - return answerList;  
458 - } else {  
459 - return {  
460 - text:  
461 - answerList.substring(0, startPos) +  
462 - str +  
463 - answerList.substring(startPos), // 将文本插入  
464 - startPos: startPos + str.length,  
465 - };  
466 - }  
467 - },  
468 - setMultiple(obj, answer) { //多选答案设置  
469 - let resault = this.insertTxtAndSetcursor(obj.answerList || "", answer);  
470 - obj.answerList = resault.text;  
471 - let str = obj.answerList;  
472 - let str2 = checkAnswer(  
473 - str,  
474 - 3,  
475 - obj.answerOptions.split(",").length,  
476 - obj.subNum  
477 - );  
478 - obj.answerList = str2;  
479 - this.$refs.formAnsIpt.$el.children[0].focus();  
480 - this.$refs.formAnsIpt.$el.children[0].selectionStart = resault.startPos;  
481 - },  
482 - changAnswer(sub, option) {//设置多选答案  
483 - let str = new RegExp(option, "g");  
484 - if (sub.correctAnswer?.includes(option)) {  
485 - sub.correctAnswer = sub.correctAnswer.replace(str, "");  
486 - } else {  
487 - let arrs = (sub.correctAnswer && sub.correctAnswer.split("")) || [];  
488 - arrs.push(option);  
489 - sub.correctAnswer = arrs.sort().join("");  
490 - }  
491 - },  
492 - setFormAns(indexs, index) {//初始化要修改的答案  
493 - if (this.questionList[0].subQuestions) {  
494 - this.formAns = { ...this.questionList[index].subQuestions[indexs] };  
495 - this.formAns.listIndex = index;  
496 - let startIndex = (this.formAns.index+1) - this.formAns.subNum;//批量设置答案开始位置  
497 - let answerList = "";  
498 - this.questionList[index].subQuestions.map((item, subIdx) => {  
499 - if (subIdx >= startIndex) {  
500 - answerList += this.setAnswer(item.questionType, item.correctAnswer);  
501 - if (subIdx != indexs) {  
502 - if (!!item.qusType) {  
503 - answerList = "";  
504 - }  
505 - } else {  
506 - if (item.qusType == 3) {  
507 - answerList = answerList.slice(0, -1);  
508 - }  
509 - this.formAns.answerList = answerList;  
510 - }  
511 - }  
512 - });  
513 - } else {  
514 - this.formAns = { ...this.questionList[indexs] };  
515 - this.formAns.listIndex = indexs;  
516 - let startIndex = this.formAns.endIndex - this.formAns.subNum;  
517 - let answerList = "";  
518 - this.questionList[index].map((item, subIdx) => {  
519 - if (subIdx >= startIndex) {  
520 - answerList += this.setAnswer(item.questionType, item.correctAnswer);  
521 - if (subIdx != indexs) {  
522 - if (!!item.qusType) {  
523 - answerList = "";  
524 - }  
525 - } else {  
526 - if (item.qusType == 3) {  
527 - answerList = answerList.slice(0, -1);  
528 - }  
529 - this.formAns.answerList = answerList;  
530 - }  
531 - }  
532 - });  
533 - }  
534 - this.diaSetAns = true;  
535 - },  
536 - saveFormAns() {  
537 - //批量修改答案  
538 - let EndIndex;  
539 - let subNum = this.formAns.subNum - 1;  
540 - if (this.questionList[this.formAns.listIndex].subQuestions) {  
541 - this.questionList[this.formAns.listIndex].subQuestions.some(  
542 - (item, index) => {  
543 - if (this.formAns.endIndex == item.questionIndex) {  
544 - EndIndex = index;  
545 - return;  
546 - }  
547 - }  
548 - );  
549 - } else {  
550 - this.questionList.some((item, index) => {  
551 - if (this.formAns.endIndex == item.questionIndex) {  
552 - EndIndex = index;  
553 - return;  
554 - }  
555 - });  
556 - }  
557 -  
558 - for (let i = 0; i <= subNum; i++) {  
559 - let correctAnswer = "";  
560 - if (this.formAns.qusType == 2) {  
561 - correctAnswer = this.formAns.answerList[subNum - i] || "";  
562 - } else if (this.formAns.qusType == 3) {  
563 - correctAnswer = this.formAns.answerList.split(",")[subNum - i] || "";  
564 - } else if (this.formAns.qusType == 4) {  
565 - correctAnswer =  
566 - this.formAns.answerList[subNum - i] == "✓"  
567 - ? 1  
568 - : this.formAns.answerList[subNum - i] == "✗"  
569 - ? 2  
570 - : "";  
571 - }  
572 - if (this.questionList[0].subQuestions) {  
573 - this.questionList[this.formAns.listIndex].subQuestions[  
574 - EndIndex - i  
575 - ].correctAnswer = correctAnswer;  
576 - } else {  
577 - this.questionList[EndIndex - i].correctAnswer = correctAnswer;  
578 - }  
579 - }  
580 - this.diaSetAns = false;  
581 - },  
582 - async edit(id) {  
583 - //修改答案  
584 - this.id = id;  
585 - const { data, status, info } = await this.$request.examQuestionList({  
586 - examId: id,  
587 - });  
588 - if (status == 0) {  
589 - this.questionList = deepClone(data?.list || []);  
590 - } else {  
591 - this.$message.error(info);  
592 - }  
593 - if (!!this.questionList[0].subQuestions) {  
594 - this.questionList?.map((item) => {  
595 - let types = [{}];  
596 - let addndex = 0;  
597 - item.subQuestions.map((sub, index) => {  
598 - if (!!sub.questionType) {  
599 - if (sub.questionType == types[addndex].qusType && sub.questionType != 5) {  
600 - //同类型批量答案+1  
601 - types[addndex].subNum += 1;  
602 - if (  
603 - types[addndex].answerOptions.length < sub.answerOptions.length  
604 - ) {  
605 - types[addndex].answerOptions = sub.answerOptions;  
606 - }  
607 - types[addndex].answerList += this.setAnswer(  
608 - sub.questionType,  
609 - sub.correctAnswer  
610 - );  
611 - if (index == item.subQuestions.length - 1) {  
612 - //循环最后类型数量大于等于5,保存批量答案  
613 - if (types[addndex].subNum && types[addndex].subNum >= 5) {  
614 - types[addndex].endIndex = sub.questionIndex;  
615 - types[addndex].index = index;  
616 - }  
617 - }  
618 - } else {  
619 - if (types[addndex].subNum && types[addndex].subNum >= 5) {  
620 - //不同类型时如果原有类型数量大于等于5,保存批量答案  
621 - types[addndex].endIndex =  
622 - item.subQuestions[index - 1].questionIndex;  
623 - types[addndex].index = index - 1;  
624 - addndex += 1;  
625 - types[addndex] = {};  
626 - }  
627 - //不同类型初始化批量答案  
628 - types[addndex].qusType = sub.questionType;  
629 - types[addndex].subNum = 1;  
630 - types[addndex].answerOptions = sub.answerOptions;  
631 - types[addndex].answerList = this.setAnswer(  
632 - sub.questionType,  
633 - sub.correctAnswer  
634 - );  
635 - }  
636 - }  
637 - });  
638 - for (let i = 0; i < types.length; i++) {  
639 - if (types[i].qusType == 3) {  
640 - types[i].answerList = types[i].answerList.slice(0, -1);  
641 - }  
642 - if (types[i].subNum >= 5) {  
643 - item.subQuestions.splice(  
644 - types[i].index + i + 1,  
645 - 0,  
646 - deepClone(types[i])  
647 - );  
648 - }  
649 - }  
650 - });  
651 - } else {  
652 - let types = [{}];  
653 - let addndex = 0;  
654 - this.questionList?.map((sub, index) => {  
655 - if (!!sub.questionType) {  
656 - if (sub.questionType == types[addndex].qusType && sub.questionType != 5) {  
657 - //同类型批量答案+1  
658 - types[addndex].subNum += 1;  
659 - if (  
660 - types[addndex].answerOptions.length < sub.answerOptions.length  
661 - ) {  
662 - types[addndex].answerOptions = sub.answerOptions;  
663 - }  
664 - types[addndex].answerList += this.setAnswer(  
665 - sub.questionType,  
666 - sub.correctAnswer  
667 - );  
668 - if (index == this.questionList.length - 1) {  
669 - //循环最后类型数量大于等于5,保存批量答案  
670 - if (types[addndex].subNum && types[addndex].subNum >= 5) {  
671 - types[addndex].endIndex = sub.questionIndex;  
672 - types[addndex].index = index;  
673 - }  
674 - }  
675 - } else {  
676 - if (types[addndex].subNum && types[addndex].subNum >= 5) {  
677 - //不同类型时如果原有类型数量大于等于5,保存批量答案  
678 - types[addndex].endIndex =  
679 - this.questionList[index - 1].questionIndex;  
680 - types[addndex].index = index - 1;  
681 - addndex += 1;  
682 - types[addndex] = {};  
683 - }  
684 - //不同类型初始化批量答案  
685 - types[addndex].qusType = sub.questionType;  
686 - types[addndex].subNum = 1;  
687 - types[addndex].answerOptions = sub.answerOptions;  
688 - types[addndex].answerList = this.setAnswer(  
689 - sub.questionType,  
690 - sub.correctAnswer  
691 - );  
692 - }  
693 - }  
694 - });  
695 - for (let i = 0; i < types.length; i++) {  
696 - if (types[i].qusType == 3) {  
697 - types[i].answerList = types[i].answerList.slice(0, -1);  
698 - }  
699 - if (types[i].subNum >= 5) {  
700 - item.subQuestions.splice(  
701 - types[i].index + i + 1,  
702 - 0,  
703 - deepClone(types[i])  
704 - );  
705 - }  
706 - }  
707 - }  
708 -  
709 - this.dialogVisible = true;  
710 - },  
711 - async saveAnswer() {  
712 - //保存答案  
713 - for (let i = 0; i < this.questionList.length; i++) {  
714 - if (this.questionList[0].subQuestions) {  
715 - for (let j = 0; j < this.questionList[i].subQuestions.length; j++) {  
716 - if (this.questionList[i].subQuestions[j].qusType) {  
717 - this.questionList[i].subQuestions.splice(j, 1);  
718 - }  
719 - }  
720 - } else {  
721 - if (this.questionList[i].qusType) {  
722 - this.questionList.splice(i, 1);  
723 - i--;  
724 - }  
725 - }  
726 - }  
727 - const { data, status, message } = await this.$request.setExamAnswer({  
728 - examId: this.id,  
729 - questionList: [...this.questionList],  
730 - });  
731 - if (status == 0) {  
732 - this.$emit("saveSuccess");  
733 - } else {  
734 - this.$message.error(message);  
735 - }  
736 - },  
737 - },  
738 -};  
739 -</script>  
740 -  
741 -<style lang="scss" scoped>  
742 -.back {  
743 - width: 100%;  
744 - height: 56px;  
745 - border-bottom: 1px solid #e2e2e2;  
746 - display: flex;  
747 - align-items: center;  
748 - padding: 0 20px;  
749 - box-sizing: border-box;  
750 - .back-l {  
751 - display: flex;  
752 - align-items: center;  
753 - cursor: pointer;  
754 - flex-shrink: 0;  
755 - font-size: 18px;  
756 - font-weight: 500;  
757 - }  
758 - .fa-mail-reply-all {  
759 - font-size: 28px;  
760 - color: #b3b3b3;  
761 - margin-right: 12px;  
762 - }  
763 -}  
764 -.form-box {  
765 - padding: 20px;  
766 -}  
767 -.answer-title {  
768 - text-align: center;  
769 - font-size: 20px;  
770 - color: #333;  
771 - font-weight: 700;  
772 - padding-bottom: 20px;  
773 - .totals {  
774 - font-size: 16px;  
775 - color: #888;  
776 - font-weight: normal;  
777 - }  
778 -}  
779 -.question-title {  
780 - line-height: 40px;  
781 - .ipt {  
782 - width: 300px;  
783 - margin: 0 16px 0 10px;  
784 - :deep(.el-input__inner) {  
785 - border-radius: 20px;  
786 - border-color: #667ffd;  
787 - background: rgba($color: #667ffd, $alpha: 0.05);  
788 - }  
789 - }  
790 - .delete {  
791 - margin-right: 8px;  
792 - }  
793 - .title-txt {  
794 - margin-right: 20px;  
795 - font-size: 16px;  
796 - font-weight: 700;  
797 - }  
798 -}  
799 -.questions-ul {  
800 - border-left: 1px solid #e2e2e2;  
801 - border-top: 1px solid #e2e2e2;  
802 - margin: 12px 0;  
803 -}  
804 -.sub-questions {  
805 - width: 100%;  
806 - display: flex;  
807 - border-bottom: 1px solid #e2e2e2;  
808 - & > div {  
809 - min-height: 40px;  
810 - padding: 5px;  
811 - flex-shrink: 0;  
812 - border-right: 1px solid #e2e2e2;  
813 - display: flex;  
814 - justify-content: center;  
815 - align-items: center;  
816 - }  
817 - .qs-num {  
818 - width: 80px;  
819 - }  
820 - .qs-type {  
821 - width: 160px;  
822 - }  
823 - .qs-score,  
824 - .qs-partScore {  
825 - width: 160px;  
826 - }  
827 - .qs-options {  
828 - flex: 1;  
829 - }  
830 - .qs-set {  
831 - width: 80px;  
832 - }  
833 - .qs-options2 {  
834 - text-align: left;  
835 - justify-content: flex-start;  
836 - padding-left: 20px;  
837 - .answer-s {  
838 - cursor: pointer;  
839 - }  
840 - }  
841 - :deep(.el-select) {  
842 - .el-input__inner {  
843 - border-radius: 20px;  
844 - border-color: #667ffd;  
845 - width: 150px;  
846 - height: 32px;  
847 - line-height: 32px;  
848 - background: rgba($color: #667ffd, $alpha: 0.05);  
849 - }  
850 - .el-input__icon {  
851 - line-height: 32px;  
852 - }  
853 - }  
854 -}  
855 -.set-ans-btn {  
856 - width: 100%;  
857 - padding: 10px 0 10px 630px;  
858 - box-sizing: border-box;  
859 - border-bottom: 1px solid #e2e2e2;  
860 -}  
861 -.fa-exchange {  
862 - color: #667ffd;  
863 - cursor: pointer;  
864 - font-size: 16px;  
865 - margin-left: 10px;  
866 -}  
867 -.dia-btn {  
868 - border-radius: 20px;  
869 - margin: 0 20px;  
870 - padding: 10px 20px;  
871 -}  
872 -.dia-tips {  
873 - padding-bottom: 10px;  
874 -}  
875 -.answer-s {  
876 - width: 32px;  
877 - height: 28px;  
878 - cursor: pointer;  
879 - user-select: none;  
880 -}  
881 -.set-questions {  
882 - display: flex;  
883 - margin-bottom: 12px;  
884 - width: 100%;  
885 - .qs-num {  
886 - flex-shrink: 0;  
887 - margin-right: 10px;  
888 - }  
889 -}  
890 -.qs-options {  
891 - flex: 1;  
892 - .ipt {  
893 - margin-bottom: 5px;  
894 - }  
895 - .delButton {  
896 - border-color: #ff6868;  
897 - background: #ff6868 url("../../../assets/images/arrow.png") no-repeat center;  
898 - background-size: 19px;  
899 - cursor: pointer;  
900 - color: transparent;  
901 - }  
902 - .ac {  
903 - border-color: #ff6868;  
904 - background: #ff6868;  
905 - color: #fff;  
906 - }  
907 -}  
908 -</style>  
909 \ No newline at end of file 0 \ No newline at end of file
src/views/standard/test/index.vue
@@ -329,96 +329,105 @@ @@ -329,96 +329,105 @@
329 description="没有更多数据" 329 description="没有更多数据"
330 ></el-empty> 330 ></el-empty>
331 <template v-if="tableData.length && loading == false"> 331 <template v-if="tableData.length && loading == false">
332 - <el-table  
333 - :max-height="tableMaxHeight"  
334 - v-if="role == 'ROLE_JIAOSHI'"  
335 - :data="tableData"  
336 - border  
337 - style="width: 100%"  
338 - >  
339 - <el-table-column  
340 - prop="studentCode"  
341 - label="学号"  
342 - align="center"  
343 - fixed  
344 - ></el-table-column>  
345 - <el-table-column  
346 - prop="studentName"  
347 - label="姓名"  
348 - fixed  
349 - align="center"  
350 - ></el-table-column>  
351 - <el-table-column  
352 - align="center"  
353 - v-for="(item, index) in answerList"  
354 - :key="index"  
355 - :label="item.title" 332 + <div id="print-content">
  333 + <el-table
  334 + :max-height="tableMaxHeight"
  335 + v-if="role == 'ROLE_JIAOSHI'"
  336 + :data="tableData"
  337 + border
  338 + style="width: 100%"
356 > 339 >
357 <el-table-column 340 <el-table-column
358 - :prop="'score' + index"  
359 - :label="index == 0 ? '总分' : '成绩'" 341 + prop="studentCode"
  342 + label="学号"
360 align="center" 343 align="center"
361 - :class-name="index % 2 == 0 ? 'bg' : ''" 344 + fixed
362 ></el-table-column> 345 ></el-table-column>
363 <el-table-column 346 <el-table-column
364 - :prop="'classRank' + index"  
365 - label="班名" 347 + prop="studentName"
  348 + label="姓名"
  349 + fixed
366 align="center" 350 align="center"
367 - :class-name="index % 2 == 0 ? 'bg' : ''"  
368 ></el-table-column> 351 ></el-table-column>
369 - </el-table-column>  
370 - </el-table>  
371 - <el-table  
372 - v-else  
373 - :data="tableData"  
374 - :max-height="tableMaxHeight"  
375 - border  
376 - style="width: 100%"  
377 - >  
378 - <el-table-column  
379 - prop="studentCode"  
380 - label="学号"  
381 - align="center"  
382 - fixed  
383 - ></el-table-column>  
384 - <el-table-column  
385 - prop="studentName"  
386 - label="姓名"  
387 - fixed  
388 - align="center"  
389 - ></el-table-column>  
390 - <el-table-column  
391 - align="center"  
392 - v-for="(item, index) in answerList"  
393 - :key="index"  
394 - :label="item"  
395 - >  
396 <el-table-column 352 <el-table-column
397 - :prop="'examCount' + item"  
398 - label="测练数"  
399 align="center" 353 align="center"
400 - :class-name="index % 2 == 0 ? 'bg' : ''"  
401 - ></el-table-column> 354 + v-for="(item, index) in answerList"
  355 + :key="index"
  356 + :label="item.title"
  357 + >
  358 + <el-table-column
  359 + :prop="'score' + index"
  360 + :label="index == 0 ? '总分' : '成绩'"
  361 + align="center"
  362 + :class-name="index % 2 == 0 ? 'bg' : ''"
  363 + ></el-table-column>
  364 + <el-table-column
  365 + :prop="'classRank' + index"
  366 + label="班名"
  367 + align="center"
  368 + :class-name="index % 2 == 0 ? 'bg' : ''"
  369 + ></el-table-column>
  370 + </el-table-column>
  371 + </el-table>
  372 + <el-table
  373 + v-else
  374 + :data="tableData"
  375 + :max-height="tableMaxHeight"
  376 + border
  377 + style="width: 100%"
  378 + >
402 <el-table-column 379 <el-table-column
403 - :prop="'participationCount' + item"  
404 - label="参与数" 380 + prop="studentCode"
  381 + label="学号"
405 align="center" 382 align="center"
406 - :class-name="index % 2 == 0 ? 'bg' : ''" 383 + fixed
407 ></el-table-column> 384 ></el-table-column>
  385 +
408 <el-table-column 386 <el-table-column
409 - :prop="'score' + item"  
410 - label="总分" 387 + prop="studentName"
  388 + label="姓名"
  389 + fixed
411 align="center" 390 align="center"
412 - :class-name="index % 2 == 0 ? 'bg' : ''"  
413 - ></el-table-column> 391 + >
  392 + <template slot-scope="scoped"
  393 + ><span class="click-b" @click="toPortrait(scoped.row)">
  394 + {{ scoped.row.studentName }}
  395 + </span></template
  396 + >
  397 + </el-table-column>
414 <el-table-column 398 <el-table-column
415 - :prop="'classRank' + item"  
416 - label="班名"  
417 align="center" 399 align="center"
418 - :class-name="index % 2 == 0 ? 'bg' : ''"  
419 - ></el-table-column>  
420 - </el-table-column>  
421 - </el-table> 400 + v-for="(item, index) in answerList"
  401 + :key="index"
  402 + :label="item"
  403 + >
  404 + <el-table-column
  405 + :prop="'examCount' + item"
  406 + label="测练数"
  407 + align="center"
  408 + :class-name="index % 2 == 0 ? 'bg' : ''"
  409 + ></el-table-column>
  410 + <el-table-column
  411 + :prop="'participationCount' + item"
  412 + label="参与数"
  413 + align="center"
  414 + :class-name="index % 2 == 0 ? 'bg' : ''"
  415 + ></el-table-column>
  416 + <el-table-column
  417 + :prop="'score' + item"
  418 + label="总分"
  419 + align="center"
  420 + :class-name="index % 2 == 0 ? 'bg' : ''"
  421 + ></el-table-column>
  422 + <el-table-column
  423 + :prop="'classRank' + item"
  424 + label="班名"
  425 + align="center"
  426 + :class-name="index % 2 == 0 ? 'bg' : ''"
  427 + ></el-table-column>
  428 + </el-table-column>
  429 + </el-table>
  430 + </div>
422 </template> 431 </template>
423 </div> 432 </div>
424 <p class="down" v-if="tabIndex == 2 && tableData.length"> 433 <p class="down" v-if="tabIndex == 2 && tableData.length">
@@ -430,6 +439,14 @@ @@ -430,6 +439,14 @@
430 @click="downExl" 439 @click="downExl"
431 >导出报表</el-button 440 >导出报表</el-button
432 > 441 >
  442 + <el-button
  443 + @click="print"
  444 + type="primary"
  445 + plain
  446 + round
  447 + icon="el-icon-printer"
  448 + >打印</el-button
  449 + >
433 </p> 450 </p>
434 </div> 451 </div>
435 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600"> 452 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600">
@@ -452,24 +469,13 @@ @@ -452,24 +469,13 @@
452 <el-button @click="diaUp = false">取 消</el-button> 469 <el-button @click="diaUp = false">取 消</el-button>
453 </div> 470 </div>
454 </el-dialog> 471 </el-dialog>
455 - <div class="edit-dia" v-show="dialogVisible" height="100%">  
456 - <editAnswer  
457 - ref="editAnswer"  
458 - :title="form.title"  
459 - :score="form.examPaperScore"  
460 - @cancel="cancel"  
461 - @saveSuccess="saveSuccess"  
462 - />  
463 - </div>  
464 </div> 472 </div>
465 </template> 473 </template>
466 474
467 <script> 475 <script>
468 -import { formatDate, downloadFile } from "utils";  
469 -import editAnswer from "./editAnswer.vue"; 476 +import { formatDate, downloadFile, tablePrint } from "utils";
470 import BusEvent from "@/utils/busEvent"; 477 import BusEvent from "@/utils/busEvent";
471 export default { 478 export default {
472 - components: { editAnswer },  
473 data() { 479 data() {
474 return { 480 return {
475 exportLoading: false, 481 exportLoading: false,
@@ -480,7 +486,6 @@ export default { @@ -480,7 +486,6 @@ export default {
480 loadingDown: false, 486 loadingDown: false,
481 url: "/api_html/teaching/importSubjectiveScore", 487 url: "/api_html/teaching/importSubjectiveScore",
482 examId: "", 488 examId: "",
483 - dialogVisible: false,  
484 form: { 489 form: {
485 id: "", 490 id: "",
486 title: "", 491 title: "",
@@ -506,7 +511,9 @@ export default { @@ -506,7 +511,9 @@ export default {
506 }; 511 };
507 }, 512 },
508 async created() { 513 async created() {
509 - this.role = this.$store.getters.info.showRole || this.$store.getters.info.permissions[0].role; 514 + this.role =
  515 + this.$store.getters.info.showRole ||
  516 + this.$store.getters.info.permissions[0].role;
510 await this._QueryClassList(); 517 await this._QueryClassList();
511 await this._QuerySubjectList(); 518 await this._QuerySubjectList();
512 await this.setDate(1); 519 await this.setDate(1);
@@ -530,7 +537,11 @@ export default { @@ -530,7 +537,11 @@ export default {
530 }); 537 });
531 }, 538 },
532 methods: { 539 methods: {
533 - changeSub(val) {//科目改变触发事件 540 + print() {
  541 + tablePrint("print-content");
  542 + },
  543 + changeSub(val) {
  544 + //科目改变触发事件
534 let sub; 545 let sub;
535 if (val && val.length) { 546 if (val && val.length) {
536 let leng = val.length - 1; 547 let leng = val.length - 1;
@@ -552,17 +563,36 @@ export default { @@ -552,17 +563,36 @@ export default {
552 }, 563 },
553 }); 564 });
554 }, 565 },
555 - uploadSJ(obj) {//导入开关 566 + toPortrait(obj) {
  567 + let subjectNames = [];
  568 + subjectNames = [...this.query["subjectNames"]];
  569 + if (
  570 + this.query["subjectNames"] &&
  571 + this.query["subjectNames"]?.length == 1 &&
  572 + this.query["subjectNames"][0] == "全部"
  573 + ) {
  574 + subjectNames = this.subjectList.map((item) => {
  575 + return item.value;
  576 + });
  577 + subjectNames?.shift();
  578 + }
  579 + //去学生画像
  580 + this.$router.push({
  581 + path: "/portraitDetail",
  582 + query: {
  583 + id: obj.studentId,
  584 + classId: obj.classId,
  585 + subjectNames: subjectNames.join(","),
  586 + studentName: obj.studentName,
  587 + studentCode: obj.studentCode,
  588 + },
  589 + });
  590 + },
  591 + uploadSJ(obj) {
  592 + //导入开关
556 this.examId = obj.id; 593 this.examId = obj.id;
557 this.diaUp = true; 594 this.diaUp = true;
558 }, 595 },
559 - cancel() {  
560 - this.dialogVisible = false;  
561 - },  
562 - saveSuccess() {//修改答案回调  
563 - this.dialogVisible = false;  
564 - this._QueryData();  
565 - },  
566 setDate(index) { 596 setDate(index) {
567 const that = this; 597 const that = this;
568 this.date = index == this.date ? "" : index; 598 this.date = index == this.date ? "" : index;
@@ -638,9 +668,14 @@ export default { @@ -638,9 +668,14 @@ export default {
638 this._QueryData(); 668 this._QueryData();
639 }, 669 },
640 edit(item) { 670 edit(item) {
641 - this.form = { ...item };  
642 - this.$refs.editAnswer.edit(this.form.id);  
643 - this.dialogVisible = true; 671 + this.$router.push({
  672 + path: "/examinationPaperEdit",
  673 + query: {
  674 + paperId: item.id,
  675 + title: item.title,
  676 + type: 2,
  677 + },
  678 + });
644 }, 679 },
645 changeTab() { 680 changeTab() {
646 this.tableMaxHeight = this.$refs.main.offsetHeight; 681 this.tableMaxHeight = this.$refs.main.offsetHeight;
@@ -848,7 +883,8 @@ export default { @@ -848,7 +883,8 @@ export default {
848 this.$message.error(info); 883 this.$message.error(info);
849 } 884 }
850 }, 885 },
851 - async downExl() {//报表到处 886 + async downExl() {
  887 + //报表到处
852 if (this.exportLoading == true) return; 888 if (this.exportLoading == true) return;
853 let query = {}; 889 let query = {};
854 for (let key in this.query) { 890 for (let key in this.query) {
@@ -892,7 +928,8 @@ export default { @@ -892,7 +928,8 @@ export default {
892 this.$message.error("下载失败"); 928 this.$message.error("下载失败");
893 } 929 }
894 }, 930 },
895 - async downExcel() {//模板下载 931 + async downExcel() {
  932 + //模板下载
896 this.loadingDown = true; 933 this.loadingDown = true;
897 let data = await this.$request.subjectiveScoreTemplate({ 934 let data = await this.$request.subjectiveScoreTemplate({
898 examId: this.examId, 935 examId: this.examId,
@@ -944,16 +981,7 @@ div::-webkit-scrollbar-thumb { @@ -944,16 +981,7 @@ div::-webkit-scrollbar-thumb {
944 .down { 981 .down {
945 padding-top: 16px; 982 padding-top: 16px;
946 } 983 }
947 -.edit-dia {  
948 - position: absolute;  
949 - left: 0;  
950 - top: 0;  
951 - right: 0;  
952 - bottom: 0;  
953 - width: 100%;  
954 - height: calc(100vh - 70px);  
955 - background: #fff;  
956 - overflow-y: auto;  
957 - z-index: 10; 984 +.click-b {
  985 + cursor: pointer;
958 } 986 }
959 </style> 987 </style>
960 \ No newline at end of file 988 \ No newline at end of file
vue.config.js
@@ -22,7 +22,6 @@ module.exports = { @@ -22,7 +22,6 @@ module.exports = {
22 }, 22 },
23 proxy: { 23 proxy: {
24 "/": { 24 "/": {
25 - // target:"http://47.104.214.8",  
26 target:"http://121.40.127.171", 25 target:"http://121.40.127.171",
27 changeOrigin: true, 26 changeOrigin: true,
28 ws:true, 27 ws:true,