年级管理增加学段字段(小学/初中/高中/中专/大学)

This commit is contained in:
神码-方晓辉 2026-02-05 10:16:30 +08:00
parent 80dd406f8c
commit 72cb6668f3
6 changed files with 135 additions and 6 deletions

View File

@ -34,6 +34,11 @@ public class PgGrade extends BaseEntity {
*/ */
private String gradeName; private String gradeName;
/**
* 学段1小学 2初中 3高中 4中专 5大学
*/
private String stage;
/** /**
* 显示顺序 * 显示顺序
*/ */

View File

@ -234,9 +234,28 @@ public class OpenApiBaseController extends BaseController {
private OpenGradeVo convertToGradeVo(PgGrade source) { private OpenGradeVo convertToGradeVo(PgGrade source) {
OpenGradeVo vo = new OpenGradeVo(); OpenGradeVo vo = new OpenGradeVo();
BeanUtils.copyProperties(source, vo); BeanUtils.copyProperties(source, vo);
// 设置学段名称
vo.setStageName(getStageName(source.getStage()));
return vo; return vo;
} }
/**
* 获取学段名称
*/
private String getStageName(String stage) {
if (stage == null) {
return null;
}
return switch (stage) {
case "1" -> "小学";
case "2" -> "初中";
case "3" -> "高中";
case "4" -> "中专";
case "5" -> "大学";
default -> "未知";
};
}
private OpenClassVo convertToClassVo(PgClass source) { private OpenClassVo convertToClassVo(PgClass source) {
OpenClassVo vo = new OpenClassVo(); OpenClassVo vo = new OpenClassVo();
BeanUtils.copyProperties(source, vo); BeanUtils.copyProperties(source, vo);

View File

@ -23,6 +23,12 @@ public class OpenGradeVo implements Serializable {
@Schema(description = "年级名称") @Schema(description = "年级名称")
private String gradeName; private String gradeName;
@Schema(description = "学段1小学 2初中 3高中 4中专 5大学")
private String stage;
@Schema(description = "学段名称")
private String stageName;
@Schema(description = "显示顺序") @Schema(description = "显示顺序")
private Integer orderNum; private Integer orderNum;

View File

@ -6,6 +6,11 @@
<el-form-item label="年级名称"> <el-form-item label="年级名称">
<el-input v-model="queryParams.gradeName" placeholder="请输入年级名称" clearable style="width: 200px" @keyup.enter="handleQuery" /> <el-input v-model="queryParams.gradeName" placeholder="请输入年级名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="学段">
<el-select v-model="queryParams.stage" placeholder="全部" clearable style="width: 120px">
<el-option v-for="item in stageOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="状态"> <el-form-item label="状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 100px"> <el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 100px">
<el-option label="正常" value="0" /> <el-option label="正常" value="0" />
@ -30,6 +35,11 @@
<el-table v-loading="loading" :data="tableData" border stripe :header-cell-style="{ background: '#f5f7fa', color: '#606266' }" style="width: 100%"> <el-table v-loading="loading" :data="tableData" border stripe :header-cell-style="{ background: '#f5f7fa', color: '#606266' }" style="width: 100%">
<el-table-column prop="name" label="年级名称" min-width="150" /> <el-table-column prop="name" label="年级名称" min-width="150" />
<el-table-column prop="code" label="年级编码" width="120" /> <el-table-column prop="code" label="年级编码" width="120" />
<el-table-column prop="stage" label="学段" width="100" align="center">
<template #default="{ row }">
<el-tag :type="getStageType(row.stage)">{{ getStageName(row.stage) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" width="80" align="center" /> <el-table-column prop="sort" label="排序" width="80" align="center" />
<el-table-column prop="status" label="状态" width="80" align="center"> <el-table-column prop="status" label="状态" width="80" align="center">
<template #default="{ row }"> <template #default="{ row }">
@ -69,6 +79,11 @@
<el-form-item label="年级编码" prop="code"> <el-form-item label="年级编码" prop="code">
<el-input v-model="form.code" placeholder="自动生成" disabled /> <el-input v-model="form.code" placeholder="自动生成" disabled />
</el-form-item> </el-form-item>
<el-form-item label="学段" prop="stage">
<el-select v-model="form.stage" placeholder="请选择学段" style="width: 100%">
<el-option v-for="item in stageOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="排序" prop="sort"> <el-form-item label="排序" prop="sort">
<el-input-number v-model="form.sort" :min="0" :max="999" /> <el-input-number v-model="form.sort" :min="0" :max="999" />
</el-form-item> </el-form-item>
@ -102,9 +117,31 @@ const queryParams = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
gradeName: '', gradeName: '',
stage: '',
status: '' status: ''
}) })
//
const stageOptions = [
{ value: '1', label: '小学' },
{ value: '2', label: '初中' },
{ value: '3', label: '高中' },
{ value: '4', label: '中专' },
{ value: '5', label: '大学' }
]
//
const getStageName = (stage) => {
const item = stageOptions.find(s => s.value === stage)
return item ? item.label : '未知'
}
//
const getStageType = (stage) => {
const types = { '1': 'success', '2': 'primary', '3': 'warning', '4': 'info', '5': 'danger' }
return types[stage] || 'info'
}
// //
const dialogVisible = ref(false) const dialogVisible = ref(false)
const dialogTitle = ref('') const dialogTitle = ref('')
@ -113,12 +150,14 @@ const form = ref({
id: null, id: null,
name: '', name: '',
code: '', code: '',
stage: '1',
sort: 0, sort: 0,
status: '0' status: '0'
}) })
const rules = { const rules = {
name: [{ required: true, message: '请输入年级名称', trigger: 'blur' }] name: [{ required: true, message: '请输入年级名称', trigger: 'blur' }],
stage: [{ required: true, message: '请选择学段', trigger: 'change' }]
} }
// //
@ -143,14 +182,14 @@ const handleQuery = () => {
// //
const resetQuery = () => { const resetQuery = () => {
queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', status: '' } queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', stage: '', status: '' }
getList() getList()
} }
// //
const handleAdd = () => { const handleAdd = () => {
dialogTitle.value = '新增年级' dialogTitle.value = '新增年级'
form.value = { id: null, name: '', code: '', sort: 0, status: '0' } form.value = { id: null, name: '', code: '', stage: '1', sort: 0, status: '0' }
dialogVisible.value = true dialogVisible.value = true
} }

View File

@ -6,6 +6,11 @@
<el-form-item label="年级名称"> <el-form-item label="年级名称">
<el-input v-model="queryParams.gradeName" placeholder="请输入年级名称" clearable style="width: 200px" @keyup.enter="handleQuery" /> <el-input v-model="queryParams.gradeName" placeholder="请输入年级名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="学段">
<el-select v-model="queryParams.stage" placeholder="全部" clearable style="width: 120px">
<el-option v-for="item in stageOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="状态"> <el-form-item label="状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 100px"> <el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 100px">
<el-option label="正常" value="0" /> <el-option label="正常" value="0" />
@ -30,6 +35,11 @@
<el-table v-loading="loading" :data="tableData" border stripe :header-cell-style="{ background: '#f5f7fa', color: '#606266' }" style="width: 100%"> <el-table v-loading="loading" :data="tableData" border stripe :header-cell-style="{ background: '#f5f7fa', color: '#606266' }" style="width: 100%">
<el-table-column prop="gradeName" label="年级名称" min-width="150" /> <el-table-column prop="gradeName" label="年级名称" min-width="150" />
<el-table-column prop="gradeCode" label="年级编码" width="120" /> <el-table-column prop="gradeCode" label="年级编码" width="120" />
<el-table-column prop="stage" label="学段" width="100" align="center">
<template #default="{ row }">
<el-tag :type="getStageType(row.stage)">{{ getStageName(row.stage) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="orderNum" label="排序" width="80" align="center" /> <el-table-column prop="orderNum" label="排序" width="80" align="center" />
<el-table-column prop="status" label="状态" width="80" align="center"> <el-table-column prop="status" label="状态" width="80" align="center">
<template #default="{ row }"> <template #default="{ row }">
@ -69,6 +79,11 @@
<el-form-item label="年级编码" prop="gradeCode"> <el-form-item label="年级编码" prop="gradeCode">
<el-input v-model="form.gradeCode" placeholder="自动生成" disabled /> <el-input v-model="form.gradeCode" placeholder="自动生成" disabled />
</el-form-item> </el-form-item>
<el-form-item label="学段" prop="stage">
<el-select v-model="form.stage" placeholder="请选择学段" style="width: 100%">
<el-option v-for="item in stageOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="排序" prop="orderNum"> <el-form-item label="排序" prop="orderNum">
<el-input-number v-model="form.orderNum" :min="0" :max="999" /> <el-input-number v-model="form.orderNum" :min="0" :max="999" />
</el-form-item> </el-form-item>
@ -105,9 +120,31 @@ const queryParams = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
gradeName: '', gradeName: '',
stage: '',
status: '' status: ''
}) })
//
const stageOptions = [
{ value: '1', label: '小学' },
{ value: '2', label: '初中' },
{ value: '3', label: '高中' },
{ value: '4', label: '中专' },
{ value: '5', label: '大学' }
]
//
const getStageName = (stage) => {
const item = stageOptions.find(s => s.value === stage)
return item ? item.label : '未知'
}
//
const getStageType = (stage) => {
const types = { '1': 'success', '2': 'primary', '3': 'warning', '4': 'info', '5': 'danger' }
return types[stage] || 'info'
}
// //
const dialogVisible = ref(false) const dialogVisible = ref(false)
const dialogTitle = ref('') const dialogTitle = ref('')
@ -116,12 +153,14 @@ const form = ref({
gradeId: null, gradeId: null,
gradeName: '', gradeName: '',
gradeCode: '', gradeCode: '',
stage: '1',
orderNum: 0, orderNum: 0,
status: '0' status: '0'
}) })
const rules = { const rules = {
gradeName: [{ required: true, message: '请输入年级名称', trigger: 'blur' }] gradeName: [{ required: true, message: '请输入年级名称', trigger: 'blur' }],
stage: [{ required: true, message: '请选择学段', trigger: 'change' }]
} }
// //
@ -146,14 +185,14 @@ const handleQuery = () => {
// //
const resetQuery = () => { const resetQuery = () => {
queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', status: '' } queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', stage: '', status: '' }
getList() getList()
} }
// //
const handleAdd = () => { const handleAdd = () => {
dialogTitle.value = '新增年级' dialogTitle.value = '新增年级'
form.value = { gradeId: null, gradeName: '', gradeCode: '', orderNum: 0, status: '0' } form.value = { gradeId: null, gradeName: '', gradeCode: '', stage: '1', orderNum: 0, status: '0' }
dialogVisible.value = true dialogVisible.value = true
} }

