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 Java 项目集合 一、概述 在这个平台上,我们为大家带来了一系列的 JavaSSM(Spring + SpringMVC + MyBatis)项目。这些项目旨在展示SSM框架在实际应用中的魅力,同时也为开发者提供了一个快速学习和实践的机会。通过下载和使用这些项目,您将能够深入了解SSM框架的核心概念、设计模式和最佳实践。 二、项目特点 实战性强:这些项目均来自实际业务场景多个领域,具有很强的实战性和参考价值。 技术先进:所有项目均采用最新的SSM框架版本,包括Spring 、SpringMVC 和MyBatis 等,确保技术的先进性和稳定性。 代码规范:项目代码严格按照行业标准和最佳实践进行编写,易于阅读和维护。 文档齐全:每个项目都配备了详细的开发文档和使用说明,方便您快速上手和定制开发。 三、适用人群 Java初学者:通过学习和实践这些项目,您将能够快速掌握SSM框架的基础知识和核心技术。 中高级开发者:这些项目将为您提供丰富的实战经验和灵感,帮助您提升技术水平和解决问题的能力。 项目经理和架构师:这些项目可以作为参考和模板,帮助您更好地规划和设计实际业务场景中的Java项目。 四、下载与使用 下载:所有项目均提供下载,您只需在平台上注册并登录即可获取。 安装与部署:每个项目都提供了详细的安装和部署指南,帮助您快速搭建和运行项目。 定制开发:您可以根据实际需求对项目进行定制开发,扩展功能和优化性能。 五、结语 通过这一系列SSM Java项目的下载和学习,您将能够深入了解SSM框架的核心技术,提升自己的编程能力,并在实际业务场景中灵活应用。我们期待您能够通过这些项目获得更多的成长和进步!
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计项目 基于SSM框架的健身房管理系统 后端Spring Boot项目.zip (78个子文件)
jinitaimeigepi
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
资源评论
01红C
- 粉丝: 1910
- 资源: 2111
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 常用正则表达式.docx
- 【java毕业设计】点餐系统网站源码(ssm+mysql+说明文档).zip
- 网络安全中的系统信息收集与防护机制探讨
- Vue搭建AudioPlaySation(三)
- 【java毕业设计】班级同学录管理系统源码(ssm+mysql+说明文档).zip
- (2024年最新更新!!!)经管类期刊-投稿指南
- 2001-2022三个版本企业数字化转型合集【重磅,更新!】
- 网络安全领域中关于资产泄漏、CMS识别与代码版本管理工具安全性的技术探讨
- 【java毕业设计】东风锻造有限公司点检管理系统源码(ssm+mysql+说明文档).zip
- Web架构与信息打点技术综合解析及其应用场景
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功