提交 e28b113e 作者: 17607474349

feat:

1、新增用户密码修改接口(登录状态)
2、新增修改密码接口(非登录状态)
3、新增获取手机验证码的接口(用于修改手机号)
4、新增手机号码发送验证码接口
5、补充getUserInfo遗漏信息
6、升级gradle依赖
上级 8d91a412
......@@ -91,7 +91,8 @@ zy-config:
host: project.yz-online.com
# RabbitMQ 订阅配置
rabbitmq:
enabled: false
mock: true
enabled: true
host: ${zy-config.host}
port: 672
username: admin
......@@ -124,3 +125,16 @@ feign:
okhttp:
enabled: true
# 自定义配置
config:
sms:
sc-ok: OK
product: Dysmsapi
domain: dysmsapi.aliyuncs.com
access-key-id: _
access-key-secret: _
sign-name: _
template-code: _
expired: 600000
......@@ -28,4 +28,8 @@ dependencies {
// myexcel
implementation "com.github.liaochong:myexcel:${myexcelVersion}"
implementation 'com.aliyun:aliyun-java-sdk-core:4.3.7'
implementation 'com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0'
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.service.user;
import com.yiring.auth.param.user.UserExportParam;
import com.yiring.auth.param.user.UserFindParam;
import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.param.user.*;
import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
......@@ -53,4 +51,35 @@ public interface UserService {
* @param response HttpServletResponse
*/
void export(UserExportParam param, HttpServletResponse response);
/**
* 修改密码
* @param param UserPwdParam
* @param idParam IdParam
* @return Result<String>
*/
Result<String> modifyPwd(UserPwdParam param, IdParam idParam);
/**
* 修改手机号
* @param param UserPhoneParam
* @param idParam IdParam
* @return Result<String>
*/
Result<String> modifyPhone(UserPhoneParam param, IdParam idParam);
/**
* 发送验证码
* @param param UserPhoneParam
* @return Result<String>
*/
Result<String> sendCode(UserPhoneParam param);
/**
* 通过手机验证码修改密码
* @param userPwdParam UserPwdParam
* @param userPhoneParam UserPhoneParam
* @return Result<String>
*/
Result<String> modifyPwdByPhone(UserPwdParam userPwdParam, UserPhoneParam userPhoneParam);
}
......@@ -2,6 +2,7 @@
package com.yiring.auth.service.user.impl;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
......@@ -11,10 +12,10 @@ import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.excel.user.UserExportExcel;
import com.yiring.auth.param.user.UserExportParam;
import com.yiring.auth.param.user.UserFindParam;
import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.param.user.*;
import com.yiring.auth.service.MessageService;
import com.yiring.auth.service.user.UserService;
import com.yiring.auth.util.Auths;
import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
......@@ -37,10 +38,12 @@ import javax.persistence.criteria.SetJoin;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -59,6 +62,12 @@ public class UserServiceImpl implements UserService {
@Resource
UserRepository userRepository;
@Resource
Auths auths;
@Resource
MessageService messageService;
@Override
public Result<String> add(UserSaveParam param) {
userRepository.save(UserSaveParam.transform(param));
......@@ -111,11 +120,14 @@ public class UserServiceImpl implements UserService {
@Override
public Result<String> reset(IdParam idParam) {
Optional<User> userOptional = userRepository.findById(idParam.getId());
User loginUser = auths.getLoginUser();
if (userOptional.isPresent()) {
User user = userOptional.get();
user.setPassword(SaSecureUtil.sha256("123456"));
userRepository.save(user);
if (loginUser == user) {
StpUtil.logout(loginUser.getId());
}
return Result.ok();
}
......@@ -207,4 +219,83 @@ public class UserServiceImpl implements UserService {
throw new RuntimeException("导出用户信息失败: " + e.getMessage());
}
}
@Override
public Result<String> modifyPwd(UserPwdParam param, IdParam idParam) {
if (!StrUtil.equals(param.getConfirmPwd(), param.getNewPassword())) {
return Result.no(Status.BAD_REQUEST, "两次密码输入不一致");
}
if (StrUtil.equals(param.getNewPassword(), param.getOldPassword())) {
return Result.no(Status.BAD_REQUEST, "原密码与新密码相同");
}
Optional<User> userOptional = userRepository.findById(idParam);
if (userOptional.isEmpty()) {
return Result.no(Status.BAD_REQUEST, "用户信息不存在");
}
User user = userOptional.get();
user.setPassword(SaSecureUtil.sha256(param.getConfirmPwd()));
userRepository.save(user);
return Result.ok();
}
@Override
public Result<String> modifyPhone(UserPhoneParam param, IdParam idParam) {
if (!StrUtil.equals(param.getType(), "phone")) return Result.no(Status.BAD_REQUEST, "请输入手机类型");
RedisTemplate<String, Object> redisTemplate = messageService.getRedisTemplate();
Object code = redisTemplate.opsForValue().get(param.getType() + param.getMobile());
if (!ObjectUtil.equal(param.getCode(), code)) {
return Result.no(Status.BAD_REQUEST, "验证码输入错误");
}
Optional<User> userOptional = userRepository.findById(idParam);
if (userOptional.isEmpty()) {
return Result.no(Status.BAD_REQUEST, "用户信息不存在");
}
User user = userOptional.get();
user.setMobile(param.getMobile());
userRepository.save(user);
return Result.ok();
}
@Override
public Result<String> sendCode(UserPhoneParam param) {
if (!StrUtil.equals(param.getCode(), "phone") || !StrUtil.equals(param.getCode(), "pwd")) {
return Result.no(Status.BAD_REQUEST);
}
return messageService.sendSmsCode(param.getType() + param.getMobile());
}
@Override
public Result<String> modifyPwdByPhone(UserPwdParam userPwdParam, UserPhoneParam userPhoneParam) {
if (!StrUtil.equals(userPhoneParam.getType(), "pwd")) return Result.no(Status.BAD_REQUEST, "请输入密码类型");
if (!StrUtil.equals(userPwdParam.getConfirmPwd(), userPwdParam.getNewPassword())) {
return Result.no(Status.BAD_REQUEST, "两次密码输入不一致");
}
RedisTemplate<String, Object> redisTemplate = messageService.getRedisTemplate();
Object code = redisTemplate.opsForValue().get(userPhoneParam.getType() + userPhoneParam.getMobile());
if (!ObjectUtil.equal(userPhoneParam.getCode(), code)) {
return Result.no(Status.BAD_REQUEST, "验证码输入错误");
}
Optional<User> userOptional = userRepository.findOne(
Example.of(User.builder().mobile(userPhoneParam.getMobile()).build())
);
if (userOptional.isEmpty()) {
return Result.no(Status.BAD_REQUEST, "用户不存在");
}
User user = userOptional.get();
user.setPassword(SaSecureUtil.sha256(userPwdParam.getConfirmPwd()));
return Result.ok();
}
}
......@@ -34,6 +34,15 @@ public class UserInfoVo implements Serializable {
@ApiModelProperty(value = "主键", example = "1")
Long userId;
@ApiModelProperty(value = "工号", example = "1234566")
String uuid;
@ApiModelProperty(value = "手机号", example = "13012345678")
String mobile;
@ApiModelProperty(value = "部门名称", example = "研发")
String deptName;
@ApiModelProperty(value = "真实姓名", example = "超级用户")
String realName;
......
......@@ -8,9 +8,7 @@ import com.yiring.auth.domain.role.RoleRepository;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.IdsParam;
import com.yiring.auth.param.user.UserExportParam;
import com.yiring.auth.param.user.UserFindParam;
import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.param.user.*;
import com.yiring.auth.service.user.UserService;
import com.yiring.auth.util.Auths;
import com.yiring.auth.util.Permissions;
......@@ -73,6 +71,9 @@ public class UserController {
UserInfoVo userInfoVo = UserInfoVo
.builder()
.userId(user.getId())
.uuid(user.getUuid())
.mobile(user.getMobile())
.deptName(user.getDepartment().getName())
.username(user.getUsername())
.realName(user.getRealName())
.avatar(user.getAvatar())
......@@ -150,7 +151,7 @@ public class UserController {
}
@ApiOperation("重置密码")
@PostMapping("reset")
@PutMapping("reset")
public Result<String> reset(@Valid IdParam idParam) {
return userService.reset(idParam);
}
......@@ -166,4 +167,28 @@ public class UserController {
public void export(@Valid UserExportParam param, HttpServletResponse response) {
userService.export(param, response);
}
@ApiOperation("修改密码")
@PutMapping("modifyPwd")
public Result<String> modifyPwd(@Valid UserPwdParam param, @Valid IdParam idParam) {
return userService.modifyPwd(param, idParam);
}
@ApiOperation("修改手机号")
@PutMapping("modifyPhone")
public Result<String> modifyPhone(@Valid UserPhoneParam param, @Valid IdParam idParam) {
return userService.modifyPhone(param, idParam);
}
@ApiOperation("通过手机号码修改密码")
@PutMapping("modifyPwdByP")
public Result<String> modifyPwdByPhone(@Valid UserPwdParam userPwdParam, @Valid UserPhoneParam userPhoneParam) {
return userService.modifyPwdByPhone(userPwdParam, userPhoneParam);
}
@ApiOperation("发送验证码")
@PutMapping("sendCode")
public Result<String> sendCode(@Valid UserPhoneParam param) {
return userService.sendCode(param);
}
}
......@@ -24,5 +24,4 @@ dependencies {
exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core'
exclude group: 'org.locationtech.jts', module: 'jts-core'
}
}
......@@ -6,15 +6,15 @@ buildscript {
// https://start.spring.io/
springCloudVersion = '2021.0.2'
// https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter
knife4jVersion = '2.0.9'
knife4jVersion = '3.0.3'
// https://mvnrepository.com/artifact/io.swagger/swagger-annotations
swaggerAnnotationsVersion = '1.6.6'
// https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter
saTokenVersion = '1.29.1.trial'
saTokenVersion = '1.30.0'
// https://mvnrepository.com/artifact/cn.hutool/hutool-all
hutoolVersion = '5.8.0.M3'
hutoolVersion = '5.8.0'
// https://mvnrepository.com/artifact/com.alibaba/fastjson
fastJsonVersion = '1.2.80'
fastJsonVersion = '2.0.3.graal'
// https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core
xxlJobVersion = '2.3.0'
// https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论