You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hotels/back/src/main/java/com/service/impl/TokenServiceImpl.java

113 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.service.impl;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.dao.TokenDao;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.CommonUtil;
import com.utils.PageUtils;
import com.utils.Query;
/**
* 处理token相关业务逻辑的服务实现类
*/
@Service("tokenService")
// 继承ServiceImpl类指定数据访问对象为TokenDao和实体类为TokenEntity实现TokenService接口
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {
// 根据传入的参数进行分页查询Token实体数据的方法
// @param params 包含查询条件、分页参数等信息的Map集合
// @return PageUtils对象包含了分页查询结果的相关信息如总记录数、当前页码等
@Override
public PageUtils queryPage(Map<String, Object> params) {
// 创建分页对象使用Query工具类从参数中构建分页参数并获取Page对象
Page<TokenEntity> page = this.selectPage(
new Query<TokenEntity>(params).getPage(),
// 创建一个空的实体查询条件包装器,即查询所有符合条件的记录(这里未添加具体条件)
new EntityWrapper<TokenEntity>()
);
// 使用PageUtils工具类将MyBatis-Plus的Page对象转换为自定义的分页工具对象并返回
return new PageUtils(page);
}
// 根据传入的查询条件包装器查询Token实体视图列表的方法
// @param wrapper 用于构建查询条件的包装器类型为TokenEntity的包装器
// @return 包含Token实体视图的List集合
@Override
public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
// 调用数据访问对象的selectListView方法传入查询条件包装器获取Token实体视图列表
return baseMapper.selectListView(wrapper);
}
// 根据传入的参数和查询条件进行分页查询Token实体数据的方法
// @param params 包含查询条件、分页参数等信息的Map集合
// @param wrapper 用于构建查询条件的包装器类型为TokenEntity的包装器
// @return PageUtils对象包含了分页查询结果的相关信息
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<TokenEntity> wrapper) {
// 创建分页对象使用Query工具类从参数中构建分页参数并获取Page对象
Page<TokenEntity> page = new Query<TokenEntity>(params).getPage();
// 设置分页对象的记录通过调用数据访问对象的selectListView方法传入分页对象和查询条件包装器获取结果
page.setRecords(baseMapper.selectListView(page, wrapper));
// 使用PageUtils工具类将MyBatis-Plus的Page对象转换为自定义的分页工具对象并返回
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
// 生成Token的方法根据用户ID、用户名、表名和角色生成并处理Token相关信息
// @param userid 用户ID
// @param username 用户名
// @param tableName 表名
// @param role 角色
// @return 生成的Token字符串
@Override
public String generateToken(Long userid, String username, String tableName, String role) {
// 根据用户ID和角色查询Token实体判断是否已存在对应的Token记录
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
// 生成32位的随机字符串作为Token
String token = CommonUtil.getRandomString(32);
// 获取当前时间的日历对象
Calendar cal = Calendar.getInstance();
// 设置日历的时间为当前时间
cal.setTime(new Date());
// 将时间增加1小时设置Token的过期时间
cal.add(Calendar.HOUR_OF_DAY, 1);
// 如果Token实体已存在则更新其Token和过期时间
if (tokenEntity != null) {
tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity);
} else {
// 如果Token实体不存在则插入一条新的Token记录
this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime()));
}
// 返回生成的Token
return token;
}
// 根据Token获取Token实体的方法并检查Token是否过期
// @param token Token字符串
// @return TokenEntity对象如果Token无效或已过期则返回null
@Override
public TokenEntity getTokenEntity(String token) {
// 根据Token查询Token实体
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
// 如果Token实体不存在或者Token已过期过期时间早于当前时间则返回null
if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) {
return null;
}
// 返回有效的Token实体
return tokenEntity;
}
}