This commit is contained in:
2026-08-24 10:49:27 +08:00
parent 5e3217dc8f
commit a5cd5eab44
5 changed files with 386 additions and 1343 deletions
-19
View File
@@ -1,19 +0,0 @@
import request from '@/utils/request'
// 课程科目(课表 KB)管理(JYSController /jys/kb
// 接口依据:JYSController 控制器(前端 baseURL 为 /api,此处不重复 /api 前缀)
/**
* 分页查询课程科目(课表 KB
* GET /jys/kb/list
* 查询参数:pageNum、pageSize、kmc 课名称(模糊)、jysdh 教研室代号(等值)、
* kclx 课程类型、pxlx 培训类型、pxcc 培训层次、kmdm 科目代码(模糊)、jc 简称(模糊)
* 返回:PageResult<KB>records/total
*/
export function listKb(params) {
return request({
url: '/jys/kb/list',
method: 'get',
params
})
}
+70
View File
@@ -0,0 +1,70 @@
import request from '@/utils/request'
// 课程科目(课标 KB)管理(JYSController /jys/kb
// 接口依据:JYSController 控制器(前端 baseURL 为 /api,此处不重复 /api 前缀)
// 实体 KB 主键为 kbh(课编号);新增时 kbh 留空由后端生成 UUID;xhbs 字段无需传递(后端 NEVER)
/**
* 新增课程科目
* POST /jys/kb/add
* body 为 KB 实体;kbh 可留空(后端生成 UUID)
*/
export function addSubject(data) {
return request({
url: '/jys/kb/add',
method: 'post',
data
})
}
/**
* 删除课程科目
* POST /jys/kb/delete?kbh=
*/
export function deleteSubject(kbh) {
return request({
url: '/jys/kb/delete',
method: 'post',
params: { kbh }
})
}
/**
* 编辑课程科目
* POST /jys/kb/update
* body 为 KB 实体,kbh 课编号必传
*/
export function updateSubject(data) {
return request({
url: '/jys/kb/update',
method: 'post',
data
})
}
/**
* 查询课程科目详情
* GET /jys/kb/get?kbh=
*/
export function getSubject(kbh) {
return request({
url: '/jys/kb/get',
method: 'get',
params: { kbh }
})
}
/**
* 分页查询课程科目(课标 KB
* GET /jys/kb/list
* 查询参数:pageNum、pageSize、kmc 课名称(模糊)、jc 简称(模糊)、kmdm 科目代码(模糊)、
* jysdh 教研室代号(等值)、kclx 课程类型、pxlx 培训类型、pxcc 培训层次
* 返回:PageResult<KB>records/total
*/
export function listSubject(params) {
return request({
url: '/jys/kb/list',
method: 'get',
params
})
}
-878
View File
@@ -1,878 +0,0 @@
<template>
<div class="app-container assessment-page">
<el-tabs v-model="activeTab" type="border-card" class="assessment-tabs">
<!-- ==================== Tab1课程表信息列表 ==================== -->
<el-tab-pane label="课程表信息列表" name="schedule">
<!-- 查询条件 -->
<el-card shadow="never" class="search-card">
<el-form :model="scheduleSearchForm" label-width="160px" class="search-form">
<!-- 考核日期独立整行 -->
<el-row :gutter="0">
<el-col :span="24">
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.examDateEnabled">考核日期</el-checkbox>
</template>
<div class="date-block">
<div class="date-range">
<span></span>
<el-date-picker
v-model="scheduleSearchForm.examDateFrom"
type="date"
value-format="yyyy-MM-dd"
:disabled="!scheduleSearchForm.examDateEnabled"
/>
<span></span>
<el-date-picker
v-model="scheduleSearchForm.examDateTo"
type="date"
value-format="yyyy-MM-dd"
:disabled="!scheduleSearchForm.examDateEnabled"
/>
</div>
<div class="quick-row">
<el-select v-model="scheduleSearchForm.semester" class="quick-select">
<el-option v-for="item in semesterOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-button size="small" @click="handleQuickDate('semester')">确定</el-button>
<el-select v-model="scheduleSearchForm.week" class="quick-select">
<el-option v-for="item in weekOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-button size="small" @click="handleQuickDate('week')">确定</el-button>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="0">
<!-- 左栏 -->
<el-col :span="12">
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.deptEnabled">教研室</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.dept" class="w-full" :disabled="!scheduleSearchForm.deptEnabled">
<el-option v-for="item in deptOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.buildingEnabled">教学楼</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.building" class="w-full" :disabled="!scheduleSearchForm.buildingEnabled">
<el-option v-for="item in buildingOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="培训层次">
<el-select v-model="scheduleSearchForm.trainLevel" placeholder="请选择" clearable class="w-full">
<el-option v-for="item in trainLevelOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.deptSystemEnabled">监考教员所属院部系</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.deptSystem" class="w-full" :disabled="!scheduleSearchForm.deptSystemEnabled">
<el-option v-for="item in deptOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.resourceTypeEnabled">保障资源类别</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.resourceType" class="w-full" :disabled="!scheduleSearchForm.resourceTypeEnabled">
<el-option v-for="item in resourceTypeOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.periodEnabled">节次</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.period" class="w-full" :disabled="!scheduleSearchForm.periodEnabled">
<el-option v-for="item in periodOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.combineEnabled">合堂选项</el-checkbox>
</template>
<el-checkbox v-model="scheduleSearchForm.combineChange" :disabled="!scheduleSearchForm.combineEnabled">合堂变动</el-checkbox>
</el-form-item>
<el-form-item label="专业名称">
<el-input v-model="scheduleSearchForm.majorName" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="监考教员姓名">
<el-input v-model="scheduleSearchForm.invigilatorName" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="考核场地名称">
<el-input v-model="scheduleSearchForm.examPlaceName" placeholder="请输入" clearable />
</el-form-item>
</el-col>
<!-- 右栏 -->
<el-col :span="12">
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.invigilatorEnabled">监考教员</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.invigilator" class="w-full" :disabled="!scheduleSearchForm.invigilatorEnabled">
<el-option v-for="item in invigilatorOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.examSubjectEnabled">考核科目</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.examSubject" class="w-full" :disabled="!scheduleSearchForm.examSubjectEnabled">
<el-option v-for="item in subjectOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.placeEnabled">教学场地</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.place" class="w-full" :disabled="!scheduleSearchForm.placeEnabled">
<el-option v-for="item in placeOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.teamEnabled">班次</el-checkbox>
</template>
<div class="team-field">
<el-select v-model="scheduleSearchForm.team" placeholder="请选择" :disabled="!scheduleSearchForm.teamEnabled">
<el-option v-for="item in teamOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-checkbox v-model="scheduleSearchForm.showElective" class="elective-check">显示选修课临时班</el-checkbox>
</div>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.teamCategoryEnabled">队别</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.teamCategory" class="w-full" :disabled="!scheduleSearchForm.teamCategoryEnabled">
<el-option v-for="item in teamCategoryOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.resourceEnabled">保障资源</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.resource" class="w-full" :disabled="!scheduleSearchForm.resourceEnabled">
<el-option v-for="item in resourceOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.manageOrgEnabled">管理机构</el-checkbox>
</template>
<el-select v-model="scheduleSearchForm.manageOrg" class="w-full" :disabled="!scheduleSearchForm.manageOrgEnabled">
<el-option v-for="item in manageOrgOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="scheduleSearchForm.logOptionEnabled">日志填写选项</el-checkbox>
</template>
<el-radio-group v-model="scheduleSearchForm.logOption" :disabled="!scheduleSearchForm.logOptionEnabled">
<el-radio :label="'已填写'">已填写</el-radio>
<el-radio :label="'未填写'">未填写</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="年级">
<el-input v-model="scheduleSearchForm.gradeInput" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="队别班次名称">
<el-input v-model="scheduleSearchForm.teamClassName" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="科目名称">
<el-input v-model="scheduleSearchForm.subjectName" placeholder="请输入" clearable />
</el-form-item>
</el-col>
</el-row>
<div class="search-actions">
<el-button type="primary" @click="handleScheduleQuery">查询</el-button>
</div>
</el-form>
</el-card>
<!-- 操作与列表区域 -->
<el-card shadow="never" class="table-card">
<div class="table-title">课程表信息列表</div>
<div class="action-bar">
<div class="action-row">
<el-button type="primary" size="small" @click="handleScheduleBatch('批量设置备注信息')">批量设置备注信息</el-button>
<el-button type="primary" size="small" @click="handleScheduleBatch('批量变更时间')">批量变更时间</el-button>
<el-button type="primary" size="small" @click="handleScheduleBatch('批量平移时间')">批量平移时间</el-button>
<el-button type="primary" size="small" @click="handleScheduleBatch('批量变更授课教员')">批量变更授课教员</el-button>
<el-button type="primary" size="small" @click="handleScheduleBatch('批量变更授课场地')">批量变更授课场地</el-button>
<el-button type="primary" size="small" @click="handleExport('班次课程课时汇总')">班次课程课时汇总另存</el-button>
<el-button type="primary" size="small" @click="handleExport('教学实施计划概要')">教学实施计划概要另存</el-button>
<el-button type="primary" size="small" @click="handleExport('教学实施计划')">教学实施计划另存</el-button>
</div>
<div class="action-row">
<el-button type="danger" size="small" @click="handleScheduleBatchDelete">批量删除</el-button>
</div>
</div>
<el-table v-loading="scheduleLoading" :data="schedulePagedData" border stripe class="main-table" @selection-change="handleScheduleSelectionChange">
<el-table-column type="selection" width="50" />
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="time" label="上课时间" width="150" align="center" />
<el-table-column prop="course" label="课程" width="110" show-overflow-tooltip />
<el-table-column prop="deptUnit" label="责任单位" width="120" show-overflow-tooltip />
<el-table-column prop="teamCategory" label="队别" width="90" align="center" />
<el-table-column prop="teamClass" label="班次" show-overflow-tooltip />
<el-table-column prop="grade" label="年级" width="90" align="center" />
<el-table-column prop="major" label="专业" width="100" show-overflow-tooltip />
<el-table-column prop="teacher" label="教员" width="80" align="center" />
<el-table-column prop="countPlace" label="人数/场地" width="110" align="center" />
<el-table-column prop="contentMethod" label="教学内容方法" width="110" show-overflow-tooltip />
<el-table-column prop="keyPoints" label="教学要点" width="100" show-overflow-tooltip />
<el-table-column prop="guarantee" label="保障明细" width="110" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" width="90" show-overflow-tooltip />
</el-table>
<div class="pagination-wrap">
<el-pagination
background
layout="total, prev, pager, next, jumper"
:total="scheduleData.length"
:page-size="schedulePageSize"
:current-page="scheduleCurrentPage"
@current-change="handleSchedulePageChange"
/>
</div>
</el-card>
</el-tab-pane>
<!-- ==================== Tab2课程检索 ==================== -->
<el-tab-pane label="课程检索" name="search">
<div v-if="statusTip" class="status-tip">{{ statusTip }}</div>
<div class="export-bar">
<el-button type="primary" @click="handleExport('另存Excel(成绩五级制)')">另存Excel(成绩五级制)</el-button>
<el-button type="primary" @click="handleExport('另存Excel(成绩四级制)')">另存Excel(成绩四级制)</el-button>
<el-button type="primary" @click="handleExport('课程学员名单')">课程学员名单</el-button>
</div>
<!-- 查询条件 -->
<el-card shadow="never" class="search-card">
<el-form :model="courseSearchForm" label-width="130px" class="search-form">
<el-row :gutter="0">
<!-- 左栏 -->
<el-col :span="12">
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.deptEnabled">责任教研室</el-checkbox>
</template>
<el-select v-model="courseSearchForm.dept" class="w-full" :disabled="!courseSearchForm.deptEnabled">
<el-option v-for="item in deptOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.courseTypeEnabled">课类型</el-checkbox>
</template>
<el-select v-model="courseSearchForm.courseType" class="w-full" :disabled="!courseSearchForm.courseTypeEnabled">
<el-option v-for="item in courseTypeOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="培训层次">
<el-select v-model="courseSearchForm.trainLevel" placeholder="请选择" clearable class="w-full">
<el-option v-for="item in trainLevelOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.teamEnabled">队别(班次)</el-checkbox>
</template>
<el-select v-model="courseSearchForm.team" class="w-full" :disabled="!courseSearchForm.teamEnabled">
<el-option v-for="item in teamOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="学分">
<div class="range-control">
<el-input v-model="courseSearchForm.creditMin" placeholder="0" />
<span class="range-sep"></span>
<el-input v-model="courseSearchForm.creditMax" placeholder="0" />
</div>
</el-form-item>
<el-form-item label="计划学时">
<div class="range-control">
<el-input v-model="courseSearchForm.planHoursMin" placeholder="0" />
<span class="range-sep"></span>
<el-input v-model="courseSearchForm.planHoursMax" placeholder="0" />
</div>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.arrangeStatusEnabled">考核安排状态</el-checkbox>
</template>
<el-radio-group v-model="courseSearchForm.arrangeStatus" :disabled="!courseSearchForm.arrangeStatusEnabled">
<el-radio :label="'已安排'">已安排</el-radio>
<el-radio :label="'未安排'">未安排</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="教员">
<el-input v-model="courseSearchForm.teacher" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="队别班次">
<el-input v-model="courseSearchForm.teamClass" placeholder="请输入" clearable />
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.scoreStatusEnabled">成绩录入状态</el-checkbox>
</template>
<el-select v-model="courseSearchForm.scoreStatus" class="w-full" :disabled="!courseSearchForm.scoreStatusEnabled">
<el-option v-for="item in scoreStatusOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="形成性成绩比例">
<div class="range-control">
<el-input v-model="courseSearchForm.formaScoreMin" placeholder="0" />
<span class="range-suffix">%</span>
<span class="range-sep"></span>
<el-input v-model="courseSearchForm.formaScoreMax" placeholder="0" />
<span class="range-suffix">%</span>
</div>
</el-form-item>
</el-col>
<!-- 右栏 -->
<el-col :span="12">
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.implTeacherEnabled">实施教员</el-checkbox>
</template>
<el-select v-model="courseSearchForm.implTeacher" class="w-full" :disabled="!courseSearchForm.implTeacherEnabled">
<el-option v-for="item in implTeacherOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.courseSubjectEnabled">课程科目</el-checkbox>
</template>
<el-select v-model="courseSearchForm.courseSubject" class="w-full" :disabled="!courseSearchForm.courseSubjectEnabled">
<el-option v-for="item in subjectOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="教学楼">
<el-select v-model="courseSearchForm.building" class="w-full">
<el-option v-for="item in buildingOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.placeEnabled">教学场地</el-checkbox>
</template>
<el-select v-model="courseSearchForm.place" class="w-full" :disabled="!courseSearchForm.placeEnabled">
<el-option v-for="item in placeOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.startDateEnabled">开课日期</el-checkbox>
</template>
<div class="range-control">
<el-date-picker v-model="courseSearchForm.startDateStart" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.startDateEnabled" />
<span class="range-sep"></span>
<el-date-picker v-model="courseSearchForm.startDateEnd" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.startDateEnabled" />
</div>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.endDateEnabled">结课日期</el-checkbox>
</template>
<div class="range-control">
<el-date-picker v-model="courseSearchForm.endDateStart" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.endDateEnabled" />
<span class="range-sep"></span>
<el-date-picker v-model="courseSearchForm.endDateEnd" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.endDateEnabled" />
</div>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.examDateEnabled">考试日期</el-checkbox>
</template>
<div class="range-control">
<el-date-picker v-model="courseSearchForm.examDateStart" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.examDateEnabled" />
<span class="range-sep"></span>
<el-date-picker v-model="courseSearchForm.examDateEnd" type="date" value-format="yyyy-MM-dd" :disabled="!courseSearchForm.examDateEnabled" />
</div>
</el-form-item>
<el-form-item label="课程科目">
<el-input v-model="courseSearchForm.courseSubjectInput" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="教学场地">
<el-input v-model="courseSearchForm.placeInput" placeholder="请输入" clearable />
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.finalStrategyEnabled">终结性成绩策略</el-checkbox>
</template>
<el-checkbox v-model="courseSearchForm.finalPassEnabled">终结性成绩定及格</el-checkbox>
</el-form-item>
<el-form-item>
<template slot="label">
<el-checkbox v-model="courseSearchForm.manageOrgEnabled">管理机构</el-checkbox>
</template>
<el-select v-model="courseSearchForm.manageOrg" class="w-full" :disabled="!courseSearchForm.manageOrgEnabled">
<el-option v-for="item in manageOrgOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="search-tip">注意勾选"选择框"表示启用该项对应的查询条件输入框非空表示启用查询条件</div>
<div class="search-actions">
<el-button type="primary" @click="handleCourseQuery">查询</el-button>
</div>
</el-form>
</el-card>
<!-- 数据表格 -->
<el-card shadow="never" class="table-card">
<el-table v-loading="courseLoading" :data="coursePagedData" border stripe class="main-table">
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column label="课程名称/课时系数" width="150" align="center">
<template slot="header">
<div class="two-line-header">
<span>课程名称</span>
<span>课时系数</span>
</div>
</template>
<template slot-scope="{ row }">
<div class="two-line-cell">
<span>{{ row.courseName }}</span>
<span>{{ row.coeff }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="teacherTimes" label="责任教员&课次" width="120" align="center" />
<el-table-column prop="teamClass" label="班次" show-overflow-tooltip />
<el-table-column prop="grade" label="年级" width="90" align="center" />
<el-table-column prop="major" label="专业" width="120" show-overflow-tooltip />
<el-table-column prop="planHours" label="计划学时" width="90" align="center" />
<el-table-column prop="runHours" label="运行学时" width="90" align="center" />
<el-table-column prop="examType" label="考核类型方式" width="110" align="center" />
<el-table-column prop="implTeacher" label="实施教员" width="90" align="center" />
<el-table-column prop="countPlace" label="人数/场地" width="110" align="center" />
<el-table-column prop="courseLecture" label="课程讲座" width="90" align="center" />
<el-table-column prop="planChange" label="实施计划变" width="90" align="center" />
</el-table>
<div class="pagination-wrap">
<el-pagination
background
layout="total, prev, pager, next, jumper"
:total="courseData.length"
:page-size="coursePageSize"
:current-page="courseCurrentPage"
@current-change="handleCoursePageChange"
/>
</div>
</el-card>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
export default {
name: 'AssessmentIndex',
data() {
return {
activeTab: 'schedule',
// ==================== 下拉选项(两页共用) ====================
deptOptions: ['教务处', '政治工作教研室', '军事基础教研室', '装备保障教研室'],
trainLevelOptions: ['本科', '研究生', '大专'],
buildingOptions: ['校内', '教学楼A', '教学楼B'],
placeOptions: ['操场', '教室101', '实验室203'],
subjectOptions: ['英语(补课)', '高等数学', '军事理论', '战术基础'],
teamOptions: ['2025级炮兵装备运用(线膛炮)专业学员54队5区队', '2024级学员32队', '研究生1队'],
manageOrgOptions: ['教务处', '教务科', '教研室'],
// Tab1 专属选项
semesterOptions: ['2026年春季学期', '2026年秋季学期', '2025年秋季学期'],
weekOptions: ['第20周2026-07-06', '第19周2026-06-29', '第21周2026-07-13'],
resourceTypeOptions: ['弹药', '器材', '场地'],
periodOptions: ['1-2', '3-4', '5-6', '7-8'],
invigilatorOptions: ['教务处', '张三', '李四', '王五'],
teamCategoryOptions: ['学员大队', '学员一队', '学员二队'],
resourceOptions: ['92式手榴弹', '模拟器材', '靶场'],
// Tab2 专属选项
courseTypeOptions: ['讲座', '讲授', '研讨', '实操'],
scoreStatusOptions: ['未填写', '已填写'],
implTeacherOptions: ['教务处', '张三', '李四', '王五', '赵六'],
// ==================== Tab1 查询条件 ====================
scheduleSearchForm: {
examDateEnabled: true,
examDateFrom: '2026-07-06',
examDateTo: '2026-07-12',
semester: '2026年春季学期',
week: '第20周2026-07-06',
deptEnabled: false,
dept: '教务处',
buildingEnabled: true,
building: '校内',
trainLevel: '',
deptSystemEnabled: false,
deptSystem: '教务处',
resourceTypeEnabled: false,
resourceType: '弹药',
periodEnabled: false,
period: '1-2',
combineEnabled: false,
combineChange: false,
majorName: '',
invigilatorName: '',
examPlaceName: '',
invigilatorEnabled: false,
invigilator: '教务处',
examSubjectEnabled: false,
examSubject: '英语(补课)',
placeEnabled: false,
place: '操场',
teamEnabled: false,
team: '',
showElective: true,
teamCategoryEnabled: false,
teamCategory: '学员大队',
resourceEnabled: false,
resource: '92式手榴弹',
manageOrgEnabled: false,
manageOrg: '教务处',
logOptionEnabled: false,
logOption: '未填写',
gradeInput: '',
teamClassName: '',
subjectName: ''
},
// ==================== Tab2 查询条件 ====================
statusTip: '',
courseSearchForm: {
deptEnabled: false,
dept: '教务处',
courseTypeEnabled: false,
courseType: '讲座',
trainLevel: '',
teamEnabled: false,
team: '2025级炮兵装备运用(线膛炮)专业学员54队5区队',
creditMin: '',
creditMax: '',
planHoursMin: '',
planHoursMax: '',
arrangeStatusEnabled: true,
arrangeStatus: '已安排',
teacher: '',
teamClass: '',
scoreStatusEnabled: false,
scoreStatus: '未填写',
formaScoreMin: '',
formaScoreMax: '',
implTeacherEnabled: false,
implTeacher: '教务处',
courseSubjectEnabled: false,
courseSubject: '英语(补课)',
building: '校内',
placeEnabled: false,
place: '操场',
startDateEnabled: false,
startDateStart: '2026-08-21',
startDateEnd: '2027-01-23',
endDateEnabled: false,
endDateStart: '2026-08-21',
endDateEnd: '2027-01-23',
examDateEnabled: false,
examDateStart: '2026-08-21',
examDateEnd: '2027-01-23',
courseSubjectInput: '',
placeInput: '',
finalStrategyEnabled: false,
finalPassEnabled: false,
manageOrgEnabled: false,
manageOrg: '教务处'
},
// ==================== Tab1 表格数据(mock ====================
scheduleLoading: false,
scheduleData: [
{ id: 1, time: '2026-07-06 08:00-09:40', course: '高等数学', deptUnit: '教务处', teamCategory: '学员大队', teamClass: '2025级本科1班', grade: '2025级', major: '数学', teacher: '张三', countPlace: '45/教室101', contentMethod: '理论讲授', keyPoints: '微积分基础', guarantee: '无', remark: '第1次课' },
{ id: 2, time: '2026-07-06 10:00-11:40', course: '军事理论', deptUnit: '政治工作教研室', teamCategory: '学员大队', teamClass: '2024级本科2班', grade: '2024级', major: '军事', teacher: '李四', countPlace: '38/教室203', contentMethod: '案例教学', keyPoints: '战争理论', guarantee: '多媒体', remark: '' },
{ id: 3, time: '2026-07-07 14:30-16:10', course: '英语(补课)', deptUnit: '军事基础教研室', teamCategory: '学员一队', teamClass: '研究生1班', grade: '2026级', major: '英语', teacher: '王五', countPlace: '30/教室102', contentMethod: '研讨教学', keyPoints: '口语训练', guarantee: '无', remark: '补课' },
{ id: 4, time: '2026-07-07 08:00-09:40', course: '战术基础', deptUnit: '教务处', teamCategory: '学员大队', teamClass: '2023级本科3班', grade: '2023级', major: '战术', teacher: '赵六', countPlace: '50/操场', contentMethod: '实操演练', keyPoints: '战术动作', guarantee: '器材', remark: '' },
{ id: 5, time: '2026-07-08 10:00-11:40', course: '装备保障', deptUnit: '装备保障教研室', teamCategory: '学员二队', teamClass: '研究生2班', grade: '2026级', major: '装备', teacher: '孙七', countPlace: '20/实验室203', contentMethod: '实践教学', keyPoints: '装备维护', guarantee: '模拟器材', remark: '分组' },
{ id: 6, time: '2026-07-08 14:30-16:10', course: '联合作战指挥', deptUnit: '教务处', teamCategory: '学员大队', teamClass: '2025级本科1班', grade: '2025级', major: '指挥', teacher: '李四', countPlace: '45/教室B301', contentMethod: '案例教学', keyPoints: '联合作战', guarantee: '多媒体', remark: '' },
{ id: 7, time: '2026-07-09 08:00-09:40', course: '大学英语', deptUnit: '军事基础教研室', teamCategory: '学员一队', teamClass: '2024级本科2班', grade: '2024级', major: '英语', teacher: '王五', countPlace: '38/教室105', contentMethod: '理论讲授', keyPoints: '语法', guarantee: '无', remark: '' },
{ id: 8, time: '2026-07-09 10:00-11:40', course: '政治理论', deptUnit: '政治工作教研室', teamCategory: '学员大队', teamClass: '研究生1班', grade: '2026级', major: '政治', teacher: '张三', countPlace: '30/教室204', contentMethod: '理论讲授', keyPoints: '形势政策', guarantee: '无', remark: '' },
{ id: 9, time: '2026-07-10 14:30-16:10', course: '装备操作', deptUnit: '装备保障教研室', teamCategory: '学员二队', teamClass: '2023级本科3班', grade: '2023级', major: '装备', teacher: '赵六', countPlace: '45/实验室101', contentMethod: '实操演练', keyPoints: '操作规范', guarantee: '器材', remark: '安全注意' },
{ id: 10, time: '2026-07-10 16:20-18:00', course: '军事地形学', deptUnit: '教务处', teamCategory: '学员大队', teamClass: '2025级本科1班', grade: '2025级', major: '地形', teacher: '孙七', countPlace: '50/操场', contentMethod: '实操演练', keyPoints: '地形判读', guarantee: '地图', remark: '' }
],
selectedRows: [],
scheduleCurrentPage: 1,
schedulePageSize: 20,
// ==================== Tab2 表格数据(mock ====================
courseLoading: false,
courseData: [
{ id: 1, courseName: '高等数学', coeff: '1.0', teacherTimes: '张三×48', teamClass: '2025级炮兵装备运用(线膛炮)专业学员54队5区队', grade: '2025级', major: '炮兵装备运用', planHours: 96, runHours: 96, examType: '闭卷考试', implTeacher: '张三', countPlace: '45/教室101', courseLecture: '讲座', planChange: '否' },
{ id: 2, courseName: '军事理论', coeff: '1.2', teacherTimes: '李四×32', teamClass: '2024级学员32队', grade: '2024级', major: '军事指挥', planHours: 64, runHours: 62, examType: '开卷考试', implTeacher: '李四', countPlace: '38/教室203', courseLecture: '讲授', planChange: '是' },
{ id: 3, courseName: '英语(补课)', coeff: '0.8', teacherTimes: '王五×40', teamClass: '研究生1队', grade: '2026级', major: '英语', planHours: 80, runHours: 78, examType: '口语测试', implTeacher: '王五', countPlace: '30/教室102', courseLecture: '讲座', planChange: '否' },
{ id: 4, courseName: '战术基础', coeff: '1.0', teacherTimes: '赵六×56', teamClass: '2023级学员51队', grade: '2023级', major: '战术指挥', planHours: 112, runHours: 110, examType: '实操考核', implTeacher: '赵六', countPlace: '50/操场', courseLecture: '实操', planChange: '是' },
{ id: 5, courseName: '装备保障', coeff: '1.1', teacherTimes: '张三×24', teamClass: '研究生2队', grade: '2026级', major: '装备保障', planHours: 48, runHours: 48, examType: '闭卷考试', implTeacher: '孙七', countPlace: '20/实验室203', courseLecture: '讲授', planChange: '否' },
{ id: 6, courseName: '联合作战指挥', coeff: '1.3', teacherTimes: '李四×60', teamClass: '2025级炮兵装备运用(线膛炮)专业学员54队5区队', grade: '2025级', major: '联合作战', planHours: 120, runHours: 118, examType: '综合考核', implTeacher: '李四', countPlace: '45/教室B301', courseLecture: '讲座', planChange: '是' },
{ id: 7, courseName: '大学英语', coeff: '0.8', teacherTimes: '王五×36', teamClass: '2024级学员32队', grade: '2024级', major: '英语', planHours: 72, runHours: 72, examType: '四级制考试', implTeacher: '王五', countPlace: '38/教室105', courseLecture: '讲授', planChange: '否' },
{ id: 8, courseName: '军事地形学', coeff: '1.0', teacherTimes: '赵六×40', teamClass: '2023级学员51队', grade: '2023级', major: '军事指挥', planHours: 80, runHours: 76, examType: '实操考核', implTeacher: '赵六', countPlace: '50/操场', courseLecture: '实操', planChange: '是' },
{ id: 9, courseName: '政治理论', coeff: '1.0', teacherTimes: '张三×48', teamClass: '研究生1队', grade: '2026级', major: '政治学', planHours: 96, runHours: 96, examType: '开卷考试', implTeacher: '孙七', countPlace: '30/教室204', courseLecture: '讲座', planChange: '否' },
{ id: 10, courseName: '装备操作', coeff: '1.2', teacherTimes: '李四×32', teamClass: '2025级炮兵装备运用(线膛炮)专业学员54队5区队', grade: '2025级', major: '炮兵装备运用', planHours: 64, runHours: 62, examType: '实操考核', implTeacher: '李四', countPlace: '45/实验室101', courseLecture: '实操', planChange: '是' }
],
courseCurrentPage: 1,
coursePageSize: 20
}
},
computed: {
schedulePagedData() {
const start = (this.scheduleCurrentPage - 1) * this.schedulePageSize
return this.scheduleData.slice(start, start + this.schedulePageSize)
},
coursePagedData() {
const start = (this.courseCurrentPage - 1) * this.coursePageSize
return this.courseData.slice(start, start + this.coursePageSize)
}
},
methods: {
// ==================== Tab1 查询 ====================
// TODO: 后端接口未提供,以下操作均为前端模拟;接口就绪后替换为对应接口
handleScheduleQuery() {
this.$message.success('查询完成(前端模拟)')
},
/** 学期/周次「确定」快速填充日期范围 */
handleQuickDate(type) {
if (type === 'semester') {
this.$message.success(`已按「${this.scheduleSearchForm.semester}」确定考核日期范围(前端模拟)`)
} else {
this.$message.success(`已按「${this.scheduleSearchForm.week}」确定考核日期范围(前端模拟)`)
}
},
// ==================== 导出按钮 ====================
handleExport(type) {
this.$message.success(`已导出 ${type}(前端模拟)`)
},
// ==================== Tab1 多选与批量操作 ====================
handleScheduleSelectionChange(rows) {
this.selectedRows = rows
},
handleScheduleBatch(action) {
if (this.selectedRows.length === 0) {
this.$message.warning('请先选择记录')
return
}
this.$message.success(`已对所选 ${this.selectedRows.length} 条记录执行「${action}」(前端模拟)`)
},
handleScheduleBatchDelete() {
if (this.selectedRows.length === 0) {
this.$message.warning('请先选择要删除的记录')
return
}
const ids = this.selectedRows.map((r) => r.id)
this.scheduleData = this.scheduleData.filter((r) => ids.indexOf(r.id) === -1)
this.$message.success(`已删除所选 ${ids.length} 条记录(前端模拟)`)
},
handleSchedulePageChange(page) {
this.scheduleCurrentPage = page
},
// ==================== Tab2 查询 ====================
handleCourseQuery() {
const now = new Date()
const hh = String(now.getHours()).padStart(2, '0')
const mm = String(now.getMinutes()).padStart(2, '0')
const ss = String(now.getSeconds()).padStart(2, '0')
const count = this.courseData.length
this.statusTip = `[${hh}:${mm}:${ss}]查询成功! 共检索到${count}条记录。`
this.$message.success(`查询成功,共检索到${count}条记录(前端模拟)`)
},
handleCoursePageChange(page) {
this.courseCurrentPage = page
}
}
}
</script>
<style scoped lang="scss">
.app-container {
padding: 20px;
}
.assessment-page {
.assessment-tabs {
background: #fff;
}
// ==================== 查询条件区域 ====================
.search-card {
margin-bottom: 16px;
.search-form {
.w-full {
width: 100%;
}
.date-block {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
.date-range {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
}
.quick-row {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
.quick-select {
width: 170px;
}
}
}
.team-field {
display: flex;
align-items: center;
gap: 8px;
.el-select {
flex: 1;
min-width: 0;
}
.elective-check {
white-space: nowrap;
}
}
.range-control {
display: flex;
align-items: center;
gap: 6px;
.el-input {
flex: 1;
}
.el-date-editor {
flex: 1;
min-width: 120px;
}
.range-sep,
.range-suffix {
flex-shrink: 0;
font-size: 12px;
color: #606266;
}
}
.search-tip {
font-size: 12px;
color: #f56c6c;
margin-top: 4px;
margin-bottom: 4px;
}
.search-actions {
display: flex;
justify-content: flex-end;
margin-top: 8px;
padding-top: 12px;
border-top: 1px solid #ebeef5;
}
}
}
// ==================== Tab2 顶部提示 / 标题 / 导出 ====================
.status-tip {
display: inline-block;
background: #dc3545;
color: #fff;
font-size: 12px;
padding: 3px 10px;
border-radius: 4px;
margin-bottom: 12px;
}
.big-title {
text-align: center;
font-size: 20px;
font-weight: 700;
color: #303133;
margin: 8px 0 12px;
}
.export-bar {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-bottom: 16px;
}
// ==================== 数据表格区域 ====================
.table-card {
.table-title {
font-size: 16px;
font-weight: 600;
color: #303133;
margin-bottom: 12px;
}
.action-bar {
.action-row {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 10px;
&:last-child {
margin-bottom: 14px;
}
}
}
.main-table {
::v-deep(.cell) {
font-size: 12px;
}
}
.two-line-header,
.two-line-cell {
display: flex;
flex-direction: column;
line-height: 1.4;
}
.pagination-wrap {
display: flex;
justify-content: flex-end;
margin-top: 12px;
}
}
}
</style>
@@ -242,7 +242,7 @@
import { listTeachingPlan } from '@/api/teachBusiness/courseRunning'
import { listStudentTeamTask } from '@/api/teachBusiness/studentTeamTask'
import { listTeam } from '@/api/studentRecords/team'
import { listKb } from '@/api/teachOffice/kb'
import { listSubject } from '@/api/teachOffice/subject'
import { listTeacher } from '@/api/teachOffice/teacher'
import { listAllSemester } from '@/api/teachBusiness/semester'
@@ -516,7 +516,7 @@ export default {
})
},
loadKbMap() {
listKb({ pageNum: 1, pageSize: 1000 }).then(response => {
listSubject({ pageNum: 1, pageSize: 1000 }).then(response => {
const data = response.data || {}
const map = {}
;(data.records || []).forEach(item => {
+314 -444
View File
@@ -1,7 +1,5 @@
<template>
<div class="app-container subject-page">
<!-- ==================== 1. 顶部状态提示 ==================== -->
<div class="status-tip">{{ statusTip }}</div>
<!-- ==================== 2. 查询条件区域 ==================== -->
<el-card shadow="never" class="search-card">
@@ -10,152 +8,41 @@
<!-- 左栏 -->
<el-col :xs="24" :md="12">
<div class="query-field">
<span class="q-label no-check">程别</span>
<el-input v-model="searchForm.kcbh" placeholder="请输入课程别名" clearable class="q-control" />
<span class="q-label no-check">课名</span>
<el-input v-model="searchForm.kmc" placeholder="请输入课名" clearable class="q-control" />
</div>
<div class="query-field">
<span class="q-label no-check">简称</span>
<el-input v-model="searchForm.jc" placeholder="请输入简称" clearable class="q-control" />
<span class="q-label no-check">科目代码</span>
<el-input v-model="searchForm.kmdm" placeholder="请输入科目代码" clearable class="q-control" />
</div>
<div class="query-field">
<span class="q-label no-check">学分</span>
<div class="q-control range-control">
<el-input v-model="searchForm.xfMin" placeholder="0" />
<span class="range-sep"></span>
<el-input v-model="searchForm.xfMax" placeholder="0" />
</div>
<span class="q-label no-check">培训层次</span>
<el-input v-model="searchForm.pxcc" placeholder="请输入培训层次" clearable class="q-control" />
</div>
<div class="query-field">
<span class="q-label no-check">学时</span>
<div class="q-control range-control">
<el-input v-model="searchForm.xsMin" placeholder="0" />
<span class="range-sep"></span>
<el-input v-model="searchForm.xsMax" placeholder="0" />
</div>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.zcfsEnabled" />
<span class="q-label">支持方式</span>
<el-select v-model="searchForm.zcfs" class="q-control" :disabled="!searchForm.zcfsEnabled">
<el-option v-for="item in zcfsOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.khlxEnabled" />
<span class="q-label">考核类型</span>
<el-select v-model="searchForm.khlx" class="q-control" :disabled="!searchForm.khlxEnabled">
<el-option v-for="item in khlxOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<span class="q-label no-check">秘密等级</span>
<el-select v-model="searchForm.mmdj" placeholder="请选择" class="q-control">
<el-option v-for="item in mmdjOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.dgxzEnabled" />
<span class="q-label">大纲性质</span>
<el-radio-group v-model="searchForm.dgxz" class="q-control" :disabled="!searchForm.dgxzEnabled">
<el-radio :label="'大纲课程'">大纲课程</el-radio>
<el-radio :label="'非大纲课程'">非大纲课程</el-radio>
</el-radio-group>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.zzglEnabled" />
<span class="q-label">政治类课程</span>
<el-radio-group v-model="searchForm.zzgl" class="q-control" :disabled="!searchForm.zzglEnabled">
<el-radio :label="'政治类'">政治类</el-radio>
<el-radio :label="'非政治类'">非政治类</el-radio>
</el-radio-group>
</div>
<div class="query-field">
<span class="q-label no-check">备注</span>
<el-input v-model="searchForm.bz" placeholder="请输入备注" clearable class="q-control" />
<span class="q-label no-check">课程类型</span>
<el-input v-model="searchForm.kclx" placeholder="请输入课程类型" clearable class="q-control" />
</div>
</el-col>
<!-- 右栏 -->
<el-col :xs="24" :md="12">
<div class="query-field">
<el-checkbox v-model="searchForm.jysEnabled" />
<span class="q-label">教研室</span>
<el-select v-model="searchForm.jys" class="q-control" :disabled="!searchForm.jysEnabled">
<el-option v-for="item in jysOptions" :key="item" :label="item" :value="item" />
</el-select>
<span class="q-label no-check">简称</span>
<el-input v-model="searchForm.jc" placeholder="请输入简称" clearable class="q-control" />
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.pxccEnabled" />
<span class="q-label">培训层次</span>
<el-select v-model="searchForm.pxcc" class="q-control" :disabled="!searchForm.pxccEnabled">
<el-option v-for="item in pxccOptions" :key="item" :label="item" :value="item" />
</el-select>
<span class="q-label no-check">教研室代号</span>
<el-input v-model="searchForm.jysdh" placeholder="请输入教研室代号" clearable class="q-control" />
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.pxlxEnabled" />
<span class="q-label">培训类型</span>
<el-select v-model="searchForm.pxlx" class="q-control" :disabled="!searchForm.pxlxEnabled">
<el-option v-for="item in pxlxOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.kclxEnabled" />
<span class="q-label">课程类型</span>
<el-select v-model="searchForm.kclx" class="q-control" :disabled="!searchForm.kclxEnabled">
<el-option v-for="item in kclxOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.jsfsEnabled" />
<span class="q-label">建设方式</span>
<el-select v-model="searchForm.jsfs" class="q-control" :disabled="!searchForm.jsfsEnabled">
<el-option v-for="item in jsfsOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.pjqkEnabled" />
<span class="q-label">评选情况</span>
<el-select v-model="searchForm.pjqk" class="q-control" :disabled="!searchForm.pjqkEnabled">
<el-option v-for="item in pjqkOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.gljgEnabled" />
<span class="q-label">管理机构</span>
<el-select v-model="searchForm.gljg" class="q-control" :disabled="!searchForm.gljgEnabled">
<el-option v-for="item in gljgOptions" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.zyxzEnabled" />
<span class="q-label">在用选项</span>
<el-radio-group v-model="searchForm.zyxz" class="q-control" :disabled="!searchForm.zyxzEnabled">
<el-radio :label="'在用'">在用</el-radio>
<el-radio :label="'其他'">其他</el-radio>
</el-radio-group>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.bbxxEnabled" />
<span class="q-label">版本选项</span>
<el-radio-group v-model="searchForm.bbxx" class="q-control" :disabled="!searchForm.bbxxEnabled">
<el-radio :label="'最新版本'">最新版本</el-radio>
<el-radio :label="'存在多版本'">存在多版本</el-radio>
<el-radio :label="'全部版本'">全部版本</el-radio>
</el-radio-group>
</div>
<div class="query-field">
<el-checkbox v-model="searchForm.bmbhEnabled" />
<span class="q-label">别名包含规范名称</span>
<el-radio-group v-model="searchForm.bmbh" class="q-control" :disabled="!searchForm.bmbhEnabled">
<el-radio :label="'完全包含'">完全包含</el-radio>
<el-radio :label="'未完全包含'">未完全包含</el-radio>
</el-radio-group>
<span class="q-label no-check">培训类型</span>
<el-input v-model="searchForm.pxlx" placeholder="请输入培训类型" clearable class="q-control" />
</div>
</el-col>
</el-row>
</el-form>
<div class="notice">注意勾选"选择框"表示启用该项对应的查询条件输入框非空表示启用查询条件</div>
<div class="query-footer">
<el-button class="gray-btn" @click="handleQuery">查询</el-button>
</div>
@@ -189,27 +76,26 @@
</div>
</el-card>
<!-- ==================== 5. 红色提示文字 ==================== -->
<div class="red-tip">
提示课程体系按"课程-专题-课题"构建的课程名称的命名格式为"课程名称\专题名称\课题名称""课程名称\课题名称"
</div>
<!-- ==================== 6. 数据表格区域 ==================== -->
<el-card shadow="never" class="table-card">
<el-table v-loading="loading" :data="tableData" stripe border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="40" align="center" />
<el-table-column prop="manage" label="管理" width="70" align="center" />
<el-table-column prop="code" label="编码" width="100" show-overflow-tooltip />
<el-table-column prop="name" label="课程名称" min-width="130" show-overflow-tooltip />
<el-table-column prop="cat" label="分类" width="100" align="center" />
<el-table-column prop="exam" label="考核类型方式" width="110" align="center" />
<el-table-column prop="inClass" label="课内学时" width="90" align="center" />
<el-table-column prop="outClass" label="课外学时" width="90" align="center" />
<el-table-column prop="other" label="其他" width="80" align="center" />
<el-table-column prop="textbook" label="教材" min-width="120" show-overflow-tooltip />
<el-table-column prop="majors" label="开设课程专业名称" min-width="150" show-overflow-tooltip />
<el-table-column prop="teacher" label="在职主讲教员" min-width="110" show-overflow-tooltip />
<el-table-column prop="kbh" label="课编号" width="130" show-overflow-tooltip />
<el-table-column prop="kmc" label="课名称" width="200" show-overflow-tooltip />
<el-table-column prop="jc" label="称" width="130" show-overflow-tooltip />
<el-table-column prop="jysdh" label="教研室代号" width="150" show-overflow-tooltip />
<el-table-column prop="kclx" label="课程类型" width="150" align="center" />
<el-table-column prop="pxlx" label="培训类型" width="150" align="center" />
<el-table-column prop="pxcc" label="培训层次" width="200" align="center" />
<el-table-column prop="xf" label="学分" align="center" />
<el-table-column prop="xs" label="学时" width="160" align="center" />
<el-table-column label="操作" width="150" align="center" fixed="right">
<template slot-scope="{ row }">
<el-button type="text" size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="text" size="small" class="text-danger" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@@ -228,119 +114,178 @@
<el-dialog
:visible="dialogVisible"
:title="dialogTitle"
width="1100px"
width="1000px"
:close-on-click-modal="false"
class="add-dialog"
@update:visible="val => dialogVisible = val"
>
<el-form ref="addFormRef" :model="addForm" :rules="rules" label-width="120px" class="add-form" :status-icon="false">
<el-row :gutter="24">
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="编号" prop="bh">
<el-input v-model="addForm.bh" placeholder="请输入编号" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="编号" prop="kbh">
<el-input v-model="addForm.kbh" :disabled="isEdit" placeholder="新增时留空自动生成" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="课标号" prop="kbh">
<el-input v-model="addForm.kbh" placeholder="请输入课标号" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课名称" prop="kmc">
<el-input v-model="addForm.kmc" placeholder="请输入课名称" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="课程名称" prop="mc">
<el-input v-model="addForm.mc" placeholder="请输入课程名称" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="称" prop="jc">
<el-input v-model="addForm.jc" placeholder="请输入称" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="适用专业" prop="syzy">
<el-input v-model="addForm.syzy" placeholder="请输入适用专业" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="教研室代号" prop="jysdh">
<el-input v-model="addForm.jysdh" placeholder="请输入教研室代号" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="课时数" prop="kcs">
<el-input-number v-model="addForm.kcs" :min="0" controls-position="right" class="w-full" />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="学分" prop="xf">
<el-input-number v-model="addForm.xf" :min="0" :precision="1" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="录入人编号" prop="zxrbh">
<el-input v-model="addForm.zxrbh" placeholder="请输入录入人编号" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="学时" prop="xs">
<el-input-number v-model="addForm.xs" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="8">
<el-form-item label="录入时间">
<el-input v-model="addForm.zxsj" placeholder="请输入录入时间" clearable />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="培训层次" prop="pxcc">
<el-input v-model="addForm.pxcc" placeholder="请输入培训层次" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-form-item label="正文">
<el-input v-model="addForm.zw" type="textarea" :rows="3" placeholder="请输入正文" />
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="培训类型" prop="pxlx">
<el-input v-model="addForm.pxlx" placeholder="请输入培训类型" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课程类型" prop="kclx">
<el-input v-model="addForm.kclx" placeholder="请输入课程类型" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="考试课时" prop="ksks">
<el-input-number v-model="addForm.ksks" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="成绩分制" prop="cjfz">
<el-input v-model="addForm.cjfz" placeholder="请输入成绩分制" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="不计入学员平均分" prop="bjrxypjf">
<el-select v-model="addForm.bjrxypjf" class="w-full">
<el-option label="否" :value="0" />
<el-option label="是" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="理论学时" prop="llxs">
<el-input-number v-model="addForm.llxs" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="实践学时" prop="sjxs">
<el-input-number v-model="addForm.sjxs" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="周课时" prop="zks">
<el-input-number v-model="addForm.zks" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课类型" prop="klx">
<el-input v-model="addForm.klx" placeholder="请输入课类型" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="考试课时不显示" prop="ksksbxs">
<el-select v-model="addForm.ksksbxs" class="w-full">
<el-option label="否" :value="0" />
<el-option label="是" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课程统一编号" prop="kctybh">
<el-input v-model="addForm.kctybh" placeholder="请输入课程统一编号" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="辅导答疑课时" prop="fddyks">
<el-input-number v-model="addForm.fddyks" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="自修课时" prop="zxks">
<el-input-number v-model="addForm.zxks" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="修订日期" prop="xdrq">
<el-input v-model="addForm.xdrq" placeholder="如 2026-08-24" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="节次优选级" prop="jcyxj">
<el-input v-model="addForm.jcyxj" placeholder="请输入节次优选级" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课程支持方式" prop="kczcfs">
<el-input v-model="addForm.kczcfs" placeholder="请输入课程支持方式" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="课程建设方式" prop="kcjsfs">
<el-input v-model="addForm.kcjsfs" placeholder="请输入课程建设方式" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="政治类课程" prop="zzlkc">
<el-select v-model="addForm.zzlkc" class="w-full">
<el-option label="否" :value="0" />
<el-option label="是" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="考核方式" prop="khfs">
<el-input v-model="addForm.khfs" placeholder="请输入考核方式" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="形成性成绩分值" prop="xcxcjfz">
<el-input-number v-model="addForm.xcxcjfz" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="终结性成绩分值" prop="zjxcjfz">
<el-input-number v-model="addForm.zjxcjfz" :min="0" controls-position="right" class="w-full" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="密级" prop="mj">
<el-input v-model="addForm.mj" placeholder="请输入密级" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="评选情况" prop="pxqk">
<el-input v-model="addForm.pxqk" placeholder="请输入评选情况" clearable />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24">
<el-form-item label="备注">
<el-input v-model="addForm.bz" type="textarea" :rows="2" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
<div class="classroom-section">
<div class="classroom-header">
<span class="classroom-title">课堂列表</span>
<el-button type="primary" size="small" @click="handleAddClassroom">添加课堂</el-button>
</div>
<el-table :data="addForm.ktList" border size="small">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="课堂编号" width="140">
<template slot-scope="{ row }">
<el-input v-model="row.bh" placeholder="课堂编号" />
</template>
</el-table-column>
<el-table-column label="课堂次序" width="90">
<template slot-scope="{ row }">
<el-input-number v-model="row.ktjc" :min="1" controls-position="right" class="w-full" />
</template>
</el-table-column>
<el-table-column label="教学内容" min-width="150">
<template slot-scope="{ row }">
<el-input v-model="row.jxnr" placeholder="教学内容" />
</template>
</el-table-column>
<el-table-column label="教学要点" min-width="150">
<template slot-scope="{ row }">
<el-input v-model="row.jxyd" placeholder="教学要点" />
</template>
</el-table-column>
<el-table-column label="教学方法" min-width="150">
<template slot-scope="{ row }">
<el-input v-model="row.jxff" placeholder="教学方法" />
</template>
</el-table-column>
<el-table-column label="主讲教员数" width="100">
<template slot-scope="{ row }">
<el-input-number v-model="row.zjjys" :min="0" controls-position="right" class="w-full" />
</template>
</el-table-column>
<el-table-column label="辅讲教员数" width="100">
<template slot-scope="{ row }">
<el-input-number v-model="row.fjjys" :min="0" controls-position="right" class="w-full" />
</template>
</el-table-column>
<el-table-column label="教学目的" min-width="150">
<template slot-scope="{ row }">
<el-input v-model="row.jxmd" placeholder="教学目的" />
</template>
</el-table-column>
<el-table-column label="教学要求" min-width="150">
<template slot-scope="{ row }">
<el-input v-model="row.jxyq" placeholder="教学要求" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" fixed="right">
<template slot-scope="{ $index }">
<el-button type="text" class="text-danger" @click="handleDeleteClassroom($index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-form>
<div slot="footer">
<div class="dialog-footer">
@@ -349,34 +294,12 @@
</div>
</div>
</el-dialog>
<!-- 撤回弹窗 -->
<el-dialog
:visible="withdrawDialogVisible"
title="撤回课程科目"
width="500px"
:close-on-click-modal="false"
@update:visible="val => withdrawDialogVisible = val"
>
<el-form :model="withdrawForm" label-width="100px">
<el-form-item label="课程编号">
<el-input v-model="withdrawForm.bh" disabled />
</el-form-item>
<el-form-item label="撤回原因">
<el-input v-model="withdrawForm.chyy" type="textarea" :rows="4" placeholder="请输入撤回原因" />
</el-form-item>
</el-form>
<div slot="footer">
<div class="dialog-footer">
<el-button @click="handleCancelWithdraw">取消</el-button>
<el-button type="primary" :loading="withdrawLoading" @click="handleWithdraw">确定撤回</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { listSubject, addSubject, updateSubject, deleteSubject, getSubject } from '@/api/teachOffice/subject'
export default {
name: 'SubjectIndex',
data() {
@@ -384,68 +307,18 @@ export default {
// ==================== 1. 顶部状态提示 ====================
statusTip: '请输入查询条件',
// ==================== 下拉选项 ====================
zcfsOptions: ['其他', '讲授', '研讨', '实操'],
khlxOptions: ['讲座', '考试', '考查', '实操'],
mmdjOptions: ['公开', '内部', '秘密', '机密'],
jysOptions: ['未确定教研室', '军事基础教研室', '政治工作教研室', '装备保障教研室'],
pxccOptions: ['无', '本科', '硕士', '博士'],
pxlxOptions: ['军官基础教育', '士兵职业教育', '研究生教育', '其他'],
kclxOptions: ['其他类', '公共基础', '专业基础', '专业核心'],
jsfsOptions: ['其他', '自建', '共建', '引进'],
pjqkOptions: ['无', '国家级', '军队级', '院校级'],
gljgOptions: ['教务处', '教研室1', '教研室2'],
// ==================== 2. 查询条件 ====================
searchForm: {
kcbh: '',
kmc: '',
jc: '',
xfMin: '',
xfMax: '',
xsMin: '',
xsMax: '',
zcfsEnabled: false,
zcfs: '其他',
khlxEnabled: false,
khlx: '讲座',
mmdj: '',
dgxzEnabled: false,
dgxz: '大纲课程',
zzglEnabled: false,
zzgl: '政治类',
bz: '',
jysEnabled: false,
jys: '未确定教研室',
pxccEnabled: false,
pxcc: '无',
pxlxEnabled: false,
pxlx: '军官基础教育',
kclxEnabled: false,
kclx: '其他类',
jsfsEnabled: false,
jsfs: '其他',
pjqkEnabled: false,
pjqk: '无',
gljgEnabled: false,
gljg: '教务处',
zyxzEnabled: true,
zyxz: '在用',
bbxxEnabled: true,
bbxx: '最新版本',
bmbhEnabled: false,
bmbh: '完全包含'
kmdm: '',
jysdh: '',
kclx: '',
pxlx: '',
pxcc: ''
},
// ==================== 列表数据 ====================
/** 模拟列表数据(后端接口未提供) */
mockTableData: [
{ id: 1, manage: '编辑', code: 'KCB001', name: '高等数学', cat: '公共基础', exam: '考试', inClass: 48, outClass: 16, other: '—', textbook: '高等数学(上册)', majors: '炮兵装备运用/通信工程', teacher: '张三' },
{ id: 2, manage: '编辑', code: 'KCB002', name: '导弹发射原理', cat: '专业核心', exam: '考试', inClass: 40, outClass: 16, other: '—', textbook: '导弹发射原理', majors: '炮兵装备运用', teacher: '李四' },
{ id: 3, manage: '编辑', code: 'KCB003', name: '通信原理', cat: '专业核心', exam: '考试', inClass: 48, outClass: 16, other: '—', textbook: '通信原理', majors: '通信工程', teacher: '王五' },
{ id: 4, manage: '编辑', code: 'KCB004', name: '军事英语', cat: '公共基础', exam: '考查', inClass: 30, outClass: 8, other: '—', textbook: '军事英语教程', majors: '全军各专业', teacher: '赵六' },
{ id: 5, manage: '编辑', code: 'KCB005', name: '联合作战指挥', cat: '专业核心', exam: '综合考核', inClass: 40, outClass: 20, other: '—', textbook: '联合作战指挥', majors: '军事指挥', teacher: '孙七' },
{ id: 6, manage: '编辑', code: 'KCB006', name: '装备维修训练', cat: '实践环节', exam: '实操', inClass: 0, outClass: 48, other: '—', textbook: '装备维修手册', majors: '装备保障', teacher: '周八' }
],
loading: false,
tableData: [],
total: 0,
@@ -460,22 +333,34 @@ export default {
// ==================== 新增/编辑弹窗 ====================
dialogVisible: false,
addLoading: false,
editLoading: false,
isEdit: false,
addForm: this.createEmptyForm(),
rules: {
bh: [{ required: true, message: '请输入编号', trigger: 'blur' }],
kbh: [{ required: true, message: '请输入课标号', trigger: 'blur' }],
mc: [{ required: true, message: '请输入课程名称', trigger: 'blur' }],
syzy: [{ required: true, message: '请输入适用专业', trigger: 'blur' }],
kcs: [{ required: true, message: '请输入课时数', trigger: 'blur' }],
zxrbh: [{ required: true, message: '请输入录入人编号', trigger: 'blur' }]
},
// ==================== 撤回弹窗 ====================
withdrawDialogVisible: false,
withdrawLoading: false,
withdrawForm: { bh: '', chyy: '' }
kmc: [{ required: true, message: '请输入课名称', trigger: 'blur' }],
jysdh: [{ required: true, message: '请输入教研室代号', trigger: 'blur' }],
xf: [{ required: true, message: '请输入学分', trigger: 'blur' }],
pxcc: [{ required: true, message: '请输入培训层次', trigger: 'blur' }],
pxlx: [{ required: true, message: '请输入培训类型', trigger: 'blur' }],
kclx: [{ required: true, message: '请输入课程类型', trigger: 'blur' }],
ksks: [{ required: true, message: '请输入考试课时', trigger: 'blur' }],
cjfz: [{ required: true, message: '请输入成绩分制', trigger: 'blur' }],
llxs: [{ required: true, message: '请输入理论学时', trigger: 'blur' }],
sjxs: [{ required: true, message: '请输入实践学时', trigger: 'blur' }],
zks: [{ required: true, message: '请输入周课时', trigger: 'blur' }],
klx: [{ required: true, message: '请输入课类型', trigger: 'blur' }],
kctybh: [{ required: true, message: '请输入课程统一编号', trigger: 'blur' }],
fddyks: [{ required: true, message: '请输入辅导答疑课时', trigger: 'blur' }],
zxks: [{ required: true, message: '请输入自修课时', trigger: 'blur' }],
xdrq: [{ required: true, message: '请输入修订日期', trigger: 'blur' }],
jcyxj: [{ required: true, message: '请输入节次优选级', trigger: 'blur' }],
kczcfs: [{ required: true, message: '请输入课程支持方式', trigger: 'blur' }],
kcjsfs: [{ required: true, message: '请输入课程建设方式', trigger: 'blur' }],
khfs: [{ required: true, message: '请输入考核方式', trigger: 'blur' }],
xcxcjfz: [{ required: true, message: '请输入形成性成绩分值', trigger: 'blur' }],
zjxcjfz: [{ required: true, message: '请输入终结性成绩分值', trigger: 'blur' }],
mj: [{ required: true, message: '请输入密级', trigger: 'blur' }],
pxqk: [{ required: true, message: '请输入评选情况', trigger: 'blur' }]
}
}
},
computed: {
@@ -486,54 +371,69 @@ export default {
return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'
}
},
created() {
// 初始化表单(保证 getCurrentTime 可用)
this.addForm = this.createEmptyForm()
},
mounted() {
this.fetchList()
},
methods: {
// ==================== 表单辅助 ====================
getCurrentTime() {
return new Date().toLocaleString('zh-CN', { hour12: false }).replace(/\//g, '-')
/** 移除空值 */
cleanPayload(obj) {
const payload = {}
Object.keys(obj).forEach(key => {
const value = obj[key]
if (value !== '' && value !== null && value !== undefined) {
payload[key] = value
}
})
return payload
},
/** 创建空白课程表单(含一条空课堂记录) */
/** 创建空白课程科目表单 */
createEmptyForm() {
return {
bh: '', kbh: '', mc: '', syzy: '', kcs: 0, bz: '', zxrbh: '', zxsj: this.getCurrentTime(),
zxzt: '0', sbzt: '0', sbsj: '', sbrbh: '', chyy: '', zw: '', jsonzd: '', ktList: [this.defaultClassroom()]
kbh: '', kmc: '', jysdh: '', bz: '', xh: '', xf: 0, jc: '', xs: 0,
pxcc: '', pxlx: '', kclx: '', ksks: 0, py: '', gfmc: '', cjfz: '',
bjrxypjf: 0, jxglbmbh: '', llxs: 0, sjxs: 0, kmdm: '', zks: 0, klx: '',
ksksbxs: 0, kctybh: '', sydx: '', fddyks: 0, zxks: 0, bb: '', xdrq: '',
jcyxj: '', kczcfs: '', kcjsfs: '', jsonzd: '', zzlkc: 0, khfs: '',
xcxcjfz: 0, zjxcjfz: 0, mj: '', pxqk: ''
}
},
/** 默认课堂项 */
defaultClassroom() {
return { bh: '', ktjc: 1, jxnr: '', jxyd: '', jxff: '', zjjys: 0, fjjys: 0, bz: '', jxmd: '', jxyq: '' }
},
resetForm() {
this.addForm = this.createEmptyForm()
},
// ==================== 列表加载 ====================
// TODO: 后端接口未提供,暂用模拟数据;接口就绪后替换为 getCourseTeachingList
buildQuery() {
return this.cleanPayload({
pageNum: this.pageNum,
pageSize: this.pageSize,
kmc: this.searchForm.kmc,
jc: this.searchForm.jc,
kmdm: this.searchForm.kmdm,
jysdh: this.searchForm.jysdh,
kclx: this.searchForm.kclx,
pxlx: this.searchForm.pxlx,
pxcc: this.searchForm.pxcc
})
},
fetchList() {
this.loading = true
setTimeout(() => {
this.tableData = [...this.mockTableData]
this.total = this.mockTableData.length
this.loading = false
}, 200)
listSubject(this.buildQuery())
.then(res => {
const data = (res && res.data) || {}
this.tableData = data.records || []
this.total = data.total || 0
this.statusTip = `共检索到 ${this.total} 条记录`
})
.finally(() => {
this.loading = false
})
},
// ==================== 查询 ====================
handleQuery() {
const now = new Date()
const hh = String(now.getHours()).padStart(2, '0')
const mm = String(now.getMinutes()).padStart(2, '0')
const ss = String(now.getSeconds()).padStart(2, '0')
this.statusTip = `[${hh}:${mm}:${ss}]查询成功!共检索到${this.total || 982}条记录。`
this.pageNum = 1
this.fetchList()
},
@@ -557,36 +457,54 @@ export default {
this.$message.warning('请先选择要删除的记录')
return
}
const ids = this.selectedRows.map((r) => r.id)
this.tableData = this.tableData.filter((r) => ids.indexOf(r.id) === -1)
this.total = this.tableData.length
this.$message.success(`已删除所选 ${ids.length} 条记录(前端模拟)`)
const kbhList = this.selectedRows.map(r => r.kbh)
this.$confirm(`确定删除所选 ${kbhList.length} 条课程科目吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const tasks = kbhList.map(kbh => deleteSubject(kbh))
Promise.all(tasks)
.then(() => {
this.$message.success(`已删除 ${kbhList.length} 条记录`)
this.fetchList()
})
.catch(() => {
this.$message.error('删除失败')
})
}).catch(() => {})
},
// ==================== 下载 ====================
downloadBlob(content, filename) {
const blob = new Blob(['\ufeff' + content], { type: 'text/plain;charset=utf-8;' })
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = filename
link.click()
URL.revokeObjectURL(link.href)
/** 单条删除 */
handleDelete(row) {
this.$confirm(`确定删除课程科目「${row.kmc || row.kbh}」吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
return deleteSubject(row.kbh)
}).then(() => {
this.$message.success('删除成功')
this.fetchList()
}).catch((err) => {
if (err && err !== 'cancel') {
this.$message.error('删除失败')
}
})
},
// ==================== 下载(后端暂未提供) ====================
handleDownloadCourse() {
this.downloadBlob('编码,课程名称,分类,考核类型方式,课内学时,课外学时\n', '课程科目基本信息.txt')
this.$message.success('课程科目基本信息已下载(前端模拟)')
this.$message.warning('后端暂未提供该接口')
},
handleDownloadTextbook() {
this.downloadBlob('课程名称,教材,在职主讲教员\n', '课程教材基本信息.txt')
this.$message.success('课程教材基本信息已下载(前端模拟)')
this.$message.warning('后端暂未提供该接口')
},
handleDownloadTemplate() {
this.downloadBlob('编码,课程名称,分类,考核类型方式,课内学时,课外学时,教材,开设课程专业名称,在职主讲教员\n', '课程科目数据文件模板.txt')
this.$message.success('【课程科目数据文件模板】已下载(前端模拟)')
this.$message.warning('后端暂未提供该接口')
},
// ==================== 文件上传 ====================
// ==================== 文件上传(后端暂未提供) ====================
handleSelectFile() {
this.$refs.fileInputRef && this.$refs.fileInputRef.click()
},
@@ -597,11 +515,7 @@ export default {
},
handleUpload() {
if (!this.selectedFile) {
this.$message.warning('请先选择文件')
return
}
this.$message.success(`文件「${this.selectedFile.name}」上传成功(前端模拟)`)
this.$message.warning('后端暂未提供该接口')
},
// ==================== 新增/编辑弹窗 ====================
@@ -611,49 +525,40 @@ export default {
this.dialogVisible = true
},
handleAddClassroom() {
this.addForm.ktList.push(this.defaultClassroom())
},
handleDeleteClassroom(index) {
this.addForm.ktList.splice(index, 1)
handleEdit(row) {
this.addLoading = true
getKb(row.kbh)
.then(res => {
const data = (res && res.data) || row
this.isEdit = true
this.addForm = Object.assign(this.createEmptyForm(), data)
this.dialogVisible = true
})
.finally(() => {
this.addLoading = false
})
},
// TODO: 后端接口未提供,保存成功后刷新列表为前端模拟;接口就绪后替换为 addCourseTeaching/updateCourseTeaching
handleSubmit() {
this.$refs.addFormRef.validate((valid) => {
if (!valid) return
this.addLoading = true
setTimeout(() => {
this.$message.success(this.isEdit ? '修改成功' : '保存成功')
this.dialogVisible = false
this.fetchList()
this.addLoading = false
}, 300)
const payload = this.cleanPayload({ ...this.addForm })
const requestFn = this.isEdit ? updateSubject : addSubject
requestFn(payload)
.then(() => {
this.$message.success(this.isEdit ? '修改成功' : '保存成功')
this.dialogVisible = false
this.fetchList()
})
.finally(() => {
this.addLoading = false
})
})
},
handleCancel() {
this.dialogVisible = false
},
// ==================== 撤回弹窗 ====================
// TODO: 后端接口未提供,撤回为前端模拟;接口就绪后替换为 deleteCourseTeaching
handleWithdraw() {
if (!this.withdrawForm.chyy.trim()) {
this.$message.warning('请输入撤回原因')
return
}
this.withdrawLoading = true
setTimeout(() => {
this.$message.success('撤回成功')
this.withdrawDialogVisible = false
this.fetchList()
this.withdrawLoading = false
}, 300)
},
handleCancelWithdraw() {
this.withdrawDialogVisible = false
}
}
}
@@ -708,22 +613,6 @@ export default {
flex: 1;
min-width: 0;
}
.range-control {
display: flex;
align-items: center;
gap: 6px;
.el-input {
flex: 1;
}
.range-sep {
flex-shrink: 0;
font-size: 12px;
color: #606266;
}
}
}
.notice {
@@ -811,6 +700,10 @@ export default {
::v-deep(.el-table .cell) {
font-size: 12px;
}
.text-danger {
color: #f56c6c;
}
}
// ==================== 新增/编辑弹窗 ====================
@@ -825,29 +718,6 @@ export default {
.w-full {
width: 100%;
}
.classroom-section {
margin-top: 16px;
.classroom-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
.classroom-title {
font-size: 15px;
font-weight: 600;
color: #303133;
}
}
}
// 课堂列表删除按钮红色文字
.text-danger {
color: #f56c6c;
padding: 0;
}
}
.dialog-footer {
@@ -872,4 +742,4 @@ export default {
color: #333;
}
}
</style>
</style>