教师端数据看板: - 新增 TeacherDashboardResponse/TeacherLessonVO/TeacherLessonTrendVO - 新增 TeacherWeeklyStatsResponse 周统计响应 - 新增 TeacherActivityLevel 枚举和 TeacherActivityRankResponse 活跃度排行 - 实现教师端课程统计、任务完成详情、任务反馈接口 学校端课程统计: - 新增 CourseUsageVO/CourseUsageStatsVO/CoursePackageVO - 新增 SchoolCourseResponse 和学校端课程使用查询接口 - 实现学校端统计数据和课程趋势接口 用户资料功能: - 新增 UpdateProfileRequest/UpdateProfileResponse - 实现用户资料更新接口 前后端对齐: - 更新 OpenAPI 规范和前端 API 类型生成 - 优化 DashboardView 组件和 API 调用 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.3 KiB
5.3 KiB
个人中心功能实现记录
日期:2026-03-20
实现内容
需求目标
在个人中心页面新增:
- 密码修改功能:输入旧密码和新密码进行修改
- 信息编辑功能:可修改姓名、手机号、邮箱
后端实现
1. 新建 DTO 文件
UpdateProfileRequest.java
- 路径:
reading-platform-java/src/main/java/com/reading/platform/dto/request/UpdateProfileRequest.java - 字段:name(姓名)、phone(手机号)、email(邮箱)
- 校验注解:
- name:
@Pattern(regexp = "^[\u4e00-\u9fa5a-zA-Z\s]{2,20}$") - phone:
@Pattern(regexp = "^1[3-9]\d{9}$") - email:
@Email
- name:
UpdateProfileResponse.java
- 路径:
reading-platform-java/src/main/java/com/reading/platform/dto/response/UpdateProfileResponse.java - 字段:userInfo(用户信息)、token(新 token)
2. 修改 Service 接口
AuthService.java
新增方法:
UpdateProfileResponse updateProfile(UpdateProfileRequest request);
void changePassword(String oldPassword, String newPassword, String currentToken);
3. 修改 Service 实现
AuthServiceImpl.java
-
新增
updateProfile()方法:- 根据当前用户角色更新对应表(AdminUser/Tenant/Teacher/Parent)
- 学校管理员(Tenant)更新
contactName/contactPhone/contactEmail字段 - 其他角色更新
name/phone/email字段 - 生成新 token 并更新 Redis
- 返回更新后的用户信息和新 token
-
新增
changePassword(String oldPassword, String newPassword, String currentToken)方法:- 调用原有
changePassword()方法修改密码 - 将当前 token 加入黑名单(使旧 token 失效)
- 调用原有
-
新增
convertToUserInfoResponse(Object userInfo, String role)私有方法:- 将 Entity 对象转换为 UserInfoResponse
4. 修改 Controller
AuthController.java
- 新增接口
PUT /api/v1/auth/profile:修改个人信息 - 修改接口
POST /api/v1/auth/change-password:增加 HttpServletRequest 参数获取 token - 新增
resolveToken(HttpServletRequest request)辅助方法:从 Authorization header 获取 token
5. 扩展 JwtTokenProvider
JwtTokenProvider.java
新增方法:
public long getRemainingExpiration(String token)
- 用于获取 token 剩余过期时间(秒)
- 用于将 token 加入黑名单时设置过期时间
前端实现
1. 扩展 API 文件
src/api/auth.ts
新增类型和方法:
export interface UpdateProfileDto {
name?: string;
phone?: string;
email?: string;
}
export interface UpdateProfileResponse {
userInfo: UserProfile;
token: string;
}
export function updateProfile(data: UpdateProfileDto): Promise<UpdateProfileResponse>
export function changePassword(oldPassword: string, newPassword: string): Promise<void>
2. 修改个人中心页面
src/views/profile/ProfileView.vue
- 新增「编辑资料」按钮:点击后弹出编辑弹窗
- 新增「修改密码」按钮:点击后弹出密码修改弹窗
- 编辑表单:
- 姓名输入框(必填,2-20 位中文或英文)
- 手机号输入框(选填,11 位数字正则校验)
- 邮箱输入框(选填,email 格式校验)
- 密码修改表单:
- 旧密码输入框(必填)
- 新密码输入框(必填,最少 6 位)
- 确认密码输入框(必填,与 new password 一致)
- 修改信息成功后:刷新本地用户信息
- 修改密码成功后:清除 token 和用户信息,跳转到登录页
后端 API 列表
| 接口 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 获取个人信息 | GET | /api/v1/auth/profile |
已有 |
| 修改个人信息 | PUT | /api/v1/auth/profile |
新增,返回新 token |
| 修改密码 | POST | /api/v1/auth/change-password |
已有,修改后 token 失效 |
验证方案
后端验证
- 启动后端服务(端口 8480)
- 使用 Swagger 测试接口:
GET /api/v1/auth/profile- 获取个人信息PUT /api/v1/auth/profile- 修改个人信息POST /api/v1/auth/change-password?oldPassword=xxx&newPassword=yyy- 修改密码
前端验证
- 启动前端服务(端口 5173)
- 登录任意角色账户
- 访问个人中心页面
- 测试编辑信息功能
- 测试修改密码功能
注意事项
-
字段映射:
- 前端统一使用
name/phone/email - 后端 Service 层根据角色映射到对应字段
- 学校管理员(Tenant)映射到
contactName/contactPhone/contactEmail
- 前端统一使用
-
Token 处理:
- 修改个人信息:返回新 token,前端替换 localStorage 中的旧 token
- 修改密码:将当前 token 加入黑名单,前端清除 token 并跳转到登录页
-
表单校验:
- 前端:手机号正则
/^1[3-9]\d{9}$/,邮箱使用 Ant Design 内置校验 - 后端:使用
@Valid+@Pattern/@Email注解校验
- 前端:手机号正则
待验证事项
- 超管角色修改信息功能
- 学校管理员修改信息功能
- 教师角色修改信息功能
- 家长角色修改信息功能
- 所有角色修改密码功能
- 修改信息后 token 是否正确刷新
- 修改密码后 token 是否失效并需重新登录
下一步计划
- 启动服务进行功能验证
- 修复可能发现的问题
- 更新测试日志