package com.yang.springboot.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yang.springboot.common.Constants;
import com.yang.springboot.common.lang.Result;
import com.yang.springboot.entity.Role;
import com.yang.springboot.entity.User;
import com.yang.springboot.mapper.UserDao;
import com.yang.springboot.param.LoginParam;
import com.yang.springboot.param.LoginUser;
import com.yang.springboot.param.RegisterParam;
import com.yang.springboot.param.UserInfoParam;
import com.yang.springboot.param.vo.UserInfoVo;
import com.yang.springboot.service.UserService;
import com.yang.springboot.utils.JwtUtils;
import com.yang.springboot.utils.RedisCache;
import com.yang.springboot.utils.UserUtils;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* <p>
* 服务实现类
* </p>
*
* @author LambCcc
* @since 2022-04-14
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
private final AuthenticationManager authenticationManager;
private final RedisCache redisCache;
private final UserDao userDao;
@Autowired
public UserServiceImpl(AuthenticationManager authenticationManager, RedisCache redisCache, UserDao userDao) {
this.authenticationManager = authenticationManager;
this.redisCache = redisCache;
this.userDao = userDao;
}
@Override
public Result getUserPage(String type, Integer currentPage, Integer pageSize, String username, String nickname, String phone) {
// 根据currentPage和pageSize 设置分页查询范围
Page<User> userPage = new Page<>(currentPage, pageSize);
LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
// 根据username nickname phone查询数据库
// 判断参数是否为空 决定是否拼接条件
// 使用like对查询条件进行模糊查询
switch (type) {
case "admin":
userLambdaQueryWrapper.eq(User::getRoleId, 1);
break;
case "stuff":
userLambdaQueryWrapper.eq(User::getRoleId, 2);
break;
case "coach":
userLambdaQueryWrapper.eq(User::getRoleId, 3);
break;
case "member":
userLambdaQueryWrapper.eq(User::getRoleId, 4);
break;
case "all":
default:
break;
}
if (StrUtil.isNotEmpty(username)) {
userLambdaQueryWrapper.like(User::getUsername, username);
}
if (StrUtil.isNotEmpty(nickname)) {
userLambdaQueryWrapper.like(User::getNickname, nickname);
}
if (StrUtil.isNotEmpty(phone)) {
userLambdaQueryWrapper.like(User::getPhone, phone);
}
return new Result(Constants.CODE_200, "获取分页信息成功!", page(userPage, userLambdaQueryWrapper));
}
/**
* 登录操作的实现类
* 1. 首先验证 输入的验证码是否正确 如果不正确直接返回错误
* 2. 调用自定义的登录接口 调用ProviderManager的authenticate方法进行认证 如果认证通过则进行生成jwt
* 3. 将token存入Redis中进行缓存
* @param loginParam 登录所需要的参数
*/
@Override
public Result login(LoginParam loginParam) {
// 获取Cookie中携带的uuid 根据uuid获取Redis中的验证码
String uuid = loginParam.getUuid();
String codeInRedis = redisCache.getCacheObject(uuid).toString();
// 校验token
if (StrUtil.isEmpty(codeInRedis)) {
return new Result(Constants.CODE_500, "验证码不存在!请重试!", null);
} else if (!codeInRedis.equals(loginParam.getCaptchaCode())) {
return new Result(Constants.CODE_500, "验证码错误!请重新输入!", null);
}
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginParam.getUsername(), loginParam.getPassword());
Authentication authentication = null;
try {
authentication = authenticationManager.authenticate(authenticationToken);
} catch (LockedException e) {
return new Result(Constants.CODE_500, "账号已停用!", null);
} catch (InternalAuthenticationServiceException e) {
return new Result(Constants.CODE_500, "登录失败!", null);
}
if (Objects.isNull(authentication)) {
throw new RuntimeException("用户名或密码错误!");
}
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
// 获取用户id生成token
String userId = loginUser.getUser().getId().toString();
String token = JwtUtils.createJWT(userId);
// 将数据存入Redis 根据ID查找和存储
redisCache.setCacheObject("UserLogin: " + userId, loginUser, 1, TimeUnit.DAYS);
// 以KEY-VALUE形式返回给前端
Map<String, String> map = new HashMap<>();
map.put("token", token);
return new Result(Constants.CODE_200, "登录成功!", map);
}
/**
* 注册操作
* 1. 首先校验验证码 如果输入错误 直接返回错误
* 2. 如果选择的职别是健身教练/工作人员/管理员 校验内部验证码是否正确 如果错误 直接返回错误
* 3. 查询数据库中是否已存在username 如果有相同username 直接返回错误
* @param registerParam 注册所需要的参数
*/
@Override
public Result register(RegisterParam registerParam) {
// 获取Cookie中携带的uuid 根据uuid获取Redis中的验证码
String uuid = registerParam.getUuid();
String codeInRedis = redisCache.getCacheObject(uuid).toString();
// 校验验证码
if (StrUtil.isEmpty(codeInRedis)) {
return new Result(Constants.CODE_500, "验证码不存在!请重试!", null);
} else if (!codeInRedis.equals(registerParam.getCaptchaCode())) {
return new Result(Constants.CODE_500, "验证码错误!请重新输入!", null);
}
// 如果注册的不是会员用户 则进行校验码判断
switch (registerParam.getRoleId()) {
case 1: // roleId为1 表示管理员
if (Constants.VERIFY_CODE_REGISTER_ADMIN.equals(registerParam.getVerifyCode())) {
return new Result(Constants.CODE_401, "内部验证码输入错误!请重试!", null);
}
break;
case 2: // roleId为2 表示工作人员
if (Constants.VERIFY_CODE_REGISTER_STUFF.equals(registerParam.getVerifyCode())) {
return new Result(Constants.CODE_401, "内部验证码输入错误!请重试!", null);
}
break;
case 3: // roleId为3 表示健身教练
if (Constants.VERIFY_CODE_REGISTER_COACH.equals(registerParam.getVerifyCode())) {
return new Result(Constants.CODE
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
个人花大量时间整理出的真实毕业设计实战成果,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人花大量时间整理出的真实毕业设计实战成果,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人花大量时间整理出的真实毕业设计实战成果,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~
资源推荐
资源详情
资源评论
收起资源包目录
《毕业设计》--毕业设计项目 基于SSM框架的健身房管理系统 后端Spring Boot项目.zip (78个子文件)
pom.xml 5KB
src
test
java
com
yang
springboot
SpringbootApplicationTests.java 224B
main
resources
mapper
UserMapper.xml 443B
CourseMapper.xml 216B
MenuMapper.xml 578B
RoleMapper.xml 214B
InstrumentMapper.xml 220B
RepairMapper.xml 216B
LockerMapper.xml 216B
java
com
yang
springboot
SpringbootApplication.java 409B
param
RegisterParam.java 546B
LockerUseParam.java 252B
LoginParam.java 464B
LoginUser.java 2KB
LockerSaveParam.java 419B
UserInfoParam.java 404B
CourseParam.java 208B
vo
UserInfoVo.java 468B
UserVo.java 444B
mapper
CourseDao.java 332B
UserDao.java 473B
LockerDao.java 332B
RoleDao.java 326B
InstrumentDao.java 344B
MenuDao.java 414B
RepairDao.java 332B
handler
AuthenticationEntryPointImpl.java 997B
AccessDeniedHandlerImpl.java 969B
controller
MenuController.java 328B
UploadController.java 2KB
RoleController.java 803B
UserController.java 3KB
InstrumentController.java 2KB
RepairController.java 1KB
LockerController.java 2KB
CourseController.java 1KB
CaptchaController.java 3KB
utils
CaptchaUtils.java 3KB
WebUtils.java 531B
JwtUtils.java 3KB
CodeGenerator.java 3KB
UserUtils.java 625B
RedisCache.java 6KB
AliOosUtils.java 3KB
service
RepairService.java 507B
UserService.java 1KB
LockerService.java 861B
InstrumentService.java 687B
RoleService.java 349B
impl
UserServiceImpl.java 16KB
CourseServiceImpl.java 3KB
MenuServiceImpl.java 477B
RepairServiceImpl.java 2KB
InstrumentServiceImpl.java 4KB
LockerServiceImpl.java 5KB
RoleServiceImpl.java 1KB
UserDetailsServiceImpl.java 2KB
CourseService.java 589B
MenuService.java 276B
filter
JwtAuthenticationTokenFilter.java 2KB
common
lang
Result.java 370B
Constants.java 358B
entity
Menu.java 1010B
Locker.java 2KB
Repair.java 1KB
Role.java 807B
Course.java 2KB
User.java 2KB
Instrument.java 2KB
config
CaptchaConfig.java 1KB
LocalDateTimeSerializerConfig.java 1KB
SecurityConfig.java 4KB
RedisConfig.java 1KB
SwaggerConfig.java 1KB
FastJsonRedisSerializer.java 1KB
MyBatisPlusConfig.java 765B
CorsConfig.java 2KB
.gitignore 451B
共 78 条
- 1
资源评论
季风泯灭的季节
- 粉丝: 2097
- 资源: 3370
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- A股本轮牛市新高度预测:数据统计揭示最高点位,散户如何布局牛市?.mp4
- springboot项目中小型制造企业质量管理系统.zip
- springboot项目助农管理系统.zip
- springboot项目助农产品采购平台设计与实现.zip
- springboot项目足球社区管理系统.zip
- springboot项目足球俱乐部管理系统.zip
- 抖音无人直播,会说话的汤姆猫弹幕互动小游戏,两场直播6000+.mp4
- COMSOL裂缝地层的THM耦合,离散裂缝模型,随机复杂裂缝,适合地热能研究
- dma接口数据手册PDF
- 短视频抖店蓝海课程:从基础功能到变现方式,轻松打造爆款短视频.mp4
- 短视频制作与运营全攻略:拍摄剪辑全流程,带你0到1做流量变现.mp4
- 短视频文案创作教程:从钉子思维到实操结构整改,轻松提升文案质量.mp4
- Comsol砷化镓和频SFG
- 快手&俄罗斯 数字人带货:流量获取与选品策略 文案制作与账号运营指南.mp4
- 基于simulink的8阶lms自适应滤波器模型,纯手搭 非软件自带lms库,图示为降噪效果 第一行为加噪信号; 第二行为滤波器输出; 第三行为降噪结果 可广泛应用于数字域噪声抵消的原型验证,具有
- JavaScript逆向(一)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功