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 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 491 delStudent(data) {
448 492 return service({
... ... @@ -938,9 +982,9 @@ export default {
938 982 });
939 983 },
940 984 // 分页查询课时报表列表
941   - pPersonal(data) {
  985 + pPeriodReportList(data) {
942 986 return service({
943   - url: setUpUrls.pPersonal,
  987 + url: setUpUrls.pPeriodReportList,
944 988 method: "POST",
945 989 data
946 990 });
... ... @@ -1177,6 +1221,14 @@ export default {
1177 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 1233 pStationReport(data) {
1182 1234 return service({
... ... @@ -1234,7 +1286,7 @@ export default {
1234 1286 responseType: 'arraybuffer',
1235 1287 });
1236 1288 },
1237   - //班级名册导出
  1289 + //上传图片
1238 1290 puploadImg(data) {
1239 1291 return service({
1240 1292 url: setUpUrls.uploadImg,
... ... @@ -1242,4 +1294,28 @@ export default {
1242 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 24 cTExportPhaseInteractiveReport: "/api_html/class/manager/exportPhaseInteractiveReport",
25 25 //班主任- 导出阶段测练报表
26 26 cTExportPhaseExamReport: "/api_html/class/manager/exportPhaseExamReport",
27   -
  27 +
28 28 //任课老师-查询管理班级
29 29 tClassList: "/api_html/teaching/classList",
30 30 //任课老师-查询管理班级授课科目
... ... @@ -110,6 +110,19 @@ export default {
110 110 addStudent: "/api_html/school/manager/addStudent",
111 111 // 导入学生答题器绑定模板下载地址
112 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 127 delStudent: "/api_html/school/manager/delStudent",
115 128 // 查询学校教师列表
... ... @@ -201,121 +214,129 @@ export default {
201 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 8  
9 9 // 不是必须加载的组件使用懒加载
10 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 19 const Ask = () => import("@/views/standard/ask/index")
16 20 const AskAnalysis = () => import("@/views/standard/ask/analysis")
17 21 const Test = () => import("@/views/standard/test/index")
... ... @@ -29,17 +33,11 @@ const SetUpSchool = () => import("@/views/standard/setUp/school")
29 33 const SetUpStudent = () => import("@/views/standard/setUp/student")
30 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 36 const PersonalAsk = () => import("@/views/personal/ask/index")
37 37 const PersonalAskAnalysis = () => import("@/views/personal/ask/analysis")
38 38 const PersonalTest = () => import("@/views/personal/test/index")
39 39 const PersonalTestAnalysis = () => import("@/views/personal/test/analysis")
40 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 41 const PersonalSetUpStudent = () => import("@/views/personal/setUp/student")
44 42 const PersonalDown = () => import("@/views/personal/down/index")
45 43 const PersonalUserInfo = () => import("@/views/personal/userInfo/index")
... ... @@ -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 401 const addroutersPersonal = [
... ... @@ -401,14 +426,14 @@ const addroutersPersonal = [
401 426 path: "/examinationPaper",
402 427 iconCls: "fa fa-file-text", // 图标样式class
403 428 name: "examinationPaper",
404   - component: PersonalExaminationPaper,
  429 + component: ExaminationPaper,
405 430 children: []
406 431 },
407 432 {
408 433 path: "/examinationPaperAdd",
409 434 iconCls: "", // 图标样式class
410 435 name: "examinationPaperAdd",
411   - component: PersonalExaminationPaperAdd,
  436 + component: ExaminationPaperAdd,
412 437 parent: "examinationPaper",
413 438 children: []
414 439 },
... ... @@ -416,7 +441,7 @@ const addroutersPersonal = [
416 441 path: "/examinationPaperEdit",
417 442 iconCls: "", // 图标样式class
418 443 name: "修改答题卡",
419   - component: PersonalExaminationPaperEdit,
  444 + component: ExaminationPaperEdit,
420 445 parent: "examinationPaper",
421 446 children: []
422 447 },
... ... @@ -424,7 +449,7 @@ const addroutersPersonal = [
424 449 path: "/examinationPaperRecycle",
425 450 iconCls: "", // 图标样式class
426 451 name: "已归档答题卡",
427   - component: PersonalExaminationPaperRecycle,
  452 + component: ExaminationPaperRecycle,
428 453 parent: "examinationPaper",
429 454 children: []
430 455 },
... ... @@ -498,7 +523,7 @@ const addroutersPersonal = [
498 523 path: "/portrait",
499 524 iconCls: "fa fa-users", // 图标样式class
500 525 name: "",
501   - component: PersonalPortrait,
  526 + component: Portrait,
502 527 meta: {
503 528 keepAlive: true,
504 529 },
... ... @@ -508,7 +533,7 @@ const addroutersPersonal = [
508 533 path: "/portraitDetail",
509 534 iconCls: "", // 图标样式class
510 535 name: "授课端软件",
511   - component: PersonalPortraitDetail,
  536 + component: PortraitDetail,
512 537 parent: "down",
513 538 children: []
514 539 }
... ...
src/utils/index.js
... ... @@ -197,7 +197,7 @@ export function b64DecodeUnicode(str) {
197 197 })
198 198 .join("")
199 199 );
200   - } catch (e) {}
  200 + } catch (e) { }
201 201 return uni;
202 202 }
203 203  
... ... @@ -568,7 +568,7 @@ function setSectionName(num) {
568 568 }
569 569 return txt;
570 570 }
571   -function setGradeName(num) {
  571 +export function setGradeName(num) {
572 572 let txt = "";
573 573 switch (num) {
574 574 case 1:
... ... @@ -619,6 +619,9 @@ function setGradeName(num) {
619 619 case 16:
620 620 txt = "大四";
621 621 break;
  622 + default:
  623 + txt = "未知";
  624 + break;
622 625 }
623 626 return txt;
624 627 }
... ... @@ -724,7 +727,7 @@ export function formatGradeNameClass(data) {
724 727 {
725 728 value: item.id,
726 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 741 gradeNameArr[gradeIndex].children.push({
739 742 value: item.id,
740 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 8 :action="url"
9 9 :multiple="false"
10 10 :data="{ ...query }"
11   - :with-credentials="true"
12 11 :limit="1"
13 12 :on-change="change"
14 13 :on-success="upSuccess"
15 14 :on-error="upError"
  15 + accept=".zip"
16 16 >
17 17 <!-- accept="application/vnd.ms-excel" -->
18 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 20 </div>
21 21 </el-upload>
22 22 </div>
... ...
src/views/admin/clientVersion/components/upLoadImg.vue
... ... @@ -7,10 +7,10 @@
7 7 :action="url"
8 8 :multiple="false"
9 9 :data="{ ...query }"
10   - :with-credentials="true"
11 10 :limit="1"
12 11 :on-success="upSuccess"
13 12 :on-error="upError"
  13 + accept="image/*"
14 14 >
15 15 <!-- accept="application/vnd.ms-excel" -->
16 16 <img v-if="imageUrl" :src="imageUrl" class="avatar" />
... ...
src/views/admin/clientVersion/index.vue
... ... @@ -75,7 +75,12 @@
75 75 </el-pagination>
76 76 </div>
77 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 84 <el-form
80 85 class="form-box"
81 86 :model="formAdd"
... ... @@ -93,7 +98,7 @@
93 98 </el-input>
94 99 </el-col>
95 100 </el-form-item>
96   - <el-form-item label="版本号:" prop="versionNumber">
  101 + <el-form-item label="版本号:">
97 102 <el-col :span="12">
98 103 <el-input
99 104 placeholder="请输入版本号"
... ... @@ -103,19 +108,19 @@
103 108 </el-input>
104 109 </el-col>
105 110 </el-form-item>
106   - <el-form-item label="软件图标:" prop="logo">
  111 + <el-form-item label="软件图标:">
107 112 <el-col :span="12">
108   - <upLoadImg :url="url" @upSuccess="logoSuccess"/>
  113 + <upLoadImg url="/file/uploadImg" @upSuccess="logoSuccess" />
109 114 </el-col>
110 115 </el-form-item>
111   - <el-form-item label="上传全量文件包:" prop="appfiles">
  116 + <el-form-item label="上传全量文件包:" prop="filePath">
112 117 <el-col :span="12">
113   - <upLoad :url="url" @upSuccess="appfilesSuccess"/>
  118 + <upLoad :url="url" @upSuccess="appfilesSuccess" />
114 119 </el-col>
115 120 </el-form-item>
116   - <el-form-item label="上传增量文件包:" prop="addfiles">
  121 + <el-form-item label="上传增量文件包:" prop="incrementFilePath">
117 122 <el-col :span="12">
118   - <upLoad :url="url" @upSuccess="addfilesSuccess"/>
  123 + <upLoad :url="url" @upSuccess="addfilesSuccess" />
119 124 </el-col>
120 125 </el-form-item>
121 126 <el-form-item label="更新描述:" prop="description">
... ... @@ -138,17 +143,18 @@
138 143 </template>
139 144  
140 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 148 export default {
144   - components:{
  149 + components: {
145 150 upLoad,
146   - upLoadImg
  151 + upLoadImg,
147 152 },
148 153 data() {
149 154 return {
150 155 url: "/file/uploadApp",
151 156 loading: false,
  157 + addLoading: false,
152 158 diaAdd: false,
153 159 tableData: [],
154 160 formAdd: {
... ... @@ -163,12 +169,6 @@ export default {
163 169 versionName: [
164 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 172 filePath: [
173 173 { required: true, message: "请上传全量文件包", trigger: "blur" },
174 174 ],
... ... @@ -198,17 +198,42 @@ export default {
198 198 this.page = page;
199 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 216 this.formAdd.filePath = res.data;
207 217 },
208   - addfilesSuccess(res){
  218 + addfilesSuccess(res) {
209 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 237 async _QueryData() {
213 238 this.loading = true;
214 239 this.tableData = [];
... ...
src/views/admin/device/index.vue
... ... @@ -27,27 +27,27 @@
27 27 <div class="answer-header">
28 28 <div class="sel-box">
29 29 <el-input
30   - placeholder="请输入租户"
  30 + placeholder="请输入学校"
31 31 v-model="query.schoolName"
32 32 class="input-with-select"
33   - @keyup.enter.native="_QueryData(true)"
  33 + @keyup.enter.native="query.loginName='',_QueryData(true)"
34 34 >
35 35 <el-button
36 36 slot="append"
37 37 icon="el-icon-search"
38   - @click="_QueryData(true)"
  38 + @click="query.loginName='',_QueryData(true)"
39 39 ></el-button>
40 40 </el-input>
41 41 <el-input
42 42 placeholder="请输入租户"
43   - v-model="query.sn"
  43 + v-model="query.loginName"
44 44 class="input-with-select"
45   - @keyup.enter.native="_QueryData(true)"
  45 + @keyup.enter.native="query.schoolName='',_QueryData(true)"
46 46 >
47 47 <el-button
48 48 slot="append"
49 49 icon="el-icon-search"
50   - @click="_QueryData(true)"
  50 + @click="query.schoolName='',_QueryData(true)"
51 51 ></el-button>
52 52 </el-input>
53 53 <el-button class="serach-box" round @click="_QueryData(true)"
... ... @@ -135,30 +135,28 @@
135 135 <div class="table-box">
136 136 <div class="answer-header">
137 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 150 <el-input
153 151 placeholder="请输入租户"
154   - v-model="query.sn"
  152 + v-model="query.loginName"
155 153 class="input-with-select"
156   - @keyup.enter.native="_QueryData(true)"
  154 + @keyup.enter.native="query.schoolName='',_QueryData(true)"
157 155 >
158 156 <el-button
159 157 slot="append"
160 158 icon="el-icon-search"
161   - @click="_QueryData(true)"
  159 + @click="query.schoolName='',_QueryData(true)"
162 160 ></el-button>
163 161 </el-input>
164 162 <el-button class="serach-box" round @click="_QueryData(true)"
... ... @@ -255,7 +253,6 @@ export default {
255 253 this.page = 1;
256 254 this.total = 0;
257 255 this.count = 0;
258   - this.query.onlineStatus = "";
259 256 this.query.schoolName = "";
260 257 this.query.loginName = "";
261 258 if (val == 1) {
... ... @@ -275,7 +272,6 @@ export default {
275 272 query: {
276 273 schoolName: "",
277 274 loginName: "",
278   - onlineStatus: "",
279 275 },
280 276 tableData: [],
281 277 total: 0,
... ... @@ -377,13 +373,6 @@ export default {
377 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 376 if (isRef) {
388 377 this.page = 1;
389 378 }
... ...
src/views/admin/device/log.vue
... ... @@ -296,7 +296,7 @@ export default {
296 296 data = {},
297 297 status,
298 298 info,
299   - } = await this.$request.deviceLogList({
  299 + } = await this.$request.pDeviceLogList({
300 300 ...query,
301 301 deviceId: Number(this.id),
302 302 page: this.page,
... ...
src/views/personal/examinationPaper/add.vue renamed to src/views/examinationPaper/add.vue
... ... @@ -55,6 +55,26 @@
55 55 @click="openTagDia"
56 56 ></el-button>
57 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 78 <el-form-item label="科目:" prop="subjectName">
59 79 <el-select class="sel" v-model="form.subjectName" placeholder="">
60 80 <el-option
... ... @@ -77,6 +97,16 @@
77 97 label="考试时长"
78 98 ></el-input-number>
79 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 110 </el-form>
81 111 <div class="btn-box">
82 112 <el-button type="danger" plain round @click="linkBack"
... ... @@ -830,23 +860,29 @@
830 860 </div>
831 861 </div>
832 862 <el-dialog
833   - :title="upLoadType == 1 ? '上传题干' : '上传题目解析'"
  863 + :title="stem.type == 1 ? '上传题干' : '上传题目解析'"
834 864 :visible.sync="dialogStem"
  865 + v-if="dialogStem"
835 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 876 <el-upload
840 877 class="upload-demo"
841 878 action="http://121.40.127.171/file/uploadImg"
842 879 :limit="1"
843   - :with-credentials="true"
844 880 :on-success="upSuccess"
845 881 :on-error="upError"
846 882 accept="image/*"
847 883 >
848 884 <el-button size="small" type="primary">{{
849   - stem.src ? "重新上传" : "选择照片"
  885 + stem.screenshot || stem.answerScreenshot ? "重新上传" : "选择照片"
850 886 }}</el-button>
851 887 </el-upload>
852 888 </div>
... ... @@ -930,43 +966,8 @@ export default {
930 966 },
931 967 data() {
932 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 971 gradeList: [], //年级
971 972 subjectList: [], //科目
972 973 answerTypeList: [], //测验类型
... ... @@ -978,6 +979,8 @@ export default {
978 979 subjectName: "",
979 980 examsDuration: 90,
980 981 questionList: [],
  982 + gradeName: "",
  983 + sharingType: 0,
981 984 },
982 985 formRules: {
983 986 //答题卡验证
... ... @@ -998,7 +1001,9 @@ export default {
998 1001 ],
999 1002 },
1000 1003 tagList: [],
1001   - diaSetAns: false,
  1004 + diaSetAns: false, //答案开关
  1005 + dialogStem: false, //截图开关
  1006 + dialogTag: false, //打标开关
1002 1007 formAns: {
1003 1008 listIndex: 0, //大题位置
1004 1009 endIndex: 0, //相同题目最后一位题目的questionIndex
... ... @@ -1008,10 +1013,53 @@ export default {
1008 1013 answerOptions: [], //答案选项
1009 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 1052 async created() {
1014 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 1063 await this._QuerySubjectList(this.gradeList[0]);
1016 1064 await this._TypeList();
1017 1065 if (this.type == 2) {
... ... @@ -1021,18 +1069,25 @@ export default {
1021 1069 methods: {
1022 1070 openStem(obj, type, index, indexs) {
1023 1071 //上传截图
1024   - this.upLoadType = type;
1025   - this.stem.id = obj.id;
1026 1072 this.stem.type = type;
1027 1073 this.stem.index = index;
1028 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 1086 this.dialogStem = true;
1031 1087 },
1032 1088 openTag(obj, type, index, indexs) {
1033 1089 //难度,知识点
1034 1090 this.stem = { ...this.stem, obj };
1035   - this.stem.id = obj.id;
1036 1091 this.stem.type = type;
1037 1092 this.stem.index = index;
1038 1093 this.stem.indexs = indexs;
... ... @@ -1040,14 +1095,18 @@ export default {
1040 1095 this.stem.difficultyFactor = obj.difficultyFactor || "";
1041 1096 this.dialogTag = true;
1042 1097 },
1043   - upSuccess(res) {
  1098 + upSuccess(res, file) {
1044 1099 //图片上传成功
1045 1100 if (res && res.status == 0) {
1046   - this.dialogStem = false;
1047 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 1104 this.form.questionList[this.stem.index].subQuestions[this.stem.indexs][
1049 1105 keys
1050 1106 ] = this.stem[keys];
  1107 + this.form.questionList[this.stem.index].subQuestions[this.stem.indexs][
  1108 + keys + "Src"
  1109 + ] = this.stem[keys + "Src"];
1051 1110 this.$message.success("上传成功");
1052 1111 } else {
1053 1112 this.$message.error(res.info);
... ... @@ -1175,7 +1234,6 @@ export default {
1175 1234 val
1176 1235 );
1177 1236 } else {
1178   - console.log(this.questionForm.answerList.split(","));
1179 1237 this.questionForm.answerList = this.questionForm.answerList
1180 1238 .split(",")
1181 1239 .splice(0, val)
... ... @@ -1431,12 +1489,12 @@ export default {
1431 1489 );
1432 1490 }
1433 1491 }
1434   - console.log(types);
1435 1492 });
1436 1493 this.step = 2;
1437 1494 return;
1438 1495 },
1439 1496 formatQuestionList() {
  1497 + //删除批量操作数据
1440 1498 for (let i = 0; i < this.form.questionList.length; i++) {
1441 1499 for (
1442 1500 let j = 0;
... ... @@ -1627,7 +1685,11 @@ export default {
1627 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 1693 tagId: obj.id,
1632 1694 tag: obj.typeName,
1633 1695 });
... ... @@ -1641,7 +1703,11 @@ export default {
1641 1703 },
1642 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 1711 tagId: obj.id,
1646 1712 });
1647 1713 if (status == 0) {
... ... @@ -1669,7 +1735,11 @@ export default {
1669 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 1743 tag: this.answerTypeName,
1674 1744 });
1675 1745 if (status == 0) {
... ... @@ -1689,8 +1759,21 @@ export default {
1689 1759 let formDatas = deepClone(this.form);
1690 1760 for (let i = 0; i < formDatas.questionList.length; i++) {
1691 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 1777 ...formDatas,
1695 1778 });
1696 1779 this.saveLoading = false;
... ... @@ -1702,9 +1785,17 @@ export default {
1702 1785 this.$message.error(info);
1703 1786 }
1704 1787 },
  1788 + async changeGrade() {
  1789 + //切换年级查询科目
  1790 + this._QuerySubjectList(this.form.gradeName);
  1791 + },
1705 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 1799 type: 1,
1709 1800 });
1710 1801 if (status == 0) {
... ... @@ -1722,30 +1813,51 @@ export default {
1722 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 1839 if (status === 0) {
1730 1840 this.subjectList =
1731 1841 data.subjectNames?.map((item) => {
1732 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 1847 if (this.subjectList.length) {
1739 1848 this.form.subjectName = this.subjectList[0].value;
1740 1849 }
1741   - console.log(this.form);
1742 1850 } else {
1743 1851 this.$message.error(info);
1744 1852 }
1745 1853 },
1746 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 1861 paperId: this.$route.query.paperId,
1750 1862 });
1751 1863 if (status == 0) {
... ... @@ -1753,6 +1865,10 @@ export default {
1753 1865 this.form.tagId = data.tagId === 0 ? "" : data.tagId;
1754 1866 this.form.subjectName = data.subjectName;
1755 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 1872 this.form.questionList = data.questionList?.map((item) => {
1757 1873 let subQuestions =
1758 1874 item.subQuestions?.map((items) => {
... ... @@ -1763,6 +1879,12 @@ export default {
1763 1879 selectNum: items.answerOptions.split(",").length,
1764 1880 answerOptions: items.answerOptions || "A,B,C,D",
1765 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 1890 return {
... ... @@ -1800,7 +1922,7 @@ export default {
1800 1922 .delButton {
1801 1923 text-indent: -9999999px;
1802 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 1926 background-size: 19px;
1805 1927 color: transparent;
1806 1928 }
... ... @@ -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 2184 </style>
2058 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 418 </div>
419 419 </el-dialog>
420 420 <el-dialog
421   - :title="upLoadType == 1 ? '上传题干' : '上传题目解析'"
  421 + :title="stem.type == 1 ? '上传题干' : '上传题目解析'"
422 422 :visible.sync="dialogStem"
  423 + v-if="dialogStem"
423 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 436 <el-upload
428 437 class="upload-demo"
429 438 action="http://121.40.127.171/file/uploadImg"
430 439 :limit="1"
431   - :with-credentials="true"
432 440 :on-success="upSuccess"
433 441 :on-error="upError"
434 442 accept="image/*"
435 443 >
436 444 <el-button size="small" type="primary">{{
437   - stem.src ? "重新上传" : "选择照片"
  445 + stem.screenshot || stem.answerScreenshot ? "重新上传" : "选择照片"
438 446 }}</el-button>
439 447 </el-upload>
440 448 </div>
... ... @@ -483,16 +491,17 @@ import { deepClone, checkAnswer } from &quot;utils&quot;;
483 491 export default {
484 492 data() {
485 493 return {
  494 + role: "",
486 495 dialogStem: false,
487 496 dialogTag: false,
488   - upLoadType: 1,
489 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 505 difficultyFactor: 0, //题目难度
497 506 knowledge: [], //知识点
498 507 },
... ... @@ -541,6 +550,9 @@ export default {
541 550 },
542 551 },
543 552 created() {
  553 + this.role =
  554 + this.$store.getters.info.showRole ||
  555 + this.$store.getters.info.permissions[0].role;
544 556 this.type = this.$route.query.type || 1;
545 557 this.title = this.$route.query.title || "";
546 558 this._QueryDetail();
... ... @@ -548,18 +560,25 @@ export default {
548 560 methods: {
549 561 openStem(obj, type, index, indexs) {
550 562 //上传截图
551   - this.upLoadType = type;
552   - this.stem.id = obj.id;
553 563 this.stem.type = type;
554 564 this.stem.index = index;
555 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 577 this.dialogStem = true;
558 578 },
559 579 openTag(obj, type, index, indexs) {
560 580 //难度,知识点
561 581 this.stem = { ...this.stem, obj };
562   - this.stem.id = obj.id;
563 582 this.stem.type = type;
564 583 this.stem.index = index;
565 584 this.stem.indexs = indexs;
... ... @@ -567,19 +586,24 @@ export default {
567 586 this.stem.difficultyFactor = obj.difficultyFactor || "";
568 587 this.dialogTag = true;
569 588 },
570   - upSuccess(res) {
  589 + upSuccess(res, file) {
571 590 //图片上传成功
572 591 if (res && res.status == 0) {
573   - this.dialogStem = false;
574 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 596 this.questionList[this.stem.index].subQuestions[this.stem.indexs][
577 597 keys
578 598 ] = this.stem[keys];
  599 + this.questionList[this.stem.index].subQuestions[this.stem.indexs][
  600 + keys + "Src"
  601 + ] = this.stem[keys + "Src"];
579 602 } else {
580 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 607 this.$message.success("上传成功");
584 608 } else {
585 609 this.$message.error(res.info);
... ... @@ -847,12 +871,25 @@ export default {
847 871 for (let j = 0; j < this.questionList[i].subQuestions.length; j++) {
848 872 if (this.questionList[i].subQuestions[j].qusType) {
849 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 883 } else {
853 884 if (this.questionList[i].qusType) {
854 885 this.questionList.splice(i, 1);
855 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 902 //更新答题卡
866 903 let modifyPaper, params;
867 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 909 params = {
870 910 paperId: this.$route.query.paperId,
871 911 questionList: questionList,
872 912 };
873 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 918 params = {
876 919 examId: this.$route.query.paperId,
877 920 questionList: questionList,
878 921 };
879 922 } else {
880   - modifyPaper = this.$request.pSetPeriodAnswer;
  923 + modifyPaper =
  924 + this.role == "ROLE_PERSONAL"
  925 + ? this.$request.pSetPeriodAnswer
  926 + : this.$request.setPeriodAnswer;
881 927 params = {
882 928 periodId: this.$route.query.paperId,
883 929 questionList: questionList,
... ... @@ -892,12 +938,22 @@ export default {
892 938 },
893 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 957 let params =
902 958 this.type == 1
903 959 ? { paperId: this.$route.query.paperId }
... ... @@ -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 1260 </style>
1200 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 95 <em class="s-line">|</em>
96 96 预计时长:{{ item.examsDuration }}
97 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 123 </p>
99 124 <p class="person">
100 125 {{ item.realName }}<em class="s-line">|</em
... ... @@ -123,6 +148,11 @@
123 148 icon="el-icon-more"
124 149 ></el-button>
125 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 156 <el-dropdown-item :command="2">复制</el-dropdown-item>
127 157 <el-dropdown-item :command="3">归档</el-dropdown-item>
128 158 </el-dropdown-menu>
... ... @@ -147,7 +177,20 @@
147 177 content="没有更多数据"
148 178 :image-size="100"
149 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 194 </div>
152 195 </template>
153 196  
... ... @@ -158,6 +201,7 @@ export default {
158 201 return {
159 202 loading: false,
160 203 userName: "",
  204 + dialogVisible: false,
161 205 query: {
162 206 classId: "",
163 207 subjectName: "",
... ... @@ -169,12 +213,24 @@ export default {
169 213 typeList: [],
170 214 archivedTotal: 0, //已归档答题卡数量
171 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 225 total: 0,
173 226 page: 1,
174 227 size: 20,
175 228 };
176 229 },
177 230 async created() {
  231 + this.role =
  232 + this.$store.getters.info.showRole ||
  233 + this.$store.getters.info.permissions[0].role;
178 234 this.userName = this.$store.getters.info.name || "";
179 235 await this._QueryClassList();
180 236 await this._QuerySubjectList();
... ... @@ -182,6 +238,11 @@ export default {
182 238 this._QueryTypeList();
183 239 },
184 240 methods: {
  241 + refreshStic() {
  242 + setTimeout(function () {
  243 + window.location.reload();
  244 + }, 500);
  245 + },
185 246 toAdd(query) {
186 247 let routerItem = {
187 248 path: "/examinationPaperAdd",
... ... @@ -201,6 +262,12 @@ export default {
201 262 //更多
202 263 const that = this;
203 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 271 case 2:
205 272 //复制
206 273 that.toAdd({ type: 2, paperId: item.id });
... ... @@ -215,9 +282,29 @@ export default {
215 282 this.page = page;
216 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 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 308 paperId: item.id,
222 309 status: 2,
223 310 });
... ... @@ -232,12 +319,16 @@ export default {
232 319 //切换班级
233 320 async changClazz() {
234 321 await this._QuerySubjectList();
235   - this._QueryTypeList()
236 322 this._QueryData(false);
237 323 },
238 324 // 查找答题卡类型
239 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 332 classId: this.query.classId,
242 333 type: 0,
243 334 });
... ... @@ -251,7 +342,7 @@ export default {
251 342 }) || [];
252 343 this.typeList.unshift({
253 344 value: "",
254   - label: "全部",
  345 + label: "请选择标签",
255 346 });
256 347 } else {
257 348 this.$message.error(info);
... ... @@ -260,14 +351,19 @@ export default {
260 351 // 查找班级
261 352 async _QueryClassList() {
262 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 360 console.log(status);
265 361 if (status === 0) {
266 362 if (!!data.list) {
267 363 this.classList =
268 364 data.list?.map((item) => {
269 365 return {
270   - value: item.id,
  366 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
271 367 label: item.className,
272 368 };
273 369 }) || [];
... ... @@ -279,7 +375,12 @@ export default {
279 375 },
280 376 // 查找科目
281 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 384 classId: this.query.classId,
284 385 });
285 386 if (status === 0) {
... ... @@ -321,7 +422,12 @@ export default {
321 422 return;
322 423 }
323 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 431 ...query,
326 432 status: 1,
327 433 page: this.page,
... ... @@ -439,11 +545,11 @@ export default {
439 545 margin-right: 12px;
440 546 }
441 547 }
442   - .icon-refresh{
443   - margin-left:20px;
  548 + .icon-refresh {
  549 + margin-left: 20px;
444 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 149 export default {
150 150 data() {
151 151 return {
  152 + role: "",
152 153 loading: false,
153 154 props: { multiple: true, checkStrictly: true },
154 155 options: [
... ... @@ -197,6 +198,9 @@ export default {
197 198 };
198 199 },
199 200 async created() {
  201 + this.role =
  202 + this.$store.getters.info.showRole ||
  203 + this.$store.getters.info.permissions[0].role;
200 204 await this._QueryClassList();
201 205 await this._QuerySubjectList();
202 206 this._QueryTypeList();
... ... @@ -205,7 +209,11 @@ export default {
205 209 methods: {
206 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 217 paperId: obj.id,
210 218 status: 1,
211 219 });
... ... @@ -218,7 +226,11 @@ export default {
218 226 },
219 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 234 paperId: obj.id,
223 235 });
224 236 if (status == 0) {
... ... @@ -255,7 +267,11 @@ export default {
255 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 275 ...query,
260 276 status: 2,
261 277 page: this.page,
... ... @@ -271,14 +287,18 @@ export default {
271 287 },
272 288 // 查找班级
273 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 295 console.log(status);
276 296 if (status === 0) {
277 297 if (!!data.list) {
278 298 this.classList =
279 299 data.list?.map((item) => {
280 300 return {
281   - value: item.id,
  301 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
282 302 label: item.className,
283 303 };
284 304 }) || [];
... ... @@ -290,7 +310,12 @@ export default {
290 310 },
291 311 // 查找科目
292 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 319 classId: this.query.classId,
295 320 });
296 321 if (status === 0) {
... ... @@ -308,7 +333,12 @@ export default {
308 333 },
309 334 // 查找答题卡类型
310 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 342 classId: this.query.classId,
313 343 tyle: 0,
314 344 });
... ...
src/views/index/mainIndex.vue
... ... @@ -194,7 +194,7 @@
194 194 对{{ dataInfo.classPeriodCount }}套随堂问答题记录分析
195 195 </p>
196 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 198 <img class="icon" src="../../assets/nav/analysis.png" alt="" />
199 199 <p class="p1">即时测报表</p>
200 200 <p class="p2" v-if="dataInfo.examCount">
... ... @@ -403,6 +403,7 @@ export default {
403 403 height: calc(50% - 8px);
404 404 flex-wrap: wrap;
405 405 padding: 12px 0 12px 30px;
  406 + margin-right:20px;
406 407 .icon {
407 408 width: 60px;
408 409 height: 60px;
... ... @@ -419,6 +420,23 @@ export default {
419 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 441 .item2 {
424 442 width: calc(50% - 10px);
... ... @@ -447,6 +465,7 @@ export default {
447 465 height: 240px;
448 466 display: flex;
449 467 flex-wrap: wrap;
  468 +
450 469 }
451 470 .item4 {
452 471 width: calc(50% - 10px);
... ...
src/views/personal/ask/index.vue
... ... @@ -88,202 +88,209 @@
88 88 >
89 89 </el-radio-group>
90 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 99 <el-table-column
  100 + prop="title"
  101 + label="课时"
200 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 115 <el-table-column
  116 + prop="participationRate"
  117 + label="参与度"
  118 + sortable="custom"
206 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 125 <el-table-column
  126 + prop="answerCorrectRate"
  127 + label="已答总正确率"
  128 + sortable="custom"
212 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 134 </el-table-column>
219 135 <el-table-column
  136 + prop="classCorrectRate"
  137 + label="班级总正确率"
  138 + sortable="custom"
220 139 align="center"
221   - :label="index == 0 ? '总正确率' : '正确率'"
222   - :prop="'correctRate' + item"
223 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 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 186 <el-table-column
  187 + prop="studentCode"
  188 + label="学号"
256 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 192 <el-table-column
264   - v-else
  193 + prop="studentName"
  194 + label="姓名"
265 195 align="center"
266   - label="互动数"
267   - :prop="'interactionsNum' + item"
268   - >
269   - </el-table-column>
  196 + fixed
  197 + width="100"
  198 + ></el-table-column>
270 199 <el-table-column
271   - v-if="index == 0"
  200 + v-for="(item, index) in phaseOption"
  201 + :key="index"
  202 + :label="item"
272 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 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 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 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 291 </el-table-column>
285   - </el-table-column>
286   - </el-table>
  292 + </el-table>
  293 + </div>
287 294 </div>
288 295 <div class="pagination-box" v-show="tabIndex == 1">
289 296 <el-pagination
... ... @@ -381,7 +388,7 @@ export default {
381 388 });
382 389 },
383 390 methods: {
384   - print() {
  391 + print() {
385 392 tablePrint("print-content");
386 393 },
387 394 changeSub(val) {
... ... @@ -521,7 +528,7 @@ export default {
521 528 if (status === 0) {
522 529 this.classList = data.list.map((item) => {
523 530 return {
524   - value: item.classId,
  531 + value: item.id,
525 532 label: item.className,
526 533 };
527 534 });
... ... @@ -683,11 +690,10 @@ export default {
683 690 this.$message.warning("请选择科目");
684 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 695 ...query,
689   - }
690   - );
  696 + });
691 697 this.loading = false;
692 698 if (status === 0) {
693 699 let subjectName = [];
... ...
src/views/personal/down/index.vue
... ... @@ -8,9 +8,11 @@
8 8 <div class="down-box" v-loading="loading">
9 9 <img class="logo" src="" alt="" />
10 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 16 </div>
15 17 <el-button type="primary" @click="downCard">立即下载</el-button>
16 18 </div>
... ... @@ -22,13 +24,38 @@ export default {
22 24 data() {
23 25 return {
24 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 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 53 async downCard() {
29 54 if (this.loading == true) return;
30 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 59 this.loading = false;
33 60 if (status == 0) {
34 61 const a = document.createElement("a");
... ... @@ -51,7 +78,7 @@ export default {
51 78 }
52 79  
53 80 .down-box {
54   - padding:20px 50px;
  81 + padding: 20px 50px;
55 82 display: flex;
56 83 align-items: center;
57 84 }
... ...
src/views/personal/setUp/student.vue
... ... @@ -450,15 +450,9 @@ export default {
450 450 let { data, info, status } = await this.$request.studentTemplateUrl();
451 451 this.loadingDown = false;
452 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 456 } else {
463 457 this.$message.error(info);
464 458 }
... ...
src/views/personal/test/index.vue
... ... @@ -517,6 +517,8 @@ export default {
517 517 id: obj.studentId,
518 518 classId: obj.classId,
519 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 650 if (status === 0) {
649 651 this.classList = data.list.map((item) => {
650 652 return {
651   - value: item.classId,
  653 + value: item.id,
652 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 60 </div>
61 61 </div>
62 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 67 <template v-if="type == 1">
66 68 <radarChart id="radarChart" :params="radarChartData" />
67 69 </template>
... ... @@ -69,6 +71,7 @@
69 71 <lineChart id="lineChart" :params="lineChartData" :xAxis="xAxis" />
70 72 </template>
71 73 </div>
  74 +
72 75 <div class="tab-box">
73 76 <el-table
74 77 v-show="type == 1"
... ... @@ -82,22 +85,22 @@
82 85 align="center"
83 86 ></el-table-column>
84 87 <el-table-column
85   - prop="cl"
  88 + prop="examCount"
86 89 label="参与测练数"
87 90 align="center"
88 91 ></el-table-column>
89 92 <el-table-column
90   - prop="bg"
  93 + prop="highestScore"
91 94 label="班最高分"
92 95 align="center"
93 96 ></el-table-column>
94 97 <el-table-column
95   - prop="bp"
  98 + prop="avgScore"
96 99 label="班平均分"
97 100 align="center"
98 101 ></el-table-column>
99 102 <el-table-column
100   - prop="br"
  103 + prop="examScore"
101 104 label="个人得分"
102 105 align="center"
103 106 ></el-table-column>
... ... @@ -109,22 +112,22 @@
109 112 style="width: 100%"
110 113 >
111 114 <el-table-column
112   - prop="subjectName"
  115 + prop="title"
113 116 label="课堂测练"
114 117 align="center"
115 118 ></el-table-column>
116 119 <el-table-column
117   - prop="br"
  120 + prop="examScore"
118 121 label="个人成绩"
119 122 align="center"
120 123 ></el-table-column>
121 124 <el-table-column
122   - prop="bp"
  125 + prop="avgScore"
123 126 label="平均成绩"
124 127 align="center"
125 128 ></el-table-column>
126 129 <el-table-column
127   - prop="pm"
  130 + prop="classRank"
128 131 label="班级排名"
129 132 align="center"
130 133 ></el-table-column>
... ... @@ -143,6 +146,8 @@ export default {
143 146 data() {
144 147 return {
145 148 id: "",
  149 + studentName: "",
  150 + studentCode: "",
146 151 classId: "",
147 152 subjectNames: [],
148 153 type: 1,
... ... @@ -156,28 +161,8 @@ export default {
156 161 date: "",
157 162 subjectList: [], //科目
158 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 167 lineChartData: [
183 168 {
... ... @@ -194,24 +179,16 @@ export default {
194 179 },
195 180 ],
196 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 186 async created() {
210 187 this.id = this.$route.query.id;
211 188 this.classId = this.$route.query.classId;
  189 + this.studentCode = this.$route.query.studentCode;
  190 + this.studentName = this.$route.query.studentName;
212 191 this.subjectNames = this.$route.query.subjectNames?.split(",") || [];
213   - this.type =
214   - this.subjectNames.length > 1 || this.subjectNames.length == 0 ? 1 : 2;
215 192 await this._QuerySubjectList();
216 193 await this.setDate(1);
217 194 let startDay = this.query?.startDay;
... ... @@ -231,8 +208,9 @@ export default {
231 208 return sub != "全部" ? item != "全部" : item == "全部";
232 209 });
233 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 214 ? 1
237 215 : 2;
238 216 },
... ... @@ -324,7 +302,16 @@ export default {
324 302 });
325 303 if (this.subjectNames.length == 0) {
326 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 315 } else {
329 316 this.$message.error(info);
330 317 }
... ... @@ -337,12 +324,62 @@ export default {
337 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 346 ...query,
343 347 });
344 348 this.loading = false;
345 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 383 } else {
347 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 69 {{ item.studentName }} <i class="fa fa-calculator"></i>
70 70 {{ item.clickerSn }}
71 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 74 </div>
75 75 <el-button
76 76 class="btn"
... ... @@ -87,11 +87,12 @@
87 87 </template>
88 88  
89 89 <script>
90   -import { formatDate } from "utils";
  90 +import { formatDate, setGradeName } from "utils";
91 91 import BusEvent from "@/utils/busEvent";
92 92 export default {
93 93 data() {
94 94 return {
  95 + role: "",
95 96 query: {
96 97 //搜索条件
97 98 classId: "",
... ... @@ -101,24 +102,16 @@ export default {
101 102 },
102 103 date: "",
103 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 106 page: 1,
117 107 size: 20,
118 108 total: 0,
119 109 };
120 110 },
121 111 async created() {
  112 + this.role =
  113 + this.$store.getters.info.showRole ||
  114 + this.$store.getters.info.permissions[0].role;
122 115 await this._QueryClassList();
123 116 await this.setDate(1);
124 117 let startDay = this.query?.startDay;
... ... @@ -140,12 +133,17 @@ export default {
140 133 });
141 134 },
142 135 methods: {
  136 + gradeName(type) {
  137 + return setGradeName(type);
  138 + },
143 139 linkDetail(obj) {
144 140 this.$router.push({
145 141 path: "/portraitDetail",
146 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 222 }
225 223 },
226 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 231 if (status === 0) {
229 232 this.classList = data.list.map((item) => {
230 233 return {
231   - value: item.classId,
  234 + value: this.role == "ROLE_PERSONAL" ? item.id : item.classId,
232 235 label: item.className,
233 236 };
234 237 });
... ... @@ -245,8 +248,11 @@ export default {
245 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 256 ...query,
251 257 page: this.page,
252 258 size: this.size,
... ...
src/views/standard/ask/analysis.vue
... ... @@ -53,75 +53,85 @@
53 53 反馈时长:{{ setDuration(detail.consumingDuration) }}
54 54 </li>
55 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 135 <template slot-scope="scoped">
126 136 <el-image
127 137 v-if="scoped.row.screenshot"
... ... @@ -131,139 +141,158 @@
131 141 >
132 142 </el-image><span v-else>暂无</span></template
133 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 296 <div class="pagination-box" v-show="type == 1">
268 297 <el-pagination
269 298 small=""
... ... @@ -285,6 +314,14 @@
285 314 icon="fa fa-cloud-download"
286 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 325 <!-- <el-button @click="edit" type="primary" round>修改答案</el-button> -->
289 326 </p>
290 327 </div>
... ... @@ -301,7 +338,7 @@
301 338 </template>
302 339  
303 340 <script>
304   -import { downloadFile } from "@/utils";
  341 +import { downloadFile,tablePrint } from "@/utils";
305 342 export default {
306 343 data() {
307 344 return {
... ... @@ -327,28 +364,31 @@ export default {
327 364 this.periodDetail();
328 365 },
329 366 methods: {
  367 + print() {
  368 + tablePrint("print-content");
  369 + },
330 370 setType(type) {
331 371 this.type = type;
332 372 this.page = 1;
333 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 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 393 setSubPro(type) {
354 394 let tit;
... ... @@ -458,8 +498,8 @@ export default {
458 498 });
459 499 this.optionsList = [...optionsList];
460 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 505 this.total = data.count;
... ... @@ -504,7 +544,9 @@ div::-webkit-scrollbar-thumb {
504 544 display: flex;
505 545 justify-content: space-between;
506 546 }
507   -.red{color:#f30}
  547 +.red {
  548 + color: #f30;
  549 +}
508 550 .page-content {
509 551 padding: 20px 20px 0;
510 552 }
... ...
src/views/standard/ask/index.vue
... ... @@ -22,7 +22,7 @@
22 22 </el-option>
23 23 </el-select>
24 24 <el-select
25   - v-if="role == 'ROLE_BANZHUREN'"
  25 + v-if="role == 'ROLE_BANZHUREN' || role == 'ROLE_PERSONAL'"
26 26 class="sel"
27 27 multiple
28 28 v-model="query.subjectNames"
... ... @@ -104,333 +104,340 @@
104 104 >阶段互动报表</el-radio-button
105 105 >
106 106 </el-radio-group>
107   - <!-- <p class="table-tit" v-if="tabIndex != 1">
108   - <span>总课时数:10</span>
109   - <span>互动总数:22</span>
110   - </p> -->
111 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 142 <el-table-column
  143 + prop="answerCorrectRate"
  144 + label="已答总正确率"
  145 + sortable="custom"
290 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 151 </el-table-column>
295 152 <el-table-column
  153 + prop="classCorrectRate"
  154 + label="班级总正确率"
  155 + sortable="custom"
296 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 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 204 <el-table-column
  205 + prop="studentCode"
  206 + label="学号"
  207 + fixed
302 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 258 </el-table-column>
309 259 <el-table-column
  260 + prop="classRank"
  261 + label="总正确率班排名"
  262 + sortable
310 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 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 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 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 349 sortable
407   - :prop="'interactionsNum' + item"
408   - >
409   - </el-table-column>
  350 + align="center"
  351 + ></el-table-column>
410 352 <el-table-column
411   - v-else
  353 + prop="rushAnswerCorrectTimes"
  354 + label="抢答答对次数"
  355 + sortable
412 356 align="center"
413   - label="互动数"
414   - :prop="'interactionsNum' + item"
415   - >
416   - </el-table-column>
  357 + ></el-table-column>
417 358 <el-table-column
418   - v-if="index == 0"
  359 + prop="checkAnswerTimes"
  360 + label="抽答次数"
  361 + sortable
419 362 align="center"
420   - label="对错分"
  363 + ></el-table-column>
  364 + <el-table-column
  365 + prop="checkAnswerCorrectTimes"
  366 + label="抽答答对次数"
421 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 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 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 438 </el-table-column>
432   - </el-table-column>
433   - </el-table>
  439 + </el-table>
  440 + </div>
434 441 </div>
435 442 <div class="pagination-box" v-show="tabIndex == 1">
436 443 <el-pagination
... ... @@ -456,21 +463,22 @@
456 463 icon="fa fa-cloud-download"
457 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 474 </p>
460 475 </div>
461 476 </div>
462   - <set-answer
463   - :diaVisible="dialogVisible"
464   - :questionList="form.questionList"
465   - :paperId="form.id"
466   - @saveSuccess="handleSuccess"
467   - @cancel="cancel"
468   - />
469 477 </div>
470 478 </template>
471 479  
472 480 <script>
473   -import { formatDate, deepClone, downloadFile } from "utils";
  481 +import { formatDate, deepClone, downloadFile, tablePrint } from "utils";
474 482 import BusEvent from "@/utils/busEvent";
475 483 export default {
476 484 data() {
... ... @@ -478,8 +486,6 @@ export default {
478 486 tableMaxHeight: 300,
479 487 role: "",
480 488 loading: false,
481   - dialogVisible: false,
482   - form: { questionList: [] },
483 489 date: "", //今天-昨天-本周
484 490 query: {
485 491 //搜索条件
... ... @@ -506,7 +512,9 @@ export default {
506 512 };
507 513 },
508 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 518 this.query.subjectNames = this.role == "ROLE_BANZHUREN" ? [] : "";
511 519 await this._QueryClassList();
512 520 await this._QuerySubjectList();
... ... @@ -532,6 +540,9 @@ export default {
532 540 });
533 541 },
534 542 methods: {
  543 + print() {
  544 + tablePrint("print-content");
  545 + },
535 546 changeSub(val) {
536 547 let sub;
537 548 if (val && val.length) {
... ... @@ -623,26 +634,14 @@ export default {
623 634 }
624 635 },
625 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 646 tabChange() {
648 647 this.tableMaxHeight = this.$refs.main.offsetHeight;
... ...
src/views/standard/setUp/school.vue
... ... @@ -5,7 +5,7 @@
5 5 <span>学校设置</span>
6 6 </template>
7 7 <template slot="btns" v-if="!code">
8   - <el-tooltip effect="dark" content="导入学校名单" placement="bottom">
  8 + <el-tooltip effect="dark" content="导入班级名单" placement="bottom">
9 9 <el-button
10 10 type="primary"
11 11 icon="el-icon-upload2"
... ... @@ -15,6 +15,16 @@
15 15 @click="diaUp = true"
16 16 ></el-button>
17 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 28 </template>
19 29 </back-box>
20 30 <div class="page-content">
... ... @@ -81,9 +91,14 @@
81 91 </div>
82 92 </div>
83 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 100 <p class="down-txt" slot="down">
86   - 通过Excel名单导入学校名单,点击
  101 + 通过Excel导入学校全部班级名单,点击
87 102 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
88 103 </p>
89 104 </up-load>
... ... @@ -230,9 +245,9 @@ export default {
230 245 },
231 246 data() {
232 247 return {
233   - code: "",//长水跳转标志
  248 + code: "", //长水跳转标志
234 249 loading: false,
235   - url: "xxx",
  250 + url: "/api_html/school/manager/importClassAndStudent",
236 251 diaUp: false,
237 252 diaSchool: false,
238 253 diaGrade: false,
... ... @@ -246,7 +261,8 @@ export default {
246 261 tenantName: "",
247 262 },
248 263 tableData: [],
249   - formSchool: {//修改学校
  264 + formSchool: {
  265 + //修改学校
250 266 sections: "",
251 267 managePwd: "",
252 268 contactPerson: "",
... ... @@ -264,7 +280,8 @@ export default {
264 280 },
265 281 ],
266 282 },
267   - formGrade: {//修改年级
  283 + formGrade: {
  284 + //修改年级
268 285 gradeName: "",
269 286 subjectNames: [],
270 287 classList: [],
... ... @@ -292,23 +309,26 @@ export default {
292 309 this._QuerySubject();
293 310 },
294 311 methods: {
295   - upSuccess(){//导入成功
296   - this.diaUp = false
  312 + upSuccess() {
  313 + //导入成功
  314 + this.diaUp = false;
297 315 this._QueryDataSchool();
298 316 this._QueryDataGrade();
299 317 },
300   - setGrade(obj) {//打开年级设置
  318 + setGrade(obj) {
  319 + //打开年级设置
301 320 this.formGrade.subjectNames = obj.subjectNames;
302 321 this.formGrade.classList = obj.classList;
303 322 this.formGrade.gradeName = obj.gradeName;
304 323 this.showAll = false;
305 324 this.diaGrade = true;
306 325 },
307   - addSubjectName() {//添加科目
  326 + addSubjectName() {
  327 + //添加科目
308 328 if (!this.subjectName) {
309 329 this.$message.warning("请填写科目名称");
310 330 return;
311   - }else if(this.subjectList.includes(this.subjectName)){
  331 + } else if (this.subjectList.includes(this.subjectName)) {
312 332 this.$message.warning("科目已存在,请重新填写~");
313 333 return;
314 334 }
... ... @@ -316,7 +336,8 @@ export default {
316 336 this.formGrade.subjectNames.push(this.subjectName);
317 337 this.subjectName = "";
318 338 },
319   - editSchool() {//保存修改学校信息
  339 + editSchool() {
  340 + //保存修改学校信息
320 341 if (!this.formSchool.sections.length) {
321 342 this.$message.error("请选择学段!");
322 343 return;
... ... @@ -349,7 +370,8 @@ export default {
349 370 }
350 371 });
351 372 },
352   - async editGrade() {//保存修改年级信息
  373 + async editGrade() {
  374 + //保存修改年级信息
353 375 if (!this.formGrade.subjectNames.length) {
354 376 this.$message.error("请选择科目!");
355 377 return;
... ... @@ -371,7 +393,8 @@ export default {
371 393 this.$message.error(info);
372 394 }
373 395 },
374   - async _QueryDataSchool() {//学校详情
  396 + async _QueryDataSchool() {
  397 + //学校详情
375 398 this.loading = true;
376 399 const { data, status, info } = await this.$request.schoolDetail();
377 400 this.loading = false;
... ... @@ -406,18 +429,29 @@ export default {
406 429 }
407 430 },
408 431 async downExcel() {
409   - let data = await this.$request.downDevice({
410   - id: this.id,
411   - });
  432 + let data = await this.$request.classAndStudentTemplate();
412 433 if (data && !data.code) {
413 434 let blob = new Blob([data], {
414 435 type: "application/vnd.ms-excel;charset=utf-8",
415 436 });
416   - downloadFile(`设备信息.xlsx`, blob);
  437 + downloadFile(`班级名单模版.xlsx`, blob);
417 438 } else {
418 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 457 </script>
... ...
src/views/standard/setUp/student.vue
... ... @@ -347,19 +347,6 @@ export default {
347 347 this.diaUp = false;
348 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 350 async removeStu(obj, index) {
364 351 const { data, status, info } = await this.$request.delStudent({
365 352 studentId: obj.id,
... ... @@ -470,6 +457,19 @@ export default {
470 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 475 </script>
... ...
src/views/standard/setUp/teacher.vue
... ... @@ -5,7 +5,7 @@
5 5 <span>教师管理</span>
6 6 </template>
7 7 <template slot="btns" v-if="!code">
8   - <!-- <el-tooltip effect="dark" content="导入教师名单" placement="bottom">
  8 + <el-tooltip effect="dark" content="导入教师名单" placement="bottom">
9 9 <el-button
10 10 type="primary"
11 11 icon="el-icon-upload2"
... ... @@ -14,7 +14,17 @@
14 14 circle
15 15 @click="diaUp = true"
16 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 28 <el-tooltip effect="dark" content="添加教师" placement="bottom">
19 29 <el-button
20 30 type="primary"
... ... @@ -217,7 +227,12 @@
217 227 </div>
218 228 </div>
219 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 236 <p class="down-txt" slot="down">
222 237 通过Excel名单导入教师名单,点击
223 238 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
... ... @@ -300,7 +315,8 @@
300 315 >
301 316 </el-option>
302 317 </el-select>
303   - <el-cascader size="small"
  318 + <el-cascader
  319 + size="small"
304 320 v-if="item.roleId == 6"
305 321 class="sel-t"
306 322 collapse
... ... @@ -310,7 +326,8 @@
310 326 :options="gradeClassList"
311 327 :props="{ expandTrigger: 'hover' }"
312 328 ></el-cascader>
313   - <el-cascader size="small"
  329 + <el-cascader
  330 + size="small"
314 331 v-if="item.roleId == 7"
315 332 class="sel-t"
316 333 collapse
... ... @@ -320,7 +337,8 @@
320 337 :options="classList"
321 338 :props="{ expandTrigger: 'hover' }"
322 339 ></el-cascader>
323   - <el-cascader size="small"
  340 + <el-cascader
  341 + size="small"
324 342 v-if="item.roleId == 8"
325 343 class="sel-t"
326 344 collapse
... ... @@ -346,13 +364,13 @@
346 364 </template>
347 365  
348 366 <script>
349   -import { downloadFile, formatGradeClass, randomWord } from "@/utils";
  367 +import { downloadFile, formatGradeClass, randomWord, getBlob } from "@/utils";
350 368 export default {
351 369 data() {
352 370 return {
353 371 code: "",
354 372 loading: false,
355   - url: "",
  373 + url: "/api_html/school/manager/importTeacher",
356 374 diaUp: false,
357 375 diaTeacher: false,
358 376 isAdd: false,
... ... @@ -423,8 +441,9 @@ export default {
423 441 await this._QueryClass();
424 442 },
425 443 methods: {
426   - upSuccess(){//导入成功
427   - this.diaUp = false
  444 + upSuccess() {
  445 + //导入成功
  446 + this.diaUp = false;
428 447 this._QueryData(10);
429 448 },
430 449 addRoleList() {
... ... @@ -494,7 +513,6 @@ export default {
494 513 ...obj,
495 514 });
496 515 } else {
497   -
498 516 res = await this.$request.updateTeacher({
499 517 teacherId: this.formTeacher.id,
500 518 teacherName: this.formTeacher.teacherName,
... ... @@ -626,7 +644,7 @@ export default {
626 644 //角色
627 645 const { data, status, info } = await this.$request.delTeacherManager({
628 646 teacherId: obj.teacherId,
629   - ...query
  647 + ...query,
630 648 });
631 649 if (status === 0) {
632 650 this._QueryData(10);
... ... @@ -755,16 +773,27 @@ export default {
755 773 }
756 774 },
757 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 791 let blob = new Blob([data], {
763 792 type: "application/vnd.ms-excel;charset=utf-8",
764 793 });
765 794 downloadFile(`教师名单.xlsx`, blob);
766 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 1 <template>
2   - <div ref="main" class="page-container" :class="dialogVisible ? 'active' : ''">
  2 + <div ref="main" class="page-container">
3 3 <back-box>
4 4 <template slot="title">
5 5 <span>单卷分析</span>
... ... @@ -53,7 +53,7 @@
53 53 >作答明细表</span
54 54 >
55 55 </div>
56   - <div class="table-box" v-loading="loading">
  56 + <div id="print-content" class="table-box" v-loading="loading">
57 57 <el-table
58 58 :max-height="tableMaxHeight"
59 59 v-show="type == 1"
... ... @@ -131,15 +131,19 @@
131 131 :label="item.title"
132 132 :prop="'count' + index"
133 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 147 </el-table-column>
144 148 </el-table>
145 149 <div class="hui-box" v-show="type == 1">
... ... @@ -340,9 +344,7 @@
340 344 :label="'Q' + item.id"
341 345 >
342 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 348 <span
347 349 v-else-if="scope.row['answer' + item.id]"
348 350 :class="scope.row['isRight' + item.id] ? '' : 'error'"
... ... @@ -352,11 +354,14 @@
352 354 <span
353 355 v-else
354 356 :class="scope.row['questionType' + item.id] == 5 ? '' : 'error'"
355   - >-</span>
  357 + >-</span
  358 + >
356 359 </template>
357 360 </el-table-column>
358 361 </el-table>
359   - <div class="down">
  362 + </div>
  363 + <div class="down">
  364 + <div>
360 365 <el-button
361 366 @click="exportData"
362 367 type="primary"
... ... @@ -365,33 +370,32 @@
365 370 icon="fa fa-cloud-download"
366 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 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 399 </div>
396 400 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600">
397 401 <up-load
... ... @@ -417,17 +421,14 @@
417 421 </template>
418 422  
419 423 <script>
420   -import { downloadFile } from "@/utils";
421   -import editAnswer from "./editAnswer.vue";
  424 +import { downloadFile, tablePrint } from "@/utils";
422 425 export default {
423   - components: { editAnswer },
424 426 data() {
425 427 return {
426 428 tableMaxHeight: 600,
427 429 loading: false,
428 430 exportLoading: false,
429 431 diaUp: false,
430   - dialogVisible: false,
431 432 url: "/api_html/teaching/importSubjectiveScore",
432 433 id: "",
433 434 title: "",
... ... @@ -466,10 +467,12 @@ export default {
466 467 created() {
467 468 this.id = this.$route.query.id;
468 469 this.title = this.$route.query.title || "";
469   - this.score = this.$route.query.score || "";
470 470 this._QueryData();
471 471 },
472 472 methods: {
  473 + print() {
  474 + tablePrint("print-content");
  475 + },
473 476 upSuccess() {
474 477 //导入成功
475 478 this.diaUp = false;
... ... @@ -499,15 +502,14 @@ export default {
499 502 return tit;
500 503 },
501 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 514 changePage(page) {
513 515 this.page = page;
... ... @@ -568,7 +570,9 @@ export default {
568 570 }
569 571 detail.map((items, index) => {
570 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 576 params["answer" + items.id] =
573 577 items.answer == 1 ? "✓" : items.answer == 2 ? "✗" : items.answer;
574 578 params["isRight" + items.id] = items.isRight;
... ... @@ -608,13 +612,17 @@ export default {
608 612 let defaultArr = detail?.filter((item) => {
609 613 return item.option != "未答";
610 614 });
611   -
  615 +
612 616 optionsList.map((items, index) => {
613 617 if (index != 4) {
614 618 params["count" + index] =
615   - defaultArr[index]?.option != "未答" ? defaultArr[index]?.count : "";
  619 + defaultArr[index]?.option != "未答"
  620 + ? defaultArr[index]?.count
  621 + : "";
616 622 params["persent" + index] =
617   - defaultArr[index]?.option != "未答" ? defaultArr[index]?.persent : "";
  623 + defaultArr[index]?.option != "未答"
  624 + ? defaultArr[index]?.persent
  625 + : "";
618 626 params["option" + index] =
619 627 defaultArr[index]?.option != "未答"
620 628 ? defaultArr[index]?.option == 1
... ... @@ -651,17 +659,14 @@ export default {
651 659 if (this.exportLoading == true) return;
652 660 this.exportLoading = true;
653 661 const data = await this.$request.exportExamReport({
654   - examId:this.id
  662 + examId: this.id,
655 663 });
656 664 this.exportLoading = false;
657 665 if (data) {
658   - let blob = new Blob([data], {
  666 + let blob = new Blob([data], {
659 667 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
660 668 });
661   - downloadFile(
662   - "即时测-单卷测练报表.xlsx",
663   - blob
664   - );
  669 + downloadFile("即时测-单卷测练报表.xlsx", blob);
665 670 } else {
666 671 this.$message.error("下载失败");
667 672 }
... ... @@ -715,7 +720,7 @@ div::-webkit-scrollbar-thumb {
715 720 z-index: 10;
716 721 }
717 722 }
718   -.persent{
  723 +.persent {
719 724 white-space: nowrap;
720 725 }
721 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 0 \ No newline at end of file
src/views/standard/test/index.vue
... ... @@ -329,96 +329,105 @@
329 329 description="没有更多数据"
330 330 ></el-empty>
331 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 340 <el-table-column
358   - :prop="'score' + index"
359   - :label="index == 0 ? '总分' : '成绩'"
  341 + prop="studentCode"
  342 + label="学号"
360 343 align="center"
361   - :class-name="index % 2 == 0 ? 'bg' : ''"
  344 + fixed
362 345 ></el-table-column>
363 346 <el-table-column
364   - :prop="'classRank' + index"
365   - label="班名"
  347 + prop="studentName"
  348 + label="姓名"
  349 + fixed
366 350 align="center"
367   - :class-name="index % 2 == 0 ? 'bg' : ''"
368 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 352 <el-table-column
397   - :prop="'examCount' + item"
398   - label="测练数"
399 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 379 <el-table-column
403   - :prop="'participationCount' + item"
404   - label="参与数"
  380 + prop="studentCode"
  381 + label="学号"
405 382 align="center"
406   - :class-name="index % 2 == 0 ? 'bg' : ''"
  383 + fixed
407 384 ></el-table-column>
  385 +
408 386 <el-table-column
409   - :prop="'score' + item"
410   - label="总分"
  387 + prop="studentName"
  388 + label="姓名"
  389 + fixed
411 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 398 <el-table-column
415   - :prop="'classRank' + item"
416   - label="班名"
417 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 431 </template>
423 432 </div>
424 433 <p class="down" v-if="tabIndex == 2 && tableData.length">
... ... @@ -430,6 +439,14 @@
430 439 @click="downExl"
431 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 450 </p>
434 451 </div>
435 452 <el-dialog title="导入主观题分数" :visible.sync="diaUp" width="600">
... ... @@ -452,24 +469,13 @@
452 469 <el-button @click="diaUp = false">取 消</el-button>
453 470 </div>
454 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 472 </div>
465 473 </template>
466 474  
467 475 <script>
468   -import { formatDate, downloadFile } from "utils";
469   -import editAnswer from "./editAnswer.vue";
  476 +import { formatDate, downloadFile, tablePrint } from "utils";
470 477 import BusEvent from "@/utils/busEvent";
471 478 export default {
472   - components: { editAnswer },
473 479 data() {
474 480 return {
475 481 exportLoading: false,
... ... @@ -480,7 +486,6 @@ export default {
480 486 loadingDown: false,
481 487 url: "/api_html/teaching/importSubjectiveScore",
482 488 examId: "",
483   - dialogVisible: false,
484 489 form: {
485 490 id: "",
486 491 title: "",
... ... @@ -506,7 +511,9 @@ export default {
506 511 };
507 512 },
508 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 517 await this._QueryClassList();
511 518 await this._QuerySubjectList();
512 519 await this.setDate(1);
... ... @@ -530,7 +537,11 @@ export default {
530 537 });
531 538 },
532 539 methods: {
533   - changeSub(val) {//科目改变触发事件
  540 + print() {
  541 + tablePrint("print-content");
  542 + },
  543 + changeSub(val) {
  544 + //科目改变触发事件
534 545 let sub;
535 546 if (val && val.length) {
536 547 let leng = val.length - 1;
... ... @@ -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 593 this.examId = obj.id;
557 594 this.diaUp = true;
558 595 },
559   - cancel() {
560   - this.dialogVisible = false;
561   - },
562   - saveSuccess() {//修改答案回调
563   - this.dialogVisible = false;
564   - this._QueryData();
565   - },
566 596 setDate(index) {
567 597 const that = this;
568 598 this.date = index == this.date ? "" : index;
... ... @@ -638,9 +668,14 @@ export default {
638 668 this._QueryData();
639 669 },
640 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 680 changeTab() {
646 681 this.tableMaxHeight = this.$refs.main.offsetHeight;
... ... @@ -848,7 +883,8 @@ export default {
848 883 this.$message.error(info);
849 884 }
850 885 },
851   - async downExl() {//报表到处
  886 + async downExl() {
  887 + //报表到处
852 888 if (this.exportLoading == true) return;
853 889 let query = {};
854 890 for (let key in this.query) {
... ... @@ -892,7 +928,8 @@ export default {
892 928 this.$message.error("下载失败");
893 929 }
894 930 },
895   - async downExcel() {//模板下载
  931 + async downExcel() {
  932 + //模板下载
896 933 this.loadingDown = true;
897 934 let data = await this.$request.subjectiveScoreTemplate({
898 935 examId: this.examId,
... ... @@ -944,16 +981,7 @@ div::-webkit-scrollbar-thumb {
944 981 .down {
945 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 987 </style>
960 988 \ No newline at end of file
... ...
vue.config.js
... ... @@ -22,7 +22,6 @@ module.exports = {
22 22 },
23 23 proxy: {
24 24 "/": {
25   - // target:"http://47.104.214.8",
26 25 target:"http://121.40.127.171",
27 26 changeOrigin: true,
28 27 ws:true,
... ...