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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了代码和底层硬件之间的中介。 面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计项目 基于SSM框架的健身房管理系统 后端Spring Boot项目.zip (78个子文件)
SJT-code
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
资源评论
JJJ69
- 粉丝: 6242
- 资源: 5777
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功