Merge pull request '杜韦注释' (#5) from 杜韦注释 into main

main
p2x9nfpei 4 months ago
commit bfe69c539c

@ -0,0 +1,126 @@
// 包声明,定义当前类所在的包路径
package com.interceptor;
// 导入Java IO包中的IOException类用于处理输入输出异常
import java.io.IOException;
// 导入Java IO包中的PrintWriter类用于向客户端输出数据
import java.io.PrintWriter;
// 导入Java util包中的HashMap类用于存储键值对数据
import java.util.HashMap;
// 导入Java util包中的Map接口用于定义键值对集合
import java.util.Map;
// 导入FastJSON的JSONObject类用于处理JSON数据
import com.alibaba.fastjson.JSONObject;
// 导入Servlet包中的HttpServletRequest类用于处理HTTP请求
import javax.servlet.http.HttpServletRequest;
// 导入Servlet包中的HttpServletResponse类用于处理HTTP响应
import javax.servlet.http.HttpServletResponse;
// 导入Apache Commons Lang库中的StringUtils类用于字符串处理
import org.apache.commons.lang3.StringUtils;
// 导入Spring框架的Autowired注解用于自动装配依赖
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring框架的Component注解标识该类为Spring组件
import org.springframework.stereotype.Component;
// 导入Spring Web包中的HandlerMethod类用于处理方法级别的处理器
import org.springframework.web.method.HandlerMethod;
// 导入Spring Web MVC包中的HandlerInterceptor接口用于定义拦截器
import org.springframework.web.servlet.HandlerInterceptor;
// 导入自定义的IgnoreAuth注解用于标记不需要认证的方法
import com.annotation.IgnoreAuth;
// 导入自定义的EIException异常类用于处理业务异常
import com.entity.EIException;
// 导入自定义的TokenEntity实体类用于表示令牌信息
import com.entity.TokenEntity;
// 导入自定义的TokenService服务类用于处理令牌相关逻辑
import com.service.TokenService;
// 导入自定义的R工具类用于封装统一响应格式
import com.utils.R;
// 权限(Token)验证拦截器
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
// 登录Token的键名
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService; // 自动注入Token服务
@Override
//在请求处理之前进行拦截
// @param request HTTP请求对象
// @param response HTTP响应对象
//@param handler 处理器对象
// @return 如果返回true则继续处理请求如果返回false则中断请求处理
// @throws Exception 处理过程中可能抛出的异常
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取请求路径
String servletPath = request.getServletPath();
// 如果是字典表或文件上传或用户注册接口,直接放行
if("/dictionary/page".equals(request.getServletPath()) || "/file/upload".equals(request.getServletPath()) || "/yonghu/register".equals(request.getServletPath()) ){
return true;
}
// 支持跨域请求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
// 如果handler是方法处理器则尝试获取IgnoreAuth注解
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true; // 如果不是方法处理器,直接放行
}
//从header中获取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
*
*/
if(annotation!=null) {
return true; // 如果存在IgnoreAuth注解直接放行
}
TokenEntity tokenEntity = null;
// 如果token不为空验证token
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
// 如果token有效设置session属性并放行
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8"); // 设置响应字符编码为UTF-8
response.setContentType("application/json; charset=utf-8"); // 设置响应内容类型为JSON
try {
writer = response.getWriter(); // 获取响应输出流
writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); // 返回错误信息
} finally {
if(writer != null){
writer.close(); // 关闭响应输出流
}
}
// throw new EIException("请先登录", 401); // 抛出未登录异常,已注释掉
return false; // 返回false中断请求处理
}
}

@ -0,0 +1,109 @@
package com.utils; // 声明包名
// 导入用于缓冲读取字符流的类
import java.io.BufferedReader;
// 导入用于将字节流转换为字符流的类
import java.io.InputStreamReader;
// 导入用于创建 HTTP 连接的类
import java.net.HttpURLConnection;
// 导入用于表示 URL 的类
import java.net.URL;
// 导入用于创建哈希映射的类
import java.util.HashMap;
// 导入用于表示列表的接口
import java.util.List;
// 导入用于表示映射的接口
import java.util.Map;
// 导入用于处理 JSON 对象的类
import org.json.JSONObject;
// 定义一个公共类 BaiduUtil
public class BaiduUtil {
// 静态方法,根据经纬度获取省市区信息
public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
// 将纬度和经度拼接成符合要求的字符串
String location = lat + "," + lng;
try {
// 拼接请求的 URL
String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" + key + "&output=json&coordtype=wgs84ll&location=" + location;
// 调用 HttpClientUtils 类的 doGet 方法发送请求并获取结果
String result = HttpClientUtils.doGet(url);
// 将返回的结果字符串转换为 JSON 对象
JSONObject o = new JSONObject(result);
// 创建一个用于存储地区信息的哈希映射
Map<String, String> area = new HashMap<>();
// 从 JSON 对象中提取省份信息并放入映射
area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
// 从 JSON 对象中提取城市信息并放入映射
area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
// 从 JSON 对象中提取区域信息并放入映射
area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
// 从 JSON 对象中提取街道信息并放入映射
area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
// 返回存储地区信息的映射
return area;
} catch (Exception e) {
// 打印异常堆栈信息
e.printStackTrace();
}
// 若出现异常则返回 null
return null;
}
// 静态方法,用于获取 API 访问令牌
public static String getAuth(String ak, String sk) {
// 定义获取令牌的基础 URL
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
// 拼接完整的获取令牌的 URL
String getAccessTokenUrl = authHost
// 固定参数 grant_type
+ "grant_type=client_credentials"
// 百度云官网获取的 API Key
+ "&client_id=" + ak
// 百度云官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
// 创建 URL 对象
URL realUrl = new URL(getAccessTokenUrl);
// 打开与 URL 之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
// 设置请求方法为 GET
connection.setRequestMethod("GET");
// 建立连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有响应头字段
for (String key : map.keySet()) {
// 打印响应头字段及其对应的值
System.err.println(key + "--->" + map.get(key));
}
// 创建 BufferedReader 用于读取响应内容
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用于存储响应结果的字符串
String result = "";
// 用于存储每行响应内容的字符串
String line;
// 逐行读取响应内容并拼接
while ((line = in.readLine()) != null) {
result += line;
}
// 打印响应结果
System.err.println("result:" + result);
// 将响应结果字符串转换为 JSON 对象
org.json.JSONObject jsonObject = new org.json.JSONObject(result);
// 从 JSON 对象中提取访问令牌
String access_token = jsonObject.getString("access_token");
// 返回访问令牌
return access_token;
} catch (Exception e) {
// 打印获取令牌失败的提示信息
System.err.printf("获取token失败");
// 打印异常堆栈信息
e.printStackTrace(System.err);
}
// 若出现异常则返回 null
return null;
}
}

@ -0,0 +1,206 @@
package com.utils; // 声明该Java类所在的包为com.utils
import com.annotation.ColumnInfo; // 导入自定义的ColumnInfo注解用于获取字段相关信息
import org.apache.tools.ant.util.DateUtils; // 导入Apache Ant工具集中用于处理日期的工具类
import org.springframework.lang.Nullable; // 导入Spring框架中用于标记参数可空的注解
import org.springframework.util.Assert; // 导入Spring框架中用于进行断言操作的工具类
import java.lang.reflect.Field; // 导入用于操作类字段反射的Field类
import java.util.ArrayList; // 导入用于创建可变大小列表的ArrayList类
import java.util.Arrays; // 导入用于操作数组的工具类
import java.util.Date; // 导入用于处理日期的Date类
import java.util.List; // 导入用于定义列表的List接口
// 定义一个名为ClazzDiff的类用于比较两个对象的属性差异
public class ClazzDiff {
// 定义一个方法,用于比较两个对象的属性,并返回包含差异信息的列表
// obj1的属性值为空时自动忽略与obj2对应属性的比较
public List<String> ClazzDiffColumn(Object obj1, Object obj2, @Nullable String... ignoreProperties) throws NoSuchFieldException, IllegalAccessException {
// 断言obj1不为空如果为空则抛出异常并提示"obj1不是空的"
Assert.notNull(obj1, "obj1不是空的");
// 断言obj2不为空如果为空则抛出异常并提示"obj2不是空的"
Assert.notNull(obj2, "obj2不是空的");
// 创建一个ArrayList对象用于存储属性差异信息
List<String> list = new ArrayList<>();
// 获取obj1对象的类类型
Class<?> obj1Class = obj1.getClass();
// 获取obj2对象的类类型
Class<?> obj2Class = obj2.getClass();
// 判断obj2是否是obj1Class的实例如果不是则抛出异常并提示"传入的两个类不是同一个类"
if (!obj1Class.isInstance(obj2)) {
throw new IllegalArgumentException("传入的两个类不是同一个类");
}
// 将可变参数ignoreProperties转换为List类型如果ignoreProperties为null则返回null
List<String> ignoreList = (ignoreProperties != null? Arrays.asList(ignoreProperties) : null);
// 获取obj1Class类中声明的所有字段
Field[] obj1DeclaredFields = obj1Class.getDeclaredFields();
// 遍历obj1的所有声明字段
for (Field f : obj1DeclaredFields) {
// 设置当前字段可访问打破Java的访问修饰符限制
f.setAccessible(true);
// 获取obj1Class类中指定名称的字段
Field obj1Field = obj1Class.getDeclaredField(f.getName());
// 获取obj2Class类中指定名称的字段
Field obj2Field = obj2Class.getDeclaredField(f.getName());
// 设置obj1Field字段可访问
obj1Field.setAccessible(true);
// 设置obj2Field字段可访问
obj2Field.setAccessible(true);
// 判断obj1Field的值不为空并且该字段不在忽略列表中
if (obj1Field.get(obj1) != null && (ignoreList == null ||!ignoreList.contains(obj1Field.getName()))) {
// 获取obj1Field字段上的ColumnInfo注解
ColumnInfo columnInfo = obj1Field.getAnnotation(ColumnInfo.class);
// 获取obj1Field字段的值
Object o1 = obj1Field.get(obj1);
// 获取obj2Field字段的值
Object o2 = obj2Field.get(obj2);
// 判断o1和o2转换为字符串后的值是否不相等
if (!String.valueOf(o1).equals(String.valueOf(o2))) {
// 如果字段名包含"File"
if (f.getName().contains("File")) {
// 添加包含文件下载链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <a type='success' style='text-decoration:none' class='el-button' href='" + o1 + "' >文件下载</a>,原先 : <a type='success' style='text-decoration:none' class='el-button' href='" + o2 + "' >文件下载</a>");
// 如果字段名包含"Video"
} else if (f.getName().contains("Video")) {
// 添加包含视频播放链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <video src='" + o1 + "' width='100px' height='100px' controls='controls'></video>,原先 : <video src='" + o2 + "' width='100px' height='100px' controls='controls'></video>");
// 如果字段名包含"Photo"
} else if (f.getName().contains("Photo")) {
// 添加包含图片展示链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <img src='" + o1 + "' width='100px' height='100px'>,原先 : <img src='" + o2 + "' width='100px' height='100px'>");
// 如果字段名包含"Time"
} else if (f.getName().contains("Time")) {
// 格式化日期并添加差异信息到列表中,若值为空则显示"空"
list.add(columnInfo.comment() + "-->现在 : [" + (o1 != null? DateUtils.format((Date) o1, "yyyy - MM - dd") : "空") + "],原先 : [" + (o2 != null? DateUtils.format((Date) o2, "yyyy - MM - dd") : "空") + "]");
// 其他情况
} else {
// 添加普通的属性差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : [" + o1 + "],原先 : [" + o2 + "]");
}
}
}
}
// 获取obj1Class父类中声明的所有字段
Field[] obj1DeclaredFields2 = obj1Class.getSuperclass().getDeclaredFields();
// 遍历obj1父类的所有声明字段
for (Field f : obj1DeclaredFields2) {
// 设置当前字段可访问
f.setAccessible(true);
// 获取obj1Class父类中指定名称的字段
Field obj1Field = obj1Class.getSuperclass().getDeclaredField(f.getName());
// 获取obj2Class父类中指定名称的字段
Field obj2Field = obj2Class.getSuperclass().getDeclaredField(f.getName());
// 设置obj1Field字段可访问
obj1Field.setAccessible(true);
// 设置obj2Field字段可访问
obj2Field.setAccessible(true);
// 判断obj1Field的值不为空并且该字段不在忽略列表中
if (obj1Field.get(obj1) != null && (ignoreList == null ||!ignoreList.contains(obj1Field.getName()))) {
// 获取obj1Field字段上的ColumnInfo注解
ColumnInfo columnInfo = obj1Field.getAnnotation(ColumnInfo.class);
// 获取obj1Field字段的值
Object o1 = obj1Field.get(obj1);
// 获取obj2Field字段的值
Object o2 = obj2Field.get(obj2);
// 判断o1和o2转换为字符串后的值是否不相等
if (!String.valueOf(o1).equals(String.valueOf(o2))) {
// 如果字段名包含"File"
if (f.getName().contains("File")) {
// 添加包含文件下载链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <a type='success' style='text-decoration:none' class='el-button' href='" + o1 + "' >文件下载</a>,原先 : <a type='success' style='text-decoration:none' class='el-button' href='" + o2 + "' >文件下载</a>");
// 如果字段名包含"Video"
} else if (f.getName().contains("Video")) {
// 添加包含视频播放链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <video src='" + o1 + "' width='100px' height='100px' controls='controls'></video>,原先 : <video src='" + o2 + "' width='100px' height='100px' controls='controls'></video>");
// 如果字段名包含"Photo"
} else if (f.getName().contains("Photo")) {
// 添加包含图片展示链接的差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : <img src='" + o1 + "' width='100px' height='100px'>,原先 : <img src='" + o2 + "' width='100px' height='100px'>");
// 如果字段名包含"Time"
} else if (f.getName().contains("Time")) {
// 格式化日期并添加差异信息到列表中,若值为空则显示"空"
list.add(columnInfo.comment() + "-->现在 : [" + (o1 != null? DateUtils.format((Date) o1, "yyyy - MM - dd") : "空") + "],原先 : [" + (o2 != null? DateUtils.format((Date) o2, "yyyy - MM - dd") : "空") + "]");
// 其他情况
} else {
// 添加普通的属性差异信息到列表中
list.add(columnInfo.comment() + "-->现在 : [" + o1 + "],原先 : [" + o2 + "]");
}
}
}
}
// 返回包含属性差异信息的列表
return list;
}
// 定义一个方法,用于判断指定类中是否包含指定名称的字段
public boolean hasField(Class c, String fieldName) {
// 获取指定类中声明的所有字段
Field[] fields = c.getDeclaredFields();
// 遍历所有字段
for (Field f : fields) {
// 判断当前字段名是否与指定的字段名相等
if (fieldName.equals(f.getName())) {
// 如果相等则返回true
return true;
}
}
// 遍历完所有字段后若未找到匹配的字段则返回false
return false;
}
// 定义主方法,用于测试代码逻辑
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// 以下是测试代码,被注释掉,可根据需要启用
// ChengpinEntity chengpinEntity1 = new ChengpinEntity();
// chengpinEntity1.setId(2);
// chengpinEntity1.setXiaoshourenyuanId(3);
// chengpinEntity1.setChengpinUuidNumber("4");
// chengpinEntity1.setChengpinName("6");
// chengpinEntity1.setChengpinSchool("7");
// chengpinEntity1.setChengpinLianxifangshi("8");
// chengpinEntity1.setChengpinXiaoshouJine(9.0);
// chengpinEntity1.setChengpinTichengJine(10.0);
// chengpinEntity1.setLunwenTypes(11);
// chengpinEntity1.setLunwenXiaoshouJine(12.1);
// chengpinEntity1.setLunwenTichengJine(13.1);
// chengpinEntity1.setChengpinZhuangtaiTypes(14);
// chengpinEntity1.setChengpinFile("15");
// chengpinEntity1.setChengpinText("16");
// chengpinEntity1.setChengpinDelete(1);
// chengpinEntity1.setInsertTime(new Date());
// chengpinEntity1.setUpdateTime(null);
// chengpinEntity1.setCreateTime(null);
// ChengpinEntity chengpinEntity2 = new ChengpinEntity();
// chengpinEntity2.setId(3);
// chengpinEntity2.setXiaoshourenyuanId(4);
// chengpinEntity2.setChengpinUuidNumber("4");
// chengpinEntity2.setChengpinName("6");
// chengpinEntity2.setChengpinSchool("7");
// chengpinEntity2.setChengpinLianxifangshi("8");
// chengpinEntity2.setChengpinXiaoshouJine(9.0);
// chengpinEntity2.setChengpinTichengJine(10.0);
// chengpinEntity2.setLunwenTypes(11);
// chengpinEntity2.setLunwenXiaoshouJine(12.1);
// chengpinEntity2.setLunwenTichengJine(13.1);
// chengpinEntity2.setChengpinZhuangtaiTypes(14);
// chengpinEntity2.setChengpinFile("16");
// chengpinEntity2.setChengpinText("16");
// chengpinEntity2.setChengpinDelete(1);
// chengpinEntity2.setInsertTime(null);
// chengpinEntity2.setUpdateTime(new Date());
// chengpinEntity2.setCreateTime(null);
// List<String> strings = new ClazzDiff<ChengpinEntity>().ClazzDiffColumn(chengpinEntity1, chengpinEntity2,new String[]{"serialVersionUID"});
// List<String> strings = new ClazzDiff().ClazzDiffColumn(chengpinEntity1, chengpinEntity2);
// System.out.println(strings);
}
}