View File

@ -0,0 +1,21 @@
-- =====================================================
-- 年级表增加学段字段 - V1.0.4
-- 执行时间: 2026-02-04
-- 说明: 年级管理增加学段(小学/初中/高中/中专/大学)
-- =====================================================
-- 1. 新增学段字段
ALTER TABLE pg_grade ADD COLUMN stage CHAR(1) NULL COMMENT '学段1小学 2初中 3高中 4中专 5大学' AFTER grade_name;
-- 2. 初始化现有数据(根据年级名称自动匹配学段)
-- 小学
UPDATE pg_grade SET stage = '1' WHERE grade_name IN ('一年级', '二年级', '三年级', '四年级', '五年级', '六年级');
-- 初中
UPDATE pg_grade SET stage = '2' WHERE grade_name IN ('七年级', '八年级', '九年级');
-- 高中
UPDATE pg_grade SET stage = '3' WHERE grade_name IN ('高一', '高二', '高三');
-- 未匹配的默认设为小学
UPDATE pg_grade SET stage = '1' WHERE stage IS NULL;
-- 3. 设置为非空并添加默认值
ALTER TABLE pg_grade MODIFY COLUMN stage CHAR(1) NOT NULL DEFAULT '1' COMMENT '学段1小学 2初中 3高中 4中专 5大学';