diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java
index 094bdec..6a131fa 100644
--- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java
+++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java
@@ -34,6 +34,11 @@ public class PgGrade extends BaseEntity {
*/
private String gradeName;
+ /**
+ * 学段(1小学 2初中 3高中 4中专 5大学)
+ */
+ private String stage;
+
/**
* 显示顺序
*/
diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java
index ae11864..b72d66d 100644
--- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java
+++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/controller/OpenApiBaseController.java
@@ -234,9 +234,28 @@ public class OpenApiBaseController extends BaseController {
private OpenGradeVo convertToGradeVo(PgGrade source) {
OpenGradeVo vo = new OpenGradeVo();
BeanUtils.copyProperties(source, vo);
+ // 设置学段名称
+ vo.setStageName(getStageName(source.getStage()));
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) {
OpenClassVo vo = new OpenClassVo();
BeanUtils.copyProperties(source, vo);
diff --git a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java
index 6c63766..3cb13c1 100644
--- a/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java
+++ b/backend/pangu-modules/pangu-business/src/main/java/org/dromara/pangu/openapi/domain/vo/OpenGradeVo.java
@@ -23,6 +23,12 @@ public class OpenGradeVo implements Serializable {
@Schema(description = "年级名称")
private String gradeName;
+ @Schema(description = "学段(1小学 2初中 3高中 4中专 5大学)")
+ private String stage;
+
+ @Schema(description = "学段名称")
+ private String stageName;
+
@Schema(description = "显示顺序")
private Integer orderNum;
diff --git a/frontend/src/views/base/grade/index.vue b/frontend/src/views/base/grade/index.vue
index 888c6e2..660ba8d 100644
--- a/frontend/src/views/base/grade/index.vue
+++ b/frontend/src/views/base/grade/index.vue
@@ -6,6 +6,11 @@
+
+
+
+
+
@@ -30,6 +35,11 @@
+
+
+ {{ getStageName(row.stage) }}
+
+
@@ -69,6 +79,11 @@
+
+
+
+
+
@@ -102,9 +117,31 @@ const queryParams = ref({
pageNum: 1,
pageSize: 10,
gradeName: '',
+ stage: '',
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 dialogTitle = ref('')
@@ -113,12 +150,14 @@ const form = ref({
id: null,
name: '',
code: '',
+ stage: '1',
sort: 0,
status: '0'
})
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 = () => {
- queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', status: '' }
+ queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', stage: '', status: '' }
getList()
}
// 新增
const handleAdd = () => {
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
}
diff --git a/frontend/src/views/business/base/grade/index.vue b/frontend/src/views/business/base/grade/index.vue
index 6b5bf3c..4830f2a 100644
--- a/frontend/src/views/business/base/grade/index.vue
+++ b/frontend/src/views/business/base/grade/index.vue
@@ -6,6 +6,11 @@
+
+
+
+
+
@@ -30,6 +35,11 @@
+
+
+ {{ getStageName(row.stage) }}
+
+
@@ -69,6 +79,11 @@
+
+
+
+
+
@@ -105,9 +120,31 @@ const queryParams = ref({
pageNum: 1,
pageSize: 10,
gradeName: '',
+ stage: '',
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 dialogTitle = ref('')
@@ -116,12 +153,14 @@ const form = ref({
gradeId: null,
gradeName: '',
gradeCode: '',
+ stage: '1',
orderNum: 0,
status: '0'
})
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 = () => {
- queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', status: '' }
+ queryParams.value = { pageNum: 1, pageSize: 10, gradeName: '', stage: '', status: '' }
getList()
}
// 新增
const handleAdd = () => {
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
}
diff --git a/scripts/sql/V1.0.4__grade_add_stage.sql b/scripts/sql/V1.0.4__grade_add_stage.sql
new file mode 100644
index 0000000..08d9724
--- /dev/null
+++ b/scripts/sql/V1.0.4__grade_add_stage.sql
@@ -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大学)';