@ -0,0 +1,58 @@
// 定义当前接口所在的包路径
package com.service;
// 导入Java集合框架中的List接口
import java.util.List;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 通用服务接口定义
public interface CommonService {
// 饼图数据求和统计方法
List<Map<String, Object>> pieSum(Map<String, Object> params);
// 饼图数据计数统计方法
List<Map<String, Object>> pieCount(Map<String, Object> params);
// 柱状图第一种数据求和统计方法
List<Map<String, Object>> barSumOne(Map<String, Object> params);
// 柱状图第一种数据计数统计方法
List<Map<String, Object>> barCountOne(Map<String, Object> params);
// 柱状图第二种数据求和统计方法
List<Map<String, Object>> barSumTwo(Map<String, Object> params);
// 柱状图第二种数据计数统计方法
List<Map<String, Object>> barCountTwo(Map<String, Object> params);
// 查询评分数据方法
// params参数包含
// tableName - 查询表名
// condition1 - 查询条件1
// condition1Value - 条件1的值
// average - 是否计算平均评分
Map<String, Object> queryScore(Map<String, Object> params);
// 新的级联字典表分组求和统计方法
// params - 包含查询条件的参数Map
// 返回分组求和结果列表
List<Map<String, Object>> newSelectGroupSum(Map<String, Object> params);
// 新的级联字典表分组计数统计方法
// params - 包含查询条件的参数Map
// 返回分组计数结果列表
List<Map<String, Object>> newSelectGroupCount(Map<String, Object> params);
// 通用柱状图数据求和方法
// params - 包含查询条件的参数Map
// 返回柱状图求和数据列表
List<Map<String, Object>> barSum(Map<String, Object> params);
// 通用柱状图数据计数方法
// params - 包含查询条件的参数Map
// 返回柱状图计数数据列表
List<Map<String, Object>> barCount(Map<String, Object> params);
}

@ -0,0 +1,73 @@
package com.service.impl; // 定义服务实现类所在的包
import java.util.List; // 导入List集合接口
import java.util.Map; // 导入Map集合接口
import org.springframework.beans.factory.annotation.Autowired; // Spring自动注入注解
import org.springframework.stereotype.Service; // Spring服务组件注解
import com.dao.CommonDao; // 导入通用数据访问接口
import com.service.CommonService; // 导入通用服务接口
@Service("commonService") // 声明为Spring服务组件指定bean名称
public class CommonServiceImpl implements CommonService { // 实现通用服务接口
@Autowired // 自动注入通用数据访问对象
private CommonDao commonDao;
// 获取饼图数据求和结果
public List<Map<String, Object>> pieSum(Map<String, Object> params){
return commonDao.pieSum(params); // 调用DAO层方法
}
// 获取饼图数据计数结果
public List<Map<String, Object>> pieCount(Map<String, Object> params){
return commonDao.pieCount(params); // 调用DAO层方法
}
// 获取第一种柱状图数据求和结果
public List<Map<String, Object>> barSumOne(Map<String, Object> params){
return commonDao.barSumOne(params); // 调用DAO层方法
}
// 获取第一种柱状图数据计数结果
public List<Map<String, Object>> barCountOne(Map<String, Object> params){
return commonDao.barCountOne(params); // 调用DAO层方法
}
// 获取第二种柱状图数据求和结果
public List<Map<String, Object>> barSumTwo(Map<String, Object> params){
return commonDao.barSumTwo(params); // 调用DAO层方法
}
// 获取第二种柱状图数据计数结果
public List<Map<String, Object>> barCountTwo(Map<String, Object> params){
return commonDao.barCountTwo(params); // 调用DAO层方法
}
// 查询评分数据
// @param params 包含查询参数表名、条件1、条件1值、是否计算平均分
public Map<String, Object> queryScore(Map<String, Object> params){
return commonDao.queryScore(params); // 调用DAO层方法
}
// 新的级联字典表分组求和统计
@Override
public List<Map<String, Object>> newSelectGroupSum(Map<String, Object> params) {
return commonDao.newSelectGroupSum(params); // 调用DAO层方法
}
// 新的级联字典表分组计数统计
@Override
public List<Map<String, Object>> newSelectGroupCount(Map<String, Object> params) {
return commonDao.newSelectGroupCount(params); // 调用DAO层方法
}
// 柱状图数据求和
public List<Map<String, Object>> barSum(Map<String, Object> params){
return commonDao.barSum(params); // 调用DAO层方法
}
// 柱状图数据计数
public List<Map<String, Object>> barCount(Map<String, Object> params){
return commonDao.barCount(params); // 调用DAO层方法
}
}

@ -0,0 +1,78 @@
// 声明该类所在的包名为 com.utils
package com.utils;
// 导入 Java 中的工具包,包含常用的工具类,如集合类
import java.util.*;
// 定义一个公共类 CommonUtil用于存放公共方法
public class CommonUtil {
// 定义一个静态方法,用于获取指定长度的随机字符串
// 参数 num 表示要生成的随机字符串的长度
public static String getRandomString(Integer num) {
// 定义一个包含所有可能字符的基础字符串
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
// 创建一个 Random 对象,用于生成随机数
Random random = new Random();
// 创建一个 StringBuffer 对象,用于拼接随机字符
StringBuffer sb = new StringBuffer();
// 循环 num 次,每次生成一个随机字符并添加到 StringBuffer 中
for (int i = 0; i < num; i++) {
// 生成一个 0 到 base 字符串长度之间的随机整数
int number = random.nextInt(base.length());
// 根据随机整数从 base 字符串中取出对应的字符,并添加到 StringBuffer 中
sb.append(base.charAt(number));
}
// 将 StringBuffer 转换为字符串并返回
return sb.toString();
}
// 定义一个静态方法,用于检查 Map 参数并添加缺失的参数
// 参数 params 是一个存储键值对的 Map 对象
public static void checkMap(Map<String, Object> params) {
// 初始化四个布尔变量,用于标记是否存在特定的键
boolean page = true, limit = true, sort = true, order = true;
// 获取 Map 中键值对的迭代器
Iterator<Map.Entry<String, Object>> iter = params.entrySet().iterator();
// 遍历 Map 中的键值对
while (iter.hasNext()) {
// 获取当前的键值对
Map.Entry<String, Object> info = iter.next();
// 获取键值对中的键
Object key = info.getKey();
// 获取键值对中的值
Object value = info.getValue();
// 如果值为 null、空字符串或 "null",则从 Map 中移除该键值对
if (value == null || "".equals(value) || "null".equals(value)) {
iter.remove();
// 如果键为 "page",则将 page 标记设为 false
} else if ("page".equals(key)) {
page = false;
// 如果键为 "limit",则将 limit 标记设为 false
} else if ("limit".equals(key)) {
limit = false;
// 如果键为 "sort",则将 sort 标记设为 false
} else if ("sort".equals(key)) {
sort = false;
// 如果键为 "order",则将 order 标记设为 false
} else if ("order".equals(key)) {
order = false;
}
}
// 如果 page 标记仍为 true说明 Map 中不存在 "page" 键,添加默认值 "1"
if (page) {
params.put("page", "1");
}
// 如果 limit 标记仍为 true说明 Map 中不存在 "limit" 键,添加默认值 "10"
if (limit) {
params.put("limit", "10");
}
// 如果 sort 标记仍为 true说明 Map 中不存在 "sort" 键,添加默认值 "id"
if (sort) {
params.put("sort", "id");
}
// 如果 order 标记仍为 true说明 Map 中不存在 "order" 键,添加默认值 "desc"
if (order) {
params.put("order", "desc");
}
}
}

