引言
CMS代表内容管理系统,它是用于创建、编辑和管理数字内容的工具。CMS管理系统可以帮助你轻松地管理和更新网站、博客、电子商务平台或其他在线平台上的内容。😊
一篇文章帮你彻底解决cms管理系统后台 文章篇幅较长,将设置成专栏,建议收藏哦
继上一篇数据库的设计以及与后端连接完成后,那么下一步就是进行service的实现
继上文我们对项目的业务层分析我们首先明确的业务层的任务:
用户注册
我们先在service层定义一个用户注册的方法
long userRegister(String userAccount,String userPassword,String checkPassword)
然后按alt+enter生成实现类impl开始写逻辑
主要思路:
- 首先用户在前端输入账号密码,校验码
- 后端校验
- 非空
- 账号不能小于4位
- 密码不能小于8位
- 校验密码也不能小于8位
- 账户不能包含特殊字符
- 校验密码和密码要相同
- 对密码进行加密
- 将用户数据插入到数据库中
我们在检测非空时可以导入依赖简化书写过程
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Apache Commons Lang3 是 Apache 软件基金会开发的一组 Java 工具类库,提供各种常用字符串处理、数学运算、数据转换、校验等常用功能实现的工具类
**
* 盐值,混淆密码,在用户加密时候使用
*/
private static final String SALT = "yupi";
@Override
public long userRegister(String userAccount, String userPassword, String checkPassword) {
//1.校验
if(StringUtils.isAnyBlank(userAccount,userPassword,checkPassword)){
return -1;
}
if(userAccount.length()<4){
return -1;
}
if(userPassword.length()<8 || checkPassword.length()<8){
return -1;
}
//账户不能包含特殊字符
String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(validPattern).matcher(userAccount);
if (matcher.find()) {
return -1;
}
//密码和校验密码相同
if(userPassword.equals(checkPassword)){
return -1;
}
//账户不能重复
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
long count = this.count(queryWrapper);
if (count > 0) {
return -1;
}
// 2. 加密
String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());
// 3. 插入数据
User user = new User();
user.setUserAccount(userAccount);
user.setUserPassword(encryptPassword);
user.setPlanetCode(planetCode);
boolean saveResult = this.save(user);
if (!saveResult) {
return -1;
}
return 0;
}
在比较数据库中用户和注册用户是否重复时我们可以如下这样写
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
long count = userMapper.selectCount(queryWrapper);
if (count > 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "账号重复");
}
那么我们要在前面加入依赖注入mapper
@Resource
private UserMapper userMapper;
用户登录
主要逻辑为
- 校验用户账户和密码是否合法
- 非空
- 账户长度不小于 4 位
- 密码就不小于 8 位
- 账户不包含特殊字符
- 校验密码是否输入正确,要和数据库中的密文密码(注册时加密后的)去对比
- 用户信息脱敏,隐藏敏感信息,防止数据库中的字段泄露
- 我们要记录用户的登录态(session),将其存到服务器上(用后端 SpringBoot 框架封装的服务器 tomcat 去记录)cookie
同理先定义接口
User userLogin(String userAccount, String userPassword, HttpServletRequest request);
如何知道是哪个用户登录了
- 连接服务器端后,得到一个 session 状态(匿名会话),返回给前端(用户已经有了会话,但是这个会 在用户登录成功之后才会保存到Session)
- 登录成功后,得到了登录成功的 session,并且给该session设置一些值(比如用户信息),返回给前端 一个设置 cookie 的 命令 session => cookie
- 前端接收到后端的命令后,设置 cookie,保存到浏览器内
- 前端再次请求后端的时候(相同的域名),在请求头中带上cookie去请求
- 后端拿到前端传来的 cookie,找到对应的 session
- 后端从 session 中可以取出基于该 session 存储的变量(用户的登录信息、登录名)
@Override
public User userLogin(String userAccount, String userPassword, HttpServletRequest request) {
// 1. 校验
if (StringUtils.isAnyBlank(userAccount, userPassword)) {
return null;
}
if (userAccount.length() < 4) {
return null;
}
if (userPassword.length() < 8) {
return null;
}
// 账户不能包含特殊字符
String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(validPattern).matcher(userAccount);
if (matcher.find()) {
return null;
}
// 2. 加密
String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());
// 查询用户是否存在
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
queryWrapper.eq("userPassword", encryptPassword);
User user = userMapper.selectOne(queryWrapper);
// 用户不存在
if (user == null) {
log.info("user login failed, userAccount cannot match userPassword");
return null;
}
// 3. 用户脱敏
User safetyUser = getSafetyUser(user);
// 4. 记录用户的登录态
request.getSession().setAttribute(USER_LOGIN_STATE, safetyUser);
return safetyUser;
}
用户脱敏
先定义接口
User getSafetyUser(User originUser);
脱敏:信息脱敏(Data Masking)是一种隐私保护技术,通过对敏感数据进行修改或者替换的方式,来保护数据的隐私和安全。信息脱敏通常应用于需要处理敏感数据的场景,例如测试、开发、分析等环境。在信息脱敏技术中,被保护的敏感数据通常会被替换成某种规则定义的非敏感数据或者格式,以避免敏感数据泄露和数据窃取的风险,主要就是防止信息泄露,隐藏敏感信息
@Override
public User getSafetyUser(User originUser) {
if (originUser == null) {
return null;
}
User safetyUser = new User();
safetyUser.setId(originUser.getId());
safetyUser.setUsername(originUser.getUsername());
safetyUser.setUserAccount(originUser.getUserAccount());
safetyUser.setAvatarUrl(originUser.getAvatarUrl());
safetyUser.setGender(originUser.getGender());
safetyUser.setPhone(originUser.getPhone());
safetyUser.setEmail(originUser.getEmail());
safetyUser.setPlanetCode(originUser.getPlanetCode());
safetyUser.setUserRole(originUser.getUserRole());
safetyUser.setUserStatus(originUser.getUserStatus());
safetyUser.setCreateTime(originUser.getCreateTime());
return safetyUser;
}
用户注销
先定义接口
int userLogout(HttpServletRequest request);
写业务逻辑
@Override
public int userLogout(HttpServletRequest request) {
// 移除登录态
request.getSession().removeAttribute(USER_LOGIN_STATE);
return 1;
}