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

1 line
36 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\\teachOffice\\subject\\index.vue?vue&type=style&index=0&id=66b271f2&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\subject\\index.vue","mtime":1787567993852},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQouYXBwLWNvbnRhaW5lciB7DQogIHBhZGRpbmc6IDIwcHg7DQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IDEuIOmhtumDqOeKtuaAgeaPkOekuiA9PT09PT09PT09PT09PT09PT09PQ0KLnN0YXR1cy10aXAgew0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIGJhY2tncm91bmQ6ICNkYzM1NDU7DQogIGNvbG9yOiAjZmZmOw0KICBmb250LXNpemU6IDEycHg7DQogIHBhZGRpbmc6IDNweCAxMHB4Ow0KICBib3JkZXItcmFkaXVzOiA0cHg7DQogIG1hcmdpbi1ib3R0b206IDEycHg7DQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IDIuIOafpeivouadoeS7tuWMuuWfnyA9PT09PT09PT09PT09PT09PT09PQ0KLnNlYXJjaC1jYXJkIHsNCiAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAucXVlcnktZmllbGQgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICBtYXJnaW4tYm90dG9tOiAxNHB4Ow0KICAgIG1pbi1oZWlnaHQ6IDMycHg7DQoNCiAgICA6OnYtZGVlcCguZWwtY2hlY2tib3gpIHsNCiAgICAgIG1hcmdpbi1yaWdodDogNnB4Ow0KICAgICAgZmxleC1zaHJpbms6IDA7DQogICAgfQ0KDQogICAgLnEtbGFiZWwgew0KICAgICAgd2lkdGg6IDEyMHB4Ow0KICAgICAgZmxleC1zaHJpbms6IDA7DQogICAgICBmb250LXNpemU6IDEzcHg7DQogICAgICBjb2xvcjogIzMwMzEzMzsNCiAgICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCg0KICAgICAgJi5uby1jaGVjayB7DQogICAgICAgIG1hcmdpbi1sZWZ0OiAyNHB4Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIC5xLWNvbnRyb2wgew0KICAgICAgZmxleDogMTsNCiAgICAgIG1pbi13aWR0aDogMDsNCiAgICB9DQogIH0NCg0KICAubm90aWNlIHsNCiAgICBmb250LXNpemU6IDEycHg7DQogICAgY29sb3I6ICNmNTZjNmM7DQogICAgbWFyZ2luLXRvcDogOHB4Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQogIH0NCg0KfQ0KDQovLyA9PT09PT09PT09PT09PT09PT09PSAzLiDmk43kvZzmjInpkq7ljLrln58gPT09PT09PT09PT09PT09PT09PT0NCi5hY3Rpb24tY2FyZCB7DQogIG1hcmdpbi1ib3R0b206IDE2cHg7DQoNCiAgLmFjdGlvbi1yb3cgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgZmxleC13cmFwOiB3cmFwOw0KICAgIGdhcDogMTJweDsNCiAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KDQogICAgJjpsYXN0LWNoaWxkIHsNCiAgICAgIG1hcmdpbi1ib3R0b206IDA7DQogICAgfQ0KICB9DQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IDQuIOaWh+S7tuS4iuS8oOWMuuWfnyA9PT09PT09PT09PT09PT09PT09PQ0KLnVwbG9hZC1jYXJkIHsNCiAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAudXBsb2FkLXJvdyB7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgZ2FwOiAxMnB4Ow0KDQogICAgLnVwbG9hZC1sZWZ0IHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgZ2FwOiAxMnB4Ow0KDQogICAgICAuZmlsZS1uYW1lIHsNCiAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICBjb2xvcjogIzk5OTsNCg0KICAgICAgICAmLmhhcy1maWxlIHsNCiAgICAgICAgICBjb2xvcjogIzMwMzEzMzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIC51cGxvYWQtcmlnaHQgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBnYXA6IDEycHg7DQogICAgfQ0KICB9DQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IDUuIOe6ouiJsuaPkOekuuaWh+WtlyA9PT09PT09PT09PT09PT09PT09PQ0KLnJlZC10aXAgew0KICBmb250LXNpemU6IDE0cHg7DQogIGNvbG9yOiAjZjU2YzZjOw0KICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KICBsaW5lLWhlaWdodDogMS42Ow0KfQ0KDQovLyA9PT09PT09PT09PT09PT09PT09PSA2LiDmlbDmja7ooajmoLzljLrln58gPT09PT09PT09PT09PT09PT09PT0NCi50YWJsZS1jYXJkIHsNCiAgLnBhZ2luYXRpb24td3JhcHBlciB7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOw0KICAgIG1hcmdpbi10b3A6IDE2cHg7DQogIH0NCg0KICA6OnYtZGVlcCguZWwtdGFibGUgLmNlbGwpIHsNCiAgICBmb250LXNpemU6IDEycHg7DQogIH0NCg0KICAudGV4dC1kYW5nZXIgew0KICAgIGNvbG9yOiAjZjU2YzZjOw0KICB9DQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IOaWsOWini/nvJbovpHlvLnnqpcgPT09PT09PT09PT09PT09PT09PT0NCi5hZGQtZGlhbG9nIHsNCiAgOjp2LWRlZXAoLmVsLWRpYWxvZ19fYm9keSkgew0KICAgIG1heC1oZWlnaHQ6IDcwdmg7DQogICAgb3ZlcmZsb3c6IGF1dG87DQogIH0NCn0NCg0KLmFkZC1mb3JtIHsNCiAgLnctZnVsbCB7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCn0NCg0KLmRpYWxvZy1mb290ZXIgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOw0KICBnYXA6IDEycHg7DQp9DQoNCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6kBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/subject","sourcesContent":["<template>\r\n <div class=\"app-container management-page subject-page\">\r\n\r\n <!-- ==================== 2. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <div class=\"section-heading\">\r\n <div>\r\n <h2 class=\"section-title\">筛选条件</h2>\r\n <p class=\"section-description\">按课程名称、代码和培训属性筛选课程科目</p>\r\n </div>\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleQuery\">查询</el-button>\r\n </div>\r\n <el-form :model=\"searchForm\">\r\n <el-row :gutter=\"32\">\r\n <!-- 左栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">课名称</span>\r\n <el-input v-model=\"searchForm.kmc\" placeholder=\"请输入课名称\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">科目代码</span>\r\n <el-input v-model=\"searchForm.kmdm\" placeholder=\"请输入科目代码\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">培训层次</span>\r\n <el-input v-model=\"searchForm.pxcc\" placeholder=\"请输入培训层次\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">课程类型</span>\r\n <el-input v-model=\"searchForm.kclx\" placeholder=\"请输入课程类型\" clearable class=\"q-control\" />\r\n </div>\r\n </el-col>\r\n\r\n <!-- 右栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">简称</span>\r\n <el-input v-model=\"searchForm.jc\" placeholder=\"请输入简称\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">教研室代号</span>\r\n <el-input v-model=\"searchForm.jysdh\" placeholder=\"请输入教研室代号\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">培训类型</span>\r\n <el-input v-model=\"searchForm.pxlx\" placeholder=\"请输入培训类型\" clearable class=\"q-control\" />\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n </el-card>\r\n\r\n <!-- ==================== 3. 操作按钮区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"action-card\">\r\n <div class=\"section-heading section-heading--compact\">\r\n <div>\r\n <h2 class=\"section-title\">课程科目操作</h2>\r\n <p class=\"section-description\">维护课程科目,或下载业务数据与导入模板</p>\r\n </div>\r\n </div>\r\n <div class=\"action-row\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleOpenDialog\">新建课程科目</el-button>\r\n <el-button type=\"danger\" plain icon=\"el-icon-delete\" @click=\"handleBatchDelete\">删除所选</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadCourse\">下载课程科目基本信息</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTextbook\">下载课程教材基本信息</el-button>\r\n </div>\r\n <div class=\"action-row\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【课程科目数据文件模板】下载</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 4. 文件上传区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"upload-card\">\r\n <div class=\"section-heading section-heading--compact\">\r\n <div>\r\n <h2 class=\"section-title\">数据导入</h2>\r\n <p class=\"section-description\">选择填写完成的课程科目模板并上传</p>\r\n </div>\r\n </div>\r\n <div class=\"upload-row\">\r\n <div class=\"upload-left\">\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleSelectFile\">选择文件</el-button>\r\n <span class=\"file-name\" :class=\"{ 'has-file': selectedFile }\">{{ fileName }}</span>\r\n <input ref=\"fileInputRef\" type=\"file\" style=\"display: none\" @change=\"handleFileChange\" />\r\n </div>\r\n <div class=\"upload-right\">\r\n <el-checkbox v-model=\"coverExist\">覆盖已存在课程科目</el-checkbox>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleUpload\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 6. 数据表格区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <div class=\"section-heading section-heading--compact table-heading\">\r\n <div>\r\n <h2 class=\"section-title\">课程科目列表</h2>\r\n <p class=\"section-description\">共 {{ total }} 条数据</p>\r\n </div>\r\n </div>\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row\r\n @selection-change=\"handleSelectionChange\">\r\n <el-table-column type=\"selection\" width=\"40\" align=\"center\" />\r\n <el-table-column prop=\"kbh\" label=\"课编号\" width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"kmc\" label=\"课名称\" width=\"200\" show-overflow-tooltip />\r\n <el-table-column prop=\"jc\" label=\"简称\" width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"jysdh\" label=\"教研室代号\" width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"kclx\" label=\"课程类型\" width=\"150\" align=\"center\" />\r\n <el-table-column prop=\"pxlx\" label=\"培训类型\" width=\"150\" align=\"center\" />\r\n <el-table-column prop=\"pxcc\" label=\"培训层次\" width=\"200\" align=\"center\" />\r\n <el-table-column prop=\"xf\" label=\"学分\" align=\"center\" />\r\n <el-table-column prop=\"xs\" label=\"学时\" width=\"160\" align=\"center\" />\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"text-danger\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n class=\"pagination-wrapper\"\r\n @current-change=\"handlePageChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- 新增/编辑课程科目弹窗 -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"1000px\"\r\n :close-on-click-modal=\"false\"\r\n class=\"add-dialog\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"addFormRef\" :model=\"addForm\" :rules=\"rules\" label-width=\"120px\" class=\"add-form\" :status-icon=\"false\">\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课编号\" prop=\"kbh\">\r\n <el-input v-model=\"addForm.kbh\" :disabled=\"isEdit\" placeholder=\"新增时留空自动生成\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课名称\" prop=\"kmc\">\r\n <el-input v-model=\"addForm.kmc\" placeholder=\"请输入课名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"简称\" prop=\"jc\">\r\n <el-input v-model=\"addForm.jc\" placeholder=\"请输入简称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"教研室代号\" prop=\"jysdh\">\r\n <el-input v-model=\"addForm.jysdh\" placeholder=\"请输入教研室代号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"学分\" prop=\"xf\">\r\n <el-input-number v-model=\"addForm.xf\" :min=\"0\" :precision=\"1\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"学时\" prop=\"xs\">\r\n <el-input-number v-model=\"addForm.xs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"培训层次\" prop=\"pxcc\">\r\n <el-input v-model=\"addForm.pxcc\" placeholder=\"请输入培训层次\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"培训类型\" prop=\"pxlx\">\r\n <el-input v-model=\"addForm.pxlx\" placeholder=\"请输入培训类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程类型\" prop=\"kclx\">\r\n <el-input v-model=\"addForm.kclx\" placeholder=\"请输入课程类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考试课时\" prop=\"ksks\">\r\n <el-input-number v-model=\"addForm.ksks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"成绩分制\" prop=\"cjfz\">\r\n <el-input v-model=\"addForm.cjfz\" placeholder=\"请输入成绩分制\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"不计入学员平均分\" prop=\"bjrxypjf\">\r\n <el-select v-model=\"addForm.bjrxypjf\" class=\"w-full\">\r\n <el-option label=\"否\" :value=\"0\" />\r\n <el-option label=\"是\" :value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"理论学时\" prop=\"llxs\">\r\n <el-input-number v-model=\"addForm.llxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"实践学时\" prop=\"sjxs\">\r\n <el-input-number v-model=\"addForm.sjxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"周课时\" prop=\"zks\">\r\n <el-input-number v-model=\"addForm.zks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课类型\" prop=\"klx\">\r\n <el-input v-model=\"addForm.klx\" placeholder=\"请输入课类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考试课时不显示\" prop=\"ksksbxs\">\r\n <el-select v-model=\"addForm.ksksbxs\" class=\"w-full\">\r\n <el-option label=\"否\" :value=\"0\" />\r\n <el-option label=\"是\" :value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程统一编号\" prop=\"kctybh\">\r\n <el-input v-model=\"addForm.kctybh\" placeholder=\"请输入课程统一编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"辅导答疑课时\" prop=\"fddyks\">\r\n <el-input-number v-model=\"addForm.fddyks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"自修课时\" prop=\"zxks\">\r\n <el-input-number v-model=\"addForm.zxks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"修订日期\" prop=\"xdrq\">\r\n <el-input v-model=\"addForm.xdrq\" placeholder=\"如 2026-08-24\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"节次优选级\" prop=\"jcyxj\">\r\n <el-input v-model=\"addForm.jcyxj\" placeholder=\"请输入节次优选级\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程支持方式\" prop=\"kczcfs\">\r\n <el-input v-model=\"addForm.kczcfs\" placeholder=\"请输入课程支持方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程建设方式\" prop=\"kcjsfs\">\r\n <el-input v-model=\"addForm.kcjsfs\" placeholder=\"请输入课程建设方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"政治类课程\" prop=\"zzlkc\">\r\n <el-select v-model=\"addForm.zzlkc\" class=\"w-full\">\r\n <el-option label=\"否\" :value=\"0\" />\r\n <el-option label=\"是\" :value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考核方式\" prop=\"khfs\">\r\n <el-input v-model=\"addForm.khfs\" placeholder=\"请输入考核方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"形成性成绩分值\" prop=\"xcxcjfz\">\r\n <el-input-number v-model=\"addForm.xcxcjfz\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"终结性成绩分值\" prop=\"zjxcjfz\">\r\n <el-input-number v-model=\"addForm.zjxcjfz\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"密级\" prop=\"mj\">\r\n <el-input v-model=\"addForm.mj\" placeholder=\"请输入密级\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"评选情况\" prop=\"pxqk\">\r\n <el-input v-model=\"addForm.pxqk\" placeholder=\"请输入评选情况\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"24\" :md=\"24\">\r\n <el-form-item label=\"备注\">\r\n <el-input v-model=\"addForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <el-button @click=\"handleCancel\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"addLoading\" @click=\"handleSubmit\">保存</el-button>\r\n </div>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { listKb as listSubject, addKb as addSubject, updateKb as updateSubject, deleteKb as deleteSubject, getKb } from '@/api/teachOffice/kb'\r\n\r\nexport default {\r\n name: 'SubjectIndex',\r\n data() {\r\n return {\r\n // ==================== 1. 顶部状态提示 ====================\r\n statusTip: '请输入查询条件',\r\n\r\n // ==================== 2. 查询条件 ====================\r\n searchForm: {\r\n kmc: '',\r\n jc: '',\r\n kmdm: '',\r\n jysdh: '',\r\n kclx: '',\r\n pxlx: '',\r\n pxcc: ''\r\n },\r\n\r\n // ==================== 列表数据 ====================\r\n loading: false,\r\n tableData: [],\r\n total: 0,\r\n pageNum: 1,\r\n pageSize: 20,\r\n selectedRows: [],\r\n\r\n // ==================== 文件上传 ====================\r\n selectedFile: null,\r\n coverExist: false,\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n dialogVisible: false,\r\n addLoading: false,\r\n isEdit: false,\r\n addForm: this.createEmptyForm(),\r\n rules: {\r\n kmc: [{ required: true, message: '请输入课名称', trigger: 'blur' }],\r\n jysdh: [{ required: true, message: '请输入教研室代号', trigger: 'blur' }],\r\n xf: [{ required: true, message: '请输入学分', trigger: 'blur' }],\r\n pxcc: [{ required: true, message: '请输入培训层次', trigger: 'blur' }],\r\n pxlx: [{ required: true, message: '请输入培训类型', trigger: 'blur' }],\r\n kclx: [{ required: true, message: '请输入课程类型', trigger: 'blur' }],\r\n ksks: [{ required: true, message: '请输入考试课时', trigger: 'blur' }],\r\n cjfz: [{ required: true, message: '请输入成绩分制', trigger: 'blur' }],\r\n llxs: [{ required: true, message: '请输入理论学时', trigger: 'blur' }],\r\n sjxs: [{ required: true, message: '请输入实践学时', trigger: 'blur' }],\r\n zks: [{ required: true, message: '请输入周课时', trigger: 'blur' }],\r\n klx: [{ required: true, message: '请输入课类型', trigger: 'blur' }],\r\n kctybh: [{ required: true, message: '请输入课程统一编号', trigger: 'blur' }],\r\n fddyks: [{ required: true, message: '请输入辅导答疑课时', trigger: 'blur' }],\r\n zxks: [{ required: true, message: '请输入自修课时', trigger: 'blur' }],\r\n xdrq: [{ required: true, message: '请输入修订日期', trigger: 'blur' }],\r\n jcyxj: [{ required: true, message: '请输入节次优选级', trigger: 'blur' }],\r\n kczcfs: [{ required: true, message: '请输入课程支持方式', trigger: 'blur' }],\r\n kcjsfs: [{ required: true, message: '请输入课程建设方式', trigger: 'blur' }],\r\n khfs: [{ required: true, message: '请输入考核方式', trigger: 'blur' }],\r\n xcxcjfz: [{ required: true, message: '请输入形成性成绩分值', trigger: 'blur' }],\r\n zjxcjfz: [{ required: true, message: '请输入终结性成绩分值', trigger: 'blur' }],\r\n mj: [{ required: true, message: '请输入密级', trigger: 'blur' }],\r\n pxqk: [{ required: true, message: '请输入评选情况', trigger: 'blur' }]\r\n }\r\n }\r\n },\r\n computed: {\r\n dialogTitle() {\r\n return this.isEdit ? '编辑课程科目' : '新增课程科目'\r\n },\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n /** 移除空值 */\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\r\n /** 创建空白课程科目表单 */\r\n createEmptyForm() {\r\n return {\r\n kbh: '', kmc: '', jysdh: '', bz: '', xh: '', xf: 0, jc: '', xs: 0,\r\n pxcc: '', pxlx: '', kclx: '', ksks: 0, py: '', gfmc: '', cjfz: '',\r\n bjrxypjf: 0, jxglbmbh: '', llxs: 0, sjxs: 0, kmdm: '', zks: 0, klx: '',\r\n ksksbxs: 0, kctybh: '', sydx: '', fddyks: 0, zxks: 0, bb: '', xdrq: '',\r\n jcyxj: '', kczcfs: '', kcjsfs: '', jsonzd: '', zzlkc: 0, khfs: '',\r\n xcxcjfz: 0, zjxcjfz: 0, mj: '', pxqk: ''\r\n }\r\n },\r\n\r\n resetForm() {\r\n this.addForm = this.createEmptyForm()\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n buildQuery() {\r\n return this.cleanPayload({\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n kmc: this.searchForm.kmc,\r\n jc: this.searchForm.jc,\r\n kmdm: this.searchForm.kmdm,\r\n jysdh: this.searchForm.jysdh,\r\n kclx: this.searchForm.kclx,\r\n pxlx: this.searchForm.pxlx,\r\n pxcc: this.searchForm.pxcc\r\n })\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n listSubject(this.buildQuery())\r\n .then(res => {\r\n const data = (res && res.data) || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.statusTip = `共检索到 ${this.total} 条记录`\r\n })\r\n .finally(() => {\r\n this.loading = false\r\n })\r\n },\r\n\r\n // ==================== 查询 ====================\r\n handleQuery() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(current) {\r\n this.pageNum = current\r\n this.fetchList()\r\n },\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n handleSelectionChange(rows) {\r\n this.selectedRows = rows\r\n },\r\n\r\n // ==================== 删除所选 ====================\r\n handleBatchDelete() {\r\n if (this.selectedRows.length === 0) {\r\n this.$message.warning('请先选择要删除的记录')\r\n return\r\n }\r\n const kbhList = this.selectedRows.map(r => r.kbh)\r\n this.$confirm(`确定删除所选 ${kbhList.length} 条课程科目吗?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n const tasks = kbhList.map(kbh => deleteSubject(kbh))\r\n Promise.all(tasks)\r\n .then(() => {\r\n this.$message.success(`已删除 ${kbhList.length} 条记录`)\r\n this.fetchList()\r\n })\r\n .catch(() => {\r\n this.$message.error('删除失败')\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /** 单条删除 */\r\n handleDelete(row) {\r\n this.$confirm(`确定删除课程科目「${row.kmc || row.kbh}」吗?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return deleteSubject(row.kbh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch((err) => {\r\n if (err && err !== 'cancel') {\r\n this.$message.error('删除失败')\r\n }\r\n })\r\n },\r\n\r\n // ==================== 下载(后端暂未提供) ====================\r\n handleDownloadCourse() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n handleDownloadTextbook() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n handleDownloadTemplate() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 文件上传(后端暂未提供) ====================\r\n handleSelectFile() {\r\n this.$refs.fileInputRef && this.$refs.fileInputRef.click()\r\n },\r\n\r\n handleFileChange(e) {\r\n const input = e.target\r\n this.selectedFile = (input.files && input.files[0]) || null\r\n },\r\n\r\n handleUpload() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n handleOpenDialog() {\r\n this.isEdit = false\r\n this.resetForm()\r\n this.dialogVisible = true\r\n },\r\n\r\n handleEdit(row) {\r\n this.addLoading = true\r\n getKb(row.kbh)\r\n .then(res => {\r\n const data = (res && res.data) || row\r\n this.isEdit = true\r\n this.addForm = Object.assign(this.createEmptyForm(), data)\r\n this.dialogVisible = true\r\n })\r\n .finally(() => {\r\n this.addLoading = false\r\n })\r\n },\r\n\r\n handleSubmit() {\r\n this.$refs.addFormRef.validate((valid) => {\r\n if (!valid) return\r\n this.addLoading = true\r\n const payload = this.cleanPayload({ ...this.addForm })\r\n const requestFn = this.isEdit ? updateSubject : addSubject\r\n requestFn(payload)\r\n .then(() => {\r\n this.$message.success(this.isEdit ? '修改成功' : '保存成功')\r\n this.dialogVisible = false\r\n this.fetchList()\r\n })\r\n .finally(() => {\r\n this.addLoading = false\r\n })\r\n })\r\n },\r\n\r\n handleCancel() {\r\n this.dialogVisible = false\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// ==================== 1. 顶部状态提示 ====================\r\n.status-tip {\r\n display: inline-block;\r\n background: #dc3545;\r\n color: #fff;\r\n font-size: 12px;\r\n padding: 3px 10px;\r\n border-radius: 4px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n// ==================== 2. 查询条件区域 ====================\r\n.search-card {\r\n margin-bottom: 16px;\r\n\r\n .query-field {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 14px;\r\n min-height: 32px;\r\n\r\n ::v-deep(.el-checkbox) {\r\n margin-right: 6px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .q-label {\r\n width: 120px;\r\n flex-shrink: 0;\r\n font-size: 13px;\r\n color: #303133;\r\n text-align: right;\r\n margin-right: 10px;\r\n white-space: nowrap;\r\n\r\n &.no-check {\r\n margin-left: 24px;\r\n }\r\n }\r\n\r\n .q-control {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n }\r\n\r\n .notice {\r\n font-size: 12px;\r\n color: #f56c6c;\r\n margin-top: 8px;\r\n text-align: left;\r\n }\r\n\r\n}\r\n\r\n// ==================== 3. 操作按钮区域 ====================\r\n.action-card {\r\n margin-bottom: 16px;\r\n\r\n .action-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n margin-bottom: 12px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 4. 文件上传区域 ====================\r\n.upload-card {\r\n margin-bottom: 16px;\r\n\r\n .upload-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n\r\n .upload-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n\r\n .file-name {\r\n font-size: 12px;\r\n color: #999;\r\n\r\n &.has-file {\r\n color: #303133;\r\n }\r\n }\r\n }\r\n\r\n .upload-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 5. 红色提示文字 ====================\r\n.red-tip {\r\n font-size: 14px;\r\n color: #f56c6c;\r\n margin-bottom: 16px;\r\n line-height: 1.6;\r\n}\r\n\r\n// ==================== 6. 数据表格区域 ====================\r\n.table-card {\r\n .pagination-wrapper {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n\r\n ::v-deep(.el-table .cell) {\r\n font-size: 12px;\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n}\r\n\r\n// ==================== 新增/编辑弹窗 ====================\r\n.add-dialog {\r\n ::v-deep(.el-dialog__body) {\r\n max-height: 70vh;\r\n overflow: auto;\r\n }\r\n}\r\n\r\n.add-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n}\r\n\r\n.dialog-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n}\r\n\r\n</style>\r\n"]}]}