@ -0,0 +1,24 @@
// 定义当前接口所在的包路径
package com.service;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入配置实体类
import com.entity.ConfigEntity;
// 导入分页工具类
import com.utils.PageUtils;
// 系统配置服务接口
// 继承MyBatis-Plus通用服务接口
// 泛型参数为ConfigEntity配置实体类
public interface ConfigService extends IService<ConfigEntity> {
// 分页查询配置数据方法
// params - 包含查询条件的参数Map
// 返回分页工具对象
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,27 @@
package com.service.impl; // 定义服务实现类所在的包
import java.util.Map; // 导入Map集合接口
import org.springframework.stereotype.Service; // Spring服务组件注解
import com.baomidou.mybatisplus.mapper.EntityWrapper; // MyBatis-Plus条件构造器
import com.baomidou.mybatisplus.plugins.Page; // MyBatis-Plus分页组件
import com.baomidou.mybatisplus.service.impl.ServiceImpl; // MyBatis-Plus服务实现基类
import com.dao.ConfigDao; // 导入配置数据访问接口
import com.entity.ConfigEntity; // 导入配置实体类
import com.service.ConfigService; // 导入配置服务接口
import com.utils.PageUtils; // 导入分页工具类
import com.utils.Query; // 导入查询工具类
@Service("configService") // 声明为Spring服务组件指定bean名称
public class ConfigServiceImpl extends ServiceImpl<ConfigDao, ConfigEntity> implements ConfigService {
@Override // 重写接口方法
public PageUtils queryPage(Map<String, Object> params) {
// 调用父类分页查询方法
Page<ConfigEntity> page = this.selectPage(
new Query<ConfigEntity>(params).getPage(), // 创建分页参数
new EntityWrapper<ConfigEntity>() // 创建空条件构造器
);
// 返回自定义分页结果
return new PageUtils(page);
}
}

@ -0,0 +1,25 @@
package com.utils; // 声明包名为com.utils
// 导入用于格式化日期的Format类
import java.text.Format;
// 导入用于格式化日期的SimpleDateFormat类
import java.text.SimpleDateFormat;
// 导入用于表示日期的Date类
import java.util.Date;
// 定义日期工具类DateUtil
public class DateUtil {
// 定义静态方法convertString将Date类型的日期转换为指定格式的字符串
// date为要转换的日期对象format为目标日期格式的字符串
public static String convertString(Date date, String format) {
// 判断日期对象是否为空
if (date == null) {
// 如果为空直接返回null
return null;
}
// 创建SimpleDateFormat对象使用传入的格式字符串进行初始化
SimpleDateFormat sdf = new SimpleDateFormat(format);
// 使用SimpleDateFormat对象将日期格式化为字符串并返回
return sdf.format(date);
}
}

@ -0,0 +1,34 @@
// 定义当前接口所在的包路径
package com.service;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入分页工具类
import com.utils.PageUtils;
// 导入字典实体类
import com.entity.DictionaryEntity;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Java集合框架中的List接口
import java.util.List;
// 字典服务接口
// 继承MyBatis-Plus通用服务接口
// 泛型参数为DictionaryEntity字典实体类
public interface DictionaryService extends IService<DictionaryEntity> {
// 分页查询字典数据方法
// params - 包含查询条件的参数Map
// 返回分页工具对象
PageUtils queryPage(Map<String, Object> params);
// 字典表数据转换方法
// obj - 需要进行字典转换的对象
// request - HTTP请求对象
void dictionaryConvert(Object obj, HttpServletRequest request);
}

@ -0,0 +1,107 @@
package com.service.impl; // 定义服务实现类包路径
import com.utils.StringUtil; // 导入字符串工具类
import com.service.DictionaryService; // 导入字典服务接口
import com.utils.ClazzDiff; // 导入类差异工具类
import org.springframework.beans.BeanUtils; // 导入Spring Bean工具类
import org.springframework.beans.factory.annotation.Autowired; // 导入自动装配注解
import org.springframework.stereotype.Service; // 导入服务注解
import java.lang.reflect.Field; // 导入反射Field类
import java.util.*; // 导入常用集合类
import com.baomidou.mybatisplus.plugins.Page; // 导入MyBatis-Plus分页组件
import com.baomidou.mybatisplus.service.impl.ServiceImpl; // 导入MyBatis-Plus服务实现基类
import org.springframework.transaction.annotation.Transactional; // 导入事务注解
import com.utils.PageUtils; // 导入分页工具类
import com.utils.Query; // 导入查询工具类
import org.springframework.web.context.ContextLoader; // 导入上下文加载器
import javax.servlet.ServletContext; // 导入Servlet上下文接口
import javax.servlet.http.HttpServletRequest; // 导入HTTP请求接口
import org.springframework.lang.Nullable; // 导入可空注解
import org.springframework.util.Assert; // 导入断言工具
import com.dao.DictionaryDao; // 导入字典数据访问接口
import com.entity.DictionaryEntity; // 导入字典实体类
import com.service.DictionaryService; // 导入字典服务接口
import com.entity.view.DictionaryView; // 导入字典视图类
@Service("dictionaryService") // 声明为Spring服务组件
@Transactional // 启用事务管理
public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService {
@Override // 重写分页查询方法
public PageUtils queryPage(Map<String,Object> params) {
Page<DictionaryView> page =new Query<DictionaryView>(params).getPage(); // 创建分页对象
page.setRecords(baseMapper.selectListView(page,params)); // 设置分页记录
return new PageUtils(page); // 返回分页结果
}
public void dictionaryConvert(Object obj, HttpServletRequest request) {
try {
if (obj == null) return; // 空对象直接返回
List<String> fieldNameList = new ArrayList<>(); // 创建字段名列表
Class tempClass = obj.getClass(); // 获取对象类
while (tempClass !=null) {
Field[] declaredFields = tempClass.getDeclaredFields(); // 获取所有声明字段
for (Field f : declaredFields) {
f.setAccessible(true); // 设置字段可访问
if (f.getType().getName().equals("java.lang.Integer") && f.getName().contains("Types")) {
fieldNameList.add(f.getName()); // 添加符合条件的字段名
}
}
tempClass = tempClass.getSuperclass(); // 获取父类继续查找
}
ServletContext servletContext = request.getServletContext(); // 获取Servlet上下文
Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap"); // 获取字典映射
for (String s : fieldNameList) {
Field types = null; // 声明Types字段
if(hasField(obj.getClass(),s)){
types= obj.getClass().getDeclaredField(s); // 获取当前类字段
}else{
types=obj.getClass().getSuperclass().getDeclaredField(s); // 获取父类字段
}
Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value")); // 获取Value字段
types.setAccessible(true); // 设置可访问
value.setAccessible(true); // 设置可访问
if (StringUtil.isNotEmpty(String.valueOf(types.get(obj)))) { // 值不为空
int i = Integer.parseInt(String.valueOf(types.get(obj))); // 获取整数值
char[] chars = s.toCharArray(); // 转换为字符数组
StringBuffer sbf = new StringBuffer(); // 创建字符串缓冲区
for(int b=0; b< chars.length; b++){
char ch = chars[b]; // 获取当前字符
if(ch <= 90 && ch >= 65){ // 大写字母处理
sbf.append("_"); // 添加下划线
ch += 32; // 转小写
}
sbf.append(ch); // 添加字符
}
String s2 = dictionaryMap.get(sbf.toString()).get(i); // 获取字典值
value.set(obj, s2); // 设置字段值
} else {
new Exception("字典表赋值出现问题::::"+value.getName()); // 抛出异常
value.set(obj, ""); // 设置空值
}
}
} catch (IllegalAccessException e) {
e.printStackTrace(); // 打印异常
} catch (NoSuchFieldException e) {
e.printStackTrace(); // 打印异常
} catch (Exception e) {
e.printStackTrace(); // 打印异常
}
}
public boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields(); // 获取所有声明字段
for (Field f : fields) {
if (fieldName.equals(f.getName())) { // 匹配字段名
return true; // 返回存在
}
}
return false; // 返回不存在
}
}

@ -0,0 +1,94 @@
// 定义当前类所在的包路径
package com.ServletContextListener;
// 导入MyBatis-Plus实体包装类
import com.baomidou.mybatisplus.mapper.EntityWrapper;
// 导入字典实体类
import com.entity.DictionaryEntity;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入自定义线程方法类
import com.thread.MyThreadMethod;
// 导入日志记录器接口
import org.slf4j.Logger;
// 导入日志工厂类
import org.slf4j.LoggerFactory;
// 导入Spring应用上下文接口
import org.springframework.context.ApplicationContext;
// 导入Web应用上下文工具类
import org.springframework.web.context.support.WebApplicationContextUtils;
// 导入Servlet监听器接口
import javax.servlet.ServletContextListener;
// 导入Servlet上下文事件类
import javax.servlet.ServletContextEvent;
// 导入Web监听器注解
import javax.servlet.annotation.WebListener;
// 导入HashMap实现类
import java.util.HashMap;
// 导入List集合接口
import java.util.List;
// 导入Map集合接口
import java.util.Map;
// 字典初始化监听器类
// 使用@WebListener注解声明为Servlet监听器
// 实现ServletContextListener接口
@WebListener
public class DictionaryServletContextListener implements ServletContextListener {
// 声明日志记录器
private static final Logger logger = LoggerFactory.getLogger(DictionaryServletContextListener.class);
// 声明自定义线程方法对象
private MyThreadMethod myThreadMethod;
// 上下文销毁方法实现
@Override
public void contextDestroyed(ServletContextEvent sce) {
// 记录服务器停止日志
logger.info("----------服务器停止----------");
}
// 上下文初始化方法实现
@Override
public void contextInitialized(ServletContextEvent sce) {
// 获取Spring应用上下文
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
// 记录字典表初始化开始日志
logger.info("----------字典表初始化开始----------");
// 从Spring容器获取字典服务实例
DictionaryService dictionaryService = (DictionaryService)appContext.getBean("dictionaryService");
// 查询所有字典数据
List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>());
// 创建字典映射表
Map<String, Map<Integer,String>> map = new HashMap<>();
// 遍历字典数据并构建映射关系
for(DictionaryEntity d :dictionaryEntities){
// 获取当前字典代码对应的映射表
Map<Integer, String> m = map.get(d.getDicCode());
// 如果映射表为空则新建
if(m ==null || m.isEmpty()){
m = new HashMap<>();
}
// 添加字典项到映射表
m.put(d.getCodeIndex(),d.getIndexName());
// 更新字典映射表
map.put(d.getDicCode(),m);
}
// 将字典映射表存入Servlet上下文
sce.getServletContext().setAttribute("dictionaryMap", map);
// 记录字典表初始化完成日志
logger.info("----------字典表初始化完成----------");
// 记录线程执行开始日志
logger.info("----------线程执行开始----------");
// 初始化并启动自定义线程
if (myThreadMethod == null) {
myThreadMethod = new MyThreadMethod();
myThreadMethod.start(); // 在Servlet上下文初始化时启动线程
}
// 记录线程执行结束日志
logger.info("----------线程执行结束----------");
}
}

@ -0,0 +1,22 @@
package com.utils; // 声明包路径
import java.io.ByteArrayOutputStream; // 导入字节数组输出流类
import java.io.File; // 导入文件操作类
import java.io.FileInputStream; // 导入文件输入流类
import java.io.IOException; // 导入IO异常类
import java.io.InputStream; // 导入输入流基类
public class FileUtil { // 文件工具类定义
public static byte[] FileToByte(File file) throws IOException { // 文件转字节数组方法
@SuppressWarnings("resource") // 忽略资源未关闭警告
InputStream content = new FileInputStream(file); // 创建文件输入流
ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); // 创建字节数组输出流
byte[] buff = new byte[100]; // 创建100字节缓冲区
int rc = 0; // 读取字节数变量
while ((rc = content.read(buff, 0, 100)) > 0) { // 循环读取文件内容
swapStream.write(buff, 0, rc); // 将读取内容写入输出流
}
return swapStream.toByteArray(); // 返回字节数组
}
}

