Files
education/frontend/node_modules/.cache/vue-loader/959062f0a771b51e81c00480ce259f37.json
T

1 line
35 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\PeidangEditDialog.vue?vue&type=style&index=0&id=5173a142&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\PeidangEditDialog.vue","mtime":1787473496107},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\css-loader\\dist\\cjs.js","mtime":1787309792478},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":1787309794547},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\postcss-loader\\src\\index.js","mtime":1787309793084},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\sass-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQoucGVpZGFuZy1kaWFsb2cgew0KICAvLyA9PT09PT09PT09IOiHquWumuS5ieagh+mimOagjyA9PT09PT09PT09DQogIDo6di1kZWVwIC5lbC1kaWFsb2dfX2hlYWRlciB7DQogICAgbWFyZ2luOiAwOw0KICAgIHBhZGRpbmc6IDA7DQogIH0NCg0KICAucGVpZGFuZy10aXRsZWJhciB7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgIGdhcDogOHB4Ow0KICAgIGhlaWdodDogNDBweDsNCiAgICBwYWRkaW5nOiAwIDE0cHg7DQogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMGEyNDZhIDAlLCAjYTZjYWYwIDEwMCUpOw0KICAgIGNvbG9yOiAjZmZmOw0KDQogICAgLnRpdGxlLWljb24gew0KICAgICAgZm9udC1zaXplOiAxOHB4Ow0KICAgICAgY29sb3I6ICNmZmY7DQogICAgfQ0KDQogICAgLnRpdGxlLXRleHQgew0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgIGNvbG9yOiAjZmZmOw0KICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Ow0KICAgIH0NCiAgfQ0KDQogIDo6di1kZWVwIC5lbC1kaWFsb2dfX2JvZHkgew0KICAgIHBhZGRpbmc6IDEycHg7DQogIH0NCg0KICA6OnYtZGVlcCAuZWwtZGlhbG9nX19mb290ZXIgew0KICAgIHBhZGRpbmc6IDhweCAxMnB4Ow0KICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICB9DQoNCiAgLnBlaWRhbmctZm9vdGVyIHsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7DQogICAgZ2FwOiA4cHg7DQogIH0NCn0NCg0KLnBlaWRhbmctYm9keSB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQogIGdhcDogMTBweDsNCg0KICAvLyA9PT09PT09PT09IOS4iuWNiumDqOWIhu+8muW3puWPs+WIhuagjyA9PT09PT09PT09DQogIC51cHBlciB7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBnYXA6IDEwcHg7DQoNCiAgICAvLyDlt6bkvqcgNzUl77ya6KGo5qC8DQogICAgLnRhYmxlLWFyZWEgew0KICAgICAgZmxleDogMzsNCiAgICAgIG1pbi13aWR0aDogMDsNCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgICBib3JkZXItcmFkaXVzOiA0cHg7DQogICAgICBwYWRkaW5nOiA2cHg7DQogICAgICBvdmVyZmxvdzogaGlkZGVuOw0KDQogICAgICAucGVpZGFuZy10YWJsZSB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIOWPs+S+pyAyNSXvvJrlsZ7mgKforr7nva4NCiAgICAucHJvcC1hcmVhIHsNCiAgICAgIGZsZXg6IDE7DQogICAgICBtaW4td2lkdGg6IDI0MHB4Ow0KICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ViZWVmNTsNCiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsNCg0KICAgICAgLnByb3AtdGl0bGUgew0KICAgICAgICBmb250LXNpemU6IDE0cHg7DQogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgIGNvbG9yOiAjMzAzMTMzOw0KICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7DQogICAgICAgIHBhZGRpbmctYm90dG9tOiA2cHg7DQogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWJlZWY1Ow0KICAgICAgfQ0KDQogICAgICAucHJvcC1mb3JtIHsNCiAgICAgICAgLnByaW9yaXR5LWZpZWxkIHsNCiAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgZ2FwOiA0cHg7DQogICAgICAgICAgd2lkdGg6IDEwMCU7DQoNCiAgICAgICAgICAuZWwtYnV0dG9uIHsNCiAgICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOw0KICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC5hcHBseS1idG4gew0KICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgbWFyZ2luLXRvcDogNHB4Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vID09PT09PT09PT0g5LiL5Y2K6YOo5YiG77ya6YWN5qGj5pi+56S65Yy65Z+fID09PT09PT09PT0NCiAgLmdhbnR0LWFyZWEgew0KICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICAgIHBhZGRpbmc6IDhweDsNCiAgICBvdmVyZmxvdzogYXV0bzsNCiAgICBtYXgtaGVpZ2h0OiAzMjBweDsNCg0KICAgIC5nYW50dC1oZWFkLA0KICAgIC5nYW50dC1jb3Vyc2UsDQogICAgLmdhbnR0LWZvb3Qgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOw0KICAgICAgbWluLXdpZHRoOiA4NjBweDsNCiAgICB9DQoNCiAgICAuZ2FudHQtbGFiZWwtY29sIHsNCiAgICAgIGZsZXgtc2hyaW5rOiAwOw0KICAgICAgd2lkdGg6IDIxMHB4Ow0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQoNCiAgICAgIC5nYW50dC1sYWJlbCB7DQogICAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICAgICAgY29sb3I6ICM2MDYyNjY7DQogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICB9DQogICAgfQ0KDQogICAgLmdhbnR0LWJvZHkgew0KICAgICAgZmxleDogMTsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KICAgIH0NCg0KICAgIC5nYW50dC1yb3cgew0KICAgICAgZGlzcGxheTogZmxleDsNCg0KICAgICAgLmdhbnR0LWNlbGwgew0KICAgICAgICBmbGV4OiAxOw0KICAgICAgICBtaW4td2lkdGg6IDM0cHg7DQogICAgICAgIGhlaWdodDogMjRweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICAgZm9udC1zaXplOiAxMXB4Ow0KICAgICAgICBjb2xvcjogIzMwMzEzMzsNCiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2ViZWVmNTsNCiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KICAgICAgfQ0KDQogICAgICAvLyDlkajliLvluqbvvJrpobbpg6jnuqLoibLnq5bnur8NCiAgICAgIC53ZWVrLWNlbGwgew0KICAgICAgICBmb250LXdlaWdodDogNjAwOw0KICAgICAgICBjb2xvcjogI2Y1NmM2YzsNCiAgICAgICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNmNTZjNmM7DQogICAgICAgIGJhY2tncm91bmQ6ICNmZmY1ZjU7DQogICAgICB9DQoNCiAgICAgIC5pbmZvLXJvdyAuZ2FudHQtY2VsbCB7DQogICAgICAgIGhlaWdodDogMjBweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7DQoNCiAgICAgICAgLnNjaCB7DQogICAgICAgICAgY29sb3I6ICMxZTZmZmY7DQogICAgICAgIH0NCg0KICAgICAgICAucmVtIHsNCiAgICAgICAgICBjb2xvcjogI2U2YTIzYzsNCiAgICAgICAgICBtYXJnaW4tbGVmdDogMnB4Ow0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIOaciOWIu+W6puiZmue6vw0KICAgICAgLm1vbnRoLWJvdW5kYXJ5IHsNCiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgIzkwOTM5OTsNCiAgICAgIH0NCg0KICAgICAgLy8g6K++56iL5p2hDQogICAgICAuYmFyLWNlbGwgew0KICAgICAgICBoZWlnaHQ6IDI2cHg7DQogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCg0KICAgICAgICAuYmFyLWhvdXJzIHsNCiAgICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgfQ0KDQogICAgICAgICYuYmFyLWFjdGl2ZSB7DQogICAgICAgICAgJi5iYXItbm9ybWFsIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM0MDllZmY7DQogICAgICAgICAgICBjb2xvcjogI2ZmZjsNCg0KICAgICAgICAgICAgLmJhci1ob3VycyB7DQogICAgICAgICAgICAgIGNvbG9yOiAjZmZmOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCg0KICAgICAgICAgICYuYmFyLWNvbnRpbnVvdXMgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y1NmM2YzsNCiAgICAgICAgICAgIGNvbG9yOiAjZmZmOw0KDQogICAgICAgICAgICAuYmFyLWhvdXJzIHsNCiAgICAgICAgICAgICAgY29sb3I6ICNmZmY7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC5tb250aC1jZWxsIHsNCiAgICAgICAgaGVpZ2h0OiAyMnB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMjJweDsNCg0KICAgICAgICAubW9udGgtdG90YWwgew0KICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsNCiAgICAgICAgICBjb2xvcjogIzYwNjI2NjsNCiAgICAgICAgICBmb250LXdlaWdodDogNjAwOw0KICAgICAgICAgIGJhY2tncm91bmQ6ICNmNGY0ZjU7DQogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjsNCiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7DQogICAgICAgICAgcGFkZGluZzogMCA0cHg7DQogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIC5nYW50dC1jb3Vyc2Ugew0KICAgICAgLmdhbnR0LWxhYmVsLWNvbCB7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQoNCiAgICAgICAgLmNvdXJzZS10YWcgew0KICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgICAgICBnYXA6IDFweDsNCiAgICAgICAgICBwYWRkaW5nOiAycHggNnB4Ow0KICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICAgICAgICBmb250LXNpemU6IDExcHg7DQoNCiAgICAgICAgICAmLnRhZy1ub3JtYWwgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2VjZjVmZjsNCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNhMGNmZmY7DQogICAgICAgICAgICBjb2xvcjogIzMzN2VjYzsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAmLnRhZy1jb250aW51b3VzIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZWYwZjA7DQogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmJjNGM0Ow0KICAgICAgICAgICAgY29sb3I6ICNkNjMwMzE7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLmNvdXJzZS1uYW1lIHsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC5jb3Vyc2UtaG91cnMgew0KICAgICAgICAgICAgZm9udC1zaXplOiAxMHB4Ow0KICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAuZ2FudHQtZm9vdCB7DQogICAgICAuZ2FudHQtbGFiZWwtY29sIHsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["PeidangEditDialog.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwaA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA","file":"PeidangEditDialog.vue","sourceRoot":"src/views/teachOffice/shiftSemester","sourcesContent":["<template>\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :show-close=\"false\"\r\n width=\"96%\"\r\n top=\"3vh\"\r\n :close-on-click-modal=\"false\"\r\n :close-on-press-escape=\"false\"\r\n class=\"peidang-dialog\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <!-- ==================== 自定义标题栏 ==================== -->\r\n <div slot=\"header\">\r\n <div class=\"peidang-titlebar\">\r\n <i class=\"el-icon-reading title-icon\"></i>\r\n <span class=\"title-text\">\r\n 班次学期配档——{{ semesterName }}——{{ classLabel }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"peidang-body\">\r\n <!-- ==================== 上半部分:左右分栏 ==================== -->\r\n <div class=\"upper\">\r\n <!-- 左侧 75%:配档课程编组管理表格 -->\r\n <div class=\"table-area\">\r\n <el-table\r\n ref=\"tableRef\"\r\n :data=\"displayCourses\"\r\n border\r\n stripe\r\n highlight-current-row\r\n size=\"small\"\r\n max-height=\"240\"\r\n class=\"peidang-table\"\r\n @current-change=\"handleCurrentChange\"\r\n >\r\n <el-table-column prop=\"name\" label=\"科目名称\" width=\"100\" align=\"left\" header-align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"short\" label=\"简称\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"planStart\" label=\"计划起始周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"actualStart\" label=\"实际起始周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"endWeek\" label=\"结束周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"连排课\" width=\"50\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-checkbox :value=\"row.continuous\" />\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"priority\" label=\"优先序数\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"weeklyHours\" label=\"周学时\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"hours\" label=\"学时\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"正课时间\" width=\"60\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-checkbox :value=\"row.scheduleTime\" />\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"已排学时\" width=\"50\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ courseStats(row).scheduled }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"未排学时\" width=\"50\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ courseStats(row).remaining }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"总班次任务数\" width=\"70\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ row.continuous ? 1 : 1 }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"配档编组任务数\" width=\"80\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ row.continuous ? 2 : 1 }}</template>\r\n </el-table-column>\r\n </el-table>\r\n </div>\r\n\r\n <!-- 右侧 25%:配档课程属性设置区 + 优先序数上下移动 -->\r\n <div class=\"prop-area\">\r\n <div class=\"prop-title\">配档课程属性</div>\r\n <el-form label-width=\"72px\" size=\"small\" class=\"prop-form\">\r\n <el-form-item label=\"周学时\">\r\n <el-input-number v-model=\"propForm.weeklyHours\" :min=\"1\" :max=\"40\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"起始周次\">\r\n <el-input-number v-model=\"propForm.startWeek\" :min=\"startWeek\" :max=\"endWeek\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"结束周次\">\r\n <el-input-number v-model=\"propForm.endWeek\" :min=\"startWeek\" :max=\"endWeek\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"连排课\">\r\n <el-checkbox v-model=\"propForm.continuous\">单科独进</el-checkbox>\r\n </el-form-item>\r\n <el-form-item label=\"优先序数\">\r\n <div class=\"priority-field\">\r\n <el-input-number v-model=\"propForm.priority\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n <el-button type=\"primary\" plain icon=\"el-icon-arrow-up\" @click=\"handlePriorityUp\" />\r\n <el-button type=\"primary\" plain icon=\"el-icon-arrow-down\" @click=\"handlePriorityDown\" />\r\n </div>\r\n </el-form-item>\r\n <el-form-item label=\"配档编组\">\r\n <el-input v-model=\"propForm.group\" />\r\n </el-form-item>\r\n </el-form>\r\n <el-button type=\"primary\" class=\"apply-btn\" @click=\"handleApplyProp\">应用属性</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 下半部分:配档显示区域(甘特图) ==================== -->\r\n <div class=\"gantt-area\">\r\n <div class=\"gantt-head\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"gantt-label\">课程 / 周次</div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <!-- 行1:周次刻度(红色竖线为周刻度) -->\r\n <div class=\"gantt-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell week-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >{{ w }}</div>\r\n </div>\r\n <!-- 行2:本周可安排正课学时 -->\r\n <div class=\"gantt-row info-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >可排{{ weeklyCapacity }}</div>\r\n </div>\r\n <!-- 行3:已安排学时 / 剩余学时 -->\r\n <div class=\"gantt-row info-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >\r\n <span class=\"sch\">已{{ monthlyScheduled(w) }}</span>\r\n <span class=\"rem\">余{{ Math.max(0, weeklyCapacity - monthlyScheduled(w)) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 课程甘特条 -->\r\n <div class=\"gantt-courses\">\r\n <div v-for=\"course in displayCourses\" :key=\"course.id\" class=\"gantt-course\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"course-tag\" :class=\"course.continuous ? 'tag-continuous' : 'tag-normal'\">\r\n <span class=\"course-name\">{{ course.name }}({{ course.short }})</span>\r\n <span class=\"course-hours\">\r\n 已排{{ courseStats(course).scheduled }}\r\n <template v-if=\"courseStats(course).remaining > 0\">+{{ courseStats(course).remaining }}</template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <div class=\"gantt-row bar-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell bar-cell\"\r\n :class=\"{\r\n 'month-boundary': isMonthBoundary(w),\r\n 'bar-active': w >= course.actualStart && w <= course.endWeek,\r\n 'bar-continuous': course.continuous,\r\n 'bar-normal': !course.continuous\r\n }\"\r\n >\r\n <span v-if=\"w >= course.actualStart && w <= course.endWeek\" class=\"bar-hours\">\r\n {{ courseWeekHours(course)[w] || '' }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部:本月可安排正课总学时(月刻度) -->\r\n <div class=\"gantt-foot\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"gantt-label\">本月正课总学时</div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <div class=\"gantt-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell month-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >\r\n <span v-if=\"bottomCells[w] && isMonthEndWeek(w)\" class=\"month-total\">\r\n 第{{ bottomCells[w].no }}月:可排{{ bottomCells[w].total }}(已排{{ bottomCells[w].scheduled }} + 余{{ bottomCells[w].remaining }})\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 底部操作 ==================== -->\r\n <div slot=\"footer\">\r\n <div class=\"peidang-footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" @click=\"handleConfirm\">确定</el-button>\r\n </div>\r\n </div>\r\n </el-dialog>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'PeidangEditDialog',\r\n props: {\r\n visible: { type: Boolean, default: false },\r\n /** 学年学期名称 */\r\n semesterName: { type: String, default: '2017-2018学年第一学期' },\r\n /** 班次标签(如 教学五系2016级专业0113班次0417) */\r\n classLabel: { type: String, default: '教学五系2016级专业0113班次0417' }\r\n },\r\n data() {\r\n return {\r\n // ==================== 时间轴参数 ====================\r\n /** 该班次开学起始周次 */\r\n startWeek: 8,\r\n /** 该班次学期结束周次 */\r\n endWeek: 32,\r\n /** 该班次每周可安排的正课学时时数(去除不能排课学时) */\r\n weeklyCapacity: 40,\r\n /** 月刻度:每 4 周为一月(8-11 第1月,12-15 第2月...),虚线分隔 */\r\n monthBreaks: [12, 16, 20, 24, 28, 32],\r\n\r\n // ==================== 配档课程数据 ====================\r\n courses: [\r\n // ---- 非连排课(按周学时安排,蓝色,每门独立一组) ----\r\n { id: 'p1', name: '课程科目001', short: '政治', planStart: 8, actualStart: 8, endWeek: 23, continuous: false, priority: 1, weeklyHours: 4, hours: 60, scheduleTime: true, group: '组1' },\r\n { id: 'p2', name: '课程科目002', short: '军事', planStart: 8, actualStart: 8, endWeek: 20, continuous: false, priority: 2, weeklyHours: 4, hours: 48, scheduleTime: true, group: '组2' },\r\n { id: 'p3', name: '课程科目003', short: '战术', planStart: 8, actualStart: 10, endWeek: 21, continuous: false, priority: 3, weeklyHours: 4, hours: 44, scheduleTime: true, group: '组3' },\r\n { id: 'p4', name: '课程科目004', short: '指挥', planStart: 8, actualStart: 12, endWeek: 22, continuous: false, priority: 4, weeklyHours: 4, hours: 40, scheduleTime: true, group: '组4' },\r\n // ---- 连排课(单科独进,红色,共为一组) ----\r\n { id: 'p5', name: '课程科目005', short: '综合演练', planStart: 8, actualStart: 8, endWeek: 13, continuous: true, priority: 5, weeklyHours: 20, hours: 100, scheduleTime: true, group: '连排组' },\r\n { id: 'p6', name: '课程科目006', short: '野营拉练', planStart: 14, actualStart: 14, endWeek: 16, continuous: true, priority: 6, weeklyHours: 24, hours: 48, scheduleTime: true, group: '连排组' }\r\n ],\r\n\r\n // ==================== 表格选中与属性设置 ====================\r\n currentCourse: null,\r\n propForm: {\r\n weeklyHours: 4,\r\n startWeek: 8,\r\n endWeek: 16,\r\n continuous: false,\r\n priority: 1,\r\n group: ''\r\n }\r\n }\r\n },\r\n computed: {\r\n dialogVisible: {\r\n get() {\r\n return this.visible\r\n },\r\n set(val) {\r\n this.$emit('update:visible', val)\r\n }\r\n },\r\n /** 周序列:8 ~ 32 */\r\n weeks() {\r\n const arr = []\r\n for (let w = this.startWeek; w <= this.endWeek; w++) arr.push(w)\r\n return arr\r\n },\r\n /** 月份信息:每月包含的周次与可安排正课学时 */\r\n months() {\r\n const list = []\r\n let mNo = 1\r\n let cur = this.startWeek\r\n while (cur <= this.endWeek) {\r\n const next = this.monthBreaks.find((b) => b > cur)\r\n const mEnd = Math.min((next === undefined ? this.endWeek + 1 : next) - 1, this.endWeek)\r\n list.push({ no: mNo, start: cur, end: mEnd, total: (mEnd - cur + 1) * this.weeklyCapacity })\r\n cur = mEnd + 1\r\n mNo++\r\n }\r\n return list\r\n },\r\n /** 底部每月汇总行数据:week -> 该月信息(仅月首格展示文字) */\r\n bottomCells() {\r\n const map = {}\r\n this.weeks.forEach((w) => {\r\n const m = this.months.find((item) => w >= item.start && w <= item.end)\r\n if (!m) return\r\n map[w] = {\r\n no: m.no,\r\n total: m.total,\r\n scheduled: this.monthlyScheduled(w),\r\n remaining: m.total - this.monthlyScheduled(w)\r\n }\r\n })\r\n return map\r\n },\r\n /** 表格展示顺序:非连排课在前,连排课在后;组内按实际起始周、优先序数排序 */\r\n displayCourses() {\r\n return [...this.courses].sort((a, b) => {\r\n if (a.continuous !== b.continuous) return a.continuous ? 1 : -1\r\n if (a.actualStart !== b.actualStart) return a.actualStart - b.actualStart\r\n return a.priority - b.priority\r\n })\r\n }\r\n },\r\n watch: {\r\n visible(val) {\r\n if (!val) return\r\n this.$nextTick(() => {\r\n if (this.$refs.tableRef) {\r\n this.$refs.tableRef.setCurrentRow(this.displayCourses[0])\r\n }\r\n this.currentCourse = this.displayCourses[0] || null\r\n this.syncPropForm()\r\n })\r\n }\r\n },\r\n methods: {\r\n /** 是否为月边界列(左侧画虚线) */\r\n isMonthBoundary(week) {\r\n return this.monthBreaks.includes(week)\r\n },\r\n /** 是否为某月的结束周(仅月结束列展示文字) */\r\n isMonthEndWeek(week) {\r\n return this.months.some((m) => m.end === week)\r\n },\r\n\r\n /** 某周所有课程已安排学时之和 */\r\n monthlyScheduled(week) {\r\n return this.courses.reduce((sum, c) => {\r\n const map = this.courseWeekHours(c)\r\n return sum + (map[week] !== undefined ? map[week] : 0)\r\n }, 0)\r\n },\r\n\r\n /** 每门课程按周分布的安排学时 */\r\n courseWeekHours(course) {\r\n const map = {}\r\n let remaining = course.hours\r\n let w = course.actualStart\r\n while (remaining > 0 && w <= course.endWeek) {\r\n const h = Math.min(course.weeklyHours, remaining)\r\n map[w] = h\r\n remaining -= h\r\n w++\r\n }\r\n return map\r\n },\r\n\r\n /** 课程计算属性:已排学时 / 未排学时 */\r\n courseStats(course) {\r\n const map = this.courseWeekHours(course)\r\n const scheduled = Object.keys(map).reduce((sum, k) => sum + map[k], 0)\r\n return { scheduled, remaining: Math.max(0, course.hours - scheduled) }\r\n },\r\n\r\n handleCurrentChange(row) {\r\n this.currentCourse = row\r\n this.syncPropForm()\r\n },\r\n\r\n /** 属性设置表单同步(右侧) */\r\n syncPropForm() {\r\n if (!this.currentCourse) return\r\n this.propForm.weeklyHours = this.currentCourse.weeklyHours\r\n this.propForm.startWeek = this.currentCourse.actualStart\r\n this.propForm.endWeek = this.currentCourse.endWeek\r\n this.propForm.continuous = this.currentCourse.continuous\r\n this.propForm.priority = this.currentCourse.priority\r\n this.propForm.group = this.currentCourse.group\r\n },\r\n\r\n /** 属性设置保存:应用所选课程的配档属性 */\r\n handleApplyProp() {\r\n if (!this.currentCourse) {\r\n this.$message.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n const row = this.currentCourse\r\n row.weeklyHours = this.propForm.weeklyHours\r\n row.actualStart = this.propForm.startWeek\r\n row.endWeek = this.propForm.endWeek\r\n row.continuous = this.propForm.continuous\r\n row.priority = this.propForm.priority\r\n row.group = this.propForm.group\r\n this.$message.success('配档属性已应用(前端演示)')\r\n },\r\n\r\n /** 优先序数上移:优先序数减 1 */\r\n handlePriorityUp() {\r\n if (!this.currentCourse) {\r\n this.$message.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n if (this.currentCourse.priority <= 1) {\r\n this.$message.info('已是最高优先序数')\r\n return\r\n }\r\n this.currentCourse.priority -= 1\r\n this.syncPropForm()\r\n },\r\n\r\n /** 优先序数下移:优先序数加 1 */\r\n handlePriorityDown() {\r\n if (!this.currentCourse) {\r\n this.$message.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n this.currentCourse.priority += 1\r\n this.syncPropForm()\r\n },\r\n\r\n // ==================== 底部操作 ====================\r\n handleConfirm() {\r\n this.$emit('confirm')\r\n this.dialogVisible = false\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.peidang-dialog {\r\n // ========== 自定义标题栏 ==========\r\n ::v-deep .el-dialog__header {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .peidang-titlebar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n height: 40px;\r\n padding: 0 14px;\r\n background: linear-gradient(90deg, #0a246a 0%, #a6caf0 100%);\r\n color: #fff;\r\n\r\n .title-icon {\r\n font-size: 18px;\r\n color: #fff;\r\n }\r\n\r\n .title-text {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #fff;\r\n letter-spacing: 0.5px;\r\n }\r\n }\r\n\r\n ::v-deep .el-dialog__body {\r\n padding: 12px;\r\n }\r\n\r\n ::v-deep .el-dialog__footer {\r\n padding: 8px 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n\r\n .peidang-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n }\r\n}\r\n\r\n.peidang-body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n\r\n // ========== 上半部分:左右分栏 ==========\r\n .upper {\r\n display: flex;\r\n gap: 10px;\r\n\r\n // 左侧 75%:表格\r\n .table-area {\r\n flex: 3;\r\n min-width: 0;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 6px;\r\n overflow: hidden;\r\n\r\n .peidang-table {\r\n width: 100%;\r\n }\r\n }\r\n\r\n // 右侧 25%:属性设置\r\n .prop-area {\r\n flex: 1;\r\n min-width: 240px;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 10px 12px;\r\n\r\n .prop-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 8px;\r\n padding-bottom: 6px;\r\n border-bottom: 1px solid #ebeef5;\r\n }\r\n\r\n .prop-form {\r\n .priority-field {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n width: 100%;\r\n\r\n .el-button {\r\n flex-shrink: 0;\r\n margin-left: 0;\r\n }\r\n }\r\n }\r\n\r\n .apply-btn {\r\n width: 100%;\r\n margin-top: 4px;\r\n }\r\n }\r\n }\r\n\r\n // ========== 下半部分:配档显示区域 ==========\r\n .gantt-area {\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 8px;\r\n overflow: auto;\r\n max-height: 320px;\r\n\r\n .gantt-head,\r\n .gantt-course,\r\n .gantt-foot {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 860px;\r\n }\r\n\r\n .gantt-label-col {\r\n flex-shrink: 0;\r\n width: 210px;\r\n display: flex;\r\n align-items: center;\r\n\r\n .gantt-label {\r\n font-size: 12px;\r\n color: #606266;\r\n font-weight: 600;\r\n white-space: nowrap;\r\n }\r\n }\r\n\r\n .gantt-body {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .gantt-row {\r\n display: flex;\r\n\r\n .gantt-cell {\r\n flex: 1;\r\n min-width: 34px;\r\n height: 24px;\r\n line-height: 24px;\r\n text-align: center;\r\n font-size: 11px;\r\n color: #303133;\r\n border-right: 1px solid #ebeef5;\r\n border-bottom: 1px solid #ebeef5;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n // 周刻度:顶部红色竖线\r\n .week-cell {\r\n font-weight: 600;\r\n color: #f56c6c;\r\n border-top: 2px solid #f56c6c;\r\n background: #fff5f5;\r\n }\r\n\r\n .info-row .gantt-cell {\r\n height: 20px;\r\n line-height: 20px;\r\n\r\n .sch {\r\n color: #1e6fff;\r\n }\r\n\r\n .rem {\r\n color: #e6a23c;\r\n margin-left: 2px;\r\n }\r\n }\r\n\r\n // 月刻度虚线\r\n .month-boundary {\r\n border-left: 1px dashed #909399;\r\n }\r\n\r\n // 课程条\r\n .bar-cell {\r\n height: 26px;\r\n position: relative;\r\n\r\n .bar-hours {\r\n font-size: 11px;\r\n font-weight: 600;\r\n }\r\n\r\n &.bar-active {\r\n &.bar-normal {\r\n background: #409eff;\r\n color: #fff;\r\n\r\n .bar-hours {\r\n color: #fff;\r\n }\r\n }\r\n\r\n &.bar-continuous {\r\n background: #f56c6c;\r\n color: #fff;\r\n\r\n .bar-hours {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .month-cell {\r\n height: 22px;\r\n line-height: 22px;\r\n\r\n .month-total {\r\n font-size: 11px;\r\n color: #606266;\r\n font-weight: 600;\r\n background: #f4f4f5;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 2px;\r\n padding: 0 4px;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n\r\n .gantt-course {\r\n .gantt-label-col {\r\n align-items: center;\r\n\r\n .course-tag {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n gap: 1px;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 11px;\r\n\r\n &.tag-normal {\r\n background: #ecf5ff;\r\n border: 1px solid #a0cfff;\r\n color: #337ecc;\r\n }\r\n\r\n &.tag-continuous {\r\n background: #fef0f0;\r\n border: 1px solid #fbc4c4;\r\n color: #d63031;\r\n }\r\n\r\n .course-name {\r\n font-weight: 600;\r\n white-space: nowrap;\r\n }\r\n\r\n .course-hours {\r\n font-size: 10px;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .gantt-foot {\r\n .gantt-label-col {\r\n align-items: center;\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}