diff --git a/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java b/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java index 5d57e56e..a88e36a7 100644 --- a/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java +++ b/jero-boot-base/jero-boot-base-api/src/main/java/com/jero/common/system/api/ISysBaseAPI.java @@ -310,5 +310,8 @@ public interface ISysBaseAPI extends CommonAPI { * @param list 文件集合(路径+文件) */ void sendEmailMsgAndFile(String email, String title, String content,List list); - + /** + * 发送短信验证码 + */ + void sendVerificationCode(String phone, String codeType, String codeTime,String templateParas); } diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java index 9361009f..b1f8bae5 100644 --- a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/config/shiro/ShiroConfig.java @@ -85,6 +85,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在 filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册 filterChainDefinitionMap.put("/sys/user/querySysUser", "anon");//根据手机号获取用户信息 + filterChainDefinitionMap.put("/sys/user/forgetPassword", "anon");//忘记密码 filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//用户忘记密码验证手机号 filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//用户更改密码 filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码 diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java index 265c920c..d23cb58b 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/controller/CompanyLoginController.java @@ -12,11 +12,13 @@ import com.jero.common.util.*; import com.jero.company.entity.PayContactsManagement; import com.jero.company.service.IPayContactsManagementService; import com.jero.modules.base.service.BaseCommonService; +import com.jero.modules.system.entity.SysUser; import com.jero.modules.system.model.SysLoginModel; import com.jero.modules.system.service.ISysDictService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -159,4 +161,29 @@ public class CompanyLoginController { result.setResult(obj); result.success("登录成功"); } + + @ApiOperation(value = "发送手机号验证码") + @GetMapping(value = "/sendVerificationCode") + public Result sendVerificationCode(String mobile) { + mobile = PasswordUtil.encrypt(mobile); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PayContactsManagement::getPhone, mobile); + PayContactsManagement contactsManagement = payContactsManagementService.getOne(queryWrapper); + if (Objects.isNull(contactsManagement)){ + throw new JeroBootException("手机号不是企业联系人"); + } + sysBaseAPI.sendVerificationCode(mobile,"2",null,null); + if (StringUtils.isBlank(contactsManagement.getPassword())){ + return Result.error("updatePassword"); + } + return Result.OK(); + } + + @ApiOperation(value = "忘记密码", notes = "忘记密码") + @PostMapping(value = "/forgetPassword") + public Result forgetPassword(@RequestBody PayContactsManagement user) { + //payContactsManagementService.forgetPassword(user); + return Result.OK("修改密码成功"); + } + } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/company/vo/CompanyLoginVO.java b/jero-boot-incoming-payment/src/main/java/com/jero/company/vo/CompanyLoginVO.java new file mode 100644 index 00000000..35f18ce0 --- /dev/null +++ b/jero-boot-incoming-payment/src/main/java/com/jero/company/vo/CompanyLoginVO.java @@ -0,0 +1,41 @@ +package com.jero.company.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import org.jeecgframework.poi.excel.annotation.Excel; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +/** + * 企业端登录 + * @author liJiaRao + * @date 2021-09-23 14:59 + */ +public class CompanyLoginVO { + /**手机号*/ + @ApiModelProperty(value = "手机号") + @NotEmpty(message = "手机号不能为空!") + @Pattern(regexp = "^((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(17[0135678])|(18[0-9])|(19[8|9])|(16[6]))\\d{8}$",message = "手机号码格式错误") + private String phone; + + /** + * 验证码 + */ + @ApiModelProperty(value = "验证码") + @TableField(exist = false) + private String verifyCode; + + @TableField(exist = false) + @ApiModelProperty(value = "RSA公钥") + private String rsapublickey; + + /** + * 确认密码 + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @ApiModelProperty(value = "确认密码") + @TableField(exist = false) + private String verifyPassword; +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java index 12143f3e..5a55631c 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/LoginController.java @@ -28,6 +28,7 @@ import com.jero.modules.system.service.ISysUserService; import com.jero.modules.system.util.RandImageUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -74,6 +75,9 @@ public class LoginController { */ public static final int RETRY_LOGIN_MAX_COUNT = 5; + @Value("${defaultPassword}") + private String defaultPassword; + @ApiOperation("登录接口") @RequestMapping(value = "/login", method = RequestMethod.POST) public Result login(@RequestBody SysLoginModel sysLoginModel) { @@ -146,7 +150,11 @@ public class LoginController { } //登录成功,清除错误登录次数 redisUtil.del(RETRY_LOGIN_PREFIX + username); - + //如果用初始密码登录,前端就跳转到修改密码界面 + if(defaultPassword.equals(password)){ + result.error500("updatePassword"); + return result; + } //用户登录信息 userInfo(sysUser, result); //update-begin--Author:wangshuai Date:20200714 for:登录日志没有记录人员 @@ -585,4 +593,11 @@ public class LoginController { public String getStandardsRSAPublicKey() { return authenticationUtils.getPublicKey(); } + + @ApiOperation(value = "忘记密码", notes = "忘记密码") + @PostMapping(value = "/forgetPassword") + public Result forgetPassword(@RequestBody SysUser user) { + sysUserService.forgetPassword(user); + return Result.OK("修改密码成功"); + } } \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java index 15a65a7a..44afdc5d 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java @@ -2,11 +2,13 @@ package com.jero.modules.system.entity; import java.util.Date; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.jero.common.aspect.annotation.Dict; import com.jero.modules.system.volid.group.CreateGroup; +import io.swagger.annotations.ApiModelProperty; import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; @@ -187,4 +189,23 @@ public class SysUser implements Serializable { /**设备id uniapp推送用*/ private String clientId; + + /** + * 验证码 + */ + @ApiModelProperty(value = "验证码") + @TableField(exist = false) + private String verifyCode; + + @TableField(exist = false) + @ApiModelProperty(value = "RSA公钥") + private String rsapublickey; + + /** + * 确认密码 + */ + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @ApiModelProperty(value = "确认密码") + @TableField(exist = false) + private String verifyPassword; } diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java index 5ba58f82..b21f0292 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/SysUserMapper.java @@ -165,4 +165,7 @@ public interface SysUserMapper extends BaseMapper { List getRoleNameByUserIds(@Param("userIds") List userIds); PayContactsManagement getPayContactsManagementByPhone(@Param("username") String username); + + void forgetPassword(@Param("user") SysUser user); + } diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml index ae0359e3..538d4433 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/SysUserMapper.xml @@ -204,4 +204,9 @@ select * from pay_contacts_management where phone = #{username}; + + + update sys_user set password = #{user.password} + where username = #{user.username} + \ No newline at end of file diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java index 5a1b2e6f..7342ee7e 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java @@ -240,4 +240,6 @@ public interface ISysUserService extends IService { Map getRoleNameByUserIds(List userIds); String resetPassword(String username); + + void forgetPassword(SysUser user); } diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java index a77b6b6e..8de4e14b 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysBaseApiImpl.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.base.Joiner; +import com.jero.common.util.HuaWeiSmsUtil; import com.jero.modules.oss.mapper.OSSFileMapper; import com.jero.modules.pay.company.entity.PayContactsManagement; import lombok.extern.slf4j.Slf4j; @@ -96,6 +97,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { private SysPermissionMapper sysPermissionMapper; @Autowired private ISysPermissionDataRuleService sysPermissionDataRuleService; + @Resource + private HuaWeiSmsUtil huaWeiSmsUtil; @Override @Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key="#username") public LoginUser getUserByName(String username) { @@ -1021,6 +1024,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { emailHandle.SendMsgAndFile(email, title, content,list); } + @Override + public void sendVerificationCode(String phone, String codeType, String codeTime, String templateParas) { + huaWeiSmsUtil.sendVerificationCode(phone, codeType, codeTime, templateParas); + } + /** * 根据部门id查询部门所有的父级(不包含自己) * @author 马志朝 diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java index df6cb373..f3160832 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysUserServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.*; import com.jero.modules.system.vo.SysUserVo; import lombok.extern.slf4j.Slf4j; import com.jero.common.api.vo.Result; @@ -14,9 +16,6 @@ import com.jero.common.system.api.ISysBaseAPI; import com.jero.modules.base.service.BaseCommonService; import com.jero.common.system.vo.LoginUser; import com.jero.common.system.vo.SysUserCacheInfo; -import com.jero.common.util.PasswordUtil; -import com.jero.common.util.UUIDGenerator; -import com.jero.common.util.oConvertUtils; import com.jero.modules.system.entity.*; import com.jero.modules.system.mapper.*; import com.jero.modules.system.model.SysUserSysDepartModel; @@ -27,6 +26,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.util.*; @@ -64,6 +64,8 @@ public class SysUserServiceImpl extends ServiceImpl impl private SysDepartRoleMapper sysDepartRoleMapper; @Resource private BaseCommonService baseCommonService; + @Autowired + private RedisUtil redisUtil; @Value("${defaultPassword}") private String defaultPassword; @@ -472,4 +474,77 @@ public class SysUserServiceImpl extends ServiceImpl impl return "密码重置成功!,默认密码为:"+defaultPassword; } + @Override + public void forgetPassword(SysUser user) { + fPRuleCheck(user); + //前端传入密码解密 + String username = user.getUsername(); + String password = user.getPassword(); + String verifyPassword = user.getVerifyPassword(); + String RSAPublicKey = user.getRsapublickey(); + String RSAPrivateKey = String.valueOf(redisUtil.get(RSAPublicKey)); + try { + password = CommonUtils.decryptBtRsaPriKey(password, RSAPrivateKey); + verifyPassword = CommonUtils.decryptBtRsaPriKey(verifyPassword, RSAPrivateKey); + user.setPassword(password); + user.setVerifyPassword(verifyPassword); + } catch (Exception e) { + e.printStackTrace(); + } + + //处理手机获取验证码的逻辑 + Object obj = redisUtil.get("_verification:_phone:" + user.getPhone()); + if (obj == null) { + throw new JeroBootException("验证码失效,请重新发送"); + } + String code = obj.toString(); + if (!user.getVerifyCode().equals(code)) { + throw new JeroBootException("验证码错误!"); + } + + if (!password.equals(verifyPassword)) { + throw new JeroBootException("新密码和确认密码不一致,请重新输入"); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysUser::getUsername, username); + SysUser sysUser = userMapper.selectOne(wrapper); + if (ObjectUtils.isEmpty(sysUser)) { + throw new JeroBootException("用户不存在"); + } + String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, sysUser.getSalt()); + user.setPassword(passwordEncode); + userMapper.forgetPassword(user); + redisUtil.del("_verification:_phone:" + user.getPhone()); + List roles = sysBaseAPI.getRolesByUsername(sysUser.getUsername()); + //SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getRoleCode, roles.get(0))); + } + + /** + * 忘记密码校验 + * @param user + */ + private void fPRuleCheck(SysUser user){ + if(ObjectUtils.isEmpty(user.getUsername())){ + throw new JeroBootException("用户名为必填"); + }else if(user.getUsername().length()>50){ + throw new JeroBootException("用户名长度不超过50个字符"); + } + if(ObjectUtils.isEmpty(user.getPhone())){ + throw new JeroBootException("手机号为必填"); + }else if(!Assert.isTel(user.getPhone())){ + throw new JeroBootException("请输入正确的手机号"); + } + if(ObjectUtils.isEmpty(user.getVerifyCode())){ + throw new JeroBootException("验证码为必填"); + }else if(user.getVerifyCode().length()>50){ + throw new JeroBootException("验证码长度不超过50个字符"); + } + if(ObjectUtils.isEmpty(user.getPassword())){ + throw new JeroBootException("新密码为必填"); + } + if(ObjectUtils.isEmpty(user.getVerifyPassword())){ + throw new JeroBootException("确认密码为必填"); + } + + } }