@ -0,0 +1,29 @@
// 定义当前接口所在的包路径
package com.service;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入分页工具类
import com.utils.PageUtils;
// 导入健身论坛实体类
import com.entity.ForumEntity;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Java集合框架中的List接口
import java.util.List;
// 健身论坛服务接口
// 继承MyBatis-Plus通用服务接口
// 泛型参数为ForumEntity论坛实体类
public interface ForumService extends IService<ForumEntity> {
// 分页查询论坛数据方法
// params - 包含查询条件的参数Map
// 返回分页工具对象
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,67 @@
// 定义包名为 com.service.impl
package com.service.impl;
// 导入 com.utils 包下的 StringUtil 类
import com.utils.StringUtil;
// 导入 com.service 包下的 DictionaryService 接口
import com.service.DictionaryService;
// 导入 com.utils 包下的 ClazzDiff 类
import com.utils.ClazzDiff;
// 导入 Spring 框架的 BeanUtils 类
import org.springframework.beans.BeanUtils;
// 导入 Spring 框架的 Autowired 注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入 Spring 框架的 Service 注解
import org.springframework.stereotype.Service;
// 导入 Java 反射机制中的 Field 类
import java.lang.reflect.Field;
// 导入 Java 集合框架中的相关类
import java.util.*;
// 导入 MyBatis-Plus 的 Page 类
import com.baomidou.mybatisplus.plugins.Page;
// 导入 MyBatis-Plus 的 ServiceImpl 类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入 Spring 框架的 Transactional 注解
import org.springframework.transaction.annotation.Transactional;
// 导入自定义的 PageUtils 类
import com.utils.PageUtils;
// 导入自定义的 Query 类
import com.utils.Query;
// 导入 Spring 框架的 ContextLoader 类
import org.springframework.web.context.ContextLoader;
// 导入 Servlet 上下文类
import javax.servlet.ServletContext;
// 导入 HTTP 请求类
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架的 Nullable 注解
import org.springframework.lang.Nullable;
// 导入 Spring 框架的 Assert 类
import org.springframework.util.Assert;
// 导入数据访问对象 ForumDao 接口
import com.dao.ForumDao;
// 导入实体类 ForumEntity
import com.entity.ForumEntity;
// 导入服务接口 ForumService
import com.service.ForumService;
// 导入视图类 ForumView
import com.entity.view.ForumView;
// 使用 Spring 的 Service 注解,将该类标记为服务组件,名称为 forumService
@Service("forumService")
// 使用 Spring 的 Transactional 注解,开启事务管理
@Transactional
// 定义 ForumServiceImpl 类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 ForumService 接口
public class ForumServiceImpl extends ServiceImpl<ForumDao, ForumEntity> implements ForumService {
// 重写 ForumService 接口中的 queryPage 方法
@Override
// 定义 queryPage 方法,用于查询分页数据,接收一个包含查询参数的 Map 对象
public PageUtils queryPage(Map<String,Object> params) {
// 根据传入的参数创建一个 ForumView 类型的分页对象
Page<ForumView> page =new Query<ForumView>(params).getPage();
// 调用 baseMapper 的 selectListView 方法查询数据列表,并设置到分页对象中
page.setRecords(baseMapper.selectListView(page,params));
// 根据分页对象创建 PageUtils 对象并返回
return new PageUtils(page);
}
}

@ -0,0 +1,29 @@
package com.utils; // 声明工具类所在包
import java.io.BufferedReader; // 导入缓冲字符输入流
import java.io.InputStreamReader; // 导入字节流转字符流
import java.net.HttpURLConnection; // 导入HTTP连接类
import java.net.URL; // 导入URL处理类
public class HttpClientUtils { // HTTP客户端工具类
public static String doGet(String uri) { // GET请求方法
StringBuilder result = new StringBuilder(); // 创建结果字符串构建器
try {
String res = ""; // 初始化响应字符串
URL url = new URL(uri); // 创建URL对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 打开HTTP连接
BufferedReader in = new BufferedReader( // 创建缓冲读取器
new InputStreamReader(conn.getInputStream(), "UTF-8")); // 使用UTF-8编码读取输入流
String line; // 声明行字符串变量
while ((line = in.readLine()) != null) { // 逐行读取响应内容
res += line+"\n"; // 拼接每行内容并换行
}
in.close(); // 关闭输入流
return res; // 返回响应结果
} catch (Exception e) { // 异常处理
e.printStackTrace(); // 打印异常堆栈
return null; // 返回空值
}
}
}

@ -0,0 +1,65 @@
package com.utils; // 声明包名为 com.utils
// 定义一个名为 JQPageInfo 的类,用于封装分页信息
public class JQPageInfo {
// 定义一个私有整数类型变量 page用于存储当前页码
private Integer page;
// 定义一个私有整数类型变量 limit用于存储每页显示的记录数
private Integer limit;
// 定义一个私有字符串类型变量 sidx用于存储排序的字段
private String sidx;
// 定义一个私有字符串类型变量 order用于存储排序的顺序升序或降序
private String order;
// 定义一个私有整数类型变量 offset用于存储偏移量
private Integer offset;
// 定义一个公共方法 getPage用于获取当前页码
public Integer getPage() {
return page;
}
// 定义一个公共方法 setPage用于设置当前页码
public void setPage(Integer page) {
this.page = page;
}
// 定义一个公共方法 getLimit用于获取每页显示的记录数
public Integer getLimit() {
return limit;
}
// 定义一个公共方法 setLimit用于设置每页显示的记录数
public void setLimit(Integer limit) {
this.limit = limit;
}
// 定义一个公共方法 getSidx用于获取排序的字段
public String getSidx() {
return sidx;
}
// 定义一个公共方法 setSidx用于设置排序的字段
public void setSidx(String sidx) {
this.sidx = sidx;
}
// 定义一个公共方法 getOrder用于获取排序的顺序
public String getOrder() {
return order;
}
// 定义一个公共方法 setOrder用于设置排序的顺序
public void setOrder(String order) {
this.order = order;
}
// 定义一个公共方法 getOffset用于获取偏移量
public Integer getOffset() {
return offset;
}
// 定义一个公共方法 setOffset用于设置偏移量
public void setOffset(Integer offset) {
this.offset = offset;
}
}

@ -0,0 +1,25 @@
// 声明该接口所在的包为 com.service
package com.service;
// 导入 MyBatis-Plus 的 IService 接口,这是 MyBatis-Plus 提供的通用服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入自定义的分页工具类,用于处理分页结果
import com.utils.PageUtils;
// 导入课程收藏实体类,对应数据库中的课程收藏表
import com.entity.JianshenkechengCollectionEntity;
// 导入 Java 的 Map 接口,用于存储键值对,通常用于传递查询参数
import java.util.Map;
// 导入 Servlet 的 HttpServletRequest 类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架的可空注解,表明参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 Java 的 List 接口,用于存储元素集合
import java.util.List;
// 定义课程收藏服务接口,继承自 MyBatis-Plus 的 IService 接口
public interface JianshenkechengCollectionService extends IService<JianshenkechengCollectionEntity> {
// 定义查询分页数据的方法,接收一个包含查询参数的 Map 对象
// 返回值为 PageUtils 对象,包含分页信息和查询结果
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,67 @@
// 声明该类所在的包为 com.service.impl
package com.service.impl;
// 导入 com.utils 包下的 StringUtil 工具类
import com.utils.StringUtil;
// 导入 com.service 包下的 DictionaryService 接口
import com.service.DictionaryService;
// 导入 com.utils 包下的 ClazzDiff 工具类
import com.utils.ClazzDiff;
// 导入 Spring 框架的 BeanUtils 类,用于 Bean 属性的复制等操作
import org.springframework.beans.BeanUtils;
// 导入 Spring 框架的 Autowired 注解,用于自动装配依赖
import org.springframework.beans.factory.annotation.Autowired;
// 导入 Spring 框架的 Service 注解,将该类标记为服务层组件
import org.springframework.stereotype.Service;
// 导入 Java 反射机制中的 Field 类,用于操作类的字段
import java.lang.reflect.Field;
// 导入 Java 集合框架的相关类,用于处理集合数据
import java.util.*;
// 导入 MyBatis-Plus 的 Page 类,用于分页操作
import com.baomidou.mybatisplus.plugins.Page;
// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入 Spring 框架的 Transactional 注解,用于开启事务管理
import org.springframework.transaction.annotation.Transactional;
// 导入自定义的 PageUtils 类,用于处理分页结果
import com.utils.PageUtils;
// 导入自定义的 Query 类,用于构建查询条件和分页信息
import com.utils.Query;
// 导入 Spring 框架的 ContextLoader 类,用于获取 Web 应用上下文
import org.springframework.web.context.ContextLoader;
// 导入 Servlet 上下文类
import javax.servlet.ServletContext;
// 导入 HTTP 请求类
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架的 Nullable 注解,标记参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 Spring 框架的 Assert 类,用于进行断言检查
import org.springframework.util.Assert;
// 导入课程收藏的数据访问对象接口
import com.dao.JianshenkechengCollectionDao;
// 导入课程收藏的实体类
import com.entity.JianshenkechengCollectionEntity;
// 导入课程收藏的服务接口
import com.service.JianshenkechengCollectionService;
// 导入课程收藏的视图类
import com.entity.view.JianshenkechengCollectionView;
// 使用 Service 注解将该类注册为 Spring 服务组件,名称为 jianshenkechengCollectionService
@Service("jianshenkechengCollectionService")
// 使用 Transactional 注解开启事务管理
@Transactional
// 定义课程收藏服务实现类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 JianshenkechengCollectionService 接口
public class JianshenkechengCollectionServiceImpl extends ServiceImpl<JianshenkechengCollectionDao, JianshenkechengCollectionEntity> implements JianshenkechengCollectionService {
// 重写 JianshenkechengCollectionService 接口中的 queryPage 方法
@Override
// 实现分页查询课程收藏数据的方法,接收一个包含查询参数的 Map 对象
public PageUtils queryPage(Map<String,Object> params) {
// 根据传入的查询参数创建一个 JianshenkechengCollectionView 类型的分页对象
Page<JianshenkechengCollectionView> page = new Query<JianshenkechengCollectionView>(params).getPage();
// 调用数据访问对象的方法查询分页列表数据,并设置到分页对象中
page.setRecords(baseMapper.selectListView(page, params));
// 根据分页对象创建 PageUtils 对象并返回
return new PageUtils(page);
}
}

@ -0,0 +1,29 @@
// 定义当前接口所在的包路径
package com.service;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入分页工具类
import com.utils.PageUtils;
// 导入课程留言实体类
import com.entity.JianshenkechengLiuyanEntity;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Java集合框架中的List接口
import java.util.List;
// 课程留言服务接口
// 继承MyBatis-Plus通用服务接口
// 泛型参数为JianshenkechengLiuyanEntity课程留言实体类
public interface JianshenkechengLiuyanService extends IService<JianshenkechengLiuyanEntity> {
// 分页查询课程留言数据方法
// params - 包含查询条件的参数Map
// 返回封装好的分页工具对象
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,71 @@
// 声明当前文件所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典数据服务接口
import com.service.DictionaryService;
// 导入类差异比较工具类
import com.utils.ClazzDiff;
// 导入Spring框架的Bean属性复制工具类
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务层组件注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合框架核心类
import java.util.*;
// 导入MyBatis-Plus分页插件类
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务管理注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象类
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值标记注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具类
import org.springframework.util.Assert;
// 导入课程留言数据访问接口
import com.dao.JianshenkechengLiuyanDao;
// 导入课程留言实体类
import com.entity.JianshenkechengLiuyanEntity;
// 导入课程留言服务接口
import com.service.JianshenkechengLiuyanService;
// 导入课程留言视图对象类
import com.entity.view.JianshenkechengLiuyanView;
// 使用@Service注解声明为Spring服务组件并指定bean名称
@Service("jianshenkechengLiuyanService")
// 使用@Transactional注解声明类级别事务所有公共方法默认开启事务
@Transactional
// 课程留言服务实现类继承MyBatis-Plus通用服务实现类
public class JianshenkechengLiuyanServiceImpl
extends ServiceImpl<JianshenkechengLiuyanDao, JianshenkechengLiuyanEntity>
implements JianshenkechengLiuyanService {
// 实现分页查询接口方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 使用Query工具类根据参数创建分页对象
Page<JianshenkechengLiuyanView> page = new Query<JianshenkechengLiuyanView>(params).getPage();
// 调用Mapper查询分页数据并设置到page对象
page.setRecords(baseMapper.selectListView(page,params));
// 返回封装好的分页工具类实例
return new PageUtils(page);
}
}

@ -0,0 +1,25 @@
// 声明该类所在的包为 com.service
package com.service;
// 导入 MyBatis-Plus 提供的 IService 接口,用于实现通用的 CRUD 操作
import com.baomidou.mybatisplus.service.IService;
// 导入自定义的 PageUtils 类,用于处理分页相关操作
import com.utils.PageUtils;
// 导入健身课程实体类,用于表示健身课程的数据结构
import com.entity.JianshenkechengEntity;
// 导入 Map 类,用于存储键值对,通常用于传递查询参数
import java.util.Map;
// 导入 HttpServletRequest 类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架中的 Nullable 注解,用于标记参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 List 类,用于存储有序的元素集合
import java.util.List;
// 定义一个名为 JianshenkechengService 的接口,它继承自 IService<JianshenkechengEntity>
public interface JianshenkechengService extends IService<JianshenkechengEntity> {
// 定义一个名为 queryPage 的方法,用于根据传入的查询参数进行分页查询
// 参数 params 是一个 Map用于存储查询所需的各种参数
// 返回值是 PageUtils 类型,包含了分页查询后的结果
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,73 @@
// 定义当前类所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入类差异比较工具
import com.utils.ClazzDiff;
// 导入Spring Bean属性复制工具
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合类
import java.util.*;
// 导入MyBatis-Plus分页插件
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具
import org.springframework.util.Assert;
// 导入健身课程DAO接口
import com.dao.JianshenkechengDao;
// 导入健身课程实体类
import com.entity.JianshenkechengEntity;
// 导入健身课程服务接口
import com.service.JianshenkechengService;
// 导入健身课程视图类
import com.entity.view.JianshenkechengView;
// 声明为Spring服务组件指定bean名称
@Service("jianshenkechengService")
// 启用类级别事务管理
@Transactional
// 健身课程服务实现类
// 继承MyBatis-Plus通用服务实现类
// 实现健身课程服务接口
public class JianshenkechengServiceImpl
extends ServiceImpl<JianshenkechengDao, JianshenkechengEntity>
implements JianshenkechengService {
// 实现分页查询方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 创建分页查询对象
Page<JianshenkechengView> page = new Query<JianshenkechengView>(params).getPage();
// 执行分页查询并设置结果
page.setRecords(baseMapper.selectListView(page,params));
// 返回分页工具对象
return new PageUtils(page);
}
// 类结束
}

@ -0,0 +1,29 @@
// 定义当前接口所在的包路径
package com.service;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入分页工具类
import com.utils.PageUtils;
// 导入教练实体类
import com.entity.JiaolianEntity;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Java集合框架中的List接口
import java.util.List;
// 教练服务接口定义
// 继承MyBatis-Plus通用服务接口
// 泛型参数为JiaolianEntity教练实体类
public interface JiaolianService extends IService<JiaolianEntity> {
// 分页查询教练数据方法
// params - 包含查询条件的参数Map
// 返回封装好的分页工具对象
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,73 @@
// 定义当前类所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入类差异比较工具
import com.utils.ClazzDiff;
// 导入Spring Bean属性复制工具
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合类
import java.util.*;
// 导入MyBatis-Plus分页插件
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具
import org.springframework.util.Assert;
// 导入教练DAO接口
import com.dao.JiaolianDao;
// 导入教练实体类
import com.entity.JiaolianEntity;
// 导入教练服务接口
import com.service.JiaolianService;
// 导入教练视图类
import com.entity.view.JiaolianView;
// 声明为Spring服务组件指定bean名称
@Service("jiaolianService")
// 启用类级别事务管理
@Transactional
// 教练服务实现类
// 继承MyBatis-Plus通用服务实现类
// 实现教练服务接口
public class JiaolianServiceImpl
extends ServiceImpl<JiaolianDao, JiaolianEntity>
implements JiaolianService {
// 实现分页查询方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 创建分页查询对象
Page<JiaolianView> page = new Query<JiaolianView>(params).getPage();
// 执行分页查询并设置结果
page.setRecords(baseMapper.selectListView(page,params));
// 返回分页工具对象
return new PageUtils(page);
}
// 类结束
}

@ -0,0 +1,25 @@
// 指定该代码文件所属的包为 com.service
package com.service;
// 导入 MyBatis-Plus 框架提供的 IService 接口,用于实现通用的单表业务逻辑
import com.baomidou.mybatisplus.service.IService;
// 导入自定义的 PageUtils 类,用于处理分页查询结果
import com.utils.PageUtils;
// 导入教练预约申请实体类,代表数据库中教练预约申请的数据结构
import com.entity.JiaolianYuyueEntity;
// 导入 Map 类,用于存储键值对,可作为查询参数
import java.util.Map;
// 导入 HttpServletRequest 类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架中的 Nullable 注解,表明参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 List 类,用于存储一组对象
import java.util.List;
// 定义一个名为 JiaolianYuyueService 的接口,继承自 IService<JiaolianYuyueEntity>,表示这是教练预约申请的服务接口
public interface JiaolianYuyueService extends IService<JiaolianYuyueEntity> {
// 定义一个方法用于分页查询教练预约申请数据
// params 参数为一个 Map 对象,存储了查询所需的条件
// 返回值为 PageUtils 对象,包含了分页查询后的结果
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,67 @@
// 指定该类所属的包为 com.service.impl
package com.service.impl;
// 导入自定义工具类 StringUtil可用于字符串处理相关操作
import com.utils.StringUtil;
// 导入服务接口 DictionaryService可能用于字典数据的服务操作
import com.service.DictionaryService;
// 导入自定义工具类 ClazzDiff也许用于类差异比较等操作
import com.utils.ClazzDiff;
// 导入 Spring 框架的 BeanUtils 类,用于 Bean 属性复制等操作
import org.springframework.beans.BeanUtils;
// 导入 Spring 框架的 Autowired 注解,用于自动注入依赖的 Bean
import org.springframework.beans.factory.annotation.Autowired;
// 导入 Spring 框架的 Service 注解,将该类标记为服务层组件
import org.springframework.stereotype.Service;
// 导入 Java 反射机制中的 Field 类,用于操作类的字段
import java.lang.reflect.Field;
// 导入 Java 集合框架中的常用类,用于处理集合数据
import java.util.*;
// 导入 MyBatis-Plus 的 Page 类,用于分页查询操作
import com.baomidou.mybatisplus.plugins.Page;
// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入 Spring 框架的 Transactional 注解,用于开启事务管理
import org.springframework.transaction.annotation.Transactional;
// 导入自定义的 PageUtils 类,用于处理分页结果
import com.utils.PageUtils;
// 导入自定义的 Query 类,用于构建查询条件和分页信息
import com.utils.Query;
// 导入 Spring 框架的 ContextLoader 类,用于获取 Web 应用上下文
import org.springframework.web.context.ContextLoader;
// 导入 Servlet 上下文接口,用于与 Servlet 容器交互
import javax.servlet.ServletContext;
// 导入 HTTP 请求对象类,用于处理 HTTP 请求
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架的 Nullable 注解,表明参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 Spring 框架的 Assert 类,用于进行断言检查
import org.springframework.util.Assert;
// 导入教练预约申请的数据访问对象接口
import com.dao.JiaolianYuyueDao;
// 导入教练预约申请的实体类
import com.entity.JiaolianYuyueEntity;
// 导入教练预约申请的服务接口
import com.service.JiaolianYuyueService;
// 导入教练预约申请的视图类
import com.entity.view.JiaolianYuyueView;
// 使用 Service 注解将该类标记为 Spring 服务组件,名称为 jiaolianYuyueService
@Service("jiaolianYuyueService")
// 使用 Transactional 注解开启事务管理
@Transactional
// 定义教练预约申请服务实现类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 JiaolianYuyueService 接口
public class JiaolianYuyueServiceImpl extends ServiceImpl<JiaolianYuyueDao, JiaolianYuyueEntity> implements JiaolianYuyueService {
// 重写 JiaolianYuyueService 接口中的 queryPage 方法
@Override
// 实现分页查询教练预约申请数据的方法,接收一个包含查询参数的 Map 对象
public PageUtils queryPage(Map<String, Object> params) {
// 根据传入的查询参数创建一个 JiaolianYuyueView 类型的分页对象
Page<JiaolianYuyueView> page = new Query<JiaolianYuyueView>(params).getPage();
// 调用数据访问对象的方法查询分页列表数据,并设置到分页对象中
page.setRecords(baseMapper.selectListView(page, params));
// 根据分页对象创建 PageUtils 对象并返回
return new PageUtils(page);
}
}

@ -0,0 +1,28 @@
package com.utils; // 声明工具类所在包
import java.math.BigInteger; // 导入大整数处理类
import java.security.MessageDigest; // 导入消息摘要类
import java.security.NoSuchAlgorithmException; // 导入无此算法异常类
public class MD5Utils { // MD5加密工具类
// MD5加密方法
public static String md5(String plainText) {
byte[] secretBytes = null; // 声明字节数组存储加密结果
try {
// 获取MD5算法实例并执行加密
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
// 抛出运行时异常MD5算法不存在时
throw new RuntimeException("没有这个md5算法");
}
// 将字节数组转换为16进制字符串
String md5code = new BigInteger(1, secretBytes).toString(16);
// 补全32位MD5字符串前面补0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code; // 返回32位MD5加密字符串
}
}

@ -0,0 +1,179 @@
package com.utils; // 声明工具类所在包
import java.util.Arrays; // 导入数组工具类
import java.util.HashMap; // 导入HashMap类
import java.util.Iterator; // 导入迭代器接口
import java.util.Map; // 导入Map接口
import org.apache.commons.lang3.StringUtils; // 导入字符串工具类
import cn.hutool.core.bean.BeanUtil; // 导入Bean工具类
import com.baomidou.mybatisplus.mapper.Wrapper; // 导入MyBatis-Plus条件构造器
public class MPUtil { // MyBatis-Plus工具类
public static final char UNDERLINE = '_'; // 下划线常量
// 带前缀的AllEQ条件转换
public static Map allEQMapPre(Object bean,String pre) {
Map<String, Object> map =BeanUtil.beanToMap(bean); // 将Bean转为Map
return camelToUnderlineMap(map,pre); // 转换键名并返回
}
// AllEQ条件转换
public static Map allEQMap(Object bean) {
Map<String, Object> map =BeanUtil.beanToMap(bean); // 将Bean转为Map
return camelToUnderlineMap(map,""); // 转换键名并返回
}
// 带前缀的LIKE条件构造
public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) {
Map<String, Object> map =BeanUtil.beanToMap(bean); // 将Bean转为Map
Map result = camelToUnderlineMap(map,pre); // 转换键名
return genLike(wrapper,result); // 生成LIKE条件
}
// LIKE条件构造
public static Wrapper allLike(Wrapper wrapper,Object bean) {
Map result = BeanUtil.beanToMap(bean, true, true); // 将Bean转为Map(忽略空值)
return genLike(wrapper,result); // 生成LIKE条件
}
// 生成LIKE条件
public static Wrapper genLike(Wrapper wrapper,Map param) {
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); // 获取迭代器
int i=0; // 计数器
while (it.hasNext()) { // 遍历Map
if(i>0) wrapper.and(); // 多个条件用AND连接
Map.Entry<String, Object> entry = it.next(); // 获取键值对
String key = entry.getKey(); // 获取字段名
String value = (String) entry.getValue(); // 获取字段值
wrapper.like(key, value); // 添加LIKE条件
i++; // 计数器递增
}
return wrapper; // 返回条件构造器
}
// LIKE或EQ条件构造
public static Wrapper likeOrEq(Wrapper wrapper,Object bean) {
Map result = BeanUtil.beanToMap(bean, true, true); // 将Bean转为Map(忽略空值)
return genLikeOrEq(wrapper,result); // 生成LIKE或EQ条件
}
// 生成LIKE或EQ条件
public static Wrapper genLikeOrEq(Wrapper wrapper,Map param) {
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); // 获取迭代器
int i=0; // 计数器
while (it.hasNext()) { // 遍历Map
if(i>0) wrapper.and(); // 多个条件用AND连接
Map.Entry<String, Object> entry = it.next(); // 获取键值对
String key = entry.getKey(); // 获取字段名
if(entry.getValue().toString().contains("%")) { // 判断是否包含%通配符
wrapper.like(key, entry.getValue().toString().replace("%", "")); // 添加LIKE条件
} else {
wrapper.eq(key, entry.getValue()); // 添加EQ条件
}
i++; // 计数器递增
}
return wrapper; // 返回条件构造器
}
// 全等条件构造
public static Wrapper allEq(Wrapper wrapper,Object bean) {
Map result = BeanUtil.beanToMap(bean, true, true); // 将Bean转为Map(忽略空值)
return genEq(wrapper,result); // 生成EQ条件
}
// 生成EQ条件
public static Wrapper genEq(Wrapper wrapper,Map param) {
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); // 获取迭代器
int i=0; // 计数器
while (it.hasNext()) { // 遍历Map
if(i>0) wrapper.and(); // 多个条件用AND连接
Map.Entry<String, Object> entry = it.next(); // 获取键值对
String key = entry.getKey(); // 获取字段名
wrapper.eq(key, entry.getValue()); // 添加EQ条件
i++; // 计数器递增
}
return wrapper; // 返回条件构造器
}
// BETWEEN条件构造
public static Wrapper between(Wrapper wrapper,Map<String, Object> params) {
for(String key : params.keySet()) { // 遍历参数Map
String columnName = ""; // 列名变量
if(key.endsWith("_start")) { // 判断是否是起始值
columnName = key.substring(0, key.indexOf("_start")); // 提取列名
if(StringUtils.isNotBlank(params.get(key).toString())) { // 判断值非空
wrapper.ge(columnName, params.get(key)); // 添加大于等于条件
}
}
if(key.endsWith("_end")) { // 判断是否是结束值
columnName = key.substring(0, key.indexOf("_end")); // 提取列名
if(StringUtils.isNotBlank(params.get(key).toString())) { // 判断值非空
wrapper.le(columnName, params.get(key)); // 添加小于等于条件
}
}
}
return wrapper; // 返回条件构造器
}
// 排序条件构造
public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) {
String order = ""; // 排序方式变量
if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) { // 获取排序方式
order = params.get("order").toString(); // 设置排序方式
}
if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) { // 获取排序字段
if(order.equalsIgnoreCase("desc")) { // 判断是否降序
wrapper.orderDesc(Arrays.asList(params.get("sort"))); // 添加降序条件
} else {
wrapper.orderAsc(Arrays.asList(params.get("sort"))); // 添加升序条件
}
}
return wrapper; // 返回条件构造器
}
// 驼峰转下划线方法
public static String camelToUnderline(String param) {
if (param == null || "".equals(param.trim())) { // 参数检查
return ""; // 返回空字符串
}
int len = param.length(); // 获取字符串长度
StringBuilder sb = new StringBuilder(len); // 创建字符串构建器
for (int i = 0; i < len; i++) { // 遍历字符串
char c = param.charAt(i); // 获取当前字符
if (Character.isUpperCase(c)) { // 判断是否大写字母
sb.append(UNDERLINE); // 添加下划线
sb.append(Character.toLowerCase(c)); // 添加小写字母
} else {
sb.append(c); // 直接添加字符
}
}
return sb.toString(); // 返回转换结果
}
// 测试方法
public static void main(String[] ages) {
System.out.println(camelToUnderline("ABCddfANM")); // 测试驼峰转下划线
}
// Map键名驼峰转下划线
public static Map camelToUnderlineMap(Map param, String pre) {
Map<String, Object> newMap = new HashMap<String, Object>(); // 创建新Map
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); // 获取迭代器
while (it.hasNext()) { // 遍历原Map
Map.Entry<String, Object> entry = it.next(); // 获取键值对
String key = entry.getKey(); // 获取键名
String newKey = camelToUnderline(key); // 转换键名格式
if (pre.endsWith(".")) { // 判断前缀是否以点结尾
newMap.put(pre + newKey, entry.getValue()); // 添加带前缀的键值对
} else if (StringUtils.isEmpty(pre)) { // 判断前缀是否为空
newMap.put(newKey, entry.getValue()); // 添加无前缀的键值对
} else {
newMap.put(pre + "." + newKey, entry.getValue()); // 添加带前缀的键值对
}
}
return newMap; // 返回新Map
}
}

