Project reconfiguration

This commit is contained in:
JiaJu Zhuang
2023-06-22 13:33:42 +08:00
parent b7a333f2cb
commit 099a3e17eb
456 changed files with 5 additions and 5 deletions

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>ai.chat2db</groupId>
<artifactId>chat2db-server-tools</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>chat2db-server-tools-base</artifactId>
<packaging>jar</packaging>
<name>chat2db-server-tools-base</name>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,30 @@
package ai.chat2db.server.tools.base.constant;
/**
* 常量
*
* @author 是仪
*/
public interface EasyToolsConstant {
/**
* 日志的追踪id
*/
String LOG_TRACE_ID = "EAGLEEYE_TRACE_ID";
/**
* 最大分页大小
*/
int MAX_PAGE_SIZE = 500;
/**
* 序列化id
*/
long SERIAL_VERSION_UID = 1L;
/**
* 最大循环次数 防止很多循环进入死循环
*/
int MAXIMUM_ITERATIONS = 10 * 1000;
}

View File

@ -0,0 +1,58 @@
package ai.chat2db.server.tools.base.constant;
/**
* 常见符号的常量枚举
*
* @author 是仪
**/
public class SymbolConstant {
/**
* +
*/
public static final String PLUS = "+";
/**
* -
*/
public static final String MINUS = "-";
/**
* *
*/
public static final String ASTERISK = "*";
/**
* /
*/
public static final String SLASH = "/";
/**
* 单引号"'"
*/
public static final String SQUOT = "'";
/**
* 空串 ""
*/
public static final String EMPTY = "";
/**
* 分隔符 "-"
*/
public static final String SEPARATOR = "-";
/**
* 等号 "="
*/
public static final String EQ = "=";
/**
* 分号 ";"
*/
public static final String SEMICOLON = ";";
/**
* 逗号 ","
*/
public static final String COMMA = ",";
/**
* 点 "."
*/
public static final String DOT = ".";
/**
* 冒号 ":"
*/
public static final String COLON = ":";
}

View File

@ -0,0 +1,26 @@
package ai.chat2db.server.tools.base.enums;
/**
* 基础的枚举
*
* 由于java枚举继承的限制枚举基类只能设计为接口请自行保证子类一定是枚举类型。
*
* @author Jiaju Zhuang
**/
public interface BaseEnum<T> {
/**
* 返回枚举的code。一般建议直接返回枚举的name
*
* @return code
*/
T getCode();
/**
* 返回枚举的描述。返回枚举的中文 方便前端下拉
*
* @return description
*/
String getDescription();
}

View File

@ -0,0 +1,8 @@
package ai.chat2db.server.tools.base.enums;
/**
* 基础的异常枚举
*
* @author 是仪
**/
public interface BaseErrorEnum extends BaseEnum<String> {}

View File

