From 49963bb49c929789cd064832100b8ef221778570 Mon Sep 17 00:00:00 2001 From: lbw <1192299468@qq.com> Date: Mon, 5 Jan 2026 12:07:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E5=AF=B9=E5=BA=94=E9=AA=8C=E8=AF=81=E7=A0=81=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在管理员页面新增修改用户信息表单,支持姓名、手机号、密码修改 - 实现验证码发送倒计时与发送状态管理 - 新增接口支持用户信息更新,包含密码和手机号校验 - 后端校验验证码有效性,编码密码后更新用户信息 - 修改用户信息后强制登出,确保安全性 - 优化登录状态判断,登出后跳转至登录页 - 取消部分日志打印,调整发送验证码缓存过期时间为5分钟 --- .../service/controller/UserController.java | 25 +++ .../service/domain/mapper/UserDOMapper.java | 4 + .../model/vo/user/UpdateUserInfoReqVO.java | 18 +++ .../enlish/service/service/UserService.java | 2 + .../service/login/LoginServiceImpl.java | 5 +- .../service/service/user/UserServiceImpl.java | 27 +++- .../src/main/resources/config/application.yml | 6 +- .../main/resources/mapper/UserDOMapper.xml | 22 +++ enlish-vue/src/api/user.js | 4 + enlish-vue/src/layouts/components/Header.vue | 11 +- enlish-vue/src/pages/admid/admid.vue | 142 +++++++++++++++++- 11 files changed, 256 insertions(+), 10 deletions(-) create mode 100644 enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/user/UpdateUserInfoReqVO.java diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/UserController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/UserController.java index 26c53ba..97fd078 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/UserController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/UserController.java @@ -1,16 +1,22 @@ package com.yinlihupo.enlish.service.controller; +import cn.dev33.satoken.stp.StpUtil; import com.yinlihupo.enlish.service.domain.dataobject.UserDO; import com.yinlihupo.enlish.service.model.vo.user.FindUserInfoRspVO; +import com.yinlihupo.enlish.service.model.vo.user.UpdateUserInfoReqVO; import com.yinlihupo.enlish.service.service.UserService; +import com.yinlihupo.framework.biz.operationlog.aspect.ApiOperationLog; import com.yinlihupo.framework.common.response.Response; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user/") +@Slf4j public class UserController { @Resource @@ -27,4 +33,23 @@ public class UserController { return Response.success(findUserInfoRspVO); } + + @PostMapping("update-user-info") + @ApiOperationLog(description = "修改密码") + public Response updatePassword(@RequestBody UpdateUserInfoReqVO updateUserInfoReqVO) { + try { + String code = updateUserInfoReqVO.getCode(); + String newPassword = updateUserInfoReqVO.getNewPassword(); + String phone = updateUserInfoReqVO.getPhone(); + String name = updateUserInfoReqVO.getName(); + userService.updateUserInfo(newPassword, code, phone, name); + + StpUtil.logout(); + + return Response.success(); + } catch (Exception e) { + log.error("修改密码失败 {}", e.getMessage()); + return Response.fail(e.getMessage()); + } + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/UserDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/UserDOMapper.java index 43e2b84..ce88946 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/UserDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/UserDOMapper.java @@ -11,6 +11,10 @@ public interface UserDOMapper { void insert(UserDO userDO); + void updatePassword(@Param("id") Long id, @Param("password") String password); + + void updateUserInfo(@Param("id") Long id, @Param("name") String name, @Param("password") String password, @Param("phone") String phone); + UserDO selectById(Long id); List selectUserDOList(@Param("name") String name, @Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/user/UpdateUserInfoReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/user/UpdateUserInfoReqVO.java new file mode 100644 index 0000000..273e3ca --- /dev/null +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/user/UpdateUserInfoReqVO.java @@ -0,0 +1,18 @@ +package com.yinlihupo.enlish.service.model.vo.user; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Data +public class UpdateUserInfoReqVO { + + private String newPassword; + private String name; + private String phone; + private String code; +} diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/UserService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/UserService.java index 7bf8ecd..2587f22 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/UserService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/UserService.java @@ -13,4 +13,6 @@ public interface UserService { Integer findUserTotal(); void createUser(UserDO userDO); + + void updateUserInfo(String password, String reqCode, String phone, String name); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java index ab960cb..e0ba625 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/login/LoginServiceImpl.java @@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.util.Objects; +import java.util.concurrent.TimeUnit; @Service @Slf4j @@ -83,7 +84,9 @@ public class LoginServiceImpl implements LoginService { @Override public void sendVerificationCode(String phone) { String code = RandomUtil.randomNumbers(6); - redisTemplate.opsForValue().set(UserRedisConstants.buildUserLoginCode(phone), code, Duration.ofSeconds(60)); + String key = UserRedisConstants.buildUserLoginCode(phone); + redisTemplate.opsForValue().set(key, code); + redisTemplate.expire(key, 5, TimeUnit.MINUTES); String signName = "短信测试"; String templateCode = "SMS_154950909"; String templateParam = String.format("{\"code\":\"%s\"}", code); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/user/UserServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/user/UserServiceImpl.java index 87d2036..d2344bc 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/user/UserServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/user/UserServiceImpl.java @@ -1,14 +1,18 @@ package com.yinlihupo.enlish.service.service.user; import cn.dev33.satoken.stp.StpUtil; +import com.yinlihupo.enlish.service.constant.UserRedisConstants; import com.yinlihupo.enlish.service.domain.dataobject.UserDO; import com.yinlihupo.enlish.service.domain.mapper.UserDOMapper; import com.yinlihupo.enlish.service.service.UserService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Objects; @Service @Slf4j @@ -17,8 +21,10 @@ public class UserServiceImpl implements UserService { @Resource private UserDOMapper userDOMapper; - - + @Resource + private RedisTemplate redisTemplate; + @Resource + private PasswordEncoder passwordEncoder; @Override public UserDO findUser() { @@ -43,4 +49,21 @@ public class UserServiceImpl implements UserService { userDOMapper.insert(userDO); } + @Override + public void updateUserInfo(String password, String reqCode, String phone, String name) { + long id = Integer.parseInt(String.valueOf(StpUtil.getLoginId())); + UserDO userDO = userDOMapper.selectById(id); + + String key = UserRedisConstants.buildUserLoginCode(userDO.getPhone()); + String code = Objects.requireNonNull(redisTemplate.opsForValue().get(key)).toString(); + if (code == null || !code.equals(reqCode)) { + throw new RuntimeException("验证码错误"); + } + + if (password != null) { + password = passwordEncoder.encode(password); + } + userDOMapper.updateUserInfo(id, name, password, phone); + } + } diff --git a/enlish-service/src/main/resources/config/application.yml b/enlish-service/src/main/resources/config/application.yml index 972b1a1..713ebb2 100644 --- a/enlish-service/src/main/resources/config/application.yml +++ b/enlish-service/src/main/resources/config/application.yml @@ -28,6 +28,6 @@ sa-token: is-share: true # 是否输出操作日志 is-log: true -logging: - level: - com.yinlihupo.enlish.service.domain.mapper: debug \ No newline at end of file +#logging: +# level: +# com.yinlihupo.enlish.service.domain.mapper: debug \ No newline at end of file diff --git a/enlish-service/src/main/resources/mapper/UserDOMapper.xml b/enlish-service/src/main/resources/mapper/UserDOMapper.xml index 33653f0..6e4b9f9 100644 --- a/enlish-service/src/main/resources/mapper/UserDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/UserDOMapper.xml @@ -20,6 +20,28 @@ values (#{phone}, #{name}, #{password}) + + update user + set password = #{password} + where id = #{id} + + + + update user + + + password = #{password}, + + + `name` = #{name}, + + + phone = #{phone}, + + + where id = #{id} + +