@ -0,0 +1,24 @@
// 声明该类所在的包为 com.thread
package com.thread;
// 定义一个名为 MyThreadMethod 的类,继承自 Thread 类,用于实现线程操作
// 此类的作用是执行一些项目启动后需要一直运行的操作,如根据时间自动更改订单状态等
public class MyThreadMethod extends Thread {
// 重写 Thread 类的 run 方法,该方法是线程启动后执行的主体逻辑
public void run() {
// 当线程未被中断时,持续执行循环
while (!this.isInterrupted()) {
try {
// 使当前线程休眠 5000 毫秒(即 5 秒),也就是每隔 5 秒执行一次后续操作
Thread.sleep(5000);
} catch (InterruptedException e) {
// 若线程在休眠过程中被中断,打印异常堆栈信息
e.printStackTrace();
}
// 这里可以添加需要定时执行的具体业务逻辑,例如根据时间自动更改订单状态等操作
// 以下是一个示例打印语句,可用于调试,显示当前线程正在执行以及当前的时间戳
// System.out.println("线程执行中:" + System.currentTimeMillis());
}
}
}

@ -0,0 +1,29 @@
// 定义当前接口所在的包路径
package com.service;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入分页工具类
import com.utils.PageUtils;
// 导入健身资讯实体类
import com.entity.NewsEntity;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Java集合框架中的List接口
import java.util.List;
// 健身资讯服务接口定义
// 继承MyBatis-Plus通用服务接口
// 泛型参数为NewsEntity健身资讯实体类
public interface NewsService extends IService<NewsEntity> {
// 分页查询健身资讯数据方法
// params - 包含查询条件的参数Map
// 返回封装好的分页工具对象
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,73 @@
// 定义当前类所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入类差异比较工具
import com.utils.ClazzDiff;
// 导入Spring Bean属性复制工具
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合类
import java.util.*;
// 导入MyBatis-Plus分页插件
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具
import org.springframework.util.Assert;
// 导入健身资讯DAO接口
import com.dao.NewsDao;
// 导入健身资讯实体类
import com.entity.NewsEntity;
// 导入健身资讯服务接口
import com.service.NewsService;
// 导入健身资讯视图类
import com.entity.view.NewsView;
// 声明为Spring服务组件指定bean名称
@Service("newsService")
// 启用类级别事务管理
@Transactional
// 健身资讯服务实现类
// 继承MyBatis-Plus通用服务实现类
// 实现健身资讯服务接口
public class NewsServiceImpl
extends ServiceImpl<NewsDao, NewsEntity>
implements NewsService {
// 实现分页查询方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 创建分页查询对象
Page<NewsView> page = new Query<NewsView>(params).getPage();
// 执行分页查询并设置结果
page.setRecords(baseMapper.selectListView(page,params));
// 返回分页工具对象
return new PageUtils(page);
}
// 类结束
}