@ -0,0 +1,35 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* @author moji
* @version ConnectionTypeEnum.java, v 0.1 2022年09月16日 14:59 moji Exp $
* @date 2022/09/16
*/
@Getter
public enum DataSourceTypeEnum implements BaseEnum<String> {
/**
* mysql数据库连接
*/
MYSQL("mysql数据库连接"),
/**
* redis数据库连接
*/
REDIS("redis数据库连接"),
;
final String description;
DataSourceTypeEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,40 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* 删除标记枚举
* <p>
* 为了兼容唯一主键+逻辑删除。使用DeletedId来标记当前数据是否删除。如果是0 则代表未删除。其他任何情况都代表已经删除。
* 删除的时候 执行语句update set deleted_id = di where 条件=条件;
*
* @author 是仪
*/
@Getter
public enum DeletedIdEnum implements BaseEnum<Long> {
/**
* 未删除
*/
NOT_DELETED(0L, "未删除"),
;
final Long code;
final String description;
DeletedIdEnum(Long code, String description) {
this.code = code;
this.description = description;
}
/**
* 判断 当前数据是否已经逻辑删除
*
* @param deletedId 表中的deleted_id
* @return 是否已经删除
*/
public static boolean isDeleted(Long deletedId) {
return !NOT_DELETED.getCode().equals(deletedId);
}
}

View File

@ -0,0 +1,35 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* @author moji
* @version ConnectionTypeEnum.java, v 0.1 2022年09月16日 14:59 moji Exp $
* @date 2022/09/16
*/
@Getter
public enum EnvTypeEnum implements BaseEnum<String> {
/**
* 日常环境
*/
DAILY("日常环境"),
/**
* 生产环境
*/
PRODUCT("生产环境"),
;
final String description;
EnvTypeEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,39 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* 操作枚举
*
* @author 是仪
*/
@Getter
public enum OperationEnum implements BaseEnum<String> {
/**
* 新增
*/
CREATE("新增"),
/**
* 修改
*/
UPDATE("修改"),
/**
* 删除
*/
DELETE("删除"),
;
final String description;
OperationEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,28 @@
package ai.chat2db.server.tools.base.enums;
/**
* 排序方向的枚举
*
* @author 是仪
*/
public enum OrderByDirectionEnum implements BaseEnum<String> {
/**
* 升序
*/
ASC,
/**
* 降序
*/
DESC;
@Override
public String getCode() {
return this.name();
}
@Override
public String getDescription() {
return this.name();
}
}

View File

@ -0,0 +1,35 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* @author moji
* @version StatusEnum.java, v 0.1 2022年09月25日 16:57 moji Exp $
* @date 2022/09/25
*/
@Getter
public enum StatusEnum implements BaseEnum<String> {
/**
* 草稿
*/
DRAFT("草稿"),
/**
* 发布
*/
RELEASE("发布"),
;
final String description;
StatusEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,43 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* 系统环境
*
* @author Jiaju Zhuang
*/
@Getter
public enum SystemEnvironmentEnum implements BaseEnum<String> {
/**
* 本地
*/
DEV("dev", "本地"),
/**
* 测试
*/
TEST("test", "测试"),
/**
* 正式
*/
RELEASE("release", "正式"),
;
final String code;
final String description;
SystemEnvironmentEnum(String code, String description) {
this.code = code;
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,55 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* 是否枚举
*
* @author 是仪
*/
@Getter
public enum YesOrNoEnum implements BaseEnum<String> {
/**
* 是
*/
YES("Y", "", true),
/**
* 未读
*/
NO("N", "", false),
;
final String letter;
final String description;
final boolean booleanValue;
YesOrNoEnum(String letter, String description, boolean booleanValue) {
this.letter = letter;
this.description = description;
this.booleanValue = booleanValue;
}
@Override
public String getCode() {
return this.name();
}
/**
* 根据布尔值转换
*
* @param booleanValue 布尔值
* @return
*/
public static YesOrNoEnum valueOf(Boolean booleanValue) {
if (booleanValue == null) {
return null;
}
if (booleanValue) {
return YesOrNoEnum.YES;
}
return YesOrNoEnum.NO;
}
}

View File

@ -0,0 +1,45 @@
package ai.chat2db.server.tools.base.excption;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import lombok.Data;
/**
* 业务异常。不需要人工介入的叫做业务异常。
*
* @author zhuangjiaju
* @date 2021/06/26
*/
@Data
public class BusinessException extends RuntimeException {
/**
* 异常的编码
*/
private String code;
public BusinessException(String message) {
this(CommonErrorEnum.COMMON_BUSINESS_ERROR, message);
}
public BusinessException(String message, Throwable throwable) {
this(CommonErrorEnum.COMMON_BUSINESS_ERROR, message, throwable);
}
public BusinessException(BaseErrorEnum errorEnum, String message) {
this(errorEnum.getCode(), message);
}
public BusinessException(BaseErrorEnum errorEnum, String message, Throwable throwable) {
super(message, throwable);
this.code = errorEnum.getCode();
}
public BusinessException(BaseErrorEnum errorEnum) {
this(errorEnum.getCode(), errorEnum.getDescription());
}
public BusinessException(String code, String message) {
super(message);
this.code = code;
}
}

View File

@ -0,0 +1,74 @@
package ai.chat2db.server.tools.base.excption;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import lombok.Getter;
/**
* 通用的返回码定义
*
* @author 是仪
*/
@Getter
public enum CommonErrorEnum implements BaseErrorEnum {
/**
* 通用业务异常
*/
COMMON_BUSINESS_ERROR("填写的信息异常,请尝试刷新页面"),
/**
* 通用系统异常
*/
COMMON_SYSTEM_ERROR("系统开小差啦,请尝试刷新页面或者联系管理员"),
/**
* 通用系统异常
*/
PARAM_ERROR("参数错误"),
/**
* 找不到数据
*/
DATA_NOT_FOUND("找不到对应数据"),
/**
* 没有权限
*/
PERMISSION_DENIED("权限不够"),
/**
* 超过最大上传
*/
MAX_UPLOAD_SIZE("上传的文件超过最大限制"),
/**
* 数据库驱动类不存在
*/
DRIVER_CLASS_NOT_EXIST("数据库驱动类不存在"),
/**
* 需要登陆
* 前端需要跳转到登陆界面
*/
NEED_LOGGED_IN("未登录,请重新登陆"),
/**
* 没有登录
* 代表用户没有登陆,不需要跳转展示为空即可
*/
NOT_LOGGED_IN("无法获取登陆信息,请尝试刷新页面或者重新登陆"),
/**
* 超过访问限制
*/
ACCESS_LIMIT_EXCEEDED("超过访问限制"),
;
CommonErrorEnum(String description) {
this.description = description;
}
final String description;
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,47 @@
package ai.chat2db.server.tools.base.excption;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import lombok.Getter;
/**
* @author moji
* @version DatasourceErrorEnum.java, v 0.1 2022年10月10日 14:32 moji Exp $
* @date 2022/10/10
*/
@Getter
public enum DatasourceErrorEnum implements BaseErrorEnum {
/**
* 数据源测试连接错误
*/
DATASOURCE_TEST_ERROR("数据源测试连接错误"),
/**
* 数据源连接错误
*/
DATASOURCE_CONNECT_ERROR("数据源连接错误"),
/**
* 控制台链接错误
*/
CONSOLE_CONNECT_ERROR("控制台链接错误"),
/**
* 不合法的执行语句
*/
SQL_ANALYSIS_ERROR("不合法的执行语句"),
;
DatasourceErrorEnum(String desctiption) {
this.description = desctiption;
}
final String description;
@Override
public String getCode() {
return this.name();
}
}

View File

@ -0,0 +1,52 @@
package ai.chat2db.server.tools.base.excption;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import lombok.Data;
/**
* 业务异常。简单的说就是需要人工介入的异常叫做系统异常。
*
* @author zhuangjiaju
* @date 2021/06/26
*/
@Data
public class SystemException extends RuntimeException {
/**
* 异常的编码
*/
private String code;
public SystemException(String message) {
this(CommonErrorEnum.COMMON_SYSTEM_ERROR, message);
}
public SystemException(String message, Throwable throwable) {
this(CommonErrorEnum.COMMON_SYSTEM_ERROR, message, throwable);
}
public SystemException(String code, String message) {
super(message);
this.code = code;
}
public SystemException(BaseErrorEnum errorEnum, String message, Throwable throwable) {
super(message, throwable);
this.code = errorEnum.getCode();
}
public SystemException(BaseErrorEnum errorEnum) {
this(errorEnum.getCode(), errorEnum.getDescription());
}
public SystemException(BaseErrorEnum errorEnum, String message) {
this(errorEnum.getCode(), message);
}
public SystemException(BaseErrorEnum errorEnum, Throwable throwable) {
super(errorEnum.getDescription(), throwable);
this.code = errorEnum.getCode();
}
}

View File

@ -0,0 +1,29 @@
package ai.chat2db.server.tools.base.handler;
/**
* 回调的处理器
* 比如meatq回调的时候 会执行这个方法
*
* @author 是仪
*/
public interface EasyCallBackHandler {
/**
* 在处理回调前调用
*/
default void preHandle() {
}
/**
* 在处理回调后调用
* 抛出异常了不会处理
*/
default void postHandle() {
}
/**
* 在处理回调后调用
* 无论是否异常 都会调用
*/
default void afterCompletion() {
}
}

View File

@ -0,0 +1,52 @@
package ai.chat2db.server.tools.base.wrapper;
/**
* @author qiuyuyu
* @date 2022/01/20
*/
public interface Result<T> extends Traceable{
/**
* 是否成功
*
* @return
* @mock true
*/
boolean success();
/**
* 设置是否成功
*
* @return
*/
void success(boolean success);
/**
* 错误编码
*
* @return
* @mock 000000
*/
String errorCode();
/**
* 设置错误编码
*
* @param errorCode
*/
void errorCode(String errorCode);
/**
* 错误信息
*
* @return
*/
String errorMessage();
/**
* 设置错误信息
*
* @param errorMessage
*/
void errorMessage(String errorMessage);
}

View File

@ -0,0 +1,22 @@
package ai.chat2db.server.tools.base.wrapper;
/**
* 是否可以跟踪
*
* @author 是仪
*/
public interface Traceable {
/**
* 获取 traceId
*
* @return traceId
*/
String getTraceId();
/**
* 设置traceId
*
* @param traceId
*/
void setTraceId(String traceId);
}

View File

@ -0,0 +1,42 @@
package ai.chat2db.server.tools.base.wrapper.param;
import java.io.Serializable;
import ai.chat2db.server.tools.base.enums.OrderByDirectionEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 排序的对象
*
* @author 是仪
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderBy implements Serializable {
/**
* 排序字段
*/
private String orderConditionName;
/**
* 排序方向
*/
private OrderByDirectionEnum direction;
public static OrderBy of(String property, OrderByDirectionEnum direction) {
return new OrderBy(property, direction);
}
public static OrderBy asc(String property) {
return new OrderBy(property, OrderByDirectionEnum.ASC);
}
public static OrderBy desc(String property) {
return new OrderBy(property, OrderByDirectionEnum.DESC);
}
}

View File

@ -0,0 +1,16 @@
package ai.chat2db.server.tools.base.wrapper.param;
/**
* 排序条件
*
* @author 是仪
*/
public interface OrderCondition {
/**
* 返回列的名字
*
* @return
*/
OrderBy getOrderBy();
}

View File

@ -0,0 +1,136 @@
package ai.chat2db.server.tools.base.wrapper.param;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.OrderByDirectionEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Range;
/**
* 分页查询的参数
*
* @author zhuangjiaju
* @date 2021/06/26
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class PageQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 页码
*/
@NotNull(message = "分页页码不能为空")
@Min(value = 1, message = "分页页码必须大于0")
private Integer pageNo;
/**
* 分页大小
*/
@NotNull(message = "分页大小不能为空")
@Range(min = 1, max = EasyToolsConstant.MAX_PAGE_SIZE,
message = "分页大小必须在1-" + EasyToolsConstant.MAX_PAGE_SIZE + "之间")
private Integer pageSize;
/**
* 是否返回总条数
* 默认不返回 提高性能
*/
private Boolean enableReturnCount;
/**
* 排序
*/
private List<OrderBy> orderByList;
public PageQueryParam() {
this.pageNo = 1;
this.pageSize = 100;
this.enableReturnCount = Boolean.FALSE;
}
/**
* 查询全部数据
*/
public void queryAll() {
this.pageNo = 1;
this.pageSize = Integer.MAX_VALUE;
}
/**
* 新增一个排序 并替换原有排序
*
* @param orderBy 排序
* @return 排序参数
*/
public PageQueryParam orderBy(OrderBy orderBy) {
orderByList = new ArrayList<>();
orderByList.add(orderBy);
return this;
}
/**
* 新增一个排序 并替换原有排序
*
* @param orderConditionName 排序字段
* @param direction 排序方向
* @return 排序参数
*/
public PageQueryParam orderBy(String orderConditionName, OrderByDirectionEnum direction) {
return orderBy(new OrderBy(orderConditionName, direction));
}
/**
* 新增一个排序 并替换原有排序
*
* @param orderCondition 排序条件
* @return 排序参数
*/
public PageQueryParam orderBy(OrderCondition orderCondition) {
return orderBy(orderCondition.getOrderBy());
}
/**
* 新增一个排序
*
* @param orderBy 排序
* @return 排序参数
*/
public PageQueryParam andOrderBy(OrderBy orderBy) {
orderByList.add(orderBy);
return this;
}
/**
* 新增一个排序
*
* @param orderConditionName 排序字段
* @param direction 排序方向
* @return 排序参数
*/
public PageQueryParam andOrderBy(String orderConditionName, OrderByDirectionEnum direction) {
return andOrderBy(new OrderBy(orderConditionName, direction));
}
/**
* 新增一个排序
*
* @param orderCondition 排序条件
* @return 排序参数
*/
public PageQueryParam andOrderBy(OrderCondition orderCondition) {
return andOrderBy(orderCondition.getOrderBy());
}
}

View File

@ -0,0 +1,100 @@
package ai.chat2db.server.tools.base.wrapper.param;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.OrderByDirectionEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* 查询的参数
*
* @author zhuangjiaju
* @date 2021/06/26
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class QueryParam implements Serializable {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 排序
*/
private List<OrderBy> orderByList;
/**
* 新增一个排序 并替换原有排序
*
* @param orderBy 排序
* @return 排序参数
*/
public QueryParam orderBy(OrderBy orderBy) {
orderByList = new ArrayList<>();
orderByList.add(orderBy);
return this;
}
/**
* 新增一个排序 并替换原有排序
*
* @param orderConditionName 排序字段
* @param direction 排序方向
* @return 排序参数
*/
public QueryParam orderBy(String orderConditionName, OrderByDirectionEnum direction) {
return orderBy(new OrderBy(orderConditionName, direction));
}
/**
* 新增一个排序 并替换原有排序
*
* @param orderCondition 排序条件
* @return 排序参数
*/
public QueryParam orderBy(OrderCondition orderCondition) {
return orderBy(orderCondition.getOrderBy());
}
/**
* 新增一个排序
*
* @param orderBy 排序
* @return 排序参数
*/
public QueryParam andOrderBy(OrderBy orderBy) {
orderByList.add(orderBy);
return this;
}
/**
* 新增一个排序
*
* @param orderConditionName 排序字段
* @param direction 排序方向
* @return 排序参数
*/
public QueryParam andOrderBy(String orderConditionName, OrderByDirectionEnum direction) {
return andOrderBy(new OrderBy(orderConditionName, direction));
}
/**
* 新增一个排序
*
* @param orderCondition 排序条件
* @return 排序参数
*/
public QueryParam andOrderBy(OrderCondition orderCondition) {
return andOrderBy(orderCondition.getOrderBy());
}
}

View File

@ -0,0 +1,44 @@
package ai.chat2db.server.tools.base.wrapper.request;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Range;
/**
* 分页查询的参数
*
* @author zhuangjiaju
* @date 2021/06/26
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class PageQueryRequest implements Serializable {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 页码
*/
@NotNull(message = "分页页码不能为空")
private Integer pageNo;
/**
* 分页条数
*/
@NotNull(message = "分页大小不能为空")
@Range(min = 1, max = EasyToolsConstant.MAX_PAGE_SIZE,
message = "分页大小必须在1-" + EasyToolsConstant.MAX_PAGE_SIZE + "之间")
private Integer pageSize;
public PageQueryRequest() {
this.pageNo = 1;
this.pageSize = 10;
}
}

View File

@ -0,0 +1,128 @@
package ai.chat2db.server.tools.base.wrapper.result;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
/**
* action的返回对象
*
* @author 是仪
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class ActionResult implements Serializable, Result {
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 是否成功
*
* @mock true
*/
@NotNull
private Boolean success;
/**
* 错误编码
*
* @see CommonErrorEnum
*/
private String errorCode;
/**
* 错误信息
*/
private String errorMessage;
/**
* traceId
*/
private String traceId;
public ActionResult() {
this.success = Boolean.TRUE;
}
/**
* 返回成功
*
* @return 运行结果
*/
public static ActionResult isSuccess() {
return new ActionResult();
}
@Override
public boolean success() {
return success;
}
@Override
public void success(boolean success) {
this.success = success;
}
@Override
public String errorCode() {
return errorCode;
}
@Override
public void errorCode(String errorCode) {
this.errorCode = errorCode;
}
@Override
public String errorMessage() {
return errorMessage;
}
@Override
public void errorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
/**
* 返回失败
*
* @param errorCode 错误编码
* @param errorMessage 错误信息
* @return 运行结果
*/
public static ActionResult fail(String errorCode, String errorMessage) {
ActionResult result = new ActionResult();
result.errorCode = errorCode;
result.errorMessage = errorMessage;
result.success = Boolean.FALSE;
return result;
}
/**
* 返回失败
*
* @param errorEnum 错误枚举
* @return 运行结果
*/
public static ActionResult fail(BaseErrorEnum errorEnum) {
return fail(errorEnum.getCode(), errorEnum.getDescription());
}
/**
* 返回失败
*
* @param errorEnum 错误枚举
* @return 运行结果
*/
public static ActionResult fail(BaseErrorEnum errorEnum, String errorMessage) {
return fail(errorEnum.getCode(), errorMessage);
}
}

View File

@ -0,0 +1,171 @@
package ai.chat2db.server.tools.base.wrapper.result;
import java.io.Serializable;
import java.util.function.Function;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
/**
* data的返回对象
*
* @author 是仪
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class DataResult<T> implements Serializable, Result<T> {
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 是否成功
*
* @mock true
*/
@NotNull
private Boolean success;
/**
* 错误编码
*
* @see CommonErrorEnum
*/
private String errorCode;
/**
* 错误信息
*/
private String errorMessage;
/**
* 数据信息
*/
private T data;
/**
* traceId
*/
private String traceId;
public DataResult() {
this.success = Boolean.TRUE;
}
private DataResult(T data) {
this();
this.data = data;
}
/**
* 构建返回对象
*
* @param data 需要构建的对象
* @param <T> 需要构建的对象类型
* @return 返回的结果
*/
public static <T> DataResult<T> of(T data) {
return new DataResult<>(data);
}
/**
* 构建空的返回对象
*
* @param <T> 需要构建的对象类型
* @return 返回的结果
*/
public static <T> DataResult<T> empty() {
return new DataResult<>();
}
/**
* 构建异常返回
*
* @param errorCode 错误编码
* @param errorMessage 错误信息
* @param <T> 需要构建的对象类型
* @return 返回的结果
*/
public static <T> DataResult<T> error(String errorCode, String errorMessage) {
DataResult<T> result = new DataResult<>();
result.errorCode = errorCode;
result.errorMessage = errorMessage;
result.success = false;
return result;
}
/**
* 构建异常返回
*
* @param errorEnum 错误枚举
* @param <T> 需要构建的对象类型
* @return 返回的结果
*/
public static <T> DataResult<T> error(BaseErrorEnum errorEnum) {
return error(errorEnum.getCode(), errorEnum.getDescription());
}
/**
* 判断是否存在数据
*
* @param dataResult
* @return 是否存在数据
*/
public static boolean hasData(DataResult<?> dataResult) {
return dataResult != null && dataResult.getSuccess() && dataResult.getData() != null;
}
/**
* 将当前的类型转换成另外一个类型
*
* @param mapper 转换的方法
* @param <R> 返回的类型
* @return 返回的结果
*/
public <R> DataResult<R> map(Function<T, R> mapper) {
R returnData = hasData(this) ? mapper.apply(getData()) : null;
DataResult<R> dataResult = new DataResult<>();
dataResult.setSuccess(getSuccess());
dataResult.setErrorCode(getErrorCode());
dataResult.setErrorMessage(getErrorMessage());
dataResult.setData(returnData);
dataResult.setTraceId(getTraceId());
return dataResult;
}
@Override
public boolean success() {
return success;
}
@Override
public void success(boolean success) {
this.success = success;
}
@Override
public String errorCode() {
return errorCode;
}
@Override
public void errorCode(String errorCode) {
this.errorCode = errorCode;
}
@Override
public String errorMessage() {
return errorMessage;
}
@Override
public void errorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}

View File

@ -0,0 +1,175 @@
package ai.chat2db.server.tools.base.wrapper.result;
import java.io.Serial;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
/**
* data的返回对象
*
* @author 是仪
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class ListResult<T> implements Serializable, Result<T> {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 是否成功
*
* @mock true
*/
@NotNull
private Boolean success;
/**
* 错误编码
*
* @see CommonErrorEnum
*/
private String errorCode;
/**
* 异常信息
*/
private String errorMessage;
/**
* 数据信息
*/
private List<T> data;
/**
* traceId
*/
private String traceId;
public ListResult() {
this.success = Boolean.TRUE;
}
private ListResult(List<T> data) {
this();
this.data = data;
}
/**
* 构建列表返回对象
*
* @param data 需要构建的对象
* @param <T> 需要构建的对象类型
* @return 返回的列表
*/
public static <T> ListResult<T> of(List<T> data) {
return new ListResult<>(data);
}
/**
* 构建空的列表返回对象
*
* @param <T> 需要构建的对象类型
* @return 返回的列表
*/
public static <T> ListResult<T> empty() {
return of(Collections.emptyList());
}
/**
* 构建异常返回列表
*
* @param errorCode 错误编码
* @param errorMessage 错误信息
* @param <T> 需要构建的对象类型
* @return 返回的列表
*/
public static <T> ListResult<T> error(String errorCode, String errorMessage) {
ListResult<T> result = new ListResult<>();
result.errorCode = errorCode;
result.errorMessage = errorMessage;
result.success = Boolean.TRUE;
return result;
}
/**
* 构建异常返回列表
*
* @param errorEnum 错误枚举
* @param <T> 需要构建的对象类型
* @return 返回的列表
*/
public static <T> ListResult<T> error(BaseErrorEnum errorEnum) {
return error(errorEnum.getCode(), errorEnum.getDescription());
}
/**
* 判断是否存在数据
*
* @param listResult
* @return 是否存在数据
*/
public static boolean hasData(ListResult<?> listResult) {
return listResult != null && listResult.getSuccess() && listResult.getData() != null && !listResult.getData()
.isEmpty();
}
/**
* 将当前的类型转换成另外一个类型
*
* @param mapper 转换的方法
* @param <R> 返回的类型
* @return 分页返回对象
*/
public <R> ListResult<R> map(Function<T, R> mapper) {
List<R> returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList())
: Collections.emptyList();
ListResult<R> listResult = new ListResult<>();
listResult.setSuccess(getSuccess());
listResult.setErrorCode(getErrorCode());
listResult.setErrorMessage(getErrorMessage());
listResult.setData(returnData);
listResult.setTraceId(getTraceId());
return listResult;
}
@Override
public boolean success() {
return success;
}
@Override
public void success(boolean success) {
this.success = success;
}
@Override
public String errorCode() {
return errorCode;
}
@Override
public void errorCode(String errorCode) {
this.errorCode = errorCode;
}
@Override
public String errorMessage() {
return errorMessage;
}
@Override
public void errorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}

View File

@ -0,0 +1,340 @@
package ai.chat2db.server.tools.base.wrapper.result;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult.Page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
/**
* data的返回对象
*
* @author 是仪
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class PageResult<T> implements Serializable, Result<List<T>> {
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 是否成功
*
* @mock true
*/
@NotNull
private Boolean success;
/**
* 错误编码
*
* @see CommonErrorEnum
*/
private String errorCode;
/**
* 异常信息
*/
private String errorMessage;
/**
* 数据信息
*/
private List<T> data;
/**
* 分页编码
*/
private Integer pageNo;
/**
* 分页大小
*/
private Integer pageSize;
/**
* 总的大小
*/
private Long total;
/**
* traceId
*/
private String traceId;
/**
* 是否存在下一页
*/
private Boolean hasNextPage;
public PageResult() {
this.pageNo = 1;
this.pageSize = 10;
this.total = 0L;
this.success = Boolean.TRUE;
}
private PageResult(List<T> data, Long total, Long pageNo, Long pageSize) {
this();
this.data = data;
this.total = total;
if (pageNo != null) {
this.pageNo = Math.toIntExact(pageNo);
}
if (pageSize != null) {
this.pageSize = Math.toIntExact(pageSize);
}
}
private PageResult(List<T> data, Long total, Integer pageNo, Integer pageSize) {
this();
this.data = data;
this.total = total;
if (pageNo != null) {
this.pageNo = pageNo;
}
if (pageSize != null) {
this.pageSize = pageSize;
}
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> of(List<T> data, Long total, Long pageNo, Long pageSize) {
return new PageResult<>(data, total, pageNo, pageSize);
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> of(List<T> data, Long total, Integer pageNo, Integer pageSize) {
return new PageResult<>(data, total, pageNo, pageSize);
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param param 分页参数
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> of(List<T> data, Long total, PageQueryParam param) {
return new PageResult<>(data, total, param.getPageNo(), param.getPageSize());
}
/**
* 构建分页返回对象
* 总条数返回
*
* @param data 返回的对象
* @param param 分页参数
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> of(List<T> data, PageQueryParam param) {
return new PageResult<>(data, 0L, param.getPageNo(), param.getPageSize());
}
/**
* 构建空的返回对象
*
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> empty(Long pageNo, Long pageSize) {
return of(Collections.emptyList(), 0L, pageNo, pageSize);
}
/**
* 构建空的返回对象
*
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> PageResult<T> empty(Integer pageNo, Integer pageSize) {
return of(Collections.emptyList(), 0L, pageNo, pageSize);
}
/**
* 判断是否还有下一页
* 根据分页大小来计算 防止total为空
*
* @return 是否还有下一页
*/
public Boolean calculateHasNextPage() {
// 存在分页大小 根据分页来计算
if (total > 0) {
return (long)pageSize * pageNo <= total;
}
// 没有数据 肯定没有下一页
if (data == null || data.isEmpty()) {
return false;
}
// 当前数量小于分页数量
return data.size() >= pageSize;
}
/**
* 判断是否还有下一页
* 根据分页大小来计算 防止total为空
*
* @return 是否还有下一页
* @deprecated 使用 {@link #getHasNextPage()} ()}
*/
@Deprecated
public boolean hasNextPage() {
return getHasNextPage();
}
public Boolean getHasNextPage() {
if (hasNextPage == null) {
hasNextPage = calculateHasNextPage();
}
return hasNextPage;
}
/**
* 返回查询异常信息
*
* @param errorCode 错误编码
* @param errorMessage 错误信息
* @param <T> 返回的对象
* @return 分页返回对象
*/
public static <T> PageResult<T> error(String errorCode, String errorMessage) {
PageResult<T> result = new PageResult<>();
result.errorCode = errorCode;
result.errorMessage = errorMessage;
result.success = Boolean.FALSE;
return result;
}
/**
* 返回查询异常信息
*
* @param errorEnum 错误枚举
* @param <T> 返回的对象
* @return 分页返回对象
*/
public static <T> PageResult<T> error(BaseErrorEnum errorEnum) {
return error(errorEnum.getCode(), errorEnum.getDescription());
}
/**
* 判断是否存在数据
*
* @param pageResult
* @return 是否存在数据
*/
public static boolean hasData(PageResult<?> pageResult) {
return pageResult != null && pageResult.getSuccess() && pageResult.getData() != null && !pageResult.getData()
.isEmpty();
}
/**
* 将当前的类型转换成另外一个类型
*
* @param mapper 转换的方法
* @param <R> 返回的类型
* @return 分页返回对象
*/
public <R> PageResult<R> map(Function<T, R> mapper) {
List<R> returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList())
: Collections.emptyList();
PageResult<R> pageResult = new PageResult<>();
pageResult.setSuccess(getSuccess());
pageResult.setErrorCode(getErrorCode());
pageResult.setErrorMessage(getErrorMessage());
pageResult.setData(returnData);
pageResult.setPageNo(getPageNo());
pageResult.setPageSize(getPageSize());
pageResult.setTotal(getTotal());
pageResult.setTraceId(getTraceId());
return pageResult;
}
/**
* 将当前的类型转换成另外一个类型
* 并且转换成web的类型
* 这里注意如果当前项目在web层用的也是 <code>PageResult</code> 则直接使用 <code>map</code>方法接口即可
*
* @param mapper 转换的方法
* @param <R> 返回的类型
* @return 分页返回对象
*/
public <R> WebPageResult<R> mapToWeb(Function<T, R> mapper) {
List<R> returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList())
: Collections.emptyList();
WebPageResult<R> pageResult = new WebPageResult<>();
pageResult.setSuccess(getSuccess());
pageResult.setErrorCode(getErrorCode());
pageResult.setErrorMessage(getErrorMessage());
pageResult.setTraceId(getTraceId());
// 重新设置一个分页信息
Page<R> page = new Page<>();
pageResult.setData(page);
page.setData(returnData);
page.setPageNo(getPageNo());
page.setPageSize(getPageSize());
page.setTotal(getTotal());
pageResult.setData(page);
return pageResult;
}
@Override
public boolean success() {
return success;
}
@Override
public void success(boolean success) {
this.success = success;
}
@Override
public String errorCode() {
return errorCode;
}
@Override
public void errorCode(String errorCode) {
this.errorCode = errorCode;
}
@Override
public String errorMessage() {
return errorMessage;
}
@Override
public void errorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}

View File

@ -0,0 +1,331 @@
package ai.chat2db.server.tools.base.wrapper.result.web;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.enums.BaseErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
/**
* data的返回对象
* 和 PageResult 比较一致 也可以直接用 PageResult。 这个是部分项目前端需要将 data+pageNo 封装到一起 所以额外创建的类
*
* @author 是仪
*/
@Data
@SuperBuilder
@AllArgsConstructor
public class WebPageResult<T> implements Serializable, Result<List<T>> {
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
/**
* 是否成功
*
* @mock true
*/
@NotNull
private Boolean success;
/**
* 异常编码
*/
private String errorCode;
/**
* 异常信息
*/
private String errorMessage;
/**
* 数据信息
*/
private Page<T> data;
/**
* traceId
*/
private String traceId;
public WebPageResult() {
this.success = Boolean.TRUE;
this.data = new Page<>();
}
private WebPageResult(List<T> data, Long total, Long pageNo, Long pageSize) {
this.success = Boolean.TRUE;
this.data = new Page<>(data, total, pageNo, pageSize);
}
private WebPageResult(List<T> data, Long total, Integer pageNo, Integer pageSize) {
this.success = Boolean.TRUE;
this.data = new Page<>(data, total, pageNo, pageSize);
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> WebPageResult<T> of(List<T> data, Long total, Long pageNo, Long pageSize) {
return new WebPageResult<>(data, total, pageNo, pageSize);
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> WebPageResult<T> of(List<T> data, Long total, Integer pageNo, Integer pageSize) {
return new WebPageResult<>(data, total, pageNo, pageSize);
}
/**
* 构建分页返回对象
*
* @param data 返回的对象
* @param total 总的条数
* @param param 分页参数
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> WebPageResult<T> of(List<T> data, Long total, PageQueryParam param) {
return new WebPageResult<>(data, total, param.getPageNo(), param.getPageSize());
}
/**
* 构建空的返回对象
*
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> WebPageResult<T> empty(Long pageNo, Long pageSize) {
return of(Collections.emptyList(), 0L, pageNo, pageSize);
}
/**
* 构建空的返回对象
*
* @param pageNo 页码
* @param pageSize 分页大小
* @param <T> 返回的对象类型
* @return 分页返回对象
*/
public static <T> WebPageResult<T> empty(Integer pageNo, Integer pageSize) {
return of(Collections.emptyList(), 0L, pageNo, pageSize);
}
/**
* 判断是否还有下一页
* 根据分页大小来计算 防止total为空
*
* @return 是否还有下一页
* @deprecated 使用 {@link #getHasNextPage()} ()}
*/
@Deprecated
public boolean hasNextPage() {
return getHasNextPage();
}
public Boolean getHasNextPage() {
if (data == null) {
return Boolean.FALSE;
}
return data.getHasNextPage();
}
/**
* 返回查询异常信息
*
* @param errorCode 错误编码
* @param errorMessage 错误信息
* @param <T> 返回的对象
* @return 分页返回对象
*/
public static <T> WebPageResult<T> error(String errorCode, String errorMessage) {
WebPageResult<T> result = new WebPageResult<>();
result.errorCode = errorCode;
result.errorMessage = errorMessage;
result.success = Boolean.FALSE;
return result;
}
/**
* 返回查询异常信息
*
* @param errorEnum 错误枚举
* @param <T> 返回的对象
* @return 分页返回对象
*/
public static <T> WebPageResult<T> error(BaseErrorEnum errorEnum) {
return error(errorEnum.getCode(), errorEnum.getDescription());
}
/**
* 判断是否存在数据
*
* @param pageResult
* @return 是否存在数据
*/
public static boolean hasData(WebPageResult<?> pageResult) {
return pageResult != null && pageResult.getSuccess() && pageResult.getData() != null
&& pageResult.getData().getData() != null && !pageResult.getData().getData().isEmpty();
}
/**
* 将当前的类型转换成另外一个类型
*
* @param mapper 转换的方法
* @param <R> 返回的类型
* @return 分页返回对象
*/
public <R> WebPageResult<R> map(Function<T, R> mapper) {
List<R> returnData = hasData(this) ? getData().getData().stream().map(mapper).collect(Collectors.toList())
: Collections.emptyList();
WebPageResult<R> pageResult = new WebPageResult<>();
pageResult.setSuccess(getSuccess());
pageResult.setErrorCode(getErrorCode());
pageResult.setErrorMessage(getErrorMessage());
pageResult.setTraceId(getTraceId());
// 重新设置一个分页信息
Page<R> page = new Page<>();
pageResult.setData(page);
page.setData(returnData);
page.setPageNo(data.getPageNo());
page.setPageSize(data.getPageSize());
page.setTotal(data.getTotal());
return pageResult;
}
@Override
public boolean success() {
return success;
}
@Override
public void success(boolean success) {
this.success = success;
}
@Override
public String errorCode() {
return errorCode;
}
@Override
public void errorCode(String errorCode) {
this.errorCode = errorCode;
}
@Override
public String errorMessage() {
return errorMessage;
}
@Override
public void errorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
/**
* 分页信息
*
* @param <T>
*/
@Data
public static class Page<T> {
/**
* 数据信息
*/
private List<T> data;
/**
* 分页编码
*/
private Integer pageNo;
/**
* 分页大小
*/
private Integer pageSize;
/**
* 总的大小
*/
private Long total;
/**
* 是否存在下一页
*/
private Boolean hasNextPage;
public Page() {
this.pageNo = 1;
this.pageSize = 10;
this.total = 0L;
}
private Page(List<T> data, Long total, Long pageNo, Long pageSize) {
this();
this.data = data;
this.total = total;
if (pageNo != null) {
this.pageNo = Math.toIntExact(pageNo);
}
if (pageSize != null) {
this.pageSize = Math.toIntExact(pageSize);
}
}
private Page(List<T> data, Long total, Integer pageNo, Integer pageSize) {
this();
this.data = data;
this.total = total;
if (pageNo != null) {
this.pageNo = pageNo;
}
if (pageSize != null) {
this.pageSize = pageSize;
}
}
public Boolean getHasNextPage() {
if (hasNextPage == null) {
hasNextPage = calculateHasNextPage();
}
return hasNextPage;
}
/**
* 判断是否还有下一页
* 根据分页大小来计算 防止total为空
*
* @return 是否还有下一页
*/
public Boolean calculateHasNextPage() {
// 存在分页大小 根据分页来计算
if (total > 0) {
return (long)pageSize * pageNo <= total;
}
// 没有数据 肯定没有下一页
if (data == null || data.isEmpty()) {
return false;
}
// 当前数量小于分页数量
return data.size() >= pageSize;
}
}
}