forked from liweijie/education
1 line
27 KiB
JSON
1 line
27 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\\student\\studentInfo\\index.vue?vue&type=style&index=0&id=0e8b5564&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\student\\studentInfo\\index.vue","mtime":1787640892012},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQouc3R1ZGVudC1pbmZvLXBhZ2Ugew0KICAuc2VhcmNoLWNhcmQgew0KICAgIC5zZWFyY2gtZm9ybSB7DQogICAgICAucmFuZ2UtY29udHJvbCB7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIGdhcDogNnB4Ow0KICAgICAgICB3aWR0aDogMTAwJTsNCg0KICAgICAgICAuZWwtaW5wdXQgew0KICAgICAgICAgIGZsZXg6IDE7DQogICAgICAgIH0NCg0KICAgICAgICAucmFuZ2Utc2VwIHsNCiAgICAgICAgICBmbGV4LXNocmluazogMDsNCiAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgY29sb3I6ICM2MDYyNjY7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLnNlYXJjaC10aXAgew0KICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgIGNvbG9yOiAjZjU2YzZjOw0KICAgICAgICBtYXJnaW4tdG9wOiA4cHg7DQogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsNCiAgICAgIH0NCg0KICAgICAgLnNlYXJjaC1hY3Rpb25zIHsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsNCiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7DQogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC50b29sYmFyIHsNCiAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KICB9DQoNCiAgLnRhYmxlLWNhcmQgew0KICAgIC5lbC10YWJsZSB7DQogICAgICB3aWR0aDogMTAwJTsNCiAgICB9DQogIH0NCg0KICAudGV4dC1wcmltYXJ5IHsNCiAgICBjb2xvcjogIzQwOWVmZjsNCiAgICBwYWRkaW5nOiAwOw0KICB9DQoNCiAgLnRleHQtc3VjY2VzcyB7DQogICAgY29sb3I6ICM2N2MyM2E7DQogICAgcGFkZGluZzogMDsNCiAgfQ0KDQogIC5kYW5nZXItdGV4dCB7DQogICAgY29sb3I6ICNmNTZjNmM7DQogICAgcGFkZGluZzogMDsNCiAgfQ0KDQogIC5mdWxsLXdpZHRoIHsNCiAgICB3aWR0aDogMTAwJTsNCiAgfQ0KDQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;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;;AAEA","file":"index.vue","sourceRoot":"src/views/student/studentInfo","sourcesContent":["<template>\r\n <div class=\"app-container student-info-page\">\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"24\">\r\n <!-- 左栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"学号\">\r\n <el-input v-model=\"searchForm.xh\" placeholder=\"请输入学号\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"姓名\">\r\n <el-input v-model=\"searchForm.xm\" placeholder=\"请输入姓名\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"性别\">\r\n <el-select v-model=\"searchForm.xb\" placeholder=\"请选择性别\" clearable class=\"full-width\">\r\n <el-option label=\"男\" value=\"男\" />\r\n <el-option label=\"女\" value=\"女\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"证件号码\">\r\n <el-input v-model=\"searchForm.zjhm\" placeholder=\"请输入证件号码\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"政治面貌\">\r\n <el-input v-model=\"searchForm.zzmm\" placeholder=\"请输入政治面貌\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"民族\">\r\n <el-input v-model=\"searchForm.mz\" placeholder=\"请输入民族\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"籍贯\">\r\n <el-input v-model=\"searchForm.jg\" placeholder=\"请输入籍贯\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"学位\">\r\n <el-input v-model=\"searchForm.xw\" placeholder=\"请输入学位\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n\r\n <!-- 右栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"原部职别\">\r\n <el-input v-model=\"searchForm.ybzb\" placeholder=\"请输入原部职别\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"身份证号\">\r\n <el-input v-model=\"searchForm.sfzh\" placeholder=\"请输入身份证号\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"文化程度\">\r\n <el-input v-model=\"searchForm.whcd\" placeholder=\"请输入文化程度\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"本科毕业院校\">\r\n <el-input v-model=\"searchForm.bkbyyx\" placeholder=\"请输入本科毕业院校\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"标签\">\r\n <el-input v-model=\"searchForm.bq\" placeholder=\"请输入标签\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"联系电话\">\r\n <el-input v-model=\"searchForm.lxdh\" placeholder=\"请输入联系电话\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"通信地址\">\r\n <el-input v-model=\"searchForm.txdz\" placeholder=\"请输入通信地址\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\r\n </div>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 数据表格区域 ==================== -->\r\n <div class=\"list-title\">学员信息列表:</div>\r\n <div class=\"toolbar\"><el-button type=\"primary\" @click=\"handleAdd\">新增学员</el-button></div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"xh\" label=\"学号\" width=\"55\" show-overflow-tooltip />\r\n <el-table-column prop=\"xm\" label=\"姓名\" width=\"55\" />\r\n <el-table-column prop=\"xb\" label=\"性别\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"nj\" label=\"年级\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"zy\" label=\"专业\" width=\"55\" show-overflow-tooltip />\r\n <el-table-column prop=\"db\" label=\"队别\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"bc\" label=\"班次\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"pxlx\" label=\"培训类型\" width=\"85\" show-overflow-tooltip />\r\n <el-table-column prop=\"pxcc\" label=\"培训层次\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"zzmm\" label=\"政治面貌\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"mz\" label=\"民族\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"jg\" label=\"籍贯\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"xw\" label=\"学位\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"zczt\" label=\"注册状态\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"xjyd\" label=\"学籍异动状态\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"ksqk\" label=\"考试情况\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"bjgm\" label=\"不及格门数\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"gljg\" label=\"管理机构\" width=\"85\" align=\"center\" />\r\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" class=\"text-primary\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" class=\"text-success\" @click=\"handleGrades(row)\">成绩</el-button>\r\n <el-button type=\"text\" class=\"danger-text\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"pagination\">\r\n <el-pagination\r\n :current-page=\"pagination.pageNum\"\r\n :page-size=\"pagination.pageSize\"\r\n :total=\"pagination.total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handlePageChange\"\r\n />\r\n </div>\r\n </el-card>\r\n\r\n <!-- 新增/编辑弹窗 -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"formData\" :rules=\"formRules\" label-width=\"120px\">\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"编号\" prop=\"bh\"><el-input v-model=\"formData.bh\" placeholder=\"请输入编号\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"学号\" prop=\"xh\"><el-input v-model=\"formData.xh\" placeholder=\"请输入学号\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"姓名\" prop=\"xm\"><el-input v-model=\"formData.xm\" placeholder=\"请输入姓名\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"性别\" prop=\"xb\"><el-select v-model=\"formData.xb\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"男\" value=\"1\" /><el-option label=\"女\" value=\"0\" /></el-select></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"出生日期\" prop=\"csrq\"><el-date-picker v-model=\"formData.csrq\" type=\"date\" placeholder=\"请选择\" value-format=\"yyyy-MM-dd\" class=\"full-width\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"民族\" prop=\"mz\"><el-input v-model=\"formData.mz\" placeholder=\"请输入民族\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"籍贯\" prop=\"jg\"><el-input v-model=\"formData.jg\" placeholder=\"请输入籍贯\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"政治面貌\" prop=\"zzmm\"><el-input v-model=\"formData.zzmm\" placeholder=\"请输入政治面貌\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"文化程度\" prop=\"whcd\"><el-input v-model=\"formData.whcd\" placeholder=\"请输入文化程度\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"学员类别\" prop=\"xylb\"><el-input v-model=\"formData.xylb\" placeholder=\"请输入学员类别\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"学员队期编号\" prop=\"xydqbh\"><el-input v-model=\"formData.xydqbh\" placeholder=\"请输入学员队期编号\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"证件号码\" prop=\"zjhm\"><el-input v-model=\"formData.zjhm\" placeholder=\"请输入证件号码\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"所属军区\" prop=\"ssjq\"><el-input v-model=\"formData.ssjq\" placeholder=\"请输入所属军区\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"当前班次编号\" prop=\"dqbzbh\"><el-input v-model=\"formData.dqbzbh\" placeholder=\"请输入当前班次编号\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"军人证件类型\" prop=\"jrzjlx\"><el-input v-model=\"formData.jrzjlx\" placeholder=\"请输入军人证件类型\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"退学状态\" prop=\"txzt\"><el-input v-model=\"formData.txzt\" placeholder=\"请输入退学状态\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"8\"><el-form-item label=\"国防生\" prop=\"gfs\"><el-select v-model=\"formData.gfs\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"留级状态\" prop=\"ljzt\"><el-input v-model=\"formData.ljzt\" placeholder=\"请输入\" /></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"分班状态\" prop=\"fbzt\"><el-input v-model=\"formData.fbzt\" placeholder=\"请输入\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"8\"><el-form-item label=\"允许查看成绩\" prop=\"yxckcj\"><el-select v-model=\"formData.yxckcj\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"已注册\" prop=\"yzc\"><el-select v-model=\"formData.yzc\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\" />\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"联系电话\" prop=\"lxdh\"><el-input v-model=\"formData.lxdh\" placeholder=\"请输入联系电话\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"通讯地址\" prop=\"txdz\"><el-input v-model=\"formData.txdz\" placeholder=\"请输入通讯地址\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"24\"><el-form-item label=\"备注\" prop=\"bz\"><el-input v-model=\"formData.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" /></el-form-item></el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"submitting\" @click=\"handleSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 成绩弹窗 -->\r\n <el-dialog\r\n :visible=\"gradesVisible\"\r\n title=\"学员成绩\"\r\n width=\"600px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => gradesVisible = val\"\r\n >\r\n <p><strong>学员:</strong>{{ gradesStudent }}</p>\r\n <el-tabs v-model=\"gradesTab\">\r\n <el-tab-pane label=\"成绩\" name=\"grades\">\r\n <div v-loading=\"gradesLoading\">\r\n <pre v-if=\"gradesData\">{{ gradesData }}</pre>\r\n </div>\r\n </el-tab-pane>\r\n <el-tab-pane label=\"进程成绩\" name=\"process\">\r\n <div v-loading=\"gradesLoading\">\r\n <pre v-if=\"processGradesData\">{{ processGradesData }}</pre>\r\n </div>\r\n </el-tab-pane>\r\n </el-tabs>\r\n <div slot=\"footer\">\r\n <el-button type=\"primary\" @click=\"handleExportGrades\">导出成绩</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n listStudentRecord,\r\n getStudentRecord,\r\n addStudentRecord,\r\n updateStudentRecord,\r\n delStudentRecord\r\n} from \"@/api/studentRecords/studentRecords\"\r\n\r\nexport default {\r\n name: 'StudentInfoIndex',\r\n data() {\r\n return {\r\n // ==================== 查询条件 ====================\r\n // 仅保留后端 XYXX 实体支持的字段:/student-records/list 会按实体字段动态构建查询条件\r\n searchForm: {\r\n xh: '', xm: '', xb: '', zjhm: '', zzmm: '', mz: '', jg: '', xw: '',\r\n ybzb: '', sfzh: '', whcd: '', bkbyyx: '', bq: '', lxdh: '', txdz: ''\r\n },\r\n\r\n // ==================== 数据表格 ====================\r\n loading: false,\r\n tableData: [],\r\n pagination: { pageNum: 1, pageSize: 20, total: 0 },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n dialogVisible: false,\r\n dialogTitle: '新增学员',\r\n submitting: false,\r\n formData: this.createEmptyForm(),\r\n formRules: {\r\n bh: [{ required: true, message: '请输入编号', trigger: 'blur' }],\r\n xh: [{ required: true, message: '请输入学号', trigger: 'blur' }],\r\n xm: [{ required: true, message: '请输入姓名', trigger: 'blur' }],\r\n xydqbh: [{ required: true, message: '请输入学员队期编号', trigger: 'blur' }],\r\n zjhm: [{ required: true, message: '请输入证件号码', trigger: 'blur' }],\r\n zzmm: [{ required: true, message: '请输入政治面貌', trigger: 'blur' }],\r\n xb: [{ required: true, message: '请选择性别', trigger: 'change' }],\r\n csrq: [{ required: true, message: '请选择出生日期', trigger: 'change' }],\r\n mz: [{ required: true, message: '请输入民族', trigger: 'blur' }],\r\n jg: [{ required: true, message: '请输入籍贯', trigger: 'blur' }],\r\n whcd: [{ required: true, message: '请输入文化程度', trigger: 'blur' }],\r\n xylb: [{ required: true, message: '请输入学员类别', trigger: 'blur' }],\r\n ssjq: [{ required: true, message: '请输入所属军区', trigger: 'blur' }],\r\n gfs: [{ required: true, message: '请选择国防生', trigger: 'change' }],\r\n txzt: [{ required: true, message: '请输入退学状态', trigger: 'blur' }],\r\n ljzt: [{ required: true, message: '请输入留级状态', trigger: 'blur' }],\r\n fbzt: [{ required: true, message: '请输入分班状态', trigger: 'blur' }],\r\n yxckcj: [{ required: true, message: '请选择允许查看成绩', trigger: 'change' }],\r\n dqbzbh: [{ required: true, message: '请输入当前班次编号', trigger: 'blur' }],\r\n yzc: [{ required: true, message: '请选择已注册', trigger: 'change' }],\r\n jrzjlx: [{ required: true, message: '请输入军人证件类型', trigger: 'blur' }]\r\n },\r\n\r\n // ==================== 成绩弹窗 ====================\r\n gradesVisible: false,\r\n gradesTab: 'grades',\r\n gradesData: null,\r\n processGradesData: null,\r\n gradesStudent: '',\r\n currentBh: '',\r\n gradesLoading: false\r\n }\r\n },\r\n mounted() {\r\n this.loadData()\r\n },\r\n methods: {\r\n /** 创建空白表单 */\r\n createEmptyForm() {\r\n return {\r\n bh: '', xh: '', xm: '', xydqbh: '', zjhm: '', zzmm: '', xb: '', csrq: '', mz: '', jg: '',\r\n whcd: '', xylb: '', ssjq: '', gfs: '', txzt: '', ljzt: '', fbzt: '', yxckcj: '', dqbzbh: '', yzc: '',\r\n jrzjlx: '', sfzh: '', lxdh: '', txdz: '', bz: '', dtsj: ''\r\n }\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n loadData() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pagination.pageNum,\r\n pageSize: this.pagination.pageSize\r\n }\r\n this.buildQueryParams(params)\r\n listStudentRecord(params).then(res => {\r\n const data = res.data || {}\r\n this.tableData = data.records || []\r\n this.pagination.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.pagination.total = 0\r\n this.loading = false\r\n })\r\n },\r\n\r\n /** 组装查询参数:仅传后端 XYXX 实体支持的字符串字段,空值忽略 */\r\n buildQueryParams(params) {\r\n const textFields = ['xh', 'xm', 'zjhm', 'zzmm', 'mz', 'jg', 'xw', 'ybzb', 'sfzh', 'whcd', 'bkbyyx', 'bq', 'lxdh', 'txdz']\r\n textFields.forEach(key => {\r\n const v = this.searchForm[key]\r\n if (v !== '' && v !== null && v !== undefined) params[key] = v.trim()\r\n })\r\n if (this.searchForm.xb) params.xb = this.searchForm.xb\r\n },\r\n\r\n // ==================== 查询/分页 ====================\r\n handleSearch() {\r\n this.pagination.pageNum = 1\r\n this.loadData()\r\n },\r\n handlePageChange(page) {\r\n this.pagination.pageNum = page\r\n this.loadData()\r\n },\r\n handleSizeChange(size) {\r\n this.pagination.pageSize = size\r\n this.pagination.pageNum = 1\r\n this.loadData()\r\n },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n resetForm() {\r\n Object.assign(this.formData, this.createEmptyForm())\r\n this.$nextTick(() => {\r\n if (this.$refs.formRef) {\r\n this.$refs.formRef.clearValidate()\r\n }\r\n })\r\n },\r\n\r\n handleAdd() {\r\n this.dialogTitle = '新增学员'\r\n this.resetForm()\r\n this.dialogVisible = true\r\n },\r\n\r\n handleEdit(row) {\r\n this.dialogTitle = '编辑学员'\r\n this.resetForm()\r\n if (!row.bh) {\r\n Object.assign(this.formData, this.createEmptyForm(), row)\r\n this.dialogVisible = true\r\n return\r\n }\r\n getStudentRecord(row.bh).then(res => {\r\n const data = res.data || {}\r\n Object.assign(this.formData, this.createEmptyForm(), data)\r\n this.dialogVisible = true\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 新增/编辑提交 ====================\r\n handleSubmit() {\r\n this.$refs.formRef.validate(valid => {\r\n if (!valid) return\r\n this.submitting = true\r\n const isAdd = this.dialogTitle === '新增学员'\r\n const payload = { ...this.formData }\r\n const request = isAdd ? addStudentRecord(payload) : updateStudentRecord(payload)\r\n request.then(() => {\r\n this.$message.success(isAdd ? '新增成功' : '编辑成功')\r\n this.dialogVisible = false\r\n this.loadData()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.submitting = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n this.$confirm(`确定要删除\"${row.xm}\"吗?`, '删除确认', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return delStudentRecord(row.bh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.loadData()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 成绩弹窗 ====================\r\n // TODO: 后端接口未提供,成绩数据为前端模拟;接口就绪后替换为 getStudentGrades / getStudentProcessGrades\r\n handleGrades(row) {\r\n this.gradesStudent = row.xm || ''\r\n this.currentBh = row.bh || ''\r\n this.gradesData = null\r\n this.processGradesData = null\r\n this.gradesTab = 'grades'\r\n this.gradesVisible = true\r\n this.gradesLoading = true\r\n setTimeout(() => {\r\n this.gradesData = { 学员: row.xm, 学号: row.xh, 课程: '通信原理', 成绩: 92, 学分: 3.0 }\r\n this.processGradesData = { 进程成绩: [{ 名称: '平时成绩', 得分: 95 }, { 名称: '期末成绩', 得分: 88 }] }\r\n this.gradesLoading = false\r\n }, 300)\r\n },\r\n\r\n // TODO: 后端接口未提供,导出为前端模拟;接口就绪后替换为 exportStudentGrades\r\n handleExportGrades() {\r\n this.$message.success(`已导出学员${this.gradesStudent}成绩(前端模拟)`)\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.student-info-page {\r\n .search-card {\r\n .search-form {\r\n .range-control {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n width: 100%;\r\n\r\n .el-input {\r\n flex: 1;\r\n }\r\n\r\n .range-sep {\r\n flex-shrink: 0;\r\n font-size: 12px;\r\n color: #606266;\r\n }\r\n }\r\n\r\n .search-tip {\r\n font-size: 12px;\r\n color: #f56c6c;\r\n margin-top: 8px;\r\n margin-bottom: 8px;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding-top: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n }\r\n }\r\n\r\n .toolbar {\r\n margin-bottom: 16px;\r\n }\r\n\r\n .table-card {\r\n .el-table {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .text-primary {\r\n color: #409eff;\r\n padding: 0;\r\n }\r\n\r\n .text-success {\r\n color: #67c23a;\r\n padding: 0;\r\n }\r\n\r\n .danger-text {\r\n color: #f56c6c;\r\n padding: 0;\r\n }\r\n\r\n .full-width {\r\n width: 100%;\r\n }\r\n\r\n}\r\n</style>\r\n"]}]} |