@ -0,0 +1,114 @@
// 声明该类所在的包为 com.utils
package com.utils;
// 导入 Serializable 接口,用于实现对象的序列化
import java.io.Serializable;
// 导入 List 接口,用于存储列表数据
import java.util.List;
// 导入 Map 接口,用于存储键值对数据
import java.util.Map;
// 导入 MyBatis-Plus 框架的 Page 类,用于分页操作
import com.baomidou.mybatisplus.plugins.Page;
// 定义一个公共类 PageUtils用于处理分页相关的操作实现 Serializable 接口以便对象可以序列化
public class PageUtils implements Serializable {
// 定义序列化版本号,用于在反序列化时验证版本一致性
private static final long serialVersionUID = 1L;
// 定义一个长整型变量,用于存储总记录数
private long total;
// 定义一个整型变量,用于存储每页显示的记录数
private int pageSize;
// 定义一个长整型变量,用于存储总页数
private long totalPage;
// 定义一个整型变量,用于存储当前页码
private int currPage;
// 定义一个泛型列表,用于存储分页显示的数据
private List<?> list;
// 定义一个构造函数,根据传入的列表数据、总记录数、每页记录数和当前页数进行分页信息初始化
public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {
// 将传入的列表数据赋值给类的成员变量
this.list = list;
// 将传入的总记录数赋值给类的成员变量
this.total = totalCount;
// 将传入的每页记录数赋值给类的成员变量
this.pageSize = pageSize;
// 将传入的当前页数赋值给类的成员变量
this.currPage = currPage;
// 计算总页数,使用 Math.ceil 方法确保结果向上取整
this.totalPage = (int) Math.ceil((double) totalCount / pageSize);
}
// 定义一个构造函数,根据 MyBatis-Plus 的 Page 对象进行分页信息初始化
public PageUtils(Page<?> page) {
// 获取 Page 对象中的记录列表并赋值给类的成员变量
this.list = page.getRecords();
// 获取 Page 对象中的总记录数并赋值给类的成员变量
this.total = page.getTotal();
// 获取 Page 对象中的每页记录数并赋值给类的成员变量
this.pageSize = page.getSize();
// 获取 Page 对象中的当前页码并赋值给类的成员变量
this.currPage = page.getCurrent();
// 获取 Page 对象中的总页数并赋值给类的成员变量
this.totalPage = page.getPages();
}
// 定义一个构造函数,根据参数 Map 生成 Page 对象并进行分页信息初始化
public PageUtils(Map<String, Object> params) {
// 根据参数 Map 创建一个 Query 对象,并获取其对应的 Page 对象
Page page = new Query(params).getPage();
// 调用另一个构造函数,使用生成的 Page 对象进行初始化
new PageUtils(page);
}
// 定义一个公共方法,用于获取每页记录数
public int getPageSize() {
return pageSize;
}
// 定义一个公共方法,用于设置每页记录数
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
// 定义一个公共方法,用于获取当前页码
public int getCurrPage() {
return currPage;
}
// 定义一个公共方法,用于设置当前页码
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
// 定义一个公共方法,用于获取列表数据
public List<?> getList() {
return list;
}
// 定义一个公共方法,用于设置列表数据
public void setList(List<?> list) {
this.list = list;
}
// 定义一个公共方法,用于获取总页数
public long getTotalPage() {
return totalPage;
}
// 定义一个公共方法,用于设置总页数
public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}
// 定义一个公共方法,用于获取总记录数
public long getTotal() {
return total;
}
// 定义一个公共方法,用于设置总记录数
public void setTotal(long total) {
this.total = total;
}
}

@ -0,0 +1,62 @@
package com.utils; // 声明工具类所在包
import org.apache.commons.io.FileUtils; // 导入文件工具类
import org.apache.poi.hssf.usermodel.HSSFCell; // 导入HSSF单元格类
import org.apache.poi.hssf.usermodel.HSSFRow; // 导入HSSF行类
import org.apache.poi.hssf.usermodel.HSSFSheet; // 导入HSSF工作表类
import org.apache.poi.hssf.usermodel.HSSFWorkbook; // 导入HSSF工作簿类
import org.apache.poi.ss.usermodel.Cell; // 导入单元格接口
import java.io.File; // 导入文件类
import java.io.FileOutputStream; // 导入文件输出流类
import java.util.ArrayList; // 导入ArrayList类
import java.util.List; // 导入List接口
public class PoiUtil { // POI工具类
// Excel导入方法
public static List<List<String>> poiImport(String url) throws Exception {
List<List<String>> list = new ArrayList<>(); // 创建结果列表
HSSFWorkbook workbook = new HSSFWorkbook(FileUtils.openInputStream(new File(url))); // 创建工作簿对象
HSSFSheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
for (int i = 0; i < sheet.getLastRowNum()+1; i++) { // 遍历所有行
HSSFRow row = sheet.getRow(i); // 获取当前行
List<String> rowlist = new ArrayList<>(); // 创建行数据列表
for (int j = 0; j < row.getLastCellNum(); j++) { // 遍历行中所有单元格
HSSFCell cell = row.getCell(j); // 获取当前单元格
cell.setCellType(Cell.CELL_TYPE_STRING); // 设置单元格类型为字符串
String value = cell.getStringCellValue(); // 获取单元格值
rowlist.add(value); // 将值添加到行数据列表
}
list.add(rowlist); // 将行数据添加到结果列表
}
return list; // 返回结果列表
}
// Excel导出方法
public static void poiExport(List<List<String>> list, String url) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(); // 创建工作表
for (int i = 0; i < list.size(); i++) { // 遍历所有行数据
HSSFRow row = sheet.createRow(i); // 创建行
List<String> dataList = list.get(i); // 获取当前行数据
for (int j = 0; j < dataList.size(); j++) { // 遍历行中所有数据
HSSFCell cell = row.createCell(j); // 创建单元格
cell.setCellValue(dataList.get(j)); // 设置单元格值
}
}
FileOutputStream stream = FileUtils.openOutputStream(new File(url)); // 创建文件输出流
workbook.write(stream); // 写入工作簿数据
stream.close(); // 关闭输出流
}
// 主方法(测试用)
public static void main(String[] args) {
try {
List<List<String>> lists = PoiUtil.poiImport("C:/Users/Administrator/Desktop/工作1.xls"); // 测试导入
PoiUtil.poiExport(lists, "C:/Users/Administrator/Desktop/工作1.xls"); // 测试导出
} catch (Exception e) {
e.printStackTrace(); // 打印异常信息
}
}
}

@ -0,0 +1,110 @@
// 声明该类所在的包为 com.utils
package com.utils;
// 导入 LinkedHashMap 类,用于存储键值对,且能保持插入顺序
import java.util.LinkedHashMap;
// 导入 Map 接口,用于定义键值对存储的通用规范
import java.util.Map;
// 导入 Apache Commons Lang3 库中的 StringUtils 类,用于字符串操作
import org.apache.commons.lang3.StringUtils;
// 导入 MyBatis-Plus 框架的 Page 类,用于分页操作
import com.baomidou.mybatisplus.plugins.Page;
// 定义一个泛型类 Query继承自 LinkedHashMap用于处理查询参数
public class Query<T> extends LinkedHashMap<String, Object> {
// 定义序列化版本号,用于序列化和反序列化时的版本验证
private static final long serialVersionUID = 1L;
// 定义 MyBatis-Plus 的 Page 对象,用于分页操作
private Page<T> page;
// 定义当前页码,默认为 1
private int currPage = 1;
// 定义每页显示的记录数,默认为 10
private int limit = 10;
// 构造函数,根据 JQPageInfo 对象初始化查询参数
public Query(JQPageInfo pageInfo) {
// 处理分页参数
// 如果 JQPageInfo 中的 page 不为空,则更新当前页码
if (pageInfo.getPage() != null) {
currPage = pageInfo.getPage();
}
// 如果 JQPageInfo 中的 limit 不为空,则更新每页记录数
if (pageInfo.getLimit() != null) {
limit = pageInfo.getLimit();
}
// 防止 SQL 注入,对排序字段和排序顺序进行过滤
String sidx = SQLFilter.sqlInject(pageInfo.getSidx());
String order = SQLFilter.sqlInject(pageInfo.getOrder());
// 初始化 MyBatis-Plus 的 Page 对象
this.page = new Page<>(currPage, limit);
// 设置排序信息
if (StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)) {
// 设置排序字段
this.page.setOrderByField(sidx);
// 判断排序顺序是否为升序
this.page.setAsc("ASC".equalsIgnoreCase(order));
}
}
// 构造函数,根据 Map 类型的参数初始化查询参数
public Query(Map<String, Object> params) {
// 将传入的参数添加到当前对象中
this.putAll(params);
// 处理分页参数
// 如果参数中包含 "page",则更新当前页码
if (params.get("page") != null) {
currPage = Integer.parseInt(String.valueOf(params.get("page")));
}
// 如果参数中包含 "limit",则更新每页记录数
if (params.get("limit") != null) {
limit = Integer.parseInt(String.valueOf(params.get("limit")));
}
// 计算偏移量并添加到参数中
this.put("offset", (currPage - 1) * limit);
// 添加当前页码到参数中
this.put("page", currPage);
// 添加每页记录数到参数中
this.put("limit", limit);
// 防止 SQL 注入,对排序字段和排序顺序进行过滤
String sidx = SQLFilter.sqlInject((String) params.get("sidx"));
String order = SQLFilter.sqlInject((String) params.get("order"));
// 将过滤后的排序字段添加到参数中
this.put("sidx", sidx);
// 将过滤后的排序顺序添加到参数中
this.put("order", order);
// 初始化 MyBatis-Plus 的 Page 对象
this.page = new Page<>(currPage, limit);
// 设置排序信息
if (StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(order)) {
// 设置排序字段
this.page.setOrderByField(sidx);
// 判断排序顺序是否为升序
this.page.setAsc("ASC".equalsIgnoreCase(order));
}
}
// 获取 MyBatis-Plus 的 Page 对象
public Page<T> getPage() {
return page;
}
// 获取当前页码
public int getCurrPage() {
return currPage;
}
// 获取每页记录数
public int getLimit() {
return limit;
}
}

@ -0,0 +1,77 @@
// 声明该类所在的包为 com.utils
package com.utils;
// 导入 HashMap 类,用于存储键值对
import java.util.HashMap;
// 导入 Map 接口,用于定义键值对存储的通用规范
import java.util.Map;
// 定义一个名为 R 的类,继承自 HashMap用于返回数据
public class R extends HashMap<String, Object> {
// 定义序列化版本号,用于序列化和反序列化时的版本验证
private static final long serialVersionUID = 1L;
// 无参构造函数,初始化时设置默认状态码为 0
public R() {
// 向 Map 中放入键为 "code",值为 0 的键值对
put("code", 0);
}
// 静态方法,返回一个表示错误的 R 对象,默认错误码为 500错误信息为 "未知异常,请联系管理员"
public static R error() {
// 调用另一个 error 方法,传入错误码 500 和错误信息
return error(500, "未知异常,请联系管理员");
}
// 静态方法,返回一个表示错误的 R 对象,错误码为 500自定义错误信息
public static R error(String msg) {
// 调用另一个 error 方法,传入错误码 500 和自定义错误信息
return error(500, msg);
}
// 静态方法,返回一个表示错误的 R 对象,自定义错误码和错误信息
public static R error(int code, String msg) {
// 创建一个新的 R 对象
R r = new R();
// 向 R 对象中放入错误码
r.put("code", code);
// 向 R 对象中放入错误信息
r.put("msg", msg);
// 返回该 R 对象
return r;
}
// 静态方法,返回一个表示成功的 R 对象,包含自定义成功信息
public static R ok(String msg) {
// 创建一个新的 R 对象
R r = new R();
// 向 R 对象中放入成功信息
r.put("msg", msg);
// 返回该 R 对象
return r;
}
// 静态方法,返回一个表示成功的 R 对象,将传入的 Map 中的键值对添加到 R 对象中
public static R ok(Map<String, Object> map) {
// 创建一个新的 R 对象
R r = new R();
// 将传入的 Map 中的所有键值对添加到 R 对象中
r.putAll(map);
// 返回该 R 对象
return r;
}
// 静态方法,返回一个表示成功的 R 对象
public static R ok() {
// 创建并返回一个新的 R 对象
return new R();
}
// 重写 put 方法,将键值对放入 R 对象中,并返回当前 R 对象,方便链式调用
public R put(String key, Object value) {
// 调用父类的 put 方法,将键值对放入 Map 中
super.put(key, value);
// 返回当前 R 对象
return this;
}
}

