Files
education/frontend/node_modules/.cache/vue-loader/5bfa66c23706239e7b907fdf8b8f47d6.json
T

1 line
26 KiB
JSON

{"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\\teachBusiness\\syllabus\\index.vue?vue&type=style&index=0&id=d669ab88&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachBusiness\\syllabus\\index.vue","mtime":1787643791760},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoNCi5hcHAtY29udGFpbmVyIHsNCiAgcGFkZGluZzogMjBweDsNCn0NCg0KLnN5bGxhYnVzLXBhZ2Ugew0KICAuc2VhcmNoLWNhcmQgew0KICAgIG1hcmdpbi1ib3R0b206IDE2cHg7DQoNCiAgICAuc2VhcmNoLWZvcm0gew0KICAgICAgLnctZnVsbCB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgfQ0KDQogICAgICAuc2VhcmNoLWFjdGlvbnMgew0KICAgICAgICBwYWRkaW5nLXRvcDogNHB4Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC50YWJsZS1jYXJkIHsNCiAgICAubGlzdC1oZWFkZXIgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KDQogICAgICAubGlzdC10aXRsZSB7DQogICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgY29sb3I6ICMzMDMxMzM7DQogICAgICB9DQogICAgfQ0KDQogICAgLnBhZ2luYXRpb24gew0KICAgICAgbWFyZ2luLXRvcDogMTZweDsNCiAgICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KICAgIH0NCiAgfQ0KfQ0KDQouZGFuZ2VyLXRleHQtYnRuIHsNCiAgY29sb3I6ICNmNTZjNmM7DQoNCiAgJjpob3ZlciB7DQogICAgY29sb3I6ICNmNzg5ODk7DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+hBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachBusiness/syllabus","sourcesContent":["<template>\r\n <div class=\"app-container syllabus-page\">\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"100px\" class=\"search-form\" @submit.native.prevent>\r\n <el-row :gutter=\"32\">\r\n <el-col :xs=\"24\" :md=\"8\">\r\n <el-form-item label=\"专业代号\">\r\n <el-input v-model=\"searchForm.zydh\" placeholder=\"请输入专业代号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :md=\"8\">\r\n <el-form-item label=\"停用标识\">\r\n <el-select v-model=\"searchForm.ty\" placeholder=\"全部\" clearable class=\"w-full\">\r\n <el-option :value=\"0\" label=\"正常\" />\r\n <el-option :value=\"1\" label=\"停用\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :md=\"8\">\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleQuery\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- 数据列表 -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <div class=\"list-header\">\r\n <div class=\"list-title\">教学大纲列表</div>\r\n <div class=\"list-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleAdd\">新增</el-button>\r\n <el-button\r\n type=\"danger\"\r\n plain\r\n icon=\"el-icon-delete\"\r\n :disabled=\"!selection.length\"\r\n @click=\"handleBatchDelete\"\r\n >删除所选</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownload\">下载</el-button>\r\n </div>\r\n </div>\r\n <el-table v-loading=\"loading\" :data=\"pagedData\" border stripe highlight-current-row\r\n @selection-change=\"handleSelectionChange\">\r\n <el-table-column type=\"selection\" width=\"50\" align=\"center\" />\r\n <el-table-column prop=\"bh\" label=\"编号\" width=\"170\" show-overflow-tooltip align=\"center\" />\r\n <el-table-column prop=\"zydh\" label=\"专业代号\" width=\"150\" align=\"center\" />\r\n <el-table-column prop=\"kbh\" label=\"课编号\" width=\"110\" show-overflow-tooltip align=\"center\" />\r\n <el-table-column prop=\"jc\" label=\"简称\" width=\"100\" show-overflow-tooltip align=\"center\" />\r\n <el-table-column prop=\"klx\" label=\"课类型\" width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"xqdc\" label=\"学期第次\" width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"xs\" label=\"学时\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"xf\" label=\"学分\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"llxs\" label=\"理论学时\" width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"sjxs\" label=\"实践学时\" width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"zks\" label=\"周课时\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"ksks\" label=\"考试课时\" width=\"80\" align=\"center\" />\r\n <el-table-column label=\"大纲课程\" width=\"90\" align=\"center\">\r\n <template slot-scope=\"scope\">{{ fmtYesNo(scope.row.dgkc) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"停用\" width=\"80\" align=\"center\">\r\n <template slot-scope=\"scope\">\r\n <el-tag :type=\"Number(scope.row.ty) === 1 ? 'danger' : 'success'\" size=\"mini\">\r\n {{ Number(scope.row.ty) === 1 ? '停用' : '正常' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"启用时间\" width=\"150\" align=\"center\">\r\n <template slot-scope=\"scope\">{{ fmtDateTime(scope.row.qysj) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"停用时间\" width=\"150\" align=\"center\">\r\n <template slot-scope=\"scope\">{{ fmtDateTime(scope.row.tysj) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"160\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"scope\">\r\n <el-button type=\"text\" size=\"mini\" icon=\"el-icon-edit\" @click=\"handleEdit(scope.row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"mini\" icon=\"el-icon-delete\" class=\"danger-text-btn\" @click=\"handleDelete(scope.row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-pagination\r\n class=\"pagination\"\r\n background\r\n layout=\"total, sizes, prev, pager, next\"\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handlePageChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- 新增/编辑弹窗 -->\r\n <el-dialog :title=\"dialog.title\" :visible.sync=\"dialog.visible\" width=\"720px\" append-to-body\r\n :close-on-click-modal=\"false\">\r\n <el-form ref=\"syllabusForm\" :model=\"dialog.form\" :rules=\"rules\" label-width=\"130px\">\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业\" prop=\"zydh\">\r\n <el-select\r\n v-model=\"dialog.form.zydh\"\r\n filterable\r\n clearable\r\n placeholder=\"请选择专业\"\r\n class=\"w-full\"\r\n :loading=\"referenceDataLoading\"\r\n >\r\n <el-option\r\n v-for=\"item in majorOptions\"\r\n :key=\"item.zydh\"\r\n :label=\"item.zymc\"\r\n :value=\"item.zydh\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课程\" prop=\"kbh\">\r\n <el-select\r\n v-model=\"dialog.form.kbh\"\r\n filterable\r\n clearable\r\n placeholder=\"请选择课程\"\r\n class=\"w-full\"\r\n :loading=\"referenceDataLoading\"\r\n >\r\n <el-option\r\n v-for=\"item in subjectOptions\"\r\n :key=\"item.kbh\"\r\n :label=\"item.kmc\"\r\n :value=\"item.kbh\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学期第次\" prop=\"xqdc\">\r\n <el-input-number v-model=\"dialog.form.xqdc\" :min=\"1\" :max=\"20\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课类型\" prop=\"klx\">\r\n <el-select\r\n v-model=\"dialog.form.klx\"\r\n filterable\r\n clearable\r\n placeholder=\"请选择课类型\"\r\n class=\"w-full\"\r\n :loading=\"referenceDataLoading\"\r\n >\r\n <el-option\r\n v-for=\"item in courseTypeOptions\"\r\n :key=\"item.dictValue\"\r\n :label=\"item.dictLabel\"\r\n :value=\"item.dictValue\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学时\" prop=\"xs\">\r\n <el-input-number v-model=\"dialog.form.xs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"停用\" prop=\"ty\">\r\n <el-radio-group v-model=\"dialog.form.ty\">\r\n <el-radio :label=\"0\">否</el-radio>\r\n <el-radio :label=\"1\">是</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"简称\">\r\n <el-input v-model=\"dialog.form.jc\" placeholder=\"请输入课程简称\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学分\">\r\n <el-input-number v-model=\"dialog.form.xf\" :min=\"0\" :step=\"0.5\" :precision=\"1\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课程定位\">\r\n <el-input v-model=\"dialog.form.kcdw\" placeholder=\"请输入课程定位\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"模块\">\r\n <el-input v-model=\"dialog.form.mk\" placeholder=\"请输入模块\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"成绩分制\">\r\n <el-input v-model=\"dialog.form.cjfz\" placeholder=\"请输入成绩分制\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教研室\">\r\n <el-select\r\n v-model=\"dialog.form.jysdh\"\r\n filterable\r\n clearable\r\n placeholder=\"请选择教研室\"\r\n class=\"w-full\"\r\n :loading=\"referenceDataLoading\"\r\n >\r\n <el-option\r\n v-for=\"item in officeOptions\"\r\n :key=\"item.jysdh\"\r\n :label=\"item.jysmc\"\r\n :value=\"item.jysdh\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试课时\">\r\n <el-input-number v-model=\"dialog.form.ksks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"理论学时\">\r\n <el-input-number v-model=\"dialog.form.llxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"实践学时\">\r\n <el-input-number v-model=\"dialog.form.sjxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"周课时\">\r\n <el-input-number v-model=\"dialog.form.zks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"不计入平均分\">\r\n <el-radio-group v-model=\"dialog.form.bjrxypjf\">\r\n <el-radio :label=\"0\">否</el-radio>\r\n <el-radio :label=\"1\">是</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试课时不显示\">\r\n <el-radio-group v-model=\"dialog.form.ksksbxs\">\r\n <el-radio :label=\"0\">否</el-radio>\r\n <el-radio :label=\"1\">是</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"大纲课程\">\r\n <el-radio-group v-model=\"dialog.form.dgkc\">\r\n <el-radio :label=\"0\">否</el-radio>\r\n <el-radio :label=\"1\">是</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button @click=\"dialog.visible = false\">取 消</el-button>\r\n <el-button type=\"primary\" :loading=\"dialog.submitting\" @click=\"submitDialog\">确 定</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n addSyllabus,\r\n deleteSyllabus,\r\n batchDeleteSyllabus,\r\n updateSyllabus,\r\n listSyllabus,\r\n listSyllabusByZydhAndTy\r\n} from '@/api/teachBusiness/syllabus'\r\nimport { listMajor } from '@/api/subjectMajor/major'\r\nimport { listKb } from '@/api/teachOffice/kb'\r\nimport { listOffice } from '@/api/teachOffice/office'\r\nimport { getDicts } from '@/api/system/dict/data'\r\n\r\nconst REFERENCE_DATA_PAGE_SIZE = 10000\r\nconst COURSE_TYPE_DICT_CODE = 'course_type'\r\n\r\nexport default {\r\n name: 'SyllabusIndex',\r\n data() {\r\n return {\r\n loading: false,\r\n searchForm: {\r\n zydh: '',\r\n ty: ''\r\n },\r\n tableData: [],\r\n total: 0,\r\n pageNum: 1,\r\n pageSize: 20,\r\n selection: [],\r\n referenceDataLoading: false,\r\n majorOptions: [],\r\n subjectOptions: [],\r\n courseTypeOptions: [],\r\n officeOptions: [],\r\n dialog: {\r\n visible: false,\r\n title: '',\r\n submitting: false,\r\n form: this.createEmptyForm()\r\n },\r\n rules: {\r\n zydh: [{ required: true, message: '请选择专业', trigger: 'change' }],\r\n kbh: [{ required: true, message: '请选择课程', trigger: 'change' }],\r\n xqdc: [{ required: true, message: '请输入学期第次', trigger: 'blur' }],\r\n klx: [{ required: true, message: '请选择课类型', trigger: 'change' }],\r\n xs: [{ required: true, message: '请输入学时', trigger: 'blur' }],\r\n ty: [{ required: true, message: '请选择停用标识', trigger: 'change' }]\r\n }\r\n }\r\n },\r\n computed: {\r\n pagedData() {\r\n const start = (this.pageNum - 1) * this.pageSize\r\n return this.tableData.slice(start, start + this.pageSize)\r\n }\r\n },\r\n created() {\r\n this.fetchList()\r\n this.loadReferenceData()\r\n },\r\n methods: {\r\n loadReferenceData() {\r\n this.referenceDataLoading = true\r\n const query = { pageNum: 1, pageSize: REFERENCE_DATA_PAGE_SIZE }\r\n const requests = [\r\n listMajor(query),\r\n listKb(query),\r\n listOffice(query),\r\n getDicts(COURSE_TYPE_DICT_CODE)\r\n ].map(request => {\r\n return request\r\n .then(response => this.getResponseRecords(response))\r\n .catch(() => [])\r\n })\r\n\r\n Promise.all(requests).then(([majors, subjects, offices, courseTypes]) => {\r\n this.majorOptions = this.getUniqueOptions(majors, 'zydh', 'zymc')\r\n this.subjectOptions = this.getUniqueOptions(subjects, 'kbh', 'kmc')\r\n this.officeOptions = this.getUniqueOptions(offices, 'jysdh', 'jysmc')\r\n this.courseTypeOptions = this.getUniqueOptions(courseTypes, 'dictValue', 'dictLabel')\r\n }).finally(() => {\r\n this.referenceDataLoading = false\r\n })\r\n },\r\n getResponseRecords(response) {\r\n const data = response.data || {}\r\n\r\n return Array.isArray(data) ? data : data.records || []\r\n },\r\n getUniqueOptions(items, valueKey, labelKey) {\r\n const values = new Set()\r\n\r\n return items.filter(item => {\r\n const value = item[valueKey]\r\n const label = item[labelKey]\r\n if (!value || !label || values.has(value)) {\r\n return false\r\n }\r\n values.add(value)\r\n\r\n return true\r\n })\r\n },\r\n /* ---------- 列表加载 ---------- */\r\n fetchList() {\r\n this.loading = true\r\n const { zydh, ty } = this.searchForm\r\n // 专业代号与停用标识同时给出时走后端 /listByZydhAndTy;否则查全部后本地过滤\r\n const useApiQuery = zydh && ty !== '' && ty !== null && ty !== undefined\r\n const req = useApiQuery\r\n ? listSyllabusByZydhAndTy(zydh, ty)\r\n : listSyllabus()\r\n req.then(response => {\r\n let list = response.data || []\r\n if (!useApiQuery) {\r\n if (zydh) list = list.filter(i => i.zydh && i.zydh.indexOf(zydh) !== -1)\r\n if (ty !== '' && ty !== null && ty !== undefined) {\r\n list = list.filter(i => Number(i.ty) === Number(ty))\r\n }\r\n }\r\n this.tableData = list\r\n this.total = list.length\r\n this.pageNum = 1\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n }).finally(() => {\r\n this.loading = false\r\n })\r\n },\r\n handleQuery() {\r\n this.fetchList()\r\n },\r\n handleReset() {\r\n this.searchForm = { zydh: '', ty: '' }\r\n this.fetchList()\r\n },\r\n handleSelectionChange(val) {\r\n this.selection = val\r\n },\r\n\r\n /* ---------- 新增 / 编辑 ---------- */\r\n handleAdd() {\r\n this.dialog.title = '新增教学大纲'\r\n this.dialog.form = this.createEmptyForm()\r\n this.dialog.visible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.syllabusForm) this.$refs.syllabusForm.clearValidate()\r\n })\r\n },\r\n handleEdit(row) {\r\n this.dialog.title = '编辑教学大纲'\r\n this.dialog.form = Object.assign({}, this.createEmptyForm(), row)\r\n this.dialog.visible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.syllabusForm) this.$refs.syllabusForm.clearValidate()\r\n })\r\n },\r\n submitDialog() {\r\n this.$refs.syllabusForm.validate(valid => {\r\n if (!valid) return\r\n this.dialog.submitting = true\r\n const payload = this.cleanPayload(this.dialog.form)\r\n const isEdit = !!payload.bh\r\n const req = isEdit ? updateSyllabus(payload) : addSyllabus(payload)\r\n req.then(() => {\r\n this.$message.success(isEdit ? '修改成功' : '新增成功')\r\n this.dialog.visible = false\r\n this.fetchList()\r\n }).finally(() => {\r\n this.dialog.submitting = false\r\n })\r\n })\r\n },\r\n\r\n /* ---------- 删除 / 批量删除 ---------- */\r\n handleDelete(row) {\r\n this.$confirm('删除后该条记录将置为「停用」,是否继续?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return deleteSyllabus(row.bh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n handleBatchDelete() {\r\n if (!this.selection.length) {\r\n this.$message.warning('请先勾选要删除的记录')\r\n return\r\n }\r\n const bhList = this.selection.map(row => row.bh)\r\n this.$confirm('确定删除所选 ' + bhList.length + ' 条记录吗?(将置为「停用」)', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return batchDeleteSyllabus(bhList)\r\n }).then(() => {\r\n this.$message.success('批量删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n /* ---------- 下载(无后端接口) ---------- */\r\n handleDownload() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n /* ---------- 分页 ---------- */\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n },\r\n handlePageChange(page) {\r\n this.pageNum = page\r\n },\r\n\r\n /* ---------- 工具 ---------- */\r\n createEmptyForm() {\r\n return {\r\n bh: '',\r\n zydh: '',\r\n kbh: '',\r\n xqdc: 1,\r\n klx: '',\r\n xs: 0,\r\n ty: 0,\r\n jc: '',\r\n xf: null,\r\n kcdw: '',\r\n ksks: 0,\r\n mk: '',\r\n cjfz: '',\r\n bjrxypjf: 0,\r\n llxs: 0,\r\n sjxs: 0,\r\n zks: 0,\r\n ksksbxs: 0,\r\n dgkc: 0,\r\n jysdh: ''\r\n }\r\n },\r\n /** 移除空值(''/null/undefined),保留 0 等有效值 */\r\n cleanPayload(obj) {\r\n const payload = {}\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n payload[key] = value\r\n }\r\n })\r\n return payload\r\n },\r\n fmtYesNo(val) {\r\n return Number(val) === 1 ? '是' : '否'\r\n },\r\n fmtDateTime(val) {\r\n return (val || '').substring(0, 16) || '-'\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.app-container {\r\n padding: 20px;\r\n}\r\n\r\n.syllabus-page {\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .search-actions {\r\n padding-top: 4px;\r\n }\r\n }\r\n }\r\n\r\n .table-card {\r\n .list-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 16px;\r\n\r\n .list-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n }\r\n }\r\n\r\n .pagination {\r\n margin-top: 16px;\r\n text-align: right;\r\n }\r\n }\r\n}\r\n\r\n.danger-text-btn {\r\n color: #f56c6c;\r\n\r\n &:hover {\r\n color: #f78989;\r\n }\r\n}\r\n</style>\r\n"]}]}