|
@@ -1,10 +1,22 @@
|
|
|
package com.pj.project.app_user;
|
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
+import cn.dev33.satoken.stp.StpUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.pj.current.satoken.StpUserUtil;
|
|
|
+import com.pj.project.app_user.dto.ForgetPasswordDto;
|
|
|
+import com.pj.project.app_user.dto.RegisterDto;
|
|
|
+import com.pj.project.re_role_menu.ReRoleMenu;
|
|
|
+import com.pj.project.re_role_menu.ReRoleMenuMapper;
|
|
|
+import com.pj.utils.cache.RedisUtil;
|
|
|
+import com.pj.utils.sg.AjaxJson;
|
|
|
import com.pj.utils.so.SoMap;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.baomidou.mybatisplus.extension.service.IService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
@@ -22,6 +34,16 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
|
|
|
/** 底层 Mapper 对象 */
|
|
|
@Autowired
|
|
|
AppUserMapper appUserMapper;
|
|
|
+ /** 密码加密模式 */
|
|
|
+ @Autowired
|
|
|
+ private PasswordEncoder passwordEncoder;
|
|
|
+ //权限字符
|
|
|
+ @Autowired
|
|
|
+ private ReRoleMenuMapper reRoleMenuMapper;
|
|
|
+ /** 方法抽取 */
|
|
|
+ @Autowired
|
|
|
+ private MethodAppUserService methodAppUserService;
|
|
|
+
|
|
|
|
|
|
|
|
|
/** 增 */
|
|
@@ -65,4 +87,133 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
|
|
|
return i;
|
|
|
}
|
|
|
|
|
|
+ /** 注册 */
|
|
|
+ boolean register(RegisterDto registerDto){
|
|
|
+ if(registerDto == null)return false;
|
|
|
+ //手机号去重
|
|
|
+ String phone = registerDto.getPhone();
|
|
|
+ if(appUserMapper.selectList(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone,phone).eq(AppUser::getDeleteStatus,1)).size() != 0)
|
|
|
+ throw new RuntimeException("当前手机号已被注册!");
|
|
|
+ //开始进行实际注册
|
|
|
+ //1. 查询数据库内是否存在逻辑删除
|
|
|
+ List<AppUser> appUserList = appUserMapper.selectList(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, phone).eq(AppUser::getDeleteStatus, 0));
|
|
|
+ if(appUserList.size() != 0){
|
|
|
+ //删除旧数据
|
|
|
+ appUserList.forEach(item -> {
|
|
|
+ appUserMapper.deleteById(item);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //2.todo:手机验证码
|
|
|
+
|
|
|
+
|
|
|
+ //3.开始新增
|
|
|
+ AppUser appUser = new AppUser();
|
|
|
+ //手机号
|
|
|
+ appUser.setPhone(phone);
|
|
|
+ //注册身份
|
|
|
+ appUser.setUserType(registerDto.getType().toString());
|
|
|
+ //加密并设置登陆密码
|
|
|
+ String password = registerDto.getPassword();
|
|
|
+ String encode = passwordEncoder.encode(password);
|
|
|
+ appUser.setPassword(encode);
|
|
|
+ //昵称
|
|
|
+ appUser.setName(registerDto.getNickName());
|
|
|
+ //创建时间
|
|
|
+ appUser.setCreateTime(new Date());
|
|
|
+ //默认可用
|
|
|
+ appUser.setStatus("1");
|
|
|
+ appUser.setDeleteStatus(1);
|
|
|
+ //保存
|
|
|
+ int insert = appUserMapper.insert(appUser);
|
|
|
+
|
|
|
+ return insert == 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 用户登录 */
|
|
|
+ AjaxJson login(String phone, String password){
|
|
|
+ if(!StringUtils.isNotBlank(phone) || !StringUtils.isNotBlank(password))
|
|
|
+ return AjaxJson.getError("错误登录!");
|
|
|
+ //登陆查询
|
|
|
+ LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(AppUser::getPhone,phone);
|
|
|
+ queryWrapper.eq(AppUser::getDeleteStatus,1); //未被逻辑删除
|
|
|
+ List<AppUser> userList = appUserMapper.selectList(queryWrapper);
|
|
|
+ if(userList.size() == 0)return AjaxJson.getError("该用户不存在,请先注册!");
|
|
|
+ //判断用户是否存在
|
|
|
+ if(userList.size() > 1){
|
|
|
+ log.debug("该手机号登录用户存在多个活动账号,手机号: " + phone);
|
|
|
+ return AjaxJson.getError("该账户存在问题,请联系客服进行处理!");
|
|
|
+ }
|
|
|
+ //获取登录用户
|
|
|
+ AppUser appUser = userList.get(0);
|
|
|
+ //比对密码
|
|
|
+ String userPassword = appUser.getPassword();
|
|
|
+ boolean matches = passwordEncoder.matches(password, userPassword);
|
|
|
+ if(!matches)return AjaxJson.getError("密码校验错误,请检查!");
|
|
|
+ //判断是否停用
|
|
|
+ if(appUser.getStatus().equals("0"))return AjaxJson.getError("该账户 " + appUser.getPhone() + " 已停用!");
|
|
|
+ //开始执行登录
|
|
|
+ StpUtil.login(appUser.getId());
|
|
|
+ // 组织返回参数,直接拿过来用的,然后自己改吧改吧
|
|
|
+ SoMap map = new SoMap();
|
|
|
+ //敏感信息置空
|
|
|
+ appUser.setPassword(null);
|
|
|
+ //执行
|
|
|
+ map.put("appUser", appUser);
|
|
|
+ //获取当前用户角色权限字符
|
|
|
+ List<ReRoleMenu> reRoleMenus = reRoleMenuMapper.selectList(new LambdaQueryWrapper<ReRoleMenu>().eq(ReRoleMenu::getAppRoleId, appUser.getUserType()));
|
|
|
+ //使用stream流对其reRoleMenus集合的权限字符进行过滤顺便转成String类型
|
|
|
+ List<String> per_list = reRoleMenus.stream().map(ReRoleMenu::getAppMenuId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
|
|
|
+ if(reRoleMenus.size() == 0)return AjaxJson.getError("当前职务暂无权限!");
|
|
|
+ //过滤出权限字符
|
|
|
+ map.put("per_list", per_list);
|
|
|
+ map.put("tokenInfo", StpUtil.getTokenInfo());
|
|
|
+ StpUserUtil.cachePerList(per_list);
|
|
|
+
|
|
|
+ return AjaxJson.getSuccessData(map);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /** 忘记密码 */
|
|
|
+ AjaxJson forgetPassword(ForgetPasswordDto forgetPasswordDto){
|
|
|
+ //进行查询
|
|
|
+ List<AppUser> appUserList = appUserMapper.selectList
|
|
|
+ (new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, forgetPasswordDto.getPhone())
|
|
|
+ .eq(AppUser::getDeleteStatus, 1)
|
|
|
+ .eq(AppUser::getStatus, 1));
|
|
|
+ if(appUserList.size() != 1)return AjaxJson.getError("当前账户存在异常,请联系客服进行处理!");
|
|
|
+ //获取当前手机号对象
|
|
|
+ AppUser appUser = appUserList.get(0);
|
|
|
+ //获取短信验证码发送结果
|
|
|
+ boolean sendResult = methodAppUserService.getSmsCode(forgetPasswordDto.getPhone());
|
|
|
+ if(!sendResult)return AjaxJson.getError("验证码发送失败!");
|
|
|
+ //从缓存中获取验证码
|
|
|
+ String smsCode = RedisUtil.get(forgetPasswordDto.getPhone());
|
|
|
+ if(smsCode == null)return AjaxJson.getError("验证码发送失败!");
|
|
|
+ //比对用户输入的验证码
|
|
|
+ boolean result = smsCode.equals(forgetPasswordDto.getSmsCode());
|
|
|
+ //进行验证码校验完成后的流程
|
|
|
+ if(result){
|
|
|
+ //密码校验
|
|
|
+ boolean equals = forgetPasswordDto.getPassword().equals(forgetPasswordDto.getRePassword());
|
|
|
+ //验证码匹配成功,执行修改密码逻辑
|
|
|
+ //1.判断其密码验证
|
|
|
+ if(equals){
|
|
|
+ //1.1 密码校验正确,设置新密码
|
|
|
+ String encode = passwordEncoder.encode(forgetPasswordDto.getRePassword());
|
|
|
+ appUser.setPassword(encode);
|
|
|
+ //1.2 执行保存
|
|
|
+ int i = appUserMapper.updateById(appUser);
|
|
|
+ if(i != 1)return AjaxJson.getError("密码重置失败!");
|
|
|
+ return AjaxJson.getSuccess("密码找回成功!");
|
|
|
+ }else {
|
|
|
+ return AjaxJson.getError("两次密码校验不匹配,请重新尝试!");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //验证码匹配错误
|
|
|
+ return AjaxJson.getError("验证码输入错误,请检查!");
|
|
|
+ }
|
|
|
+
|
|
|
}
|