@ -0,0 +1,45 @@
package com.utils;
// 导入Apache Commons Lang3工具类库
import org.apache.commons.lang3.StringUtils;
// 导入自定义异常类
import com.entity.EIException;
// 定义SQL过滤工具类
public class SQLFilter {
// SQL注入过滤方法对输入字符串进行安全处理
public static String sqlInject(String str) {
// 检查输入字符串是否为null或空字符串
if (StringUtils.isBlank(str)) {
// 如果是空字符串则返回null
return null;
}
// 替换字符串中的单引号为空字符串
str = StringUtils.replace(str, "'", "");
// 替换字符串中的双引号为空字符串
str = StringUtils.replace(str, "\"", "");
// 替换字符串中的分号为空字符串
str = StringUtils.replace(str, ";", "");
// 替换字符串中的反斜杠为空字符串
str = StringUtils.replace(str, "\\", "");
// 将处理后的字符串转换为小写,便于统一检查
str = str.toLowerCase();
// 定义SQL关键字黑名单数组
String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};
// 遍历关键字黑名单数组
for (String keyword : keywords) {
// 检查处理后的字符串是否包含当前关键字
if (str.indexOf(keyword) != -1) {
// 如果包含则抛出非法字符异常
throw new EIException("包含非法字符");
}
}
// 返回经过安全处理的字符串
return str;
}
}

@ -0,0 +1,25 @@
// 声明该类所在的包为 com.service
package com.service;
// 导入 MyBatis-Plus 提供的 IService 接口,此接口可用于实现通用的 CRUD 操作
import com.baomidou.mybatisplus.service.IService;
// 导入自定义的 PageUtils 类,用于处理分页查询相关的逻辑
import com.utils.PageUtils;
// 导入单页数据实体类,该类用于表示单页数据的结构
import com.entity.SingleSeachEntity;
// 导入 Map 类,可用于存储键值对,通常用于传递查询参数
import java.util.Map;
// 导入 HttpServletRequest 类,用于处理 HTTP 请求相关操作
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架中的 Nullable 注解,用于标记参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 List 类,用于存储一组对象
import java.util.List;
// 定义单页数据服务接口,继承自 IService<SingleSeachEntity>
public interface SingleSeachService extends IService<SingleSeachEntity> {
// 定义一个方法用于根据传入的查询参数进行分页查询
// params 是一个 Map 类型的参数,用于存储查询条件
// 返回值是 PageUtils 类型,包含了分页查询后的结果
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,73 @@
// 定义当前类所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入类差异比较工具
import com.utils.ClazzDiff;
// 导入Spring Bean属性复制工具
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合类
import java.util.*;
// 导入MyBatis-Plus分页插件
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具
import org.springframework.util.Assert;
// 导入单页数据DAO接口
import com.dao.SingleSeachDao;
// 导入单页数据实体类
import com.entity.SingleSeachEntity;
// 导入单页数据服务接口
import com.service.SingleSeachService;
// 导入单页数据视图类
import com.entity.view.SingleSeachView;
// 声明为Spring服务组件指定bean名称
@Service("singleSeachService")
// 启用类级别事务管理
@Transactional
// 单页数据服务实现类
// 继承MyBatis-Plus通用服务实现类
// 实现单页数据服务接口
public class SingleSeachServiceImpl
extends ServiceImpl<SingleSeachDao, SingleSeachEntity>
implements SingleSeachService {
// 实现分页查询方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 创建分页查询对象
Page<SingleSeachView> page = new Query<SingleSeachView>(params).getPage();
// 执行分页查询并设置结果
page.setRecords(baseMapper.selectListView(page,params));
// 返回分页工具对象
return new PageUtils(page);
}
// 类结束
}

@ -0,0 +1,57 @@
// 声明类所在的包为 com.utils
package com.utils;
// 导入 Spring 框架中处理 Bean 相关异常的类
import org.springframework.beans.BeansException;
// 导入 Spring 框架的应用上下文接口,代表 Spring 应用的上下文环境
import org.springframework.context.ApplicationContext;
// 导入 Spring 框架的应用上下文感知接口,实现该接口可获取应用上下文
import org.springframework.context.ApplicationContextAware;
// 导入 Spring 框架的组件注解,用于将类标记为 Spring 组件
import org.springframework.stereotype.Component;
// 使用 @Component 注解将该类标记为 Spring 组件,使其能被 Spring 自动扫描和管理
@Component
// 定义 SpringContextUtils 类,实现 ApplicationContextAware 接口以获取 Spring 应用上下文
public class SpringContextUtils implements ApplicationContextAware {
// 定义一个静态的 ApplicationContext 类型变量,用于存储 Spring 应用上下文
public static ApplicationContext applicationContext;
// 重写 ApplicationContextAware 接口的方法,当 Spring 容器初始化时会调用此方法
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
// 将传入的应用上下文赋值给类的静态变量,方便后续静态方法使用
SpringContextUtils.applicationContext = applicationContext;
}
// 定义静态方法,根据 Bean 的名称从应用上下文中获取对应的 Bean 实例
public static Object getBean(String name) {
// 调用应用上下文的 getBean 方法,通过名称获取 Bean 实例
return applicationContext.getBean(name);
}
// 定义泛型静态方法,根据 Bean 的名称和所需类型从应用上下文中获取指定类型的 Bean 实例
public static <T> T getBean(String name, Class<T> requiredType) {
// 调用应用上下文的 getBean 方法,通过名称和类型获取 Bean 实例
return applicationContext.getBean(name, requiredType);
}
// 定义静态方法,用于判断应用上下文中是否包含指定名称的 Bean
public static boolean containsBean(String name) {
// 调用应用上下文的 containsBean 方法进行判断
return applicationContext.containsBean(name);
}
// 定义静态方法,用于判断指定名称的 Bean 是否为单例模式
public static boolean isSingleton(String name) {
// 调用应用上下文的 isSingleton 方法进行判断
return applicationContext.isSingleton(name);
}
// 定义静态方法,用于获取指定名称的 Bean 的类型
public static Class<? extends Object> getType(String name) {
// 调用应用上下文的 getType 方法获取 Bean 的类型
return applicationContext.getType(name);
}
}

@ -0,0 +1,31 @@
package com.utils;
// 字符串工具类,提供字符串判空相关方法
public class StringUtil {
// 判断字符串是否为空
// 空值条件null、空字符串或"null"字符串
public static boolean isEmpty(String s) {
// 检查字符串是否为null
if (s == null) {
return true;
}
// 检查字符串是否为空字符串
if (s.equals("")) {
return true;
}
// 检查字符串是否为"null"字符串
if (s.equals("null")) {
return true;
}
// 不满足以上条件则返回false
return false;
}
// 判断字符串是否非空
// 直接调用isEmpty方法取反
public static boolean isNotEmpty(String s) {
// 返回isEmpty方法的相反结果
return !StringUtil.isEmpty(s);
}
}

@ -0,0 +1,48 @@
// 声明该接口所在的包为 com.service
package com.service;
// 导入 List 类,用于存储一组对象
import java.util.List;
// 导入 Map 类,用于存储键值对,通常用于传递查询参数
import java.util.Map;
// 导入 MyBatis-Plus 的 Wrapper 类,用于构建查询条件
import com.baomidou.mybatisplus.mapper.Wrapper;
// 导入 MyBatis-Plus 的 IService 接口,提供通用的单表业务方法
import com.baomidou.mybatisplus.service.IService;
// 导入 Token 实体类,代表数据库中的 Token 数据
import com.entity.TokenEntity;
// 导入自定义的 PageUtils 类,用于处理分页查询结果
import com.utils.PageUtils;
// 定义 Token 服务接口,继承自 IService<TokenEntity>
public interface TokenService extends IService<TokenEntity> {
// 定义分页查询方法,根据传入的查询参数进行分页查询
// params 参数为一个 Map 对象,存储了查询所需的条件
// 返回值为 PageUtils 对象,包含了分页查询后的结果
PageUtils queryPage(Map<String, Object> params);
// 定义查询列表视图的方法,根据传入的查询条件包装器查询 Token 实体列表
// wrapper 参数为 Wrapper<TokenEntity> 类型,用于构建查询条件
// 返回值为 List<TokenEntity> 类型,包含符合条件的 Token 实体列表
List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper);
// 定义带查询条件包装器的分页查询方法,根据传入的查询参数和查询条件包装器进行分页查询
// params 参数为一个 Map 对象,存储了查询所需的条件
// wrapper 参数为 Wrapper<TokenEntity> 类型,用于构建查询条件
// 返回值为 PageUtils 对象,包含了分页查询后的结果
PageUtils queryPage(Map<String, Object> params, Wrapper<TokenEntity> wrapper);
// 定义生成 Token 的方法,根据传入的用户 ID、用户名、表名和角色生成一个 Token 字符串
// userid 参数为 Integer 类型,表示用户的 ID
// username 参数为 String 类型,表示用户的名称
// tableName 参数为 String 类型,表示相关表的名称
// role 参数为 String 类型,表示用户的角色
// 返回值为 String 类型,即生成的 Token 字符串
String generateToken(Integer userid, String username, String tableName, String role);
// 定义根据 Token 字符串获取 Token 实体的方法
// token 参数为 String 类型,表示要查询的 Token 字符串
// 返回值为 TokenEntity 类型,即符合条件的 Token 实体
TokenEntity getTokenEntity(String token);
}

@ -0,0 +1,121 @@
// 声明该类所在的包为 com.service.impl
package com.service.impl;
// 导入 Java 中的 Calendar 类,用于处理日期和时间
import java.util.Calendar;
// 导入 Java 中的 Date 类,用于表示日期和时间
import java.util.Date;
// 导入 Java 中的 List 接口,用于存储一组对象
import java.util.List;
// 导入 Java 中的 Map 接口,用于存储键值对
import java.util.Map;
// 导入 Spring 框架的 Service 注解,用于将该类标记为服务层组件
import org.springframework.stereotype.Service;
// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建 SQL 查询条件
import com.baomidou.mybatisplus.mapper.EntityWrapper;
// 导入 MyBatis-Plus 的 Wrapper 接口,是 EntityWrapper 的父接口
import com.baomidou.mybatisplus.mapper.Wrapper;
// 导入 MyBatis-Plus 的 Page 类,用于分页查询
import com.baomidou.mybatisplus.plugins.Page;
// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入 Token 数据访问对象接口
import com.dao.TokenDao;
// 导入 Token 实体类
import com.entity.TokenEntity;
// 重复导入 Token 实体类,此处可删除该重复导入
import com.entity.TokenEntity;
// 导入 Token 服务接口
import com.service.TokenService;
// 导入自定义的通用工具类
import com.utils.CommonUtil;
// 导入自定义的分页工具类
import com.utils.PageUtils;
// 导入自定义的查询工具类
import com.utils.Query;
// 使用 Service 注解将该类标记为 Spring 服务组件,名称为 tokenService
@Service("tokenService")
// 定义 Token 服务实现类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 TokenService 接口
public class TokenServiceImpl extends ServiceImpl<TokenDao, TokenEntity> implements TokenService {
// 重写 TokenService 接口中的 queryPage 方法,用于分页查询 Token 数据
@Override
public PageUtils queryPage(Map<String, Object> params) {
// 根据传入的参数创建一个 TokenEntity 类型的分页对象
Page<TokenEntity> page = this.selectPage(
// 通过 Query 工具类根据参数获取分页信息
new Query<TokenEntity>(params).getPage(),
// 创建一个空的查询条件包装器
new EntityWrapper<TokenEntity>()
);
// 根据分页对象创建 PageUtils 对象并返回
return new PageUtils(page);
}
// 重写 TokenService 接口中的 selectListView 方法,用于查询 Token 列表数据
@Override
public List<TokenEntity> selectListView(Wrapper<TokenEntity> wrapper) {
// 调用数据访问对象的 selectListView 方法,根据查询条件包装器查询列表数据并返回
return baseMapper.selectListView(wrapper);
}
// 重写 TokenService 接口中的 queryPage 方法,支持带查询条件的分页查询 Token 数据
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<TokenEntity> wrapper) {
// 根据传入的参数创建一个 TokenEntity 类型的分页对象
Page<TokenEntity> page = new Query<TokenEntity>(params).getPage();
// 调用数据访问对象的 selectListView 方法,根据分页对象和查询条件包装器查询列表数据并设置到分页对象中
page.setRecords(baseMapper.selectListView(page, wrapper));
// 根据分页对象创建 PageUtils 对象
PageUtils pageUtil = new PageUtils(page);
// 返回 PageUtils 对象
return pageUtil;
}
// 重写 TokenService 接口中的 generateToken 方法,用于生成 Token
@Override
public String generateToken(Integer userid, String username, String tableName, String role) {
// 根据用户 ID 和角色查询 Token 实体对象
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
// 调用通用工具类的方法生成一个 32 位的随机字符串作为 Token
String token = CommonUtil.getRandomString(32);
// 获取当前时间的 Calendar 实例
Calendar cal = Calendar.getInstance();
// 设置 Calendar 的时间为当前日期和时间
cal.setTime(new Date());
// 将 Calendar 的时间增加 1 小时,作为 Token 的过期时间
cal.add(Calendar.HOUR_OF_DAY, 1);
// 如果查询到了 Token 实体对象
if (tokenEntity != null) {
// 更新 Token 实体对象的 Token 字段
tokenEntity.setToken(token);
// 更新 Token 实体对象的过期时间字段
tokenEntity.setExpiratedtime(cal.getTime());
// 调用更新方法更新 Token 实体对象
this.updateById(tokenEntity);
} else {
// 如果未查询到 Token 实体对象,创建一个新的 Token 实体对象并插入数据库
this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime()));
}
// 返回生成的 Token
return token;
}
// 重写 TokenService 接口中的 getTokenEntity 方法,用于根据 Token 获取 Token 实体对象
@Override
public TokenEntity getTokenEntity(String token) {
// 根据 Token 查询 Token 实体对象
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("token", token));
// 如果未查询到 Token 实体对象或者 Token 已过期
if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) {
// 返回 null
return null;
}
// 返回查询到的 Token 实体对象
return tokenEntity;
}
}

