refactor: 删除学生管理中的学科字段

前端:
- 列表页删除学科列
- 编辑弹窗删除学科下拉框

后端:
- PgStudent 实体删除 subjectId 字段
- StudentVo 删除 subjectId 和 subjectName 字段
- Service 层删除学科关联查询

需求文档:
- 删除学生数据项中的学科字段
- 删除表格列定义中的学科列

数据库需执行:ALTER TABLE pg_student DROP COLUMN subject_id;
This commit is contained in:
神码-方晓辉 2026-02-02 21:11:37 +08:00
parent b5c2692aab
commit 43ee2dbf87
6 changed files with 2 additions and 51 deletions

View File

@ -44,8 +44,6 @@ public class PgStudent extends BaseEntity {
private Long schoolClassId; private Long schoolClassId;
private Long subjectId;
private Long memberId; private Long memberId;
private String status; private String status;

View File

@ -50,13 +50,6 @@ public class StudentVo {
*/ */
private String className; private String className;
private Long subjectId;
/**
* 学科名称
*/
private String subjectName;
private Long memberId; private Long memberId;
/** /**

View File

@ -22,8 +22,6 @@ import org.dromara.pangu.school.domain.PgSchoolGrade;
import org.dromara.pangu.school.mapper.PgSchoolClassMapper; import org.dromara.pangu.school.mapper.PgSchoolClassMapper;
import org.dromara.pangu.school.mapper.PgSchoolGradeMapper; import org.dromara.pangu.school.mapper.PgSchoolGradeMapper;
import org.dromara.pangu.school.mapper.PgSchoolMapper; import org.dromara.pangu.school.mapper.PgSchoolMapper;
import org.dromara.pangu.base.domain.PgSubject;
import org.dromara.pangu.base.mapper.PgSubjectMapper;
import org.dromara.pangu.student.domain.PgStudent; import org.dromara.pangu.student.domain.PgStudent;
import org.dromara.pangu.student.domain.dto.StudentImportDto; import org.dromara.pangu.student.domain.dto.StudentImportDto;
import org.dromara.pangu.student.domain.vo.StudentVo; import org.dromara.pangu.student.domain.vo.StudentVo;
@ -53,7 +51,6 @@ public class PgStudentServiceImpl implements IPgStudentService {
private final PgSchoolClassMapper schoolClassMapper; private final PgSchoolClassMapper schoolClassMapper;
private final PgGradeMapper gradeMapper; private final PgGradeMapper gradeMapper;
private final PgClassMapper classMapper; private final PgClassMapper classMapper;
private final PgSubjectMapper subjectMapper;
private final PgMemberMapper memberMapper; private final PgMemberMapper memberMapper;
@Override @Override
@ -123,14 +120,12 @@ public class PgStudentServiceImpl implements IPgStudentService {
Set<Long> schoolIds = new HashSet<>(); Set<Long> schoolIds = new HashSet<>();
Set<Long> schoolGradeIds = new HashSet<>(); Set<Long> schoolGradeIds = new HashSet<>();
Set<Long> schoolClassIds = new HashSet<>(); Set<Long> schoolClassIds = new HashSet<>();
Set<Long> subjectIds = new HashSet<>();
Set<Long> memberIds = new HashSet<>(); Set<Long> memberIds = new HashSet<>();
for (PgStudent s : students) { for (PgStudent s : students) {
if (s.getSchoolId() != null) schoolIds.add(s.getSchoolId()); if (s.getSchoolId() != null) schoolIds.add(s.getSchoolId());
if (s.getSchoolGradeId() != null) schoolGradeIds.add(s.getSchoolGradeId()); if (s.getSchoolGradeId() != null) schoolGradeIds.add(s.getSchoolGradeId());
if (s.getSchoolClassId() != null) schoolClassIds.add(s.getSchoolClassId()); if (s.getSchoolClassId() != null) schoolClassIds.add(s.getSchoolClassId());
if (s.getSubjectId() != null) subjectIds.add(s.getSubjectId());
if (s.getMemberId() != null) memberIds.add(s.getMemberId()); if (s.getMemberId() != null) memberIds.add(s.getMemberId());
} }
@ -147,10 +142,6 @@ public class PgStudentServiceImpl implements IPgStudentService {
schoolClassMapper.selectByIds(schoolClassIds).stream() schoolClassMapper.selectByIds(schoolClassIds).stream()
.collect(Collectors.toMap(PgSchoolClass::getId, Function.identity())); .collect(Collectors.toMap(PgSchoolClass::getId, Function.identity()));
Map<Long, PgSubject> subjectMap = subjectIds.isEmpty() ? Collections.emptyMap() :
subjectMapper.selectByIds(subjectIds).stream()
.collect(Collectors.toMap(PgSubject::getSubjectId, Function.identity()));
Map<Long, PgMember> memberMap = memberIds.isEmpty() ? Collections.emptyMap() : Map<Long, PgMember> memberMap = memberIds.isEmpty() ? Collections.emptyMap() :
memberMapper.selectByIds(memberIds).stream() memberMapper.selectByIds(memberIds).stream()
.collect(Collectors.toMap(PgMember::getMemberId, Function.identity())); .collect(Collectors.toMap(PgMember::getMemberId, Function.identity()));
@ -198,12 +189,6 @@ public class PgStudentServiceImpl implements IPgStudentService {
vo.setClassName(classNameMap.get(schoolClass.getClassId())); vo.setClassName(classNameMap.get(schoolClass.getClassId()));
} }
// 填充学科名称
PgSubject subject = subjectMap.get(s.getSubjectId());
if (subject != null) {
vo.setSubjectName(subject.getSubjectName());
}
// 填充会员信息 // 填充会员信息
PgMember member = memberMap.get(s.getMemberId()); PgMember member = memberMap.get(s.getMemberId());
if (member != null) { if (member != null) {

View File

@ -322,7 +322,7 @@
| 功能编号 | 功能名称 | 功能描述 | 优先级 | | 功能编号 | 功能名称 | 功能描述 | 优先级 |
| ------- | ------ | ------------------- |:---:| | ------- | ------ | ------------------- |:---:|
| STU-001 | 学生列表查询 | 按姓名、学号、性别、手机号、学科等筛选 | P0 | | STU-001 | 学生列表查询 | 按姓名、学号、性别、手机号等筛选 | P0 |
| STU-002 | 学校树筛选 | 通过左侧学校树快速定位学生,点击节点时带上完整层级条件(学校+年级+班级) | P0 | | STU-002 | 学校树筛选 | 通过左侧学校树快速定位学生,点击节点时带上完整层级条件(学校+年级+班级) | P0 |
| STU-003 | 新增学生 | 手动创建学生信息 | P0 | | STU-003 | 新增学生 | 手动创建学生信息 | P0 |
| STU-004 | 编辑学生 | 修改学生基本信息 | P0 | | STU-004 | 编辑学生 | 修改学生基本信息 | P0 |
@ -372,7 +372,6 @@
| 所属学校 | 下拉选择 | ✓ | 依赖区域 | | 所属学校 | 下拉选择 | ✓ | 依赖区域 |
| 所属年级 | 下拉选择 | ✓ | 依赖学校 | | 所属年级 | 下拉选择 | ✓ | 依赖学校 |
| 所属班级 | 下拉选择 | ✓ | 依赖年级 | | 所属班级 | 下拉选择 | ✓ | 依赖年级 |
| 学科 | 下拉选择 | - | 学科信息 |
| 归属用户 | 关联 | ✓ | 关联会员ID | | 归属用户 | 关联 | ✓ | 关联会员ID |
| 创建时间 | 日期时间 | - | 系统自动记录 | | 创建时间 | 日期时间 | - | 系统自动记录 |
@ -844,7 +843,6 @@
| 学校 | 学校名称 | | 学校 | 学校名称 |
| 年级 | 年级名称 | | 年级 | 年级名称 |
| 班级 | 班级名称 | | 班级 | 班级名称 |
| 学科 | 学科名称 |
| 用户身份 | 家长/教师 | | 用户身份 | 家长/教师 |
| 用户昵称 | 归属会员昵称 | | 用户昵称 | 归属会员昵称 |
| 用户手机号 | 归属会员手机号 | | 用户手机号 | 归属会员手机号 |

View File

@ -53,11 +53,6 @@
@change="handleSchoolChange" @change="handleSchoolChange"
/> />
</el-form-item> </el-form-item>
<el-form-item label="学科" prop="subjectId">
<el-select v-model="form.subjectId" placeholder="请选择学科(选填)" clearable style="width: 100%">
<el-option v-for="item in subjectList" :key="item.subjectId" :label="item.subjectName" :value="item.subjectId" />
</el-select>
</el-form-item>
<el-form-item label="归属用户" prop="memberId"> <el-form-item label="归属用户" prop="memberId">
<div style="display: flex; gap: 8px; width: 100%"> <div style="display: flex; gap: 8px; width: 100%">
<el-input <el-input
@ -102,8 +97,6 @@ const memberSelectRef = ref()
// //
const schoolTreeData = ref([]) const schoolTreeData = ref([])
//
const subjectList = ref([])
const initialForm = { const initialForm = {
studentId: null, studentId: null,
@ -115,7 +108,6 @@ const initialForm = {
schoolId: null, schoolId: null,
schoolGradeId: null, schoolGradeId: null,
schoolClassId: null, schoolClassId: null,
subjectId: null,
memberId: null, memberId: null,
memberDisplay: '' memberDisplay: ''
} }
@ -143,18 +135,6 @@ const getSchoolTree = async () => {
} }
} }
//
const getSubjectList = async () => {
try {
const res = await request.get('/business/subject/list', { params: { status: '0' } })
if (res.code === 200) {
subjectList.value = res.rows || []
}
} catch (e) {
console.error('获取学科列表失败:', e)
}
}
// //
const formatBirthday = (date) => { const formatBirthday = (date) => {
if (!date) return '' if (!date) return ''
@ -190,7 +170,7 @@ const open = async (row = null) => {
formRef.value?.clearValidate() formRef.value?.clearValidate()
// //
await Promise.all([getSchoolTree(), getSubjectList()]) await getSchoolTree()
// //
if (row) { if (row) {
@ -203,7 +183,6 @@ const open = async (row = null) => {
form.studentNo = data.studentNo form.studentNo = data.studentNo
form.gender = data.gender || '0' form.gender = data.gender || '0'
form.birthday = data.birthday ? formatBirthday(data.birthday) : '' form.birthday = data.birthday ? formatBirthday(data.birthday) : ''
form.subjectId = data.subjectId
form.memberId = data.memberId form.memberId = data.memberId
form.memberDisplay = data.memberNickname ? `${data.memberNickname}${data.memberPhone || ''}` : '' form.memberDisplay = data.memberNickname ? `${data.memberNickname}${data.memberPhone || ''}` : ''
@ -265,7 +244,6 @@ const handleSubmit = async () => {
schoolId: form.schoolId, schoolId: form.schoolId,
schoolGradeId: form.schoolGradeId, schoolGradeId: form.schoolGradeId,
schoolClassId: form.schoolClassId, schoolClassId: form.schoolClassId,
subjectId: form.subjectId,
memberId: form.memberId memberId: form.memberId
} }

View File

@ -73,7 +73,6 @@
<el-table-column prop="schoolName" label="学校" min-width="150" show-overflow-tooltip /> <el-table-column prop="schoolName" label="学校" min-width="150" show-overflow-tooltip />
<el-table-column prop="gradeName" label="年级" width="80" /> <el-table-column prop="gradeName" label="年级" width="80" />
<el-table-column prop="className" label="班级" width="80" /> <el-table-column prop="className" label="班级" width="80" />
<el-table-column prop="subjectName" label="学科" width="80" />
<el-table-column prop="memberNickname" label="归属用户" width="120" show-overflow-tooltip> <el-table-column prop="memberNickname" label="归属用户" width="120" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.memberNickname">{{ row.memberNickname }}</span> <span v-if="row.memberNickname">{{ row.memberNickname }}</span>