提交
This commit is contained in:
1 parent
3b3d2bb157
commit
94f07a059b
69 files changed
+2787
-643
No files matched your search
@@ -0,0 +1,141 @@
|
||||
# 学生信息管理-宿舍楼栋字段优化变更记录
|
||||
|
||||
## 📅 变更信息
|
||||
- **变更日期**: 2025-01-01
|
||||
- **变更人员**: AI Assistant
|
||||
- **变更类型**: 功能优化
|
||||
- **影响模块**: 学生信息管理 - 新增/编辑弹窗
|
||||
|
||||
## 🎯 变更目标
|
||||
优化学生信息管理中的宿舍楼栋字段,从手动输入改为通过API获取的树形下拉选择,并为楼栋名称添加性别标识。
|
||||
|
||||
## 📋 变更内容
|
||||
|
||||
### 1. 前端页面修改
|
||||
**文件**: `web/src/views/studentMsg/studentMsg/index.vue`
|
||||
|
||||
#### 1.1 添加状态变量
|
||||
```typescript
|
||||
const dormBuildingOptions = ref([]); // 宿舍楼栋选项
|
||||
```
|
||||
|
||||
#### 1.2 新增API调用函数
|
||||
```typescript
|
||||
/** 获取宿舍楼栋树形数据 */
|
||||
const getDormBuildingTree = async () => {
|
||||
try {
|
||||
const res = await service.get('/xgss/dormBuildingTree/list');
|
||||
if (res && res.data) {
|
||||
// 处理数据,为楼栋名称添加性别标识
|
||||
const processTreeData = (nodes: any[]): any[] => {
|
||||
return nodes.map(node => {
|
||||
const processedNode = { ...node };
|
||||
|
||||
// 如果是楼栋类型,添加性别标识
|
||||
if (node.type === 'building' && node.buildingType) {
|
||||
const genderPrefix = node.buildingType === 1 ? '(男)' : node.buildingType === 2 ? '(女)' : '';
|
||||
processedNode.label = genderPrefix + node.label;
|
||||
processedNode.name = genderPrefix + node.name;
|
||||
}
|
||||
|
||||
// 递归处理子节点
|
||||
if (node.children && node.children.length > 0) {
|
||||
processedNode.children = processTreeData(node.children);
|
||||
}
|
||||
|
||||
return processedNode;
|
||||
});
|
||||
};
|
||||
|
||||
dormBuildingOptions.value = processTreeData(res.data);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取宿舍楼栋数据失败:', error);
|
||||
ElMessage.error('获取宿舍楼栋数据失败');
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
#### 1.3 宿舍楼栋字段改为树形选择器
|
||||
**位置**: 学籍信息Tab
|
||||
```vue
|
||||
<el-form-item label="宿舍楼栋" prop="dormitoryBuilding">
|
||||
<el-tree-select
|
||||
v-model="form.dormitoryBuilding"
|
||||
:data="dormBuildingOptions"
|
||||
:props="{
|
||||
label: 'label',
|
||||
value: 'id',
|
||||
children: 'children',
|
||||
disabled: (data) => data.type !== 'building'
|
||||
}"
|
||||
:check-strictly="true"
|
||||
:render-after-expand="false"
|
||||
placeholder="请选择宿舍楼栋"
|
||||
filterable
|
||||
clearable
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
```
|
||||
|
||||
#### 1.4 组件初始化调用
|
||||
```typescript
|
||||
onMounted(() => {
|
||||
getDeptTree(); // 初始化部门数据
|
||||
getRegionTree(); // 初始化行政区划数据
|
||||
getDormBuildingTree(); // 初始化宿舍楼栋数据 - 新增
|
||||
getList(); // 初始化列表数据
|
||||
});
|
||||
```
|
||||
|
||||
## 🔧 技术实现要点
|
||||
|
||||
### 1. API接口
|
||||
- **URL**: `/xgss/dormBuildingTree/list`
|
||||
- **方法**: GET
|
||||
- **入参**: 无
|
||||
- **返回**: 树形结构的宿舍楼栋数据
|
||||
|
||||
### 2. 数据处理逻辑
|
||||
- 根据 `buildingType` 字段添加性别标识:
|
||||
- `buildingType = 1`: 添加"(男)"前缀
|
||||
- `buildingType = 2`: 添加"(女)"前缀
|
||||
- 递归处理树形数据结构
|
||||
- 保持原有数据结构不变,仅添加前缀
|
||||
|
||||
### 3. 选择限制
|
||||
- 只能选择 `type === 'building'` 的节点
|
||||
- 其他类型节点自动禁用
|
||||
- 支持搜索过滤功能
|
||||
|
||||
## ✅ 功能验证
|
||||
|
||||
### 1. 界面功能
|
||||
- [x] 宿舍楼栋字段显示为树形下拉选择器
|
||||
- [x] 楼栋名称正确显示性别标识
|
||||
- [x] 只能选择楼栋类型节点
|
||||
- [x] 支持搜索和清空功能
|
||||
|
||||
### 2. 数据交互
|
||||
- [x] API正确调用
|
||||
- [x] 数据正确解析和处理
|
||||
- [x] 树形结构正确显示
|
||||
- [x] 选择值正确保存
|
||||
|
||||
## 🎯 预期效果
|
||||
1. **用户体验优化**: 从手动输入改为选择,减少输入错误
|
||||
2. **数据标准化**: 确保宿舍楼栋数据的规范性和一致性
|
||||
3. **性别标识**: 清晰显示楼栋的性别属性,便于管理
|
||||
4. **数据准确性**: 通过API获取最新的楼栋信息
|
||||
|
||||
## 📝 注意事项
|
||||
1. 确保后端API `/xgss/dormBuildingTree/list` 正常可用
|
||||
2. 数据结构需包含 `type`、`buildingType`、`label`、`id` 等字段
|
||||
3. 如果API调用失败,会显示错误提示信息
|
||||
4. 选择器支持键盘导航和筛选功能
|
||||
|
||||
## 🔄 后续优化建议
|
||||
1. 可考虑添加楼栋可用性状态显示
|
||||
2. 可添加楼栋详细信息预览功能
|
||||
3. 可根据学生性别自动过滤对应性别的楼栋
|
||||
@@ -0,0 +1,107 @@
|
||||
# 学生信息管理用户验证逻辑修复记录
|
||||
|
||||
**修复时间**: 2025-01-01 14:30:00
|
||||
**修复人员**: AI Assistant
|
||||
**影响模块**: 学工管理 - 学生信息管理
|
||||
**修复类型**: 代码错误修复
|
||||
|
||||
## 问题描述
|
||||
|
||||
XgStudentMsgController中的add方法存在多个代码错误:
|
||||
|
||||
1. **变量名错误**: 使用了未定义的`user`变量,应该使用参数`bo`
|
||||
2. **导入缺失**: 缺少`StringUtils`和`SysUserBo`的导入
|
||||
3. **服务未注入**: 引用了`tenantService`但未正确注入`ISysTenantService`
|
||||
4. **方法调用错误**: 用户验证方法需要`SysUserBo`对象参数,而不是`String`
|
||||
|
||||
## 错误代码片段
|
||||
|
||||
```java
|
||||
// 错误的代码
|
||||
if (!userService.checkUserNameUnique(user)) {
|
||||
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
|
||||
}
|
||||
```
|
||||
|
||||
## 修复方案
|
||||
|
||||
### 1. 添加必要的导入
|
||||
|
||||
```java
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.system.domain.bo.SysUserBo;
|
||||
import org.dromara.system.service.ISysTenantService;
|
||||
```
|
||||
|
||||
### 2. 注入租户服务
|
||||
|
||||
```java
|
||||
private final ISysTenantService tenantService;
|
||||
```
|
||||
|
||||
### 3. 修正用户验证逻辑
|
||||
|
||||
```java
|
||||
// 验证学号作为用户名的唯一性
|
||||
if (StringUtils.isNotBlank(bo.getStudentNo())) {
|
||||
SysUserBo tempUser = new SysUserBo();
|
||||
tempUser.setUserName(bo.getStudentNo());
|
||||
if (!userService.checkUserNameUnique(tempUser)) {
|
||||
return R.fail("新增学生'" + bo.getName() + "'失败,学号'" + bo.getStudentNo() + "'已被使用作为登录账号");
|
||||
}
|
||||
}
|
||||
|
||||
// 验证手机号唯一性(如果提供了手机号)
|
||||
if (StringUtils.isNotBlank(bo.getPhone())) {
|
||||
SysUserBo tempUser = new SysUserBo();
|
||||
tempUser.setPhonenumber(bo.getPhone());
|
||||
if (!userService.checkPhoneUnique(tempUser)) {
|
||||
return R.fail("新增学生'" + bo.getName() + "'失败,手机号码'" + bo.getPhone() + "'已存在");
|
||||
}
|
||||
}
|
||||
|
||||
// 验证邮箱唯一性(如果提供了邮箱)
|
||||
if (StringUtils.isNotBlank(bo.getEmail())) {
|
||||
SysUserBo tempUser = new SysUserBo();
|
||||
tempUser.setEmail(bo.getEmail());
|
||||
if (!userService.checkEmailUnique(tempUser)) {
|
||||
return R.fail("新增学生'" + bo.getName() + "'失败,邮箱账号'" + bo.getEmail() + "'已存在");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 修复文件列表
|
||||
|
||||
- `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java`
|
||||
|
||||
## 修复效果
|
||||
|
||||
1. ✅ **编译错误解决**: 消除了所有编译错误
|
||||
2. ✅ **逻辑正确**: 用户验证逻辑适配学生信息的字段(学号、手机号、邮箱)
|
||||
3. ✅ **错误消息优化**: 错误提示信息更加清晰和用户友好
|
||||
4. ✅ **服务注入完整**: 租户服务正确注入,支持多租户用户额度检查
|
||||
|
||||
## 业务逻辑说明
|
||||
|
||||
此修复确保了学生信息创建时的用户验证机制正常工作:
|
||||
|
||||
1. **学号唯一性**: 学号将作为系统用户名,必须保证唯一性
|
||||
2. **联系方式唯一性**: 手机号和邮箱在系统中必须唯一(如果提供)
|
||||
3. **租户额度检查**: 在多租户环境下检查用户创建额度
|
||||
4. **自动用户创建**: 通过验证后,Service层会自动为学生创建对应的系统用户账号
|
||||
|
||||
## 关联说明
|
||||
|
||||
该验证逻辑与`XgStudentMsgServiceImpl.insertByBo`方法中的用户创建逻辑配套使用,确保数据一致性和业务完整性。
|
||||
|
||||
## 测试建议
|
||||
|
||||
1. 测试学号重复时的错误提示
|
||||
2. 测试手机号重复时的错误提示
|
||||
3. 测试邮箱重复时的错误提示
|
||||
4. 测试多租户环境下的用户额度限制
|
||||
5. 测试正常学生信息创建和用户账号自动生成
|
||||
|
||||
---
|
||||
|
||||
**备注**: 此次修复遵循了项目的编码规范和错误处理标准,确保了学生信息管理模块的稳定性和可靠性。
|
||||
@@ -0,0 +1,117 @@
|
||||
# 学生用户操作限制功能开发记录
|
||||
|
||||
**变更时间**: 2025-01-01 14:30:00
|
||||
**开发者**: Cursor AI
|
||||
**变更类型**: 功能增强
|
||||
**影响模块**: 系统管理-用户管理
|
||||
|
||||
## 变更概述
|
||||
|
||||
在用户管理界面中,当用户的 `accountType` 为 "2"(学生用户)时,禁用所有管理操作,包括修改、删除、状态调整、重置密码、分配角色等。
|
||||
|
||||
## 详细变更内容
|
||||
|
||||
### 1. 前端类型定义更新
|
||||
|
||||
**文件**: `web/src/api/system/user/types.ts`
|
||||
|
||||
- 在 `UserVO` 接口中添加 `accountType: string` 字段
|
||||
|
||||
### 2. 用户管理页面功能限制
|
||||
|
||||
**文件**: `web/src/views/system/user/index.vue`
|
||||
|
||||
#### 2.1 新增计算属性
|
||||
- `isSelectedStudentUser`: 判断选中的单个用户是否为学生用户
|
||||
- `hasSelectedStudentUser`: 判断选中的用户中是否包含学生用户
|
||||
|
||||
#### 2.2 批量操作按钮限制
|
||||
- **修改按钮**: 当选中学生用户时禁用 (`isSelectedStudentUser`)
|
||||
- **删除按钮**: 当选中用户包含学生用户时禁用 (`hasSelectedStudentUser`)
|
||||
|
||||
#### 2.3 表格操作限制
|
||||
- **状态开关**: 学生用户的状态开关设为禁用状态
|
||||
- **行操作按钮**: 学生用户隐藏所有操作按钮(修改、删除、重置密码、分配角色)
|
||||
- **学生用户标识**: 在操作列显示"学生用户"文字提示
|
||||
|
||||
#### 2.4 操作函数校验
|
||||
- `handleDelete()`: 检查并阻止删除学生用户
|
||||
- `handleStatusChange()`: 检查并阻止修改学生用户状态
|
||||
- `handleAuthRole()`: 检查并阻止为学生用户分配角色
|
||||
- `handleResetPwd()`: 检查并阻止重置学生用户密码
|
||||
- `handleUpdate()`: 检查并阻止修改学生用户信息
|
||||
|
||||
#### 2.5 用户体验优化
|
||||
- 所有被禁止的操作都会显示友好的错误提示信息
|
||||
- 学生用户在操作列显示"学生用户"标识,鼠标悬停显示"学生用户不允许操作"提示
|
||||
|
||||
## 技术实现要点
|
||||
|
||||
### 条件判断逻辑
|
||||
```javascript
|
||||
// 单个学生用户判断
|
||||
scope.row.accountType === '2'
|
||||
|
||||
// 批量操作中包含学生用户判断
|
||||
selectedUsers.value.some(user => user.accountType === '2')
|
||||
```
|
||||
|
||||
### 状态开关禁用
|
||||
```vue
|
||||
<el-switch
|
||||
v-model="scope.row.status"
|
||||
active-value="0"
|
||||
inactive-value="1"
|
||||
:disabled="scope.row.accountType === '2'"
|
||||
@change="handleStatusChange(scope.row)"
|
||||
></el-switch>
|
||||
```
|
||||
|
||||
### 操作按钮条件显示
|
||||
```vue
|
||||
<el-tooltip v-if="scope.row.userId !== 1 && scope.row.accountType !== '2'" content="修改" placement="top">
|
||||
<el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
|
||||
</el-tooltip>
|
||||
```
|
||||
|
||||
## 功能验证
|
||||
|
||||
### 测试场景
|
||||
1. ✅ 学生用户状态开关被禁用
|
||||
2. ✅ 学生用户不显示修改、删除、重置密码、分配角色按钮
|
||||
3. ✅ 选中学生用户时批量修改按钮被禁用
|
||||
4. ✅ 选中包含学生用户的多个用户时批量删除按钮被禁用
|
||||
5. ✅ 所有被禁止的操作都显示友好提示信息
|
||||
6. ✅ 学生用户在操作列显示"学生用户"标识
|
||||
|
||||
### 错误提示信息
|
||||
- "学生用户不允许删除操作"
|
||||
- "学生用户不允许修改状态"
|
||||
- "学生用户不允许分配角色操作"
|
||||
- "学生用户不允许重置密码操作"
|
||||
- "学生用户不允许修改操作"
|
||||
- "选中的用户中包含学生用户,不允许删除操作"
|
||||
|
||||
## 影响范围
|
||||
|
||||
### 直接影响
|
||||
- 系统管理员无法通过用户管理界面修改学生用户信息
|
||||
- 学生用户的账号状态无法通过界面调整
|
||||
- 学生用户无法被删除、重置密码或分配角色
|
||||
|
||||
### 兼容性
|
||||
- 保持了对管理员用户(userId === 1)的原有保护逻辑
|
||||
- 不影响非学生用户的正常管理功能
|
||||
- 向下兼容,对没有 accountType 字段的用户不影响
|
||||
|
||||
## 后续优化建议
|
||||
|
||||
1. 考虑添加学生用户专用的管理界面,提供受限的编辑功能
|
||||
2. 可以考虑增加配置项,允许超级管理员临时开启学生用户的管理权限
|
||||
3. 添加学生用户批量导入/导出功能的特殊处理逻辑
|
||||
|
||||
## 相关文档
|
||||
|
||||
- API文档: `docs/开发文档/API/用户认证登录API.md`
|
||||
- 数据库设计: `docs/设计文档/database/mysql-database-standard.md`
|
||||
- 前端开发规范: `.cursor/cursorrules-frontend.md`
|
||||
@@ -0,0 +1,120 @@
|
||||
# 代码调整记录 - 2025-01-01 - system
|
||||
|
||||
## 2025-01-01 23:xx:xx - 学生信息管理表单只读字段优化
|
||||
|
||||
### 变更内容
|
||||
优化学生信息新增/编辑表单中自动填充字段的显示效果,将从班级信息自动填充的字段设置为只读状态。
|
||||
|
||||
### 修改文件
|
||||
- `web/src/views/studentMsg/studentMsg/index.vue`
|
||||
|
||||
### 具体修改
|
||||
1. **班级信息相关字段设置为disabled状态**:
|
||||
- 班级名称 (className) - 改为disabled
|
||||
- 学院名称 (collegeName) - 改为disabled
|
||||
- 专业名称 (majorName) - 改为disabled
|
||||
- 班主任姓名 (classTeacherName) - 改为disabled
|
||||
|
||||
2. **学籍信息相关字段设置为disabled状态**:
|
||||
- 学历层次 (academicLevel) - 改为disabled
|
||||
- 年级 (grade) - 改为disabled
|
||||
- 入学年份 (enrollmentYear) - 改为disabled
|
||||
- 学制 (schoolSystem) - 改为disabled
|
||||
|
||||
### 变更原因
|
||||
- 这些字段在新增学生时从选中的班级信息自动填充
|
||||
- 设置为disabled状态可以明确告知用户这些字段是自动填充的
|
||||
- 防止用户误操作导致数据不一致
|
||||
- 提供更好的用户体验,明确区分可编辑和不可编辑字段
|
||||
|
||||
### 技术影响
|
||||
- 提升表单的用户体验
|
||||
- 确保数据一致性
|
||||
- 视觉上明确区分自动填充字段和手动输入字段
|
||||
|
||||
### 测试要点
|
||||
- 新增学生时,从班级树选择班级后,相关字段应正确填充且显示为disabled状态
|
||||
- 编辑学生时,这些字段应保持可编辑状态(因为可能需要修正数据)
|
||||
|
||||
---
|
||||
|
||||
## 📋 变更概览
|
||||
- **日期**: 2025-01-01
|
||||
- **操作员**: system
|
||||
- **变更类型**: 功能优化
|
||||
- **影响模块**: 学工管理-学生信息管理
|
||||
|
||||
---
|
||||
|
||||
## 🎯 本次变更
|
||||
|
||||
### 2025-01-01 12:30:00 - 学生信息管理页面新增按钮条件显示
|
||||
|
||||
**变更文件**:
|
||||
- `web/src/views/studentMsg/studentMsg/index.vue`
|
||||
|
||||
**变更内容**:
|
||||
1. **新增响应式变量**:
|
||||
- 添加 `currentSelectedNode` 用于存储当前选中的部门节点信息
|
||||
|
||||
2. **新增计算属性**:
|
||||
- 添加 `showAddButton` 计算属性,判断是否显示新增按钮
|
||||
- 判断逻辑:只有当 `deptCategory` 以 "bj-" 开头时才显示新增按钮
|
||||
|
||||
3. **修改节点点击事件**:
|
||||
- 在 `handleNodeClick` 方法中保存当前选中的节点信息到 `currentSelectedNode`
|
||||
|
||||
4. **修改新增按钮显示**:
|
||||
- 在新增按钮的 `el-col` 组件上添加 `v-if="showAddButton"` 条件
|
||||
|
||||
5. **修改重置操作**:
|
||||
- 在 `resetQuery` 方法中清空 `currentSelectedNode` 以隐藏新增按钮
|
||||
|
||||
**技术实现**:
|
||||
```vue
|
||||
// 1. 导入 computed 函数
|
||||
import { getCurrentInstance, ref, reactive, toRefs, watchEffect, onMounted, computed } from 'vue';
|
||||
|
||||
// 2. 新增变量和计算属性
|
||||
const currentSelectedNode = ref<any>(null);
|
||||
const showAddButton = computed(() => {
|
||||
if (!currentSelectedNode.value) {
|
||||
return false;
|
||||
}
|
||||
return currentSelectedNode.value.deptCategory && currentSelectedNode.value.deptCategory.startsWith('bj-');
|
||||
});
|
||||
|
||||
// 3. 修改模板
|
||||
<el-col :span="1.5" v-if="showAddButton">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
|
||||
</el-col>
|
||||
```
|
||||
|
||||
**业务价值**:
|
||||
- 🎯 **权限控制**: 确保只有在班级节点才能新增学生,符合业务逻辑
|
||||
- 🔒 **数据安全**: 防止在错误的组织层级下创建学生数据
|
||||
- 👥 **用户体验**: 清晰的界面提示,避免用户在非班级节点进行无效操作
|
||||
- 📊 **数据完整性**: 确保学生数据与正确的班级关联
|
||||
|
||||
**测试建议**:
|
||||
1. 点击非班级节点,确认新增按钮隐藏
|
||||
2. 点击班级节点(deptCategory 以 bj- 开头),确认新增按钮显示
|
||||
3. 执行重置操作,确认新增按钮隐藏
|
||||
4. 测试新增学生功能正常
|
||||
|
||||
---
|
||||
|
||||
## 📝 技术规范遵循
|
||||
|
||||
✅ **前端开发规范**: 遵循 Vue 3 Composition API 规范
|
||||
✅ **响应式设计**: 使用 computed 实现响应式显示逻辑
|
||||
✅ **代码清洁**: 添加详细注释说明业务逻辑
|
||||
✅ **用户体验**: 条件显示提升界面友好性
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相关文档
|
||||
|
||||
- **前端开发规范**: `.cursor/cursorrules-frontend.md`
|
||||
- **学生信息管理API**: `docs/开发文档/API/学生信息管理API.md`
|
||||
- **项目规范总览**: `.cursor/rules.md`
|
||||
@@ -23,14 +23,14 @@
|
||||
### 1. 性别字段数据不一致问题
|
||||
|
||||
**问题描述**:
|
||||
- 数据库表:`gender char(1) COMMENT '性别(M-男 F-女)'`
|
||||
- 数据库表:`gender char(1) COMMENT '性别(0-男 1-女)'`
|
||||
- 前端原始使用:`sys_user_sex`字典(0-男 1-女 2-未知)
|
||||
- 导致新增时提示"性别必须是F"的错误
|
||||
|
||||
**根本原因**: 前后端性别数据格式不统一
|
||||
|
||||
**修复方案**:
|
||||
- 创建专用字典:`zsjy_gender`(M-男 F-女)
|
||||
- 创建专用字典:`zsjy_gender`(0-男 1-女)
|
||||
- 更新前端页面使用新字典
|
||||
- 修正身份证自动识别输出M/F格式
|
||||
|
||||
@@ -105,7 +105,7 @@ form.value.gender = genderCode % 2 === 1 ? 'M' : 'F';
|
||||
| `id` | bigint(20) | NOT NULL | 主键ID | ✅ 正常 |
|
||||
| `name` | varchar(50) | NOT NULL | 姓名 | ✅ 正常 |
|
||||
| `id_card` | varchar(18) | NOT NULL | 身份证号 | ✅ 正常 |
|
||||
| `gender` | char(1) | NOT NULL | 性别(M-男 F-女) | ✅ 已修复 |
|
||||
| `gender` | char(1) | NOT NULL | 性别(0-男 1-女) | ✅ 已修复 |
|
||||
| `is_boarding` | tinyint(1) | DEFAULT 0 | 是否住校(0-否 1-是) | ✅ 正常 |
|
||||
| `birth_date` | date | NULL | 出生年月 | ✅ 正常 |
|
||||
| `phone1` | varchar(20) | NOT NULL | 联系手机号码1 | ✅ 正常 |
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
### 1. 性别字段显示问题
|
||||
|
||||
**问题描述**:
|
||||
- 数据库表定义:`gender char(1) COMMENT '性别(M-男 F-女)'`
|
||||
- 数据库表定义:`gender char(1) COMMENT '性别(0-男 1-女)'`
|
||||
- 前端使用:`zsjy_gender`字典
|
||||
- 但字典数据标签值可能被改动或未正确配置,导致显示代码而非文字
|
||||
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
# 代码调整记录 - 2025-07-24 - Cursor
|
||||
|
||||
## 📋 调整概览
|
||||
- **调整日期**: 2025-07-24 10:30:00
|
||||
- **调整人员**: Cursor AI
|
||||
- **调整模块**: 系统管理 - 用户信息管理
|
||||
- **调整类型**: 功能增强
|
||||
|
||||
---
|
||||
|
||||
## 🎯 本次调整
|
||||
|
||||
### 1. 用户信息更新同步学生信息功能
|
||||
**文件**: `backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java`
|
||||
|
||||
#### 调整内容
|
||||
1. **导入新增**:
|
||||
- 添加 `JdbcTemplate` 相关导入
|
||||
- 添加 `@Autowired` 注解导入
|
||||
|
||||
2. **依赖注入**:
|
||||
```java
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
```
|
||||
|
||||
3. **方法增强**: `updateUserProfile()` 方法
|
||||
- 添加 `@Transactional` 事务控制
|
||||
- 新增学生信息同步逻辑
|
||||
- 当 `accountType = "2"` 时自动更新 `xg_student_msg` 表
|
||||
|
||||
#### 实现逻辑
|
||||
```java
|
||||
// 判断账号类型为学生(accountType = "2")时,同步更新学生信息表
|
||||
if ("2".equals(user.getAccountType()) && result > 0) {
|
||||
try {
|
||||
String updateSql = "UPDATE xg_student_msg SET " +
|
||||
"name = ?, email = ?, gender = ?, phone = ?, update_time = NOW() " +
|
||||
"WHERE id = ? AND deleted = 0";
|
||||
|
||||
jdbcTemplate.update(updateSql,
|
||||
user.getNickName(), // 昵称对应学生姓名
|
||||
user.getEmail(), // 邮箱
|
||||
user.getSex(), // 性别
|
||||
user.getPhonenumber(), // 手机号
|
||||
user.getUserId() // 用户ID对应学生ID
|
||||
);
|
||||
} catch (Exception e) {
|
||||
// 异常处理和日志记录
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 字段映射关系
|
||||
| 用户表字段 | 学生表字段 | 说明 |
|
||||
|-----------|-----------|------|
|
||||
| `nickName` | `name` | 用户昵称 → 学生姓名 |
|
||||
| `email` | `email` | 邮箱地址 |
|
||||
| `sex` | `gender` | 性别信息 |
|
||||
| `phonenumber` | `phone` | 手机号码 |
|
||||
| `userId` | `id` | 用户ID → 学生ID |
|
||||
|
||||
---
|
||||
|
||||
## ✅ 功能特性
|
||||
|
||||
### 🔐 安全控制
|
||||
- ✅ **条件判断**: 仅当 `accountType = "2"` 时执行同步
|
||||
- ✅ **事务控制**: 确保数据一致性
|
||||
- ✅ **异常隔离**: 学生信息更新失败不影响用户信息更新
|
||||
|
||||
### 📊 数据同步
|
||||
- ✅ **实时同步**: 用户信息更新时自动同步学生信息
|
||||
- ✅ **逻辑删除**: 仅更新未删除的学生记录 (`deleted = 0`)
|
||||
- ✅ **时间戳**: 自动更新修改时间
|
||||
|
||||
### 📝 操作日志
|
||||
- ✅ **成功日志**: 记录同步成功信息
|
||||
- ✅ **错误日志**: 记录同步失败详情
|
||||
- ✅ **用户ID**: 便于问题排查
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试建议
|
||||
|
||||
### 测试场景
|
||||
1. **正常场景**: 学生用户(`accountType = "2"`)更新个人信息
|
||||
2. **条件验证**: 非学生用户更新信息时不触发同步
|
||||
3. **异常处理**: 学生表不存在对应记录时的处理
|
||||
4. **事务验证**: 确保同步失败时不影响用户信息更新
|
||||
|
||||
### 测试数据
|
||||
```sql
|
||||
-- 测试用户数据 (accountType = "2")
|
||||
UPDATE sys_user SET account_type = '2' WHERE user_id = 123;
|
||||
|
||||
-- 对应学生数据
|
||||
SELECT * FROM xg_student_msg WHERE id = 123;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 相关文档
|
||||
|
||||
### 更新的文档
|
||||
- 需要更新: API文档 - 用户信息管理部分
|
||||
- 需要更新: 学生信息管理相关文档
|
||||
|
||||
### 参考规范
|
||||
- 数据库规范: `docs/设计文档/database/mysql-database-standard.md`
|
||||
- 后端开发规范: `.cursor/cursorrules-backend.md`
|
||||
|
||||
---
|
||||
|
||||
## 🔄 后续计划
|
||||
|
||||
### 优化建议
|
||||
1. **性能优化**: 考虑批量更新场景的优化
|
||||
2. **监控告警**: 添加同步失败的监控机制
|
||||
3. **配置化**: 将同步逻辑配置化,支持开关控制
|
||||
|
||||
### 扩展功能
|
||||
1. **双向同步**: 考虑学生信息更新时反向同步用户信息
|
||||
2. **字段扩展**: 支持更多字段的自动同步
|
||||
3. **异步同步**: 对于非关键更新采用异步同步机制
|
||||
|
||||
---
|
||||
|
||||
**✅ 调整状态**: 已完成
|
||||
**🔍 验证状态**: 待测试
|
||||
**📝 文档状态**: 已记录
|
||||
@@ -74,7 +74,7 @@ public TableDataInfo<ZsjyEnrollmentProcessVo> queryPageList(ZsjyEnrollmentProces
|
||||
|
||||
```java
|
||||
/**
|
||||
* 性别(M-男 F-女)- 从enrollment_info表获取
|
||||
* 性别(0-男 1-女)- 从enrollment_info表获取
|
||||
*/
|
||||
private String gender;
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
| studentNo | string | 否 | 学号 |
|
||||
| name | string | 否 | 姓名(模糊查询) |
|
||||
| idCard | string | 否 | 身份证号 |
|
||||
| gender | string | 否 | 性别:M-男,F-女 |
|
||||
| gender | string | 否 | 性别:0-男,1-女 |
|
||||
| studentStatus | string | 否 | 学籍状态 |
|
||||
| enrollmentYear | integer | 否 | 入学年份 |
|
||||
| majorCode | string | 否 | 专业代码 |
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
| pageSize | Integer | 是 | 每页记录数 |
|
||||
| name | String | 否 | 姓名,支持模糊查询 |
|
||||
| idCard | String | 否 | 身份证号 |
|
||||
| gender | String | 否 | 性别(M-男 F-女) |
|
||||
| gender | String | 否 | 性别(0-男 1-女) |
|
||||
| examNumber | String | 否 | 准考证号 |
|
||||
| phone1 | String | 否 | 联系电话 |
|
||||
| examRegion | String | 否 | 中考地区 |
|
||||
@@ -67,7 +67,7 @@
|
||||
| id | Long | 主键ID |
|
||||
| name | String | 姓名 |
|
||||
| idCard | String | 身份证号 |
|
||||
| gender | String | 性别(M-男 F-女) |
|
||||
| gender | String | 性别(0-男 1-女) |
|
||||
| phone1 | String | 联系电话 |
|
||||
| examNumber | String | 准考证号 |
|
||||
| examRegion | String | 中考地区 |
|
||||
@@ -99,7 +99,7 @@
|
||||
| id | Long | 主键ID |
|
||||
| name | String | 姓名 |
|
||||
| idCard | String | 身份证号 |
|
||||
| gender | String | 性别(M-男 F-女) |
|
||||
| gender | String | 性别(0-男 1-女) |
|
||||
| isBoarding | Integer | 是否住校(0-否 1-是) |
|
||||
| birthDate | Date | 出生年月 |
|
||||
| phone1 | String | 联系电话1 |
|
||||
@@ -141,7 +141,7 @@
|
||||
|---------|--------|---------|-----|
|
||||
| name | String | 是 | 姓名 |
|
||||
| idCard | String | 是 | 身份证号 |
|
||||
| gender | String | 是 | 性别(M-男 F-女) |
|
||||
| gender | String | 是 | 性别(0-男 1-女) |
|
||||
| isBoarding | Integer | 否 | 是否住校(0-否 1-是) |
|
||||
| birthDate | Date | 否 | 出生年月 |
|
||||
| phone1 | String | 是 | 联系电话1 |
|
||||
@@ -190,7 +190,7 @@
|
||||
| id | Long | 是 | 主键ID |
|
||||
| name | String | 是 | 姓名 |
|
||||
| idCard | String | 是 | 身份证号 |
|
||||
| gender | String | 是 | 性别(M-男 F-女) |
|
||||
| gender | String | 是 | 性别(0-男 1-女) |
|
||||
| isBoarding | Integer | 否 | 是否住校(0-否 1-是) |
|
||||
| birthDate | Date | 否 | 出生年月 |
|
||||
| phone1 | String | 是 | 联系电话1 |
|
||||
|
||||
@@ -37,7 +37,7 @@ public class EnrollmentInfoVo {
|
||||
private Long id; // 主键ID
|
||||
private String name; // 姓名
|
||||
private String idCard; // 身份证号
|
||||
private String gender; // 性别(M-男 F-女)
|
||||
private String gender; // 性别(0-男 1-女)
|
||||
private Boolean isBoarding; // 是否住校
|
||||
private Date birthDate; // 出生日期
|
||||
private String phone1; // 联系手机号码1
|
||||
|
||||
@@ -29,7 +29,7 @@ CREATE TABLE `xg_student_info` (
|
||||
-- 基本信息
|
||||
`student_id` varchar(32) NOT NULL COMMENT '学号',
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:M-男,F-女',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:0-男,1-女',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
||||
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||
`nation` varchar(20) DEFAULT NULL COMMENT '民族',
|
||||
|
||||
@@ -35,7 +35,7 @@ CREATE TABLE `xg_student_info` (
|
||||
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`name_pinyin` varchar(200) DEFAULT NULL COMMENT '姓名拼音',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:M-男,F-女',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:0-男,1-女',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
||||
`nation` varchar(20) DEFAULT NULL COMMENT '民族',
|
||||
`political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌',
|
||||
|
||||
@@ -180,7 +180,7 @@ CREATE TABLE `xg_student_info` (
|
||||
`id` bigint(20) NOT NULL COMMENT '主键ID',
|
||||
`student_no` varchar(32) NOT NULL COMMENT '学号',
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`gender` char(1) DEFAULT NULL COMMENT '性别:M-男,F-女',
|
||||
`gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
||||
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||
`nation` varchar(20) DEFAULT NULL COMMENT '民族',
|
||||
|
||||
@@ -182,7 +182,7 @@ CREATE TABLE IF NOT EXISTS `xg_student_info` (
|
||||
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`name_pinyin` varchar(200) DEFAULT NULL COMMENT '姓名拼音',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:M-男,F-女',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:0-男,1-女',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
||||
`nation` varchar(20) DEFAULT NULL COMMENT '民族',
|
||||
`political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌',
|
||||
|
||||
@@ -31,7 +31,7 @@ CREATE TABLE `xg_student_info` (
|
||||
`name_english` varchar(100) DEFAULT NULL COMMENT '英文姓名',
|
||||
`former_name` varchar(50) DEFAULT NULL COMMENT '曾用名',
|
||||
`name_pinyin` varchar(200) DEFAULT NULL COMMENT '姓名拼音',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:M-男,F-女',
|
||||
`gender` char(1) NOT NULL COMMENT '性别:0-男,1-女',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
||||
`nation` varchar(20) DEFAULT NULL COMMENT '民族',
|
||||
`political_status` varchar(20) DEFAULT NULL COMMENT '政治面貌',
|
||||
|
||||
@@ -39,6 +39,7 @@ CREATE TABLE `xg_class_msg` (
|
||||
`class_type` varchar(20) DEFAULT '1' COMMENT '班级类型:1-中级工 2-高级工 3-预备技师 4-技师 5-中高职一体',
|
||||
`grade` varchar(10) NOT NULL COMMENT '年级',
|
||||
`enrollment_year` int(4) NOT NULL COMMENT '入学年份',
|
||||
`school_system` int(2) DEFAULT '4' COMMENT '学制(年)',
|
||||
`graduation_year` int(4) DEFAULT NULL COMMENT '毕业年份',
|
||||
`training_type` varchar(20) DEFAULT NULL COMMENT '培养方式:全日制,在职,函授,夜大等',
|
||||
`degree_type` varchar(20) DEFAULT NULL COMMENT '学位类型:学士,硕士,博士,专科',
|
||||
|
||||
@@ -31,7 +31,7 @@ CREATE TABLE `zsjy_enrollment_info` (
|
||||
-- 基本信息
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(M-男 F-女)',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(0-男 1-女)',
|
||||
`is_boarding` tinyint(1) DEFAULT 0 COMMENT '是否住校(0-否 1-是)',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生年月',
|
||||
`phone1` varchar(20) NOT NULL COMMENT '联系手机号码1',
|
||||
|
||||
@@ -31,7 +31,7 @@ CREATE TABLE `zsjy_enrollment_info` (
|
||||
-- 基本信息
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(M-男 F-女)',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(0-男 1-女)',
|
||||
`is_boarding` tinyint(1) DEFAULT 0 COMMENT '是否住校(0-否 1-是)',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生年月',
|
||||
`phone1` varchar(20) NOT NULL COMMENT '联系手机号码1',
|
||||
|
||||
@@ -48,7 +48,7 @@ CREATE TABLE `zsjy_enrollment_info` (
|
||||
-- 基本信息
|
||||
`name` varchar(50) NOT NULL COMMENT '姓名',
|
||||
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(M-男 F-女)',
|
||||
`gender` char(1) NOT NULL COMMENT '性别(0-男 1-女)',
|
||||
`is_boarding` tinyint(1) DEFAULT 0 COMMENT '是否住校(0-否 1-是)',
|
||||
`birth_date` date DEFAULT NULL COMMENT '出生年月',
|
||||
`phone1` varchar(20) NOT NULL COMMENT '联系手机号码1',
|
||||
|
||||
Reference in new issue
Block a user