package com.community.service.impl;
import com.community.entity.LoginTicket;
import com.community.entity.User;
import com.community.mapper.UserMapper;
import com.community.service.UserService;
import com.community.utils.CommonUtil;
import com.community.utils.Constant;
import com.community.utils.MailClient;
import com.community.utils.RedisKeyUtil;
import com.community.utils.UserThreadLocal;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private MailClient mailClient;
@Autowired
private TemplateEngine templateEngine;
@Autowired
private UserThreadLocal userThreadLocal;
@Autowired
private RedisTemplate redisTemplate;
@Value("${community.path.domain}")
private String domain;
// 1. 先从缓存中查询
private User getCache(int userId) {
String userKey = RedisKeyUtil.getUserKey(userId);
return (User) redisTemplate.opsForValue().get(userKey);
}
// 2. 取不到时初始化缓存数据
private User initCache(int userId) {
User user = userMapper.selectById(userId);
String userKey = RedisKeyUtil.getUserKey(userId);
redisTemplate.opsForValue().set(userKey, user, 3600, TimeUnit.SECONDS);
return user;
}
// 3. 数据变更时清除缓存数据
private void clearCache(int userId) {
String userKey = RedisKeyUtil.getUserKey(userId);
redisTemplate.delete(userKey);
}
/**
* 根据用户 id 查询用户
*/
@Override
public User selectById(int id) {
User user = getCache(id);
if (user == null) {
user = initCache(id);
}
return user;
}
/**
* 根据用户名查询用户
*/
@Override
public User selectByUsername(String username) {
return userMapper.selectByUsername(username);
}
/**
* 根据邮箱查询用户
*/
@Override
public User selectByEmail(String email) {
return userMapper.selectByEmail(email);
}
/**
* 添加用户
*/
@Override
public int insertUser(User user) {
return userMapper.insertUser(user);
}
/**
* 修改用户状态
*/
@Override
public int updateStatus(int id, int status) {
return userMapper.updateStatus(id, status);
}
/**
* 注册用户
*/
@Override
public Map<String, Object> register(User user) {
Map<String, Object> map = new HashMap<>();
// 空值判断
if (user == null) {
throw new IllegalArgumentException("参数不能为空!");
}
if (StringUtils.isBlank(user.getUsername())) {
map.put("UsernameMessage", "账号不能为空!");
return map;
}
if (StringUtils.isBlank(user.getPassword())) {
map.put("PasswordMessage", "密码不能为空!");
return map;
}
if (StringUtils.isBlank(user.getEmail())) {
map.put("EmailMessage", "邮箱不能为空!");
return map;
}
// 验证账号
User dbUser = userMapper.selectByUsername(user.getUsername());
if (dbUser != null) {
map.put("UsernameMessage", "该账号已存在!");
return map;
}
// 验证邮箱
dbUser = userMapper.selectByEmail(user.getEmail());
if (dbUser != null) {
map.put("EmailMessage", "该邮箱已被注册!");
return map;
}
// 注册用户
user.setSalt(CommonUtil.generateUUID().substring(0, 5));
user.setPassword(CommonUtil.md5(user.getPassword() + user.getSalt()));
user.setType(0);
user.setStatus(0);
user.setActivationCode(CommonUtil.generateUUID());
user.setHeaderUrl("https://weizujie.oss-cn-shenzhen.aliyuncs.com/img/avatar.png");
user.setCreateTime(new Date());
userMapper.insertUser(user);
// 发送激活邮件
Context context = new Context();
context.setVariable("email", user.getEmail());
// http://localhost:8080/activation/153/ajdaejfsiufhsfbsef
String url = domain + "/activation/" + user.getId() + "/" + user.getActivationCode();
context.setVariable("url", url);
String content = templateEngine.process("mail/activation", context);
mailClient.sendMail(user.getEmail(), "激活账号", content);
return map;
}
/**
* 激活用户
*/
@Override
public int activation(int id, String code) {
User dbUser = userMapper.selectById(id);
if (dbUser.getStatus() == 1) {
return Constant.ACTIVATION_REPEAT;
} else if (dbUser.getActivationCode().equals(code)) {
userMapper.updateStatus(id, 1);
clearCache(id);
return Constant.ACTIVATION_SUCCESS;
} else {
return Constant.ACTIVATION_FAILURE;
}
}
/**
* 用户登录
*
* @param username 登录账号
* @param password 明文密码。数据库里存的是加密后的密码
* @param expired 凭证过期时间
*/
@Override
public Map<String, Object> login(String username, String password, int expired) {
Map<String, Object> map = new HashMap<>();
// 空值判断
if (StringUtils.isBlank(username)) {
map.put("UsernameMessage", "账号不能为空!");
}
if (StringUtils.isBlank(password)) {
map.put("PasswordMessage", "密码不能为空!");
}
// 账号验证
User dbUser = userMapper.selectByUsername(username);
if (dbUser == null) {
map.put("UsernameMessage", "该账号不存在!");
return map;
}
if (dbUser.getStatus() == 0) {
map.put("UsernameMessage", "该账号未激活!");
return map;
}
// 密码验证
password = CommonUtil.md5(password + dbUser.getSalt());
if (!dbUser.getPassword().equals(password)) {
map.put("PasswordMessage", "密码错误!");
return map;
}
// 生成登录凭证
LoginTicket loginTicket = new LoginTicket();
loginTicket.setUserId(dbUser.getId());
loginTicket.setTicket(CommonUtil.generateUUID());
loginTicket.setStatus(0);
loginTicket.setExpired(new Date(System.currentTimeMillis() + expired * 1000L));
// loginTicketMapper.insertLoginTicket(loginTicket);
// 将登录凭证存入 redis
String ticketKey = RedisKeyUtil.getTicketKey(loginTicket.getTicket());
redisTemplate.opsForValue().set(ticketKey, loginTicket);
map.put("ticket", loginTicket.getTicket());
return map;
}
/**
* 用户退出
*/
@Override
public void logout(String ticket) {
// return loginTicketMapper.updateStatus(ticket, 1);
String ticketKey = RedisKeyUtil.getTicketKey(ticket);
LoginTicket loginTicket = (LoginTicket) redisTemplate.opsForValue().get(ticketKey);
loginTicket.setStatus(1);
redisTemplate.opsForValue().set(ticketKey, loginTicket);
}
/**
* 根据 ticket 查询用户
*/
@Override
public LoginTicket selectByTicket(String ticket) {
String ticketKey = RedisKeyUtil.getTicketKey(ticket);
return (LoginTicket) redisTemplate.opsForValue().get(ticketKey);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于SpringBoot+Mybatis+Redis开发的一个问答社区源码+sql数据库(仿牛客网).zip 【项目介绍】 主要功能: 使用 ThreadLocal 保存用户状态,通过拦截器拦截请求,根据自定义注解判断用户登录状态 使用 Ajax 异步发帖、发送私信、评论 使用 Redis 实现点赞、关注功能,优化登录模块——存储登录凭证、缓存用户信息 【备注】 主要针对计算机相关专业的正在做毕设的学生和需要项目实战的Java学习者。 也可作为课程设计、期末大作业。包含:项目源码、数据库脚本、项目说明等,该项目可以直接作为毕设、课程设计使用。 也可以用来学习参考借鉴!
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot+Mybatis+Redis开发的一个问答社区源码+sql数据库(仿牛客网).zip (96个子文件)
项目说明.md 2KB
pom.xml 4KB
.gitattributes 29B
src
main
resources
application-pro.yml 839B
mapper
UserMapper.xml 2KB
DiscussPostMapper.xml 2KB
MessageMapper.xml 3KB
CommentMapper.xml 2KB
application-dev.yml 1003B
templates
site
discuss-detail.html 11KB
notice.html 8KB
register.html 4KB
profile.html 3KB
operate-result.html 2KB
letter-detail.html 6KB
forget.html 7KB
admin
data.html 7KB
search.html 14KB
followee.html 3KB
letter.html 6KB
setting.html 5KB
login.html 5KB
my-comment.html 3KB
follower.html 3KB
notice-detail.html 10KB
my-post.html 3KB
error
500.html 1KB
404.html 1KB
mail
activation.html 471B
forget.html 407B
index.html 11KB
static
js
bootstrap.min.js 57KB
discuss.js 504B
bs-custom-file-input.js 5KB
register.js 121B
popper.min.js 19KB
profile.js 981B
index.js 1KB
letter.js 1KB
jquery-3.1.0.min.js 84KB
global.js 986B
img
error.png 31KB
404.png 60KB
icon.png 18KB
css
letter.css 181B
global.css 2KB
bootstrap.min.css 152KB
discuss-detail.css 273B
login.css 39B
application.yml 35B
java
com
community
CommunityApplication.java 409B
mapper
UserMapper.java 884B
DiscussPostMapper.java 1KB
CommentMapper.java 1KB
MessageMapper.java 1KB
annotation
LoginRequired.java 554B
controller
LikeController.java 2KB
DiscussPostController.java 6KB
UserController.java 9KB
LoginController.java 6KB
CommentController.java 1KB
MessageController.java 5KB
advice
ExceptionAdvice.java 1KB
HomeController.java 2KB
FollowController.java 4KB
utils
MailClient.java 1KB
CookieUtil.java 696B
CommonUtil.java 583B
UserThreadLocal.java 472B
Constant.java 867B
RedisKeyUtil.java 2KB
service
UserService.java 1KB
MessageService.java 1KB
FollowService.java 943B
LikeService.java 525B
impl
FollowServiceImpl.java 5KB
DiscussPostServiceImpl.java 2KB
UserServiceImpl.java 9KB
MessageServiceImpl.java 2KB
CommentServiceImpl.java 4KB
LikeServiceImpl.java 3KB
CommentService.java 939B
DiscussPostService.java 1KB
entity
Message.java 650B
Comment.java 626B
LoginTicket.java 302B
DiscussPost.java 749B
Page.java 2KB
User.java 708B
vo
ResultVo.java 859B
config
KaptchaConfig.java 1KB
RedisConfig.java 1KB
WebMvcConfig.java 1KB
interceptor
LoginTicketInterceptor.java 2KB
LoginRequiredInterceptor.java 2KB
community.sql 4KB
共 96 条
- 1
资源评论
Make程序设计
- 粉丝: 5568
- 资源: 3566
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功