From 0b8e4eeeb3d8d1cb1dbdaac39094a9571bb9e0b4 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:25:37 +0800 Subject: [PATCH 01/53] ADD file via upload --- AuthorizationInterceptor.java | 126 ++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 AuthorizationInterceptor.java diff --git a/AuthorizationInterceptor.java b/AuthorizationInterceptor.java new file mode 100644 index 0000000..7fd3c28 --- /dev/null +++ b/AuthorizationInterceptor.java @@ -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,中断请求处理 + } +} From c046b8234ee0229d5395f0fe57ffe37d9adade21 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:31:21 +0800 Subject: [PATCH 02/53] ADD file via upload --- TypeEnum.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 TypeEnum.java diff --git a/TypeEnum.java b/TypeEnum.java new file mode 100644 index 0000000..b45cb08 --- /dev/null +++ b/TypeEnum.java @@ -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; + } +} From 65ab69b0dd9f30a85afbe355daa3d4cdc0f11aab Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:32:05 +0800 Subject: [PATCH 03/53] ADD file via upload --- CommonServiceImpl.java | 132 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 CommonServiceImpl.java diff --git a/CommonServiceImpl.java b/CommonServiceImpl.java new file mode 100644 index 0000000..f57a9f1 --- /dev/null +++ b/CommonServiceImpl.java @@ -0,0 +1,132 @@ +package com.service.impl; +// 定义当前类所在的包路径,表示这是服务实现层的代码 + +// 导入必要的工具类 +import java.util.List; // Java List接口,用于存储有序集合 +import java.util.Map; // Java Map接口,用于存储键值对集合 + +// 导入Spring相关注解 +import org.springframework.beans.factory.annotation.Autowired; // Spring自动注入注解 +import org.springframework.stereotype.Service; // Spring服务注解 + +// 导入DAO和服务接口 +import com.dao.CommonDao; // 通用数据访问接口 +import com.service.CommonService; // 通用服务接口 + + + // 通用服务实现类 + //提供各种通用数据统计和查询服务 + //@author [作者姓名] + //@date [创建日期] + +@Service("commonService") // 声明为Spring服务组件,指定bean名称为"commonService" +public class CommonServiceImpl implements CommonService { + + @Autowired // 自动注入CommonDao实例 + private CommonDao commonDao; // 通用数据访问对象 + + + // 饼图数据求和统计 + //@param params 查询参数Map + //@return 统计结果列表,每个元素是一个包含统计数据的Map + + public List> pieSum(Map params){ + return commonDao.pieSum(params); // 调用DAO层方法获取数据 + } + + + // 饼图数据计数统计 + //@param params 查询参数Map + //@return 统计结果列表,每个元素是一个包含统计数据的Map + + public List> pieCount(Map params){ + return commonDao.pieCount(params); + } + + + // 第一种柱状图数据求和统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barSumOne(Map params){ + return commonDao.barSumOne(params); + } + + + // 第一种柱状图数据计数统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barCountOne(Map params){ + return commonDao.barCountOne(params); + } + + + // 第二种柱状图数据求和统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barSumTwo(Map params){ + return commonDao.barSumTwo(params); + } + + + // 第二种柱状图数据计数统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barCountTwo(Map params){ + return commonDao.barCountTwo(params); + } + + + // 查询评分数据 + //@param params 查询参数Map,包含: + // - tableName: 查询表名 + // - condition1: 条件字段1 + // - condition1Value: 条件值1 + // - average: 是否计算平均评分 + //@return 包含评分数据的Map + + public Map queryScore(Map params){ + return commonDao.queryScore(params); + } + + + //新的级联字典表分组求和统计 + // @param params 查询参数Map + //@return 分组统计结果列表 + + @Override + public List> newSelectGroupSum(Map params) { + return commonDao.newSelectGroupSum(params); + } + + + // 新的级联字典表分组计数统计 + //@param params 查询参数Map + //@return 分组统计结果列表 + + @Override + public List> newSelectGroupCount(Map params) { + return commonDao.newSelectGroupCount(params); + } + + + // 通用柱状图求和统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barSum(Map params){ + return commonDao.barSum(params); + } + + + // 通用柱状图计数统计 + //@param params 查询参数Map + //@return 统计结果列表 + + public List> barCount(Map params){ + return commonDao.barCount(params); + } +} \ No newline at end of file From bbffedcb744cf484b9099d4895b0621c67e42739 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:33:07 +0800 Subject: [PATCH 04/53] Update CommonServiceImpl.java --- CommonServiceImpl.java | 203 +++++++++++++++-------------------------- 1 file changed, 72 insertions(+), 131 deletions(-) diff --git a/CommonServiceImpl.java b/CommonServiceImpl.java index f57a9f1..331025c 100644 --- a/CommonServiceImpl.java +++ b/CommonServiceImpl.java @@ -1,132 +1,73 @@ -package com.service.impl; -// 定义当前类所在的包路径,表示这是服务实现层的代码 - -// 导入必要的工具类 -import java.util.List; // Java List接口,用于存储有序集合 -import java.util.Map; // Java Map接口,用于存储键值对集合 - -// 导入Spring相关注解 -import org.springframework.beans.factory.annotation.Autowired; // Spring自动注入注解 -import org.springframework.stereotype.Service; // Spring服务注解 - -// 导入DAO和服务接口 -import com.dao.CommonDao; // 通用数据访问接口 -import com.service.CommonService; // 通用服务接口 - - - // 通用服务实现类 - //提供各种通用数据统计和查询服务 - //@author [作者姓名] - //@date [创建日期] - -@Service("commonService") // 声明为Spring服务组件,指定bean名称为"commonService" -public class CommonServiceImpl implements CommonService { - - @Autowired // 自动注入CommonDao实例 - private CommonDao commonDao; // 通用数据访问对象 - - - // 饼图数据求和统计 - //@param params 查询参数Map - //@return 统计结果列表,每个元素是一个包含统计数据的Map - - public List> pieSum(Map params){ - return commonDao.pieSum(params); // 调用DAO层方法获取数据 - } - - - // 饼图数据计数统计 - //@param params 查询参数Map - //@return 统计结果列表,每个元素是一个包含统计数据的Map - - public List> pieCount(Map params){ - return commonDao.pieCount(params); - } - - - // 第一种柱状图数据求和统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barSumOne(Map params){ - return commonDao.barSumOne(params); - } - - - // 第一种柱状图数据计数统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barCountOne(Map params){ - return commonDao.barCountOne(params); - } - - - // 第二种柱状图数据求和统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barSumTwo(Map params){ - return commonDao.barSumTwo(params); - } - - - // 第二种柱状图数据计数统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barCountTwo(Map params){ - return commonDao.barCountTwo(params); - } - - - // 查询评分数据 - //@param params 查询参数Map,包含: - // - tableName: 查询表名 - // - condition1: 条件字段1 - // - condition1Value: 条件值1 - // - average: 是否计算平均评分 - //@return 包含评分数据的Map - - public Map queryScore(Map params){ - return commonDao.queryScore(params); - } - - - //新的级联字典表分组求和统计 - // @param params 查询参数Map - //@return 分组统计结果列表 - - @Override - public List> newSelectGroupSum(Map params) { - return commonDao.newSelectGroupSum(params); - } - - - // 新的级联字典表分组计数统计 - //@param params 查询参数Map - //@return 分组统计结果列表 - - @Override - public List> newSelectGroupCount(Map params) { - return commonDao.newSelectGroupCount(params); - } - - - // 通用柱状图求和统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barSum(Map params){ - return commonDao.barSum(params); - } - - - // 通用柱状图计数统计 - //@param params 查询参数Map - //@return 统计结果列表 - - public List> barCount(Map params){ - return commonDao.barCount(params); - } +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> pieSum(Map params){ + return commonDao.pieSum(params); // 调用DAO层方法 + } + + // 获取饼图数据计数结果 + public List> pieCount(Map params){ + return commonDao.pieCount(params); // 调用DAO层方法 + } + + // 获取第一种柱状图数据求和结果 + public List> barSumOne(Map params){ + return commonDao.barSumOne(params); // 调用DAO层方法 + } + + // 获取第一种柱状图数据计数结果 + public List> barCountOne(Map params){ + return commonDao.barCountOne(params); // 调用DAO层方法 + } + + // 获取第二种柱状图数据求和结果 + public List> barSumTwo(Map params){ + return commonDao.barSumTwo(params); // 调用DAO层方法 + } + + // 获取第二种柱状图数据计数结果 + public List> barCountTwo(Map params){ + return commonDao.barCountTwo(params); // 调用DAO层方法 + } + + // 查询评分数据 + // @param params 包含查询参数:表名、条件1、条件1值、是否计算平均分 + public Map queryScore(Map params){ + return commonDao.queryScore(params); // 调用DAO层方法 + } + + // 新的级联字典表分组求和统计 + @Override + public List> newSelectGroupSum(Map params) { + return commonDao.newSelectGroupSum(params); // 调用DAO层方法 + } + + // 新的级联字典表分组计数统计 + @Override + public List> newSelectGroupCount(Map params) { + return commonDao.newSelectGroupCount(params); // 调用DAO层方法 + } + + // 柱状图数据求和 + public List> barSum(Map params){ + return commonDao.barSum(params); // 调用DAO层方法 + } + + // 柱状图数据计数 + public List> barCount(Map params){ + return commonDao.barCount(params); // 调用DAO层方法 + } } \ No newline at end of file From 9fddf9c06bba2dce2fb59f74bb9aacfd966accf3 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:36:41 +0800 Subject: [PATCH 05/53] ADD file via upload --- ConfigServiceImpl.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ConfigServiceImpl.java diff --git a/ConfigServiceImpl.java b/ConfigServiceImpl.java new file mode 100644 index 0000000..8a93b63 --- /dev/null +++ b/ConfigServiceImpl.java @@ -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 implements ConfigService { + + @Override // 重写接口方法 + public PageUtils queryPage(Map params) { + // 调用父类分页查询方法 + Page page = this.selectPage( + new Query(params).getPage(), // 创建分页参数 + new EntityWrapper() // 创建空条件构造器 + ); + // 返回自定义分页结果 + return new PageUtils(page); + } +} \ No newline at end of file From 7f53bce8df5a7c6ccb4b971a1538619938dfe68a Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:44:06 +0800 Subject: [PATCH 06/53] ADD file via upload --- DictionaryServiceImpl.java | 107 +++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 DictionaryServiceImpl.java diff --git a/DictionaryServiceImpl.java b/DictionaryServiceImpl.java new file mode 100644 index 0000000..a754cba --- /dev/null +++ b/DictionaryServiceImpl.java @@ -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 implements DictionaryService { + + @Override // 重写分页查询方法 + public PageUtils queryPage(Map params) { + Page page =new Query(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 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> dictionaryMap= (Map>) 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; // 返回不存在 + } +} \ No newline at end of file From efcd7b8430ab73e9f58294034e6294efd75bd1ba Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:51:28 +0800 Subject: [PATCH 07/53] ADD file via upload --- ForumServiceImpl.java | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 ForumServiceImpl.java diff --git a/ForumServiceImpl.java b/ForumServiceImpl.java new file mode 100644 index 0000000..770fa8e --- /dev/null +++ b/ForumServiceImpl.java @@ -0,0 +1,41 @@ +package com.service.impl; + +import com.utils.StringUtil; +import com.service.DictionaryService; +import com.utils.ClazzDiff; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.lang.reflect.Field; +import java.util.*; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; +import com.utils.PageUtils; +import com.utils.Query; +import org.springframework.web.context.ContextLoader; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; +import com.dao.ForumDao; +import com.entity.ForumEntity; +import com.service.ForumService; +import com.entity.view.ForumView; + +/** + * 健身论坛 服务实现类 + */ +@Service("forumService") +@Transactional +public class ForumServiceImpl extends ServiceImpl implements ForumService { + + @Override + public PageUtils queryPage(Map params) { + Page page =new Query(params).getPage(); + page.setRecords(baseMapper.selectListView(page,params)); + return new PageUtils(page); + } + + +} From e074130ae0feccf3a3561e0e90e5e1f4e0793278 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:52:13 +0800 Subject: [PATCH 08/53] Update ForumServiceImpl.java --- ForumServiceImpl.java | 108 ++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 41 deletions(-) diff --git a/ForumServiceImpl.java b/ForumServiceImpl.java index 770fa8e..49f3c95 100644 --- a/ForumServiceImpl.java +++ b/ForumServiceImpl.java @@ -1,41 +1,67 @@ -package com.service.impl; - -import com.utils.StringUtil; -import com.service.DictionaryService; -import com.utils.ClazzDiff; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import java.lang.reflect.Field; -import java.util.*; -import com.baomidou.mybatisplus.plugins.Page; -import com.baomidou.mybatisplus.service.impl.ServiceImpl; -import org.springframework.transaction.annotation.Transactional; -import com.utils.PageUtils; -import com.utils.Query; -import org.springframework.web.context.ContextLoader; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; -import com.dao.ForumDao; -import com.entity.ForumEntity; -import com.service.ForumService; -import com.entity.view.ForumView; - -/** - * 健身论坛 服务实现类 - */ -@Service("forumService") -@Transactional -public class ForumServiceImpl extends ServiceImpl implements ForumService { - - @Override - public PageUtils queryPage(Map params) { - Page page =new Query(params).getPage(); - page.setRecords(baseMapper.selectListView(page,params)); - return new PageUtils(page); - } - - -} +// 定义包名为 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 implements ForumService { + + // 重写 ForumService 接口中的 queryPage 方法 + @Override + // 定义 queryPage 方法,用于查询分页数据,接收一个包含查询参数的 Map 对象 + public PageUtils queryPage(Map params) { + // 根据传入的参数创建一个 ForumView 类型的分页对象 + Page page =new Query(params).getPage(); + // 调用 baseMapper 的 selectListView 方法查询数据列表,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page,params)); + // 根据分页对象创建 PageUtils 对象并返回 + return new PageUtils(page); + } +} \ No newline at end of file From bacddb53cf10402dda78743b9ed9c002b4be6cbe Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 20:55:47 +0800 Subject: [PATCH 09/53] ADD file via upload --- JianshenkechengCollectionServiceImpl.java | 67 +++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 JianshenkechengCollectionServiceImpl.java diff --git a/JianshenkechengCollectionServiceImpl.java b/JianshenkechengCollectionServiceImpl.java new file mode 100644 index 0000000..b62f31b --- /dev/null +++ b/JianshenkechengCollectionServiceImpl.java @@ -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 implements JianshenkechengCollectionService { + + // 重写 JianshenkechengCollectionService 接口中的 queryPage 方法 + @Override + // 实现分页查询课程收藏数据的方法,接收一个包含查询参数的 Map 对象 + public PageUtils queryPage(Map params) { + // 根据传入的查询参数创建一个 JianshenkechengCollectionView 类型的分页对象 + Page page = new Query(params).getPage(); + // 调用数据访问对象的方法查询分页列表数据,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, params)); + // 根据分页对象创建 PageUtils 对象并返回 + return new PageUtils(page); + } +} \ No newline at end of file From 607b0c70e53466077b0f135b0e686194bdc0c10e Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:01:13 +0800 Subject: [PATCH 10/53] ADD file via upload --- JianshenkechengLiuyanServiceImpl.java | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 JianshenkechengLiuyanServiceImpl.java diff --git a/JianshenkechengLiuyanServiceImpl.java b/JianshenkechengLiuyanServiceImpl.java new file mode 100644 index 0000000..b985c73 --- /dev/null +++ b/JianshenkechengLiuyanServiceImpl.java @@ -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 + implements JianshenkechengLiuyanService { + + // 实现分页查询接口方法 + @Override + public PageUtils queryPage(Map params) { + // 使用Query工具类根据参数创建分页对象 + Page page = new Query(params).getPage(); + + // 调用Mapper查询分页数据并设置到page对象 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回封装好的分页工具类实例 + return new PageUtils(page); + } + +} \ No newline at end of file From 964467ea571a7d61e76d44f9c281967e124ad516 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:11:19 +0800 Subject: [PATCH 11/53] ADD file via upload --- JianshenkechengServiceImpl.java | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 JianshenkechengServiceImpl.java diff --git a/JianshenkechengServiceImpl.java b/JianshenkechengServiceImpl.java new file mode 100644 index 0000000..b7fd159 --- /dev/null +++ b/JianshenkechengServiceImpl.java @@ -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 + implements JianshenkechengService { + + // 实现分页查询方法 + @Override + public PageUtils queryPage(Map params) { + // 创建分页查询对象 + Page page = new Query(params).getPage(); + + // 执行分页查询并设置结果 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回分页工具对象 + return new PageUtils(page); + } + // 类结束 +} \ No newline at end of file From ffa01d8b42a47b9d4e8567ddc237894be45678ac Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:14:50 +0800 Subject: [PATCH 12/53] ADD file via upload --- JiaolianServiceImpl.java | 73 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 JiaolianServiceImpl.java diff --git a/JiaolianServiceImpl.java b/JiaolianServiceImpl.java new file mode 100644 index 0000000..3014b83 --- /dev/null +++ b/JiaolianServiceImpl.java @@ -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 + implements JiaolianService { + + // 实现分页查询方法 + @Override + public PageUtils queryPage(Map params) { + // 创建分页查询对象 + Page page = new Query(params).getPage(); + + // 执行分页查询并设置结果 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回分页工具对象 + return new PageUtils(page); + } + // 类结束 +} \ No newline at end of file From 0b63d76d8926f00e239f0594a4230ada90fac73a Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:17:04 +0800 Subject: [PATCH 13/53] ADD file via upload --- JiaolianYuyueServiceImpl.java | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 JiaolianYuyueServiceImpl.java diff --git a/JiaolianYuyueServiceImpl.java b/JiaolianYuyueServiceImpl.java new file mode 100644 index 0000000..31b6ef4 --- /dev/null +++ b/JiaolianYuyueServiceImpl.java @@ -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 implements JiaolianYuyueService { + + // 重写 JiaolianYuyueService 接口中的 queryPage 方法 + @Override + // 实现分页查询教练预约申请数据的方法,接收一个包含查询参数的 Map 对象 + public PageUtils queryPage(Map params) { + // 根据传入的查询参数创建一个 JiaolianYuyueView 类型的分页对象 + Page page = new Query(params).getPage(); + // 调用数据访问对象的方法查询分页列表数据,并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, params)); + // 根据分页对象创建 PageUtils 对象并返回 + return new PageUtils(page); + } +} \ No newline at end of file From 3d579bb043a9b735115f28a9da0251eb6a6c68dc Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:28:34 +0800 Subject: [PATCH 14/53] ADD file via upload --- NewsServiceImpl.java | 73 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 NewsServiceImpl.java diff --git a/NewsServiceImpl.java b/NewsServiceImpl.java new file mode 100644 index 0000000..faf13c7 --- /dev/null +++ b/NewsServiceImpl.java @@ -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 + implements NewsService { + + // 实现分页查询方法 + @Override + public PageUtils queryPage(Map params) { + // 创建分页查询对象 + Page page = new Query(params).getPage(); + + // 执行分页查询并设置结果 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回分页工具对象 + return new PageUtils(page); + } + // 类结束 +} \ No newline at end of file From 0c7e3c86350c7f8dda19628ace112a53ec2f46ae Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:30:00 +0800 Subject: [PATCH 15/53] ADD file via upload --- SingleSeachServiceImpl.java | 73 +++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 SingleSeachServiceImpl.java diff --git a/SingleSeachServiceImpl.java b/SingleSeachServiceImpl.java new file mode 100644 index 0000000..61d2312 --- /dev/null +++ b/SingleSeachServiceImpl.java @@ -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 + implements SingleSeachService { + + // 实现分页查询方法 + @Override + public PageUtils queryPage(Map params) { + // 创建分页查询对象 + Page page = new Query(params).getPage(); + + // 执行分页查询并设置结果 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回分页工具对象 + return new PageUtils(page); + } + // 类结束 +} \ No newline at end of file From beac827c04e5365eb9dcc7a51c6055238be88e98 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:34:11 +0800 Subject: [PATCH 16/53] ADD file via upload --- TokenServiceImpl.java | 121 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 TokenServiceImpl.java diff --git a/TokenServiceImpl.java b/TokenServiceImpl.java new file mode 100644 index 0000000..e40eb52 --- /dev/null +++ b/TokenServiceImpl.java @@ -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 implements TokenService { + + // 重写 TokenService 接口中的 queryPage 方法,用于分页查询 Token 数据 + @Override + public PageUtils queryPage(Map params) { + // 根据传入的参数创建一个 TokenEntity 类型的分页对象 + Page page = this.selectPage( + // 通过 Query 工具类根据参数获取分页信息 + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 根据分页对象创建 PageUtils 对象并返回 + return new PageUtils(page); + } + + // 重写 TokenService 接口中的 selectListView 方法,用于查询 Token 列表数据 + @Override + public List selectListView(Wrapper wrapper) { + // 调用数据访问对象的 selectListView 方法,根据查询条件包装器查询列表数据并返回 + return baseMapper.selectListView(wrapper); + } + + // 重写 TokenService 接口中的 queryPage 方法,支持带查询条件的分页查询 Token 数据 + @Override + public PageUtils queryPage(Map params, + Wrapper wrapper) { + // 根据传入的参数创建一个 TokenEntity 类型的分页对象 + Page page = new Query(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().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().eq("token", token)); + // 如果未查询到 Token 实体对象或者 Token 已过期 + if (tokenEntity == null || tokenEntity.getExpiratedtime().getTime() < new Date().getTime()) { + // 返回 null + return null; + } + // 返回查询到的 Token 实体对象 + return tokenEntity; + } +} \ No newline at end of file From 9e467aff9cfde37d9ad4be42e3815ac45c5c52ee Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:36:54 +0800 Subject: [PATCH 17/53] ADD file via upload --- UsersServiceImpl.java | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 UsersServiceImpl.java diff --git a/UsersServiceImpl.java b/UsersServiceImpl.java new file mode 100644 index 0000000..5a02ce0 --- /dev/null +++ b/UsersServiceImpl.java @@ -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 implements UsersService { + + // 重写 UsersService 接口中的 queryPage 方法,用于分页查询系统用户数据 + @Override + public PageUtils queryPage(Map params) { + // 根据传入的参数创建一个 UsersEntity 类型的分页对象 + Page page = this.selectPage( + // 通过 Query 工具类根据参数获取分页信息 + new Query(params).getPage(), + // 创建一个空的查询条件包装器 + new EntityWrapper() + ); + // 根据分页对象创建 PageUtils 对象并返回 + return new PageUtils(page); + } + + // 重写 UsersService 接口中的 selectListView 方法,用于查询系统用户列表数据 + @Override + public List selectListView(Wrapper wrapper) { + // 调用数据访问对象的 selectListView 方法,根据查询条件包装器查询列表数据并返回 + return baseMapper.selectListView(wrapper); + } + + // 重写 UsersService 接口中的 queryPage 方法,支持带查询条件的分页查询系统用户数据 + @Override + public PageUtils queryPage(Map params, + Wrapper wrapper) { + // 根据传入的参数创建一个 UsersEntity 类型的分页对象 + Page page = new Query(params).getPage(); + // 调用数据访问对象的 selectListView 方法,根据分页对象和查询条件包装器查询列表数据并设置到分页对象中 + page.setRecords(baseMapper.selectListView(page, wrapper)); + // 根据分页对象创建 PageUtils 对象 + PageUtils pageUtil = new PageUtils(page); + // 返回 PageUtils 对象 + return pageUtil; + } +} \ No newline at end of file From 345a200479b745333956c5b349940998e821c04e Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 21:39:11 +0800 Subject: [PATCH 18/53] ADD file via upload --- YonghuServiceImpl.java | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 YonghuServiceImpl.java diff --git a/YonghuServiceImpl.java b/YonghuServiceImpl.java new file mode 100644 index 0000000..78803bc --- /dev/null +++ b/YonghuServiceImpl.java @@ -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 + implements YonghuService { + + // 实现分页查询方法 + @Override + public PageUtils queryPage(Map params) { + // 创建分页查询对象 + Page page = new Query(params).getPage(); + + // 执行分页查询并设置结果 + page.setRecords(baseMapper.selectListView(page,params)); + + // 返回分页工具对象 + return new PageUtils(page); + } + // 类结束 +} \ No newline at end of file From f984c807b0092087ee5df806b8d46b2e64931dd5 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:00:42 +0800 Subject: [PATCH 19/53] ADD file via upload --- CommonService.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 CommonService.java diff --git a/CommonService.java b/CommonService.java new file mode 100644 index 0000000..2b12c4c --- /dev/null +++ b/CommonService.java @@ -0,0 +1,58 @@ +// 定义当前接口所在的包路径 +package com.service; + +// 导入Java集合框架中的List接口 +import java.util.List; +// 导入Java集合框架中的Map接口 +import java.util.Map; + +// 通用服务接口定义 +public interface CommonService { + + // 饼图数据求和统计方法 + List> pieSum(Map params); + + // 饼图数据计数统计方法 + List> pieCount(Map params); + + // 柱状图第一种数据求和统计方法 + List> barSumOne(Map params); + + // 柱状图第一种数据计数统计方法 + List> barCountOne(Map params); + + // 柱状图第二种数据求和统计方法 + List> barSumTwo(Map params); + + // 柱状图第二种数据计数统计方法 + List> barCountTwo(Map params); + + // 查询评分数据方法 + // params参数包含: + // tableName - 查询表名 + // condition1 - 查询条件1 + // condition1Value - 条件1的值 + // average - 是否计算平均评分 + Map queryScore(Map params); + + // 新的级联字典表分组求和统计方法 + // params - 包含查询条件的参数Map + // 返回分组求和结果列表 + List> newSelectGroupSum(Map params); + + // 新的级联字典表分组计数统计方法 + // params - 包含查询条件的参数Map + // 返回分组计数结果列表 + List> newSelectGroupCount(Map params); + + // 通用柱状图数据求和方法 + // params - 包含查询条件的参数Map + // 返回柱状图求和数据列表 + List> barSum(Map params); + + // 通用柱状图数据计数方法 + // params - 包含查询条件的参数Map + // 返回柱状图计数数据列表 + List> barCount(Map params); + +} \ No newline at end of file From 9af6ebe0030587dbe1eaa22e93c4f5d8b2d4c6cb Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:01:45 +0800 Subject: [PATCH 20/53] ADD file via upload --- ConfigService.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 ConfigService.java diff --git a/ConfigService.java b/ConfigService.java new file mode 100644 index 0000000..74054da --- /dev/null +++ b/ConfigService.java @@ -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 { + + // 分页查询配置数据方法 + // params - 包含查询条件的参数Map + // 返回分页工具对象 + PageUtils queryPage(Map params); + +} \ No newline at end of file From 97e727b49810a97b2c8d8e473563981c75b1e861 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:02:49 +0800 Subject: [PATCH 21/53] ADD file via upload --- DictionaryService.java | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 DictionaryService.java diff --git a/DictionaryService.java b/DictionaryService.java new file mode 100644 index 0000000..f2b832d --- /dev/null +++ b/DictionaryService.java @@ -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 { + + // 分页查询字典数据方法 + // params - 包含查询条件的参数Map + // 返回分页工具对象 + PageUtils queryPage(Map params); + + // 字典表数据转换方法 + // obj - 需要进行字典转换的对象 + // request - HTTP请求对象 + void dictionaryConvert(Object obj, HttpServletRequest request); + +} \ No newline at end of file From 11a834c2840285ff8dc80e72d7e7375b0309c6c6 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:05:20 +0800 Subject: [PATCH 22/53] ADD file via upload --- ForumService.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ForumService.java diff --git a/ForumService.java b/ForumService.java new file mode 100644 index 0000000..f23be0b --- /dev/null +++ b/ForumService.java @@ -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 { + + // 分页查询论坛数据方法 + // params - 包含查询条件的参数Map + // 返回分页工具对象 + PageUtils queryPage(Map params); + +} \ No newline at end of file From 92ba214989c74fe8ac90ae873dbeb62474733de1 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:06:48 +0800 Subject: [PATCH 23/53] ADD file via upload --- JianshenkechengCollectionService.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 JianshenkechengCollectionService.java diff --git a/JianshenkechengCollectionService.java b/JianshenkechengCollectionService.java new file mode 100644 index 0000000..c399d96 --- /dev/null +++ b/JianshenkechengCollectionService.java @@ -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 { + + // 定义查询分页数据的方法,接收一个包含查询参数的 Map 对象 + // 返回值为 PageUtils 对象,包含分页信息和查询结果 + PageUtils queryPage(Map params); +} \ No newline at end of file From 8747bd2a08224ad77ae951e93c3b9711d81145e5 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:08:21 +0800 Subject: [PATCH 24/53] ADD file via upload --- JianshenkechengLiuyanService.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 JianshenkechengLiuyanService.java diff --git a/JianshenkechengLiuyanService.java b/JianshenkechengLiuyanService.java new file mode 100644 index 0000000..7910627 --- /dev/null +++ b/JianshenkechengLiuyanService.java @@ -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 { + + // 分页查询课程留言数据方法 + // params - 包含查询条件的参数Map + // 返回封装好的分页工具对象 + PageUtils queryPage(Map params); + +} \ No newline at end of file From 1dcb4173e8ee733a74a42f81709ce13454b432ba Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:10:50 +0800 Subject: [PATCH 25/53] ADD file via upload --- JianshenkechengService.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 JianshenkechengService.java diff --git a/JianshenkechengService.java b/JianshenkechengService.java new file mode 100644 index 0000000..0079569 --- /dev/null +++ b/JianshenkechengService.java @@ -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 +public interface JianshenkechengService extends IService { + // 定义一个名为 queryPage 的方法,用于根据传入的查询参数进行分页查询 + // 参数 params 是一个 Map,用于存储查询所需的各种参数 + // 返回值是 PageUtils 类型,包含了分页查询后的结果 + PageUtils queryPage(Map params); +} \ No newline at end of file From 805e86902b1021aff8c4a2616ad9c5a1dfc00f1e Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:12:12 +0800 Subject: [PATCH 26/53] ADD file via upload --- JiaolianService.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 JiaolianService.java diff --git a/JiaolianService.java b/JiaolianService.java new file mode 100644 index 0000000..1c654f8 --- /dev/null +++ b/JiaolianService.java @@ -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 { + + // 分页查询教练数据方法 + // params - 包含查询条件的参数Map + // 返回封装好的分页工具对象 + PageUtils queryPage(Map params); + +} \ No newline at end of file From 9000dad8adf1e62d33aa5185d86823a98ec520eb Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:15:54 +0800 Subject: [PATCH 27/53] ADD file via upload --- JiaolianYuyueService.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 JiaolianYuyueService.java diff --git a/JiaolianYuyueService.java b/JiaolianYuyueService.java new file mode 100644 index 0000000..a9b6f32 --- /dev/null +++ b/JiaolianYuyueService.java @@ -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,表示这是教练预约申请的服务接口 +public interface JiaolianYuyueService extends IService { + // 定义一个方法用于分页查询教练预约申请数据 + // params 参数为一个 Map 对象,存储了查询所需的条件 + // 返回值为 PageUtils 对象,包含了分页查询后的结果 + PageUtils queryPage(Map params); +} \ No newline at end of file From fa46759de9a7d2411d20ce386df32651ecfa1dd3 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:16:49 +0800 Subject: [PATCH 28/53] ADD file via upload --- NewsService.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 NewsService.java diff --git a/NewsService.java b/NewsService.java new file mode 100644 index 0000000..e7d266e --- /dev/null +++ b/NewsService.java @@ -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 { + + // 分页查询健身资讯数据方法 + // params - 包含查询条件的参数Map + // 返回封装好的分页工具对象 + PageUtils queryPage(Map params); + +} \ No newline at end of file From 8df0db63dbd8c223aa0d02273e691a52434f3a62 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:18:37 +0800 Subject: [PATCH 29/53] ADD file via upload --- SingleSeachService.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 SingleSeachService.java diff --git a/SingleSeachService.java b/SingleSeachService.java new file mode 100644 index 0000000..402de49 --- /dev/null +++ b/SingleSeachService.java @@ -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 +public interface SingleSeachService extends IService { + // 定义一个方法用于根据传入的查询参数进行分页查询 + // params 是一个 Map 类型的参数,用于存储查询条件 + // 返回值是 PageUtils 类型,包含了分页查询后的结果 + PageUtils queryPage(Map params); +} \ No newline at end of file From c97e9739883feba294f5480e3744fd54974e0dca Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:21:10 +0800 Subject: [PATCH 30/53] ADD file via upload --- TokenService.java | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 TokenService.java diff --git a/TokenService.java b/TokenService.java new file mode 100644 index 0000000..ca8ccbe --- /dev/null +++ b/TokenService.java @@ -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 +public interface TokenService extends IService { + // 定义分页查询方法,根据传入的查询参数进行分页查询 + // params 参数为一个 Map 对象,存储了查询所需的条件 + // 返回值为 PageUtils 对象,包含了分页查询后的结果 + PageUtils queryPage(Map params); + + // 定义查询列表视图的方法,根据传入的查询条件包装器查询 Token 实体列表 + // wrapper 参数为 Wrapper 类型,用于构建查询条件 + // 返回值为 List 类型,包含符合条件的 Token 实体列表 + List selectListView(Wrapper wrapper); + + // 定义带查询条件包装器的分页查询方法,根据传入的查询参数和查询条件包装器进行分页查询 + // params 参数为一个 Map 对象,存储了查询所需的条件 + // wrapper 参数为 Wrapper 类型,用于构建查询条件 + // 返回值为 PageUtils 对象,包含了分页查询后的结果 + PageUtils queryPage(Map params, Wrapper 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); +} \ No newline at end of file From f8d7dfd6c50178b0d5b44b5376f4b5cfa86688fa Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:22:03 +0800 Subject: [PATCH 31/53] ADD file via upload --- UsersService.java | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 UsersService.java diff --git a/UsersService.java b/UsersService.java new file mode 100644 index 0000000..18d4a63 --- /dev/null +++ b/UsersService.java @@ -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 { + + // 分页查询用户数据方法(基础版) + // params - 包含查询条件的参数Map + // 返回封装好的分页工具对象 + PageUtils queryPage(Map params); + + // 根据条件查询用户列表方法 + // wrapper - 查询条件构造器 + // 返回用户实体列表 + List selectListView(Wrapper wrapper); + + // 分页查询用户数据方法(增强版) + // params - 包含查询条件的参数Map + // wrapper - 查询条件构造器 + // 返回封装好的分页工具对象 + PageUtils queryPage(Map params, Wrapper wrapper); + \ No newline at end of file From cd5f43941e758a079693c4d083e5c00f744329cb Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:24:41 +0800 Subject: [PATCH 32/53] ADD file via upload --- YonghuService.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 YonghuService.java diff --git a/YonghuService.java b/YonghuService.java new file mode 100644 index 0000000..cf04045 --- /dev/null +++ b/YonghuService.java @@ -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,表明这是一个用户服务接口 +public interface YonghuService extends IService { + // 定义一个方法用于根据传入的查询参数进行分页查询用户数据 + // params 是一个 Map 类型的参数,存储了查询所需的各种条件 + // 返回值是 PageUtils 类型,包含了分页查询后的结果数据 + PageUtils queryPage(Map params); +} \ No newline at end of file From 7395d75b251e29846d6d29cc556749cf77df2dbe Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:31:46 +0800 Subject: [PATCH 33/53] ADD file via upload --- DictionaryServletContextListener.java | 94 +++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 DictionaryServletContextListener.java diff --git a/DictionaryServletContextListener.java b/DictionaryServletContextListener.java new file mode 100644 index 0000000..fbc7e12 --- /dev/null +++ b/DictionaryServletContextListener.java @@ -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 dictionaryEntities = dictionaryService.selectList(new EntityWrapper()); + // 创建字典映射表 + Map> map = new HashMap<>(); + // 遍历字典数据并构建映射关系 + for(DictionaryEntity d :dictionaryEntities){ + // 获取当前字典代码对应的映射表 + Map 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("----------线程执行结束----------"); + } +} \ No newline at end of file From b8d26c4eae3c8ea0b7b29440be5aa0fd04159d7d Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:33:54 +0800 Subject: [PATCH 34/53] ADD file via upload --- MyThreadMethod.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 MyThreadMethod.java diff --git a/MyThreadMethod.java b/MyThreadMethod.java new file mode 100644 index 0000000..886d4f6 --- /dev/null +++ b/MyThreadMethod.java @@ -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()); + } + } +} \ No newline at end of file From 59b310252cb25a2e7a303269b72ee27fe7c8cbdf Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:47:03 +0800 Subject: [PATCH 35/53] ADD file via upload --- BaiduUtil.java | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 BaiduUtil.java diff --git a/BaiduUtil.java b/BaiduUtil.java new file mode 100644 index 0000000..a050ec9 --- /dev/null +++ b/BaiduUtil.java @@ -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 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 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> 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; + } +} \ No newline at end of file From 600698e450277b782f63e3cd97b9c84c6e8e7a4b Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:53:53 +0800 Subject: [PATCH 36/53] ADD file via upload --- ClazzDiff.java | 206 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 ClazzDiff.java diff --git a/ClazzDiff.java b/ClazzDiff.java new file mode 100644 index 0000000..488604c --- /dev/null +++ b/ClazzDiff.java @@ -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 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 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 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() + "-->现在 : 文件下载,原先 : 文件下载"); + // 如果字段名包含"Video" + } else if (f.getName().contains("Video")) { + // 添加包含视频播放链接的差异信息到列表中 + list.add(columnInfo.comment() + "-->现在 : ,原先 : "); + // 如果字段名包含"Photo" + } else if (f.getName().contains("Photo")) { + // 添加包含图片展示链接的差异信息到列表中 + list.add(columnInfo.comment() + "-->现在 : ,原先 : "); + // 如果字段名包含"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() + "-->现在 : 文件下载,原先 : 文件下载"); + // 如果字段名包含"Video" + } else if (f.getName().contains("Video")) { + // 添加包含视频播放链接的差异信息到列表中 + list.add(columnInfo.comment() + "-->现在 : ,原先 : "); + // 如果字段名包含"Photo" + } else if (f.getName().contains("Photo")) { + // 添加包含图片展示链接的差异信息到列表中 + list.add(columnInfo.comment() + "-->现在 : ,原先 : "); + // 如果字段名包含"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 strings = new ClazzDiff().ClazzDiffColumn(chengpinEntity1, chengpinEntity2,new String[]{"serialVersionUID"}); + // List strings = new ClazzDiff().ClazzDiffColumn(chengpinEntity1, chengpinEntity2); + // System.out.println(strings); + } +} \ No newline at end of file From a6dcccbd908f848242bdb0341728efc5f9882ff2 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 22:56:30 +0800 Subject: [PATCH 37/53] ADD file via upload --- CommonUtil.java | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 CommonUtil.java diff --git a/CommonUtil.java b/CommonUtil.java new file mode 100644 index 0000000..bb718ae --- /dev/null +++ b/CommonUtil.java @@ -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 params) { + // 初始化四个布尔变量,用于标记是否存在特定的键 + boolean page = true, limit = true, sort = true, order = true; + // 获取 Map 中键值对的迭代器 + Iterator> iter = params.entrySet().iterator(); + // 遍历 Map 中的键值对 + while (iter.hasNext()) { + // 获取当前的键值对 + Map.Entry 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"); + } + } +} \ No newline at end of file From ba84eacd63bd7a02d4d79a35d884d970b859b2ae Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:00:52 +0800 Subject: [PATCH 38/53] ADD file via upload --- DateUtil.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 DateUtil.java diff --git a/DateUtil.java b/DateUtil.java new file mode 100644 index 0000000..70002ef --- /dev/null +++ b/DateUtil.java @@ -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); + } +} \ No newline at end of file From 5edba550fef124505d116268d1c1656ee376a076 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:10:16 +0800 Subject: [PATCH 39/53] ADD file via upload --- FileUtil.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 FileUtil.java diff --git a/FileUtil.java b/FileUtil.java new file mode 100644 index 0000000..cce3b0b --- /dev/null +++ b/FileUtil.java @@ -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(); // 返回字节数组 + } +} \ No newline at end of file From 66e4a4424d2d7af485075010d266c38ea3b696ec Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:11:47 +0800 Subject: [PATCH 40/53] ADD file via upload --- HttpClientUtils.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 HttpClientUtils.java diff --git a/HttpClientUtils.java b/HttpClientUtils.java new file mode 100644 index 0000000..67632a3 --- /dev/null +++ b/HttpClientUtils.java @@ -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; // 返回空值 + } + } +} \ No newline at end of file From 9768386f0502c93a822bddb365e57dc5bc354141 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:14:27 +0800 Subject: [PATCH 41/53] ADD file via upload --- JQPageInfo.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 JQPageInfo.java diff --git a/JQPageInfo.java b/JQPageInfo.java new file mode 100644 index 0000000..c98fe39 --- /dev/null +++ b/JQPageInfo.java @@ -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; + } +} \ No newline at end of file From f4c5396916dbf1dbfcf86fb3828f8a94ada02b12 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:18:00 +0800 Subject: [PATCH 42/53] ADD file via upload --- MD5Utils.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 MD5Utils.java diff --git a/MD5Utils.java b/MD5Utils.java new file mode 100644 index 0000000..f89da2f --- /dev/null +++ b/MD5Utils.java @@ -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加密字符串 + } +} \ No newline at end of file From 69521fd7ed5a0ab688447a7194f0ad169fcc6533 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:23:36 +0800 Subject: [PATCH 43/53] ADD file via upload --- MPUtil.java | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 MPUtil.java diff --git a/MPUtil.java b/MPUtil.java new file mode 100644 index 0000000..50944ce --- /dev/null +++ b/MPUtil.java @@ -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 map =BeanUtil.beanToMap(bean); // 将Bean转为Map + return camelToUnderlineMap(map,pre); // 转换键名并返回 + } + + // AllEQ条件转换 + public static Map allEQMap(Object bean) { + Map map =BeanUtil.beanToMap(bean); // 将Bean转为Map + return camelToUnderlineMap(map,""); // 转换键名并返回 + } + + // 带前缀的LIKE条件构造 + public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) { + Map 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> it = param.entrySet().iterator(); // 获取迭代器 + int i=0; // 计数器 + while (it.hasNext()) { // 遍历Map + if(i>0) wrapper.and(); // 多个条件用AND连接 + Map.Entry 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> it = param.entrySet().iterator(); // 获取迭代器 + int i=0; // 计数器 + while (it.hasNext()) { // 遍历Map + if(i>0) wrapper.and(); // 多个条件用AND连接 + Map.Entry 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> it = param.entrySet().iterator(); // 获取迭代器 + int i=0; // 计数器 + while (it.hasNext()) { // 遍历Map + if(i>0) wrapper.and(); // 多个条件用AND连接 + Map.Entry entry = it.next(); // 获取键值对 + String key = entry.getKey(); // 获取字段名 + wrapper.eq(key, entry.getValue()); // 添加EQ条件 + i++; // 计数器递增 + } + return wrapper; // 返回条件构造器 + } + + // BETWEEN条件构造 + public static Wrapper between(Wrapper wrapper,Map 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 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 newMap = new HashMap(); // 创建新Map + Iterator> it = param.entrySet().iterator(); // 获取迭代器 + while (it.hasNext()) { // 遍历原Map + Map.Entry 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 + } +} \ No newline at end of file From ddde76e4ed76f9f37052cd1ea684509fda58d7b6 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:31:50 +0800 Subject: [PATCH 44/53] ADD file via upload --- PageUtils.java | 114 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 PageUtils.java diff --git a/PageUtils.java b/PageUtils.java new file mode 100644 index 0000000..4a2ea63 --- /dev/null +++ b/PageUtils.java @@ -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 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; + } +} \ No newline at end of file From 2e6a7d32185c77aa2d2a733cb0be51ac221afe12 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:35:05 +0800 Subject: [PATCH 45/53] ADD file via upload --- PoiUtil.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 PoiUtil.java diff --git a/PoiUtil.java b/PoiUtil.java new file mode 100644 index 0000000..a14932b --- /dev/null +++ b/PoiUtil.java @@ -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> poiImport(String url) throws Exception { + List> 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 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 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 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> lists = PoiUtil.poiImport("C:/Users/Administrator/Desktop/工作1.xls"); // 测试导入 + PoiUtil.poiExport(lists, "C:/Users/Administrator/Desktop/工作1.xls"); // 测试导出 + } catch (Exception e) { + e.printStackTrace(); // 打印异常信息 + } + } +} \ No newline at end of file From a9c1b8f12fdd02b6e2db5ce2f9b1c21336b3f1a4 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:42:09 +0800 Subject: [PATCH 46/53] ADD file via upload --- Query.java | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 Query.java diff --git a/Query.java b/Query.java new file mode 100644 index 0000000..a692b12 --- /dev/null +++ b/Query.java @@ -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 extends LinkedHashMap { + // 定义序列化版本号,用于序列化和反序列化时的版本验证 + private static final long serialVersionUID = 1L; + // 定义 MyBatis-Plus 的 Page 对象,用于分页操作 + private Page 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 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 getPage() { + return page; + } + + // 获取当前页码 + public int getCurrPage() { + return currPage; + } + + // 获取每页记录数 + public int getLimit() { + return limit; + } +} \ No newline at end of file From 64772323fc754d9d2b960fdcb133adace1caf288 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:43:43 +0800 Subject: [PATCH 47/53] ADD file via upload --- R.java | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 R.java diff --git a/R.java b/R.java new file mode 100644 index 0000000..ba1de02 --- /dev/null +++ b/R.java @@ -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 { + // 定义序列化版本号,用于序列化和反序列化时的版本验证 + 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 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; + } +} \ No newline at end of file From ae03fdad474e5ed460d8da52cc9958c902c09a4b Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:45:59 +0800 Subject: [PATCH 48/53] ADD file via upload --- SpringContextUtils.java | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 SpringContextUtils.java diff --git a/SpringContextUtils.java b/SpringContextUtils.java new file mode 100644 index 0000000..b6ca4e3 --- /dev/null +++ b/SpringContextUtils.java @@ -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 getBean(String name, Class 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 getType(String name) { + // 调用应用上下文的 getType 方法获取 Bean 的类型 + return applicationContext.getType(name); + } +} \ No newline at end of file From 376e758b65bc356b59dffc7281645e9b22affb86 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:55:35 +0800 Subject: [PATCH 49/53] ADD file via upload --- SQLFilter.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 SQLFilter.java diff --git a/SQLFilter.java b/SQLFilter.java new file mode 100644 index 0000000..78ce28e --- /dev/null +++ b/SQLFilter.java @@ -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; + } +} \ No newline at end of file From eda9a11aa05fdd3bab911d815f0edc6cf4765e4f Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Mon, 28 Apr 2025 23:59:03 +0800 Subject: [PATCH 50/53] ADD file via upload --- StringUtil.java | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 StringUtil.java diff --git a/StringUtil.java b/StringUtil.java new file mode 100644 index 0000000..158efb9 --- /dev/null +++ b/StringUtil.java @@ -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); + } +} \ No newline at end of file From 3cebe990c568d0ea5d42eb3a421e8352261b1f28 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Tue, 29 Apr 2025 00:00:18 +0800 Subject: [PATCH 51/53] ADD file via upload --- ValidatorUtils.java | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 ValidatorUtils.java diff --git a/ValidatorUtils.java b/ValidatorUtils.java new file mode 100644 index 0000000..347181b --- /dev/null +++ b/ValidatorUtils.java @@ -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> constraintViolations = validator.validate(object, groups); + // 检查是否有校验错误 + if (!constraintViolations.isEmpty()) { + // 获取第一个校验错误 + ConstraintViolation constraint = (ConstraintViolation)constraintViolations.iterator().next(); + // 抛出包含错误信息的异常 + throw new EIException(constraint.getMessage()); + } + } +} \ No newline at end of file From f4ef98b1326731f28203d7e3767e9c9804d97882 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Tue, 29 Apr 2025 00:01:53 +0800 Subject: [PATCH 52/53] ADD file via upload --- jianshenfangglApplication.java | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 jianshenfangglApplication.java diff --git a/jianshenfangglApplication.java b/jianshenfangglApplication.java new file mode 100644 index 0000000..682facd --- /dev/null +++ b/jianshenfangglApplication.java @@ -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); + } +} \ No newline at end of file From 5d0222ecda4735a57c32c844093d10e4bfb89702 Mon Sep 17 00:00:00 2001 From: p2x9nfpei <2196435763@qq.com> Date: Tue, 29 Apr 2025 02:06:37 +0800 Subject: [PATCH 53/53] ADD file via upload --- vuedw.js | 4216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4216 insertions(+) create mode 100644 vuedw.js diff --git a/vuedw.js b/vuedw.js new file mode 100644 index 0000000..bef76e6 --- /dev/null +++ b/vuedw.js @@ -0,0 +1,4216 @@ +// 缓存样式文本解析器,将CSS字符串转换为样式对象 +var parseStyleText = cached(function (cssText) { + var res = {}; // 存储解析结果的空对象 + var listDelimiter = /;(?![^(]*\))/g; // 分号分割(排除括号内的分号) + var propertyDelimiter = /:(.+)/; // 冒号分隔属性名和值 + cssText.split(listDelimiter).forEach(function (item) { // 拆分样式声明 + if (item) { // 过滤空项 + var tmp = item.split(propertyDelimiter); // 分割属性键值 + tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim()); // 存入结果对象 + } + }); + return res // 返回解析后的样式对象 +}); + +// 合并静态样式和动态样式数据 +function normalizeStyleData (data) { + var style = normalizeStyleBinding(data.style); // 标准化动态样式 + return data.staticStyle // 合并静态样式(编译时处理) + ? extend(data.staticStyle, style) + : style +} + +// 标准化样式绑定值(支持数组/字符串/对象格式) +function normalizeStyleBinding (bindingStyle) { + if (Array.isArray(bindingStyle)) { // 数组转为对象合并 + return toObject(bindingStyle) + } + if (typeof bindingStyle === 'string') { // 字符串解析为对象 + return parseStyleText(bindingStyle) + } + return bindingStyle // 直接返回对象 +} + +// 获取层级样式(父组件样式覆盖子组件) +function getStyle (vnode, checkChild) { + var res = {}; // 结果对象 + var styleData; // 临时存储样式数据 + + if (checkChild) { // 检查子组件链 + var childNode = vnode; + while (childNode.componentInstance) { // 遍历子组件实例 + childNode = childNode.componentInstance._vnode; // 获取子组件虚拟节点 + if (childNode && childNode.data && (styleData = normalizeStyleData(childNode.data))) { + extend(res, styleData); // 合并子组件样式 + } + } + } + + if ((styleData = normalizeStyleData(vnode.data))) { // 当前节点样式 + extend(res, styleData); + } + + var parentNode = vnode; + while ((parentNode = parentNode.parent)) { // 遍历父节点链 + if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) { + extend(res, styleData); // 合并父组件样式 + } + } + return res // 返回最终合并结果 +} + +// 匹配CSS自定义属性(--开头) +var cssVarRE = /^--/; +// 匹配!important结尾 +var importantRE = /\s*!important$/; +// 设置元素样式属性(处理多种情况) +var setProp = function (el, name, val) { + if (cssVarRE.test(name)) { // CSS变量处理 + el.style.setProperty(name, val); + } else if (importantRE.test(val)) { // 含!important处理 + el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important'); + } else { // 常规属性处理 + var normalizedName = normalize(name); // 标准化属性名 + if (Array.isArray(val)) { // 数组值处理(自动前缀备选) + for (var i = 0, len = val.length; i < len; i++) { // 遍历数组设置属性 + el.style[normalizedName] = val[i]; + } + } else { // 单值处理 + el.style[normalizedName] = val; + } + } +}; + +// 浏览器厂商前缀列表 +var vendorNames = ['Webkit', 'Moz', 'ms']; +// 缓存空样式对象用于属性检测 +var emptyStyle; +// 标准化样式属性名(自动添加前缀) +var normalize = cached(function (prop) { + emptyStyle = emptyStyle || document.createElement('div').style; // 创建临时元素 + prop = camelize(prop); // 驼峰化属性名 + if (prop !== 'filter' && (prop in emptyStyle)) { // 原生支持检测 + return prop + } + var capName = prop.charAt(0).toUpperCase() + prop.slice(1); // 首字母大写 + for (var i = 0; i < vendorNames.length; i++) { // 遍历前缀列表 + var name = vendorNames[i] + capName; // 生成带前缀属性名 + if (name in emptyStyle)) { // 检测是否支持 + return name // 返回带前缀属性名 + } + } +}); + +// 样式更新函数(对比新旧样式差异) +function updateStyle (oldVnode, vnode) { + var data = vnode.data; // 新节点数据 + var oldData = oldVnode.data; // 旧节点数据 + + // 无样式变化直接返回 + if (isUndef(data.staticStyle) && isUndef(data.style) && + isUndef(oldData.staticStyle) && isUndef(oldData.style) + ) { + return + } + + var cur, name; // 临时变量 + var el = vnode.elm; // 实际DOM元素 + var oldStaticStyle = oldData.staticStyle; // 旧静态样式 + var oldStyleBinding = oldData.normalizedStyle || oldData.style || {}; // 旧动态样式 + + var oldStyle = oldStaticStyle || oldStyleBinding; // 合并旧样式 + var style = normalizeStyleBinding(vnode.data.style) || {}; // 标准化新样式 + + // 存储标准化后的样式用于下次对比 + vnode.data.normalizedStyle = isDef(style.__ob__) + ? extend({}, style) // 响应式数据需要克隆 + : style; + + var newStyle = getStyle(vnode, true); // 获取层级合并后的新样式 + + // 移除旧样式中不存在于新样式的属性 + for (name in oldStyle) { + if (isUndef(newStyle[name])) { + setProp(el, name, ''); + } + } + // 设置/更新变化的样式属性 + for (name in newStyle) { + cur = newStyle[name]; + if (cur !== oldStyle[name]) { // 值发生变化时更新 + setProp(el, name, cur == null ? '' : cur); // null转为空字符串 + } + } +} + +// 导出样式模块(创建和更新时调用) +var style = { + create: updateStyle, + update: updateStyle +}; + +// 匹配空白字符的正则 +var whitespaceRE = /\s+/; + +// 添加类名(兼容SVG元素) +function addClass (el, cls) { + if (!cls || !(cls = cls.trim())) { // 空值处理 + return + } + + if (el.classList) { // 支持classList + if (cls.indexOf(' ') > -1) { // 多类名分割处理 + cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); }); + } else { + el.classList.add(cls); + } + } else { // 兼容旧浏览器 + var cur = " " + (el.getAttribute('class') || '') + " "; // 当前类名字符串 + if (cur.indexOf(' ' + cls + ' ') < 0) { // 不存在时添加 + el.setAttribute('class', (cur + cls).trim()); + } + } +} + +// 移除类名(兼容SVG元素) +function removeClass (el, cls) { + if (!cls || !(cls = cls.trim())) { // 空值处理 + return + } + + if (el.classList) { // 支持classList + if (cls.indexOf(' ') > -1) { // 多类名分割处理 + cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); }); + } else { + el.classList.remove(cls); + } + if (!el.classList.length) { // 无类名时移除属性 + el.removeAttribute('class'); + } + } else { // 兼容旧浏览器 + var cur = " " + (el.getAttribute('class') || '') + " "; + var tar = ' ' + cls + ' '; + while (cur.indexOf(tar) >= 0) { // 循环替换目标类名 + cur = cur.replace(tar, ' '); + } + cur = cur.trim(); // 清理空白 + if (cur) { + el.setAttribute('class', cur); + } else { + el.removeAttribute('class'); + } + } +} +// 解析过渡配置并标准化格式 +function resolveTransition (def$$1) { + if (!def$$1) { // 无配置直接返回 + return + } + /* istanbul ignore else */ + if (typeof def$$1 === 'object') { // 对象类型配置 + var res = {}; + if (def$$1.css !== false) { // 允许CSS过渡 + extend(res, autoCssTransition(def$$1.name || 'v')); // 合并自动生成的CSS类 + } + extend(res, def$$1); // 合并用户自定义配置 + return res + } else if (typeof def$$1 === 'string') { // 字符串类型配置 + return autoCssTransition(def$$1) // 生成对应CSS类配置 + } +} + +// 缓存自动生成的CSS过渡类配置 +var autoCssTransition = cached(function (name) { + return { + enterClass: (name + "-enter"), // 进入开始类 + enterToClass: (name + "-enter-to"), // 进入结束类 + enterActiveClass: (name + "-enter-active"), // 进入激活类 + leaveClass: (name + "-leave"), // 离开开始类 + leaveToClass: (name + "-leave-to"), // 离开结束类 + leaveActiveClass: (name + "-leave-active") // 离开激活类 + } +}); + +// 浏览器环境检测(排除IE9) +var hasTransition = inBrowser && !isIE9; +var TRANSITION = 'transition'; // CSS过渡类型 +var ANIMATION = 'animation'; // CSS动画类型 + +// 过渡属性/事件检测 +var transitionProp = 'transition'; // 过渡属性名 +var transitionEndEvent = 'transitionend'; // 过渡结束事件 +var animationProp = 'animation'; // 动画属性名 +var animationEndEvent = 'animationend'; // 动画结束事件 +if (hasTransition) { // 处理浏览器前缀 + /* istanbul ignore if */ + if (window.ontransitionend === undefined && // 检测Webkit前缀 + window.onwebkittransitionend !== undefined + ) { + transitionProp = 'WebkitTransition'; // Webkit过渡属性 + transitionEndEvent = 'webkitTransitionEnd'; // Webkit过渡结束事件 + } + if (window.onanimationend === undefined && // 检测Webkit动画 + window.onwebkitanimationend !== undefined + ) { + animationProp = 'WebkitAnimation'; // Webkit动画属性 + animationEndEvent = 'webkitAnimationEnd'; // Webkit动画结束事件 + } +} + +// 跨浏览器requestAnimationFrame实现 +var raf = inBrowser + ? window.requestAnimationFrame // 原生支持 + ? window.requestAnimationFrame.bind(window) + : setTimeout // 降级方案 + : /* istanbul ignore next */ function (fn) { return fn(); }; // 非浏览器环境直接执行 + +// 下一帧执行函数(双raf保证在样式变更后执行) +function nextFrame (fn) { + raf(function () { + raf(fn); + }); +} + +// 添加过渡类并记录 +function addTransitionClass (el, cls) { + var transitionClasses = el._transitionClasses || (el._transitionClasses = []); // 初始化类存储 + if (transitionClasses.indexOf(cls) < 0) { // 避免重复添加 + transitionClasses.push(cls); // 记录类名 + addClass(el, cls); // 添加类到元素 + } +} + +// 移除过渡类并清理记录 +function removeTransitionClass (el, cls) { + if (el._transitionClasses) { // 存在记录时 + remove(el._transitionClasses, cls); // 从记录中移除 + } + removeClass(el, cls); // 从元素移除类 +} + +// 等待过渡结束执行回调 +function whenTransitionEnds ( + el, + expectedType, + cb +) { + var ref = getTransitionInfo(el, expectedType); // 获取过渡信息 + var type = ref.type; // 过渡类型 + var timeout = ref.timeout; // 超时时间 + var propCount = ref.propCount; // 属性数量 + if (!type) { return cb() } // 无过渡类型立即回调 + var event = type === TRANSITION ? transitionEndEvent : animationEndEvent; // 确定事件类型 + var ended = 0; // 结束计数器 + var end = function () { // 结束处理函数 + el.removeEventListener(event, onEnd); // 移除监听 + cb(); // 执行回调 + }; + var onEnd = function (e) { // 事件回调 + if (e.target === el) { // 确认目标元素 + if (++ended >= propCount) { // 所有属性过渡完成 + end(); + } + } + }; + setTimeout(function () { // 超时兜底 + if (ended < propCount) { + end(); + } + }, timeout + 1); // 增加1ms防止边界情况 + el.addEventListener(event, onEnd); // 监听结束事件 +} + +// 匹配transform属性的正则 +var transformRE = /\b(transform|all)(,|$)/; + +// 获取元素过渡信息 +function getTransitionInfo (el, expectedType) { + var styles = window.getComputedStyle(el); // 获取计算样式 + var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', '); // 过渡延迟 + var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', '); // 过渡持续时间 + var transitionTimeout = getTimeout(transitionDelays, transitionDurations); // 计算总时间 + var animationDelays = (styles[animationProp + 'Delay'] || '').split(', '); // 动画延迟 + var animationDurations = (styles[animationProp + 'Duration'] || '').split(', '); // 动画持续时间 + var animationTimeout = getTimeout(animationDelays, animationDurations); // 计算总时间 + + var type; // 过渡类型 + var timeout = 0; // 总超时 + var propCount = 0; // 属性数量 + /* istanbul ignore if */ + if (expectedType === TRANSITION) { // 预期为过渡类型 + if (transitionTimeout > 0) { + type = TRANSITION; + timeout = transitionTimeout; + propCount = transitionDurations.length; + } + } else if (expectedType === ANIMATION) { // 预期为动画类型 + if (animationTimeout > 0) { + type = ANIMATION; + timeout = animationTimeout; + propCount = animationDurations.length; + } + } else { // 自动判断类型 + timeout = Math.max(transitionTimeout, animationTimeout); + type = timeout > 0 + ? transitionTimeout > animationTimeout + ? TRANSITION + : ANIMATION + : null; + propCount = type + ? type === TRANSITION + ? transitionDurations.length + : animationDurations.length + : 0; + } + var hasTransform = // 检测是否包含transform属性 + type === TRANSITION && + transformRE.test(styles[transitionProp + 'Property']); + return { // 返回过渡信息对象 + type: type, + timeout: timeout, + propCount: propCount, + hasTransform: hasTransform + } +} + +// 计算最大超时时间 +function getTimeout (delays, durations) { + /* istanbul ignore next */ // 填充延迟数组保证长度匹配 + while (delays.length < durations.length) { + delays = delays.concat(delays); + } + + return Math.max.apply(null, durations.map(function (d, i) { // 计算每个属性的总时间 + return toMs(d) + toMs(delays[i]) + })) +} + +// 转换时间为毫秒(处理逗号小数格式) +function toMs (s) { + return Number(s.slice(0, -1).replace(',', '.')) * 1000 // 替换逗号为点 +} + +/* 进入过渡处理 */ + +function enter (vnode, toggleDisplay) { + var el = vnode.elm; // 获取DOM元素 + + // 立即调用旧的离开回调 + if (isDef(el._leaveCb)) { + el._leaveCb.cancelled = true; // 标记取消 + el._leaveCb(); // 执行回调 + } + + var data = resolveTransition(vnode.data.transition); // 解析过渡配置 + if (isUndef(data)) { // 无有效配置直接返回 + return + } + + /* istanbul ignore if */ + if (isDef(el._enterCb) || el.nodeType !== 1) { // 已存在进入回调或非元素节点 + return + } + + // 解构过渡配置项 + var css = data.css; + var type = data.type; + var enterClass = data.enterClass; + var enterToClass = data.enterToClass; + var enterActiveClass = data.enterActiveClass; + var appearClass = data.appearClass; + var appearToClass = data.appearToClass; + var appearActiveClass = data.appearActiveClass; + var beforeEnter = data.beforeEnter; + var enter = data.enter; + var afterEnter = data.afterEnter; + var enterCancelled = data.enterCancelled; + var beforeAppear = data.beforeAppear; + var appear = data.appear; + var afterAppear = data.afterAppear; + var appearCancelled = data.appearCancelled; + var duration = data.duration; + + // 获取上下文实例 + var context = activeInstance; + var transitionNode = activeInstance.$vnode; + while (transitionNode && transitionNode.parent) { // 查找最近的transition父组件 + context = transitionNode.context; + transitionNode = transitionNode.parent; + } + + var isAppear = !context._isMounted || !vnode.isRootInsert; // 判断是否初次渲染 + + if (isAppear && !appear && appear !== '') { // 初次渲染但未配置appear + return + } + + // 确定使用的类名 + var startClass = isAppear && appearClass + ? appearClass + : enterClass; + var activeClass = isAppear && appearActiveClass + ? appearActiveClass + : enterActiveClass; + var toClass = isAppear && appearToClass + ? appearToClass + : enterToClass; + + // 确定使用的钩子函数 + var beforeEnterHook = isAppear + ? (beforeAppear || beforeEnter) + : beforeEnter; + var enterHook = isAppear + ? (typeof appear === 'function' ? appear : enter) + : enter; + var afterEnterHook = isAppear + ? (afterAppear || afterEnter) + : afterEnter; + var enterCancelledHook = isAppear + ? (appearCancelled || enterCancelled) + : enterCancelled; + + // 处理显式指定的持续时间 + var explicitEnterDuration = toNumber( + isObject(duration) + ? duration.enter + : duration + ); + + if (explicitEnterDuration != null) { // 验证持续时间有效性 + checkDuration(explicitEnterDuration, 'enter', vnode); + } + + var expectsCSS = css !== false && !isIE9; // 是否期望CSS过渡 + var userWantsControl = getHookArgumentsLength(enterHook); // 用户是否控制过渡 + + var cb = el._enterCb = once(function () { // 单次执行回调 + if (expectsCSS) { // 清理CSS类 + removeTransitionClass(el, toClass); + removeTransitionClass(el, activeClass); + } + if (cb.cancelled) { // 过渡取消处理 + if (expectsCSS) { + removeTransitionClass(el, startClass); + } + enterCancelledHook && enterCancelledHook(el); + } else { // 正常结束处理 + afterEnterHook && afterEnterHook(el); + } + el._enterCb = null; // 清理回调引用 + }); + + if (!vnode.data.show) { // 非v-show控制的元素 + // 注入insert钩子处理待定离开元素 + mergeVNodeHook(vnode, 'insert', function () { + var parent = el.parentNode; + var pendingNode = parent && parent._pending && parent._pending[vnode.key]; + if (pendingNode && // 清理旧节点的离开回调 + pendingNode.tag === vnode.tag && + pendingNode.elm._leaveCb + ) { + pendingNode.elm._leaveCb(); + } + enterHook && enterHook(el, cb); // 执行进入钩子 + }); + } + + // 开始进入过渡 + beforeEnterHook && beforeEnterHook(el); // 执行前置钩子 + if (expectsCSS) { // CSS过渡处理 + addTransitionClass(el, startClass); // 添加起始类 + addTransitionClass(el, activeClass); // 添加激活类 + nextFrame(function () { // 下一帧处理 + removeTransitionClass(el, startClass); // 移除起始类 + if (!cb.cancelled) { + addTransitionClass(el, toClass); // 添加目标类 + if (!userWantsControl) { // 用户未自定义控制 + if (isValidDuration(explicitEnterDuration)) { // 有效持续时间 + setTimeout(cb, explicitEnterDuration); // 定时器结束 + } else { + whenTransitionEnds(el, type, cb); // 监听过渡结束 + } + } + } + }); + } + + if (vnode.data.show) { // v-show控制的元素 + toggleDisplay && toggleDisplay(); // 切换显示状态 + enterHook && enterHook(el, cb); // 执行进入钩子 + } + + if (!expectsCSS && !userWantsControl) { // 无CSS过渡且用户未控制 + cb(); // 立即回调 + } +} +// 处理元素离开过渡 +function leave (vnode, rm) { + var el = vnode.elm; // 获取DOM元素 + + // 立即调用可能的进入回调 + if (isDef(el._enterCb)) { + el._enterCb.cancelled = true; // 标记进入回调已取消 + el._enterCb(); // 执行进入回调清理 + } + + var data = resolveTransition(vnode.data.transition); // 解析过渡配置 + if (isUndef(data) || el.nodeType !== 1) { // 无效配置或非元素节点 + return rm() // 直接执行移除回调 + } + + /* istanbul ignore if */ + if (isDef(el._leaveCb)) { // 已存在离开回调 + return // 防止重复执行 + } + + // 解构过渡配置项 + var css = data.css; + var type = data.type; + var leaveClass = data.leaveClass; + var leaveToClass = data.leaveToClass; + var leaveActiveClass = data.leaveActiveClass; + var beforeLeave = data.beforeLeave; + var leave = data.leave; + var afterLeave = data.afterLeave; + var leaveCancelled = data.leaveCancelled; + var delayLeave = data.delayLeave; // 延迟离开函数 + var duration = data.duration; + + var expectsCSS = css !== false && !isIE9; // 是否使用CSS过渡 + var userWantsControl = getHookArgumentsLength(leave); // 用户是否控制离开过程 + + // 处理显式离开持续时间 + var explicitLeaveDuration = toNumber( + isObject(duration) + ? duration.leave + : duration + ); + + if (isDef(explicitLeaveDuration)) { // 验证持续时间有效性 + checkDuration(explicitLeaveDuration, 'leave', vnode); + } + + // 创建一次性离开回调 + var cb = el._leaveCb = once(function () { + if (el.parentNode && el.parentNode._pending) { // 清理父节点待处理记录 + el.parentNode._pending[vnode.key] = null; + } + if (expectsCSS) { // 清理CSS类 + removeTransitionClass(el, leaveToClass); + removeTransitionClass(el, leaveActiveClass); + } + if (cb.cancelled) { // 过渡取消处理 + if (expectsCSS) { + removeTransitionClass(el, leaveClass); + } + leaveCancelled && leaveCancelled(el); // 调用取消钩子 + } else { // 正常结束 + rm(); // 执行移除回调 + afterLeave && afterLeave(el); // 调用结束钩子 + } + el._leaveCb = null; // 清除回调引用 + }); + + if (delayLeave) { // 存在延迟离开函数 + delayLeave(performLeave); // 延迟执行离开 + } else { + performLeave(); // 立即执行离开 + } + + // 实际执行离开动画的函数 + function performLeave () { + if (cb.cancelled) { // 已取消则返回 + return + } + // 记录待移除元素 + if (!vnode.data.show && el.parentNode) { + (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode; + } + beforeLeave && beforeLeave(el); // 执行前置钩子 + if (expectsCSS) { // CSS过渡处理 + addTransitionClass(el, leaveClass); // 添加离开起始类 + addTransitionClass(el, leaveActiveClass); // 添加离开激活类 + nextFrame(function () { // 下一帧处理 + removeTransitionClass(el, leaveClass); // 移除起始类 + if (!cb.cancelled) { + addTransitionClass(el, leaveToClass); // 添加离开目标类 + if (!userWantsControl) { // 用户未自定义控制 + if (isValidDuration(explicitLeaveDuration)) { // 有效持续时间 + setTimeout(cb, explicitLeaveDuration); // 定时触发回调 + } else { + whenTransitionEnds(el, type, cb); // 监听过渡结束 + } + } + } + }); + } + leave && leave(el, cb); // 执行用户提供的离开钩子 + if (!expectsCSS && !userWantsControl) { // 无CSS且用户未控制 + cb(); // 直接执行回调 + } + } +} + +// 开发环境校验过渡持续时间有效性 +function checkDuration (val, name, vnode) { + if (typeof val !== 'number') { // 非数字类型警告 + warn( + " 显式 " + name + " 持续时间无效,应为数字 - 得到 " + (JSON.stringify(val)), + vnode.context + ); + } else if (isNaN(val)) { // NaN值警告 + warn( + " 显式 " + name + " 持续时间为 NaN,可能表达式错误", + vnode.context + ); + } +} + +// 验证是否为有效持续时间 +function isValidDuration (val) { + return typeof val === 'number' && !isNaN(val) // 数字且非NaN +} + +/** + * 标准化过渡钩子的参数长度(处理合并钩子/组件方法/普通函数) + */ +function getHookArgumentsLength (fn) { + if (isUndef(fn)) return false // 无钩子直接返回 + var invokerFns = fn.fns; // 处理合并的钩子数组 + if (isDef(invokerFns)) { + return getHookArgumentsLength( // 递归检测第一个真实钩子 + Array.isArray(invokerFns) ? invokerFns[0] : invokerFns + ) + } else { + return (fn._length || fn.length) > 1 // 检测参数长度是否大于1 + } +} + +// 进入过渡的封装函数(用于create/activate生命周期) +function _enter (_, vnode) { + if (vnode.data.show !== true) { // 非v-show控制的元素 + enter(vnode); // 执行进入过渡 + } +} + +// 浏览器环境的过渡处理模块 +var transition = inBrowser ? { + create: _enter, // 元素创建时触发进入 + activate: _enter, // 组件激活时触发进入 + remove: function remove$$1 (vnode, rm) { // 元素移除时 + if (vnode.data.show !== true) { // 非v-show元素 + leave(vnode, rm); // 执行离开过渡 + } else { + rm(); // 直接移除 + } + } +} : {}; // 非浏览器环境空对象 + +// 平台相关模块列表(按顺序应用) +var platformModules = [ + attrs, // 属性处理模块 + klass, // class类名处理模块 + events, // 事件处理模块 + domProps, // DOM属性处理模块 + style, // 样式处理模块 + transition // 过渡处理模块 +]; + +// 合并基础模块和平台模块 +var modules = platformModules.concat(baseModules); + +// 创建虚拟DOM patch函数 +var patch = createPatchFunction({ + nodeOps: nodeOps, // DOM节点操作方法 + modules: modules // 使用的模块列表 +}); + +/* IE9兼容处理 */ +if (isIE9) { + // 监听selectionchange事件解决oninput不触发的问题 + document.addEventListener('selectionchange', function () { + var el = document.activeElement; // 当前焦点元素 + if (el && el.vmodel) { // 带有vmodel标记的元素 + trigger(el, 'input'); // 手动触发input事件 + } + }); +} + +// v-model指令实现 +var directive = { + inserted: function inserted (el, binding, vnode, oldVnode) { + if (vnode.tag === 'select') { // select元素处理 + if (oldVnode.elm && !oldVnode.elm._vOptions) { // 旧节点无选项缓存 + mergeVNodeHook(vnode, 'postpatch', function () { // 合并postpatch钩子 + directive.componentUpdated(el, binding, vnode); // 更新后设置选中 + }); + } else { + setSelected(el, binding, vnode.context); // 直接设置选中 + } + el._vOptions = [].map.call(el.options, getValue); // 缓存选项值 + } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) { // 文本输入类元素 + el._vModifiers = binding.modifiers; // 存储修饰符 + if (!binding.modifiers.lazy) { // 非lazy模式 + el.addEventListener('compositionstart', onCompositionStart); // 输入法开始 + el.addEventListener('compositionend', onCompositionEnd); // 输入法结束 + el.addEventListener('change', onCompositionEnd); // 处理Safari兼容 + if (isIE9) el.vmodel = true; // IE9特殊标记 + } + } + }, + + componentUpdated: function componentUpdated (el, binding, vnode) { + if (vnode.tag === 'select') { // select元素更新后 + setSelected(el, binding, vnode.context); // 设置选中状态 + var prevOptions = el._vOptions; // 旧选项值 + var curOptions = el._vOptions = [].map.call(el.options, getValue); // 新选项值 + if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) { // 选项变化检测 + var needReset = el.multiple // 多选模式检测 + ? binding.value.some(hasNoMatchingOption) + : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions); + if (needReset) trigger(el, 'change'); // 触发change事件 + } + } + } +}; + +// 设置select元素选中状态 +function setSelected (el, binding, vm) { + actuallySetSelected(el, binding, vm); // 实际设置 + /* IE/Edge兼容处理 */ + if (isIE || isEdge) setTimeout(() => actuallySetSelected(el, binding, vm), 0); +} + +// 实际设置选中逻辑 +function actuallySetSelected (el, binding, vm) { + var value = binding.value; // 当前绑定值 + var isMultiple = el.multiple; // 是否多选 + if (isMultiple && !Array.isArray(value)) { // 多选但值非数组 + warn( + `