@ -0,0 +1,51 @@
// 包声明,定义当前文件所在的包路径
package com.model.enums;
// 导入Java的序列化接口用于标记类的实例可以被序列化
import java.io.Serializable;
// 导入MyBatis-Plus的枚举接口用于支持枚举类型的数据库映射
import com.baomidou.mybatisplus.enums.IEnum;
//类型枚举类继承自MyBatis-Plus的IEnum接口用于定义不同的状态类型。
// 必须在IEnum中配置该包扫描自动注入查看文件spring-mybatis.xml中的参数typeEnumsPackage。
public enum TypeEnum implements IEnum {
// 定义枚举值DISABLED表示禁用状态值为0描述为"禁用"
DISABLED(0, "禁用"),
// 定义枚举值NORMAL表示正常状态值为1描述为"正常"
NORMAL(1, "正常");
// 枚举值对应的整数值
private final int value;
// 枚举值对应的描述信息
private final String desc;
//构造方法,初始化枚举值的整数和描述信息
//@param value 枚举值对应的整数
// @param desc 枚举值对应的描述信息
TypeEnum(final int value, final String desc) {
this.value = value;
this.desc = desc;
}
//获取枚举值对应的整数值
// @return 枚举值对应的整数值
@Override
public Serializable getValue() {
return this.value;
}
//获取枚举值对应的描述信息
//@return 枚举值对应的描述信息
public String getDesc() {
return this.desc;
}
}

@ -0,0 +1,38 @@
// 定义当前接口所在的包路径
package com.service;
// 导入Java集合框架中的List接口
import java.util.List;
// 导入Java集合框架中的Map接口
import java.util.Map;
// 导入MyBatis-Plus条件构造器
import com.baomidou.mybatisplus.mapper.Wrapper;
// 导入MyBatis-Plus服务接口
import com.baomidou.mybatisplus.service.IService;
// 导入用户实体类
import com.entity.UsersEntity;
// 导入分页工具类
import com.utils.PageUtils;
// 系统用户服务接口
// 继承MyBatis-Plus通用服务接口
// 泛型参数为UsersEntity用户实体类
public interface UsersService extends IService<UsersEntity> {
// 分页查询用户数据方法(基础版)
// params - 包含查询条件的参数Map
// 返回封装好的分页工具对象
PageUtils queryPage(Map<String, Object> params);
// 根据条件查询用户列表方法
// wrapper - 查询条件构造器
// 返回用户实体列表
List<UsersEntity> selectListView(Wrapper<UsersEntity> wrapper);
// 分页查询用户数据方法(增强版)
// params - 包含查询条件的参数Map
// wrapper - 查询条件构造器
// 返回封装好的分页工具对象
PageUtils queryPage(Map<String, Object> params, Wrapper<UsersEntity> wrapper);

@ -0,0 +1,70 @@
// 声明类所在的包为 com.service.impl
package com.service.impl;
// 导入 Java 中的 List 接口,用于存储元素集合
import java.util.List;
// 导入 Java 中的 Map 接口,用于存储键值对
import java.util.Map;
// 导入系统用户服务接口
import com.service.UsersService;
// 导入 Spring 框架的 Service 注解,用于将类标记为服务层组件
import org.springframework.stereotype.Service;
// 导入 MyBatis-Plus 的 EntityWrapper 类,用于构建查询条件
import com.baomidou.mybatisplus.mapper.EntityWrapper;
// 导入 MyBatis-Plus 的 Wrapper 接口,是 EntityWrapper 的父接口
import com.baomidou.mybatisplus.mapper.Wrapper;
// 导入 MyBatis-Plus 的 Page 类,用于分页查询
import com.baomidou.mybatisplus.plugins.Page;
// 导入 MyBatis-Plus 的 ServiceImpl 类,作为服务实现类的基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入系统用户数据访问对象接口
import com.dao.UsersDao;
// 导入系统用户实体类
import com.entity.UsersEntity;
// 导入自定义的分页工具类
import com.utils.PageUtils;
// 导入自定义的查询工具类
import com.utils.Query;
// 使用 Service 注解将该类标记为 Spring 服务组件,名称为 userService
@Service("userService")
// 定义系统用户服务实现类,继承自 MyBatis-Plus 的 ServiceImpl 类,并实现 UsersService 接口
public class UsersServiceImpl extends ServiceImpl<UsersDao, UsersEntity> implements UsersService {
// 重写 UsersService 接口中的 queryPage 方法,用于分页查询系统用户数据
@Override
public PageUtils queryPage(Map<String, Object> params) {
// 根据传入的参数创建一个 UsersEntity 类型的分页对象
Page<UsersEntity> page = this.selectPage(
// 通过 Query 工具类根据参数获取分页信息
new Query<UsersEntity>(params).getPage(),
// 创建一个空的查询条件包装器
new EntityWrapper<UsersEntity>()
);
// 根据分页对象创建 PageUtils 对象并返回
return new PageUtils(page);
}
// 重写 UsersService 接口中的 selectListView 方法,用于查询系统用户列表数据
@Override
public List<UsersEntity> selectListView(Wrapper<UsersEntity> wrapper) {
// 调用数据访问对象的 selectListView 方法,根据查询条件包装器查询列表数据并返回
return baseMapper.selectListView(wrapper);
}
// 重写 UsersService 接口中的 queryPage 方法,支持带查询条件的分页查询系统用户数据
@Override
public PageUtils queryPage(Map<String, Object> params,
Wrapper<UsersEntity> wrapper) {
// 根据传入的参数创建一个 UsersEntity 类型的分页对象
Page<UsersEntity> page = new Query<UsersEntity>(params).getPage();
// 调用数据访问对象的 selectListView 方法,根据分页对象和查询条件包装器查询列表数据并设置到分页对象中
page.setRecords(baseMapper.selectListView(page, wrapper));
// 根据分页对象创建 PageUtils 对象
PageUtils pageUtil = new PageUtils(page);
// 返回 PageUtils 对象
return pageUtil;
}
}

@ -0,0 +1,39 @@
package com.utils;
// 导入必要的Java工具类
import java.util.Set;
// 导入验证相关的类
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
// 导入自定义异常类
import com.entity.EIException;
// 数据校验工具类基于hibernate-validator实现
public class ValidatorUtils {
// 静态验证器实例
private static Validator validator;
// 静态初始化块,初始化验证器
static {
// 获取默认的验证器工厂并创建验证器实例
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
// 校验对象方法
// object: 需要校验的对象
// groups: 可选的校验组
// 抛出EIException当校验失败时
public static void validateEntity(Object object, Class<?>... groups)
throws EIException {
// 执行校验并获取校验结果集合
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
// 检查是否有校验错误
if (!constraintViolations.isEmpty()) {
// 获取第一个校验错误
ConstraintViolation<Object> constraint = (ConstraintViolation<Object>)constraintViolations.iterator().next();
// 抛出包含错误信息的异常
throw new EIException(constraint.getMessage());
}
}
}

@ -0,0 +1,25 @@
// 指定该代码文件所属的包名为 com.service
package com.service;
// 导入 MyBatis-Plus 提供的 IService 接口,用于实现通用的单表业务逻辑操作
import com.baomidou.mybatisplus.service.IService;
// 导入自定义的 PageUtils 类,用于处理分页查询的结果
import com.utils.PageUtils;
// 导入用户实体类,该类对应数据库中用户表的数据结构
import com.entity.YonghuEntity;
// 导入 Map 类,可用于存储键值对,通常用来作为查询参数的容器
import java.util.Map;
// 导入 HttpServletRequest 类,用于处理 HTTP 请求相关的操作
import javax.servlet.http.HttpServletRequest;
// 导入 Spring 框架的 Nullable 注解,表明参数或返回值可以为 null
import org.springframework.lang.Nullable;
// 导入 List 类,用于存储一组对象
import java.util.List;
// 定义一个名为 YonghuService 的接口,继承自 IService<YonghuEntity>,表明这是一个用户服务接口
public interface YonghuService extends IService<YonghuEntity> {
// 定义一个方法用于根据传入的查询参数进行分页查询用户数据
// params 是一个 Map 类型的参数,存储了查询所需的各种条件
// 返回值是 PageUtils 类型,包含了分页查询后的结果数据
PageUtils queryPage(Map<String, Object> params);
}

@ -0,0 +1,73 @@
// 定义当前类所在的包路径
package com.service.impl;
// 导入字符串处理工具类
import com.utils.StringUtil;
// 导入字典服务接口
import com.service.DictionaryService;
// 导入类差异比较工具
import com.utils.ClazzDiff;
// 导入Spring Bean属性复制工具
import org.springframework.beans.BeanUtils;
// 导入Spring依赖注入注解
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring服务注解
import org.springframework.stereotype.Service;
// 导入Java反射Field类
import java.lang.reflect.Field;
// 导入Java集合类
import java.util.*;
// 导入MyBatis-Plus分页插件
import com.baomidou.mybatisplus.plugins.Page;
// 导入MyBatis-Plus服务实现基类
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
// 导入Spring事务注解
import org.springframework.transaction.annotation.Transactional;
// 导入分页工具类
import com.utils.PageUtils;
// 导入查询参数封装类
import com.utils.Query;
// 导入Spring上下文加载器
import org.springframework.web.context.ContextLoader;
// 导入Servlet上下文接口
import javax.servlet.ServletContext;
// 导入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 导入Spring空值注解
import org.springframework.lang.Nullable;
// 导入Spring断言工具
import org.springframework.util.Assert;
// 导入用户DAO接口
import com.dao.YonghuDao;
// 导入用户实体类
import com.entity.YonghuEntity;
// 导入用户服务接口
import com.service.YonghuService;
// 导入用户视图类
import com.entity.view.YonghuView;
// 声明为Spring服务组件指定bean名称
@Service("yonghuService")
// 启用类级别事务管理
@Transactional
// 用户服务实现类
// 继承MyBatis-Plus通用服务实现类
// 实现用户服务接口
public class YonghuServiceImpl
extends ServiceImpl<YonghuDao, YonghuEntity>
implements YonghuService {
// 实现分页查询方法
@Override
public PageUtils queryPage(Map<String,Object> params) {
// 创建分页查询对象
Page<YonghuView> page = new Query<YonghuView>(params).getPage();
// 执行分页查询并设置结果
page.setRecords(baseMapper.selectListView(page,params));
// 返回分页工具对象
return new PageUtils(page);
}
// 类结束
}

@ -0,0 +1,36 @@
package com;
// 导入MyBatis的Mapper扫描注解
import org.mybatis.spring.annotation.MapperScan;
// 导入Spring Boot核心启动类
import org.springframework.boot.SpringApplication;
// 导入Spring Boot自动配置注解
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 导入Spring应用构建器
import org.springframework.boot.builder.SpringApplicationBuilder;
// 导入Servlet组件扫描注解
import org.springframework.boot.web.servlet.ServletComponentScan;
// 导入Spring Boot Servlet初始化器
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
// 主应用类使用SpringBootApplication注解标识为Spring Boot应用
@SpringBootApplication
// 扫描指定包下的Servlet组件
@ServletComponentScan(value = "com.ServletContextListener")
// 扫描指定包下的MyBatis Mapper接口
@MapperScan(basePackages = {"com.dao"})
public class jianshenfangglApplication extends SpringBootServletInitializer {
// 应用主入口方法
public static void main(String[] args) {
// 启动Spring Boot应用
SpringApplication.run(jianshenfangglApplication.class, args);
}
// 重写configure方法用于外部容器部署
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
// 配置应用源
return applicationBuilder.sources(jianshenfangglApplication.class);
}
}

4216
vuedw.js

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save