package com.atqidi.elcar.service.impl;
import cn.hutool.crypto.digest.BCrypt;
import cn.hutool.crypto.digest.DigestUtil;
import com.atqidi.elcar.entity.RefreshToken;
import com.atqidi.elcar.entity.Rose;
import com.atqidi.elcar.entity.User;
import com.atqidi.elcar.mapper.RefreshTokenMapper;
import com.atqidi.elcar.mapper.RoseMapper;
import com.atqidi.elcar.mapper.UserMapper;
import com.atqidi.elcar.service.UserService;
import com.atqidi.elcar.utils.*;
import com.atqidi.elcar.utils.result.Result;
import com.atqidi.elcar.utils.result.ResultCodeEnum;
import com.atqidi.elcar.utils.tools.PageTools;
import com.atqidi.elcar.vo.LoginUser;
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.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* 服务实现类
* </p>
* TODO 权限认证
* 删除 修改
*
* @author oldbai
* @since 2021-04-26
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
RoseMapper roseMapper;
@Autowired
RedisUtil redisUtil;
@Autowired
RefreshTokenMapper refreshTokenMapper;
QueryWrapper<User> wrapper;
HttpServletRequest request = null;
HttpServletResponse response = null;
/**
* 登陆:
* 1.用户需要携带 :手机号、密码、验证码
* TODO 后期使用阿里云短信验证码,可以使用验证码一键登录
* 2.对数据库进行保存或更新 token 信息
* 3.对redis进行保存或更新 token 信息
* 4.登陆成功返回 token 信息,使用 MD5 加密返回 token-key
*
* @param user
* @param captchaKey
* @param captcha
* @return
*/
@Override
public Result login(LoginUser user, String captchaKey, String captcha) {
Result result = checkPhone(user.getPhone());
//通过手机号查找该用户是否存在
if (result.getCode().equals(ResultCodeEnum.SUCCESS.getCode())) {
return result.message("手机号不存在");
}
//检查验证码
String cp = (String) redisUtil.get(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey);
if (StringUtils.isEmpty(cp) || !cp.toLowerCase().equals(captcha.toLowerCase())) {
return Result.fail().message("验证码错误,请重新获取验证码");
}
//验证码成功后,就删了验证码
redisUtil.del(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey);
User userByPhone = (User) getUserByPhoneFromDB(user.getPhone());
//检查密码
//使用checkpw方法检查被加密的字符串是否与原始字符串匹配:
/* if (!BCrypt.checkpw(user.getPassword(), userByPhone.getPassword())) {
return result.message("密码错误");
}*/
if (!DigestUtil.md5Hex(user.getPassword().getBytes()).equals(userByPhone.getPassword())) {
return result.message("密码错误");
}
//密码正确则生成 token
String tokenKey = createToken(userByPhone);
//返回token-key给前端
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("token", tokenKey);
return Result.ok(hashMap).message("登陆成功");
}
private User getUserByPhoneFromDB(String phone) {
wrapper = new QueryWrapper<>();
wrapper.eq("phone", phone);
User user = (User) userMapper.selectOne(wrapper);
return user;
}
/**
* 生成 token
*
* @param user
* @return
*/
private String createToken(User user) {
//先通过id删除数据库有的数据
QueryWrapper<RefreshToken> refreshTokenQueryWrapper = new QueryWrapper<>();
refreshTokenQueryWrapper.eq("user_id", user.getId());
refreshTokenMapper.delete(refreshTokenQueryWrapper);
Map<String, Object> map = ClaimsUtils.User2Claims(user);
String token = JwtUtil.createToken(map);
//MD5 序列化生成 token-key
String tokenKey = BCrypt.hashpw(token);
RefreshToken refreshToken = new RefreshToken();
refreshToken.setUserId(user.getId());
refreshToken.setRefreshToken(token);
refreshToken.setTokenKey(tokenKey);
//存入数据库
int insert = refreshTokenMapper.insert(refreshToken);
if (insert == 0) {
log.info("存入失败");
}
//存入redis
redisUtil.set(Constants.User.KEY_TOKEN + tokenKey, token);
return tokenKey;
}
/**
* 注册:
* 1.用户注册需要携带:手机号、密码、验证码
* 默认普通社会人士,可以进行认证,通过修改用户信息进行认证身份。
* TODO 后期使用短信认证一键注册,只需要输入密码即可
* 2.检查手机号是否重复
* 3.完成注册
*
* @param user
* @param captchaKey
* @param captcha
* @return
*/
@Override
public Result register(User user, String captchaKey, String captcha) {
Result result = checkPhone(user.getPhone());
//检查手机号是否可以用
if (result.getCode().equals(ResultCodeEnum.FAIL.getCode())) {
return result;
}
//检查手机格式
if (!ValidateUtil.validateMobile(user.getPhone())) {
return result.message("手机号格式不对");
}
//检查验证码是否正确
String cp = (String) redisUtil.get(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey);
if (!cp.toLowerCase().equals(captcha.toLowerCase())) {
return Result.fail().message("验证码错误");
}
//删除redis的验证码缓存
redisUtil.del(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey);
//密码加密
user.setPassword(DigestUtil.md5Hex(user.getPassword().getBytes()));
//设置用户默认角色
user.setRoleId(Constants.User.DEF_ROSE);
int insert = userMapper.insert(user);
if (insert == 0) {
return Result.fail().message("注册失败");
}
return Result.ok().message("注册成功");
}
/**
* 检查用户是否登录:
* 1.通过 token-key 去redis查找,有则解析 token 返回用户信息
* 2.通过 token-key 去mysql查找,有则解析 token 返回用户信息
* 3.都没有表示用户登录信息过期了,要求重新登陆
*
* @param token
* @return
*/
@Override
public Result checkUser(String token) {
getRequestAndResponse();
//如果前端不传token过来,我们自己取
if (StringUtils.isEmpty(token)) {
token = request.getHeader("token");
}
//去redis查找用户是否存在
String redisToken = (String) redisUtil.get(Constants.User.KEY_TOKEN + token);
if (StringUtils.isEmpty(redisToken)) {
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
安卓开发-基于java开发的充电设备管理系统完整源码+数据库(课程设计).zip 安卓开发-基于java开发的充电设备管理系统完整源码+数据库(课程设计).zip 安卓开发-基于java开发的充电设备管理系统完整源码+数据库(课程设计).zip 安卓开发 课程设计源码 java开发 充电设备管理系统完整源码+数据库 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。包含:项目源码、数据库脚本、项目说明等,该项目可以直接作为毕设、课程设计使用。 也可以用来学习参考借鉴!
资源推荐
资源详情
资源评论
收起资源包目录
安卓开发-基于java开发的充电设备管理系统完整源码+数据库(课程设计).zip (102个子文件)
.gitignore 395B
UserServiceImpl.java 18KB
RedisUtil.java 14KB
OrderTableServiceImpl.java 10KB
ValidateUtil.java 8KB
PayTableServiceImpl.java 7KB
CarServiceImpl.java 7KB
EquipmentServiceImpl.java 7KB
CarTypeServiceImpl.java 5KB
RoseServiceImpl.java 5KB
OrderTableController.java 5KB
UserController.java 4KB
SnowflakeIdWorker.java 4KB
JwtUtil.java 3KB
RedisConfig.java 3KB
CodeGenerator.java 3KB
EquipmentController.java 3KB
CarController.java 2KB
Constants.java 2KB
Result.java 2KB
PayTableController.java 2KB
CarTypeController.java 2KB
RoseController.java 2KB
SwaggerConfig.java 2KB
ResultCodeEnum.java 2KB
MybatisConfig.java 2KB
PayTable.java 1KB
User.java 1KB
OrderTable.java 1KB
Equipment.java 1KB
RefreshToken.java 1KB
Car.java 1KB
ModelEntity.java 1KB
ClaimsUtils.java 1KB
UserService.java 1KB
UserServiceImplTest.java 1017B
AppMessage.java 945B
CarType.java 936B
Rose.java 917B
UserMapper.java 850B
MyMetaObjectHandler.java 847B
EquipmentService.java 784B
ExceptionController.java 718B
CarTypeService.java 717B
CarMapper.java 713B
OrderTableService.java 678B
TextMapper.java 607B
CarService.java 606B
PayTableService.java 603B
RoseService.java 588B
ElcarApplication.java 581B
RefreshTokenServiceImpl.java 526B
AppMessageServiceImpl.java 512B
ElcarApplicationTests.java 466B
PageTools.java 436B
RefreshTokenController.java 423B
AppMessageController.java 419B
RefreshTokenMapper.java 355B
OrderTableMapper.java 349B
EquipmentMapper.java 346B
PayTableMapper.java 343B
CarTypeMapper.java 339B
RoseMapper.java 331B
LoginUser.java 297B
RefreshTokenService.java 293B
AppMessageMapper.java 287B
AppMessageService.java 287B
CarTyoeVO.java 213B
log-info-2021-05-10.0.log 218KB
log-info-2021-05-18.0.log 116KB
log-info-2021-05-11.0.log 48KB
log-info-2021-05-17.0.log 45KB
log_info.log 41KB
log-info-2021-05-15.0.log 19KB
log_error.log 12KB
log-info-2021-05-19.0.log 11KB
log-info-2021-05-20.0.log 6KB
log-warn-2021-05-10.0.log 3KB
log-info-2021-05-14.0.log 2KB
log_warn.log 2KB
log_info.log 922B
log-error-2021-05-10.0.log 358B
log_debug.log 0B
log_warn.log 0B
log_error.log 0B
log_debug.log 0B
项目说明.md 8B
application.properties 570B
new_el_pile.sql 11KB
el_pile.sql 11KB
logback-spring.xml 8KB
pom.xml 4KB
UserMapper.xml 3KB
CarMapper.xml 2KB
RefreshTokenMapper.xml 222B
AppMessageMapper.xml 220B
OrderTableMapper.xml 220B
EquipmentMapper.xml 219B
PayTableMapper.xml 218B
CarTypeMapper.xml 217B
共 102 条
- 1
- 2
资源评论
m_466683585
- 粉丝: 5490
- 资源: 3568
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功