24282 1 year ago
parent
commit
56222c40eb

+ 17 - 0
base-starter/src/main/java/org/dromara/base/annotation/FormatIgnore.java

@@ -0,0 +1,17 @@
+package org.dromara.base.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 排除接口返回统一格式
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface FormatIgnore {
+
+}

+ 44 - 0
base-starter/src/main/java/org/dromara/base/config/ResponseAdvice.java

@@ -0,0 +1,44 @@
+package org.dromara.base.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.base.annotation.FormatIgnore;
+import org.dromara.base.domain.R;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.lang.Nullable;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+/**
+ * 做统一格式返回
+ */
+@Slf4j
+@RestController
+@RestControllerAdvice
+public class ResponseAdvice implements ResponseBodyAdvice<Object>, ErrorController {
+
+    @Override
+    public boolean supports(MethodParameter returnType, @Nullable Class<? extends HttpMessageConverter<?>> converterType) {
+        return returnType.getAnnotatedElement().getAnnotation(FormatIgnore.class) == null;
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body,
+                                  @Nullable MethodParameter returnType,
+                                  @Nullable MediaType selectedContentType,
+                                  @Nullable Class<? extends HttpMessageConverter<?>> selectedConverterType,
+                                  @Nullable ServerHttpRequest request,
+                                  @Nullable ServerHttpResponse response) {
+        if (body instanceof R || body instanceof TableDataInfo) {
+            return body;
+        }
+        return R.success(body);
+    }
+
+}

+ 1 - 1
base-starter/src/main/java/org/dromara/web/ScanConfig.java → base-starter/src/main/java/org/dromara/base/config/ScanConfig.java

@@ -1,4 +1,4 @@
-package org.dromara.web;
+package org.dromara.base.config;
 
 import org.springframework.context.annotation.ComponentScan;
 

+ 38 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseAllPo.java

@@ -0,0 +1,38 @@
+package org.dromara.base.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class BaseAllPo extends BaseIdPo {
+
+    /**
+     * 创建人
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+}

+ 26 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseCreatePo.java

@@ -0,0 +1,26 @@
+package org.dromara.base.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class BaseCreatePo extends BaseIdPo {
+
+    /**
+     * 创建人
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+}

+ 21 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseIdPo.java

@@ -0,0 +1,21 @@
+package org.dromara.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Getter
+@Setter
+public class BaseIdPo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+}

+ 105 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseSelectDto.java

@@ -0,0 +1,105 @@
+package org.dromara.base.domain;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Getter;
+import lombok.Setter;
+import org.dromara.common.core.exception.ServiceException;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Getter
+@Setter
+@SuppressWarnings("unused")
+public class BaseSelectDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 通用id
+     */
+    private Long id;
+
+    /**
+     * 通用id集合
+     */
+    private List<Long> idList;
+
+    /**
+     * 页数
+     */
+    private Integer pageNum;
+
+    /**
+     * 每页条数
+     */
+    private Integer pageSize;
+
+    /**
+     * 是否查询全部数据
+     */
+    private Boolean searchAll;
+
+    /**
+     * 关键字查询
+     */
+    private String keyword;
+
+    /**
+     * 通用开始时间
+     */
+    private String beginTime;
+
+    /**
+     * 通用结束时间
+     */
+    private String endTime;
+
+    /**
+     * 返回分页实体
+     */
+    public <T> Page<T> getPage() {
+        if (ObjectUtil.equal(searchAll, true)) {
+            return new Page<>(getPageNum(), -1, false);
+        } else {
+            return new Page<>(getPageNum(), getPageSize());
+        }
+    }
+
+    public Integer getPageNum() {
+        return ObjectUtil.defaultIfNull(pageNum, 1);
+    }
+
+    public Integer getPageSize() {
+        return ObjectUtil.defaultIfNull(pageSize, 10);
+    }
+
+    public Date getBeginTime() {
+        if (StrUtil.isBlank(beginTime)) {
+            return null;
+        }
+        try {
+            return DateUtil.beginOfDay(DateUtil.parse(beginTime));
+        } catch (Exception e) {
+            throw new ServiceException("开始时间格式错误");
+        }
+    }
+
+    public Date getEndTime() {
+        if (StrUtil.isBlank(endTime)) {
+            return null;
+        }
+        try {
+            return DateUtil.endOfDay(DateUtil.parse(endTime));
+        } catch (Exception e) {
+            throw new ServiceException("结束时间格式错误");
+        }
+    }
+
+}

+ 104 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseService.java

@@ -0,0 +1,104 @@
+package org.dromara.base.domain;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@SuppressWarnings({"unused", "unchecked", "UnusedReturnValue"})
+public interface BaseService<T extends BaseIdPo> extends IService<T> {
+
+    // =========================================================
+    // mp方法扩展
+    // =========================================================
+
+    default Map<Long, T> byIdsToMap(Collection<? extends Serializable> ids) {
+        return listByIds(ids).stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+    }
+
+    default List<Map<String, Object>> listMaps(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return listMaps(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default <K> List<K> fieldList(SFunction<T, K> mapper, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().select(mapper).func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().map(mapper).filter(ObjectUtil::isNotEmpty).collect(Collectors.toList());
+    }
+
+    default <K> Set<K> fieldSet(SFunction<T, K> mapper, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().select(mapper).func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().map(mapper).filter(ObjectUtil::isNotEmpty).collect(Collectors.toSet());
+    }
+
+    default long count(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return count(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default T getOne(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return getOne(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer).last("limit 1"));
+    }
+
+    default Page<T> page(Page<T> page, Consumer<LambdaQueryWrapper<T>> consumer) {
+        return page(page, Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default Page<T> page(BaseSelectDto dto, Consumer<LambdaQueryWrapper<T>> consumer) {
+        return page(dto.getPage(), Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default List<T> list(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return list(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default boolean update(Consumer<LambdaUpdateWrapper<T>> consumer) {
+        return update(Wrappers.<T>lambdaUpdate().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default boolean update(T t, Consumer<LambdaUpdateWrapper<T>> consumer) {
+        return update(t, Wrappers.<T>lambdaUpdate().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default boolean remove(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return remove(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    default boolean saveBatchEx(Collection<? extends T> entityList) {
+        return saveBatch((List<T>) entityList, DEFAULT_BATCH_SIZE);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    default boolean updateBatchExById(Collection<? extends T> entityList) {
+        return updateBatchById((List<T>) entityList, DEFAULT_BATCH_SIZE);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    default boolean saveOrUpdateBatchEx(Collection<? extends T> entityList) {
+        return saveOrUpdateBatch((List<T>) entityList, DEFAULT_BATCH_SIZE);
+    }
+
+    /**
+     * 编辑关联表
+     */
+    @Transactional(rollbackFor = Exception.class)
+    default void editLinked(List<? extends T> list, SFunction<T, Long> getMasterIdFun, Long masterId) {
+        List<Long> idList = list.stream().map(BaseIdPo::getId).filter(Objects::nonNull).collect(Collectors.toList());
+        remove(q -> q.eq(getMasterIdFun, masterId).notIn(ObjectUtil.isNotEmpty(idList), BaseIdPo::getId, idList));
+        saveOrUpdateBatchEx(list);
+    }
+
+}

+ 26 - 0
base-starter/src/main/java/org/dromara/base/domain/BaseTimePo.java

@@ -0,0 +1,26 @@
+package org.dromara.base.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class BaseTimePo extends BaseIdPo {
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+}

+ 65 - 0
base-starter/src/main/java/org/dromara/base/domain/R.java

@@ -0,0 +1,65 @@
+package org.dromara.base.domain;
+
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.Getter;
+import lombok.Setter;
+
+
+/**
+ * 统一返回结果的类
+ */
+@Getter
+@Setter
+public class R {
+
+    /**
+     * 是否成功
+     */
+    private Boolean success;
+
+    /**
+     * 返回码
+     */
+    private Integer code;
+
+    /**
+     * 返回消息
+     */
+    private String message;
+
+    /**
+     * 返回数据
+     */
+    private Object data;
+
+    private R(Boolean success, Integer code, String message) {
+        this.success = success;
+        this.code = code;
+        this.message = message;
+    }
+
+    private R(Boolean success, Integer code, String message, Object data) {
+        this.success = success;
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+    public static R success() {
+        return new R(true, HttpServletResponse.SC_OK, "成功");
+    }
+
+    public static R success(Object data) {
+        return new R(true, HttpServletResponse.SC_OK, "成功", data);
+    }
+
+    public static R fail(String errorMsg, Object... params) {
+        return new R(false, HttpServletResponse.SC_BAD_REQUEST, StrUtil.format(errorMsg, params));
+    }
+
+    public static R fail(Integer errorCode, String errorMsg, Object... params) {
+        return new R(false, errorCode, StrUtil.format(errorMsg, params));
+    }
+
+}

+ 91 - 0
base-starter/src/main/java/org/dromara/base/utils/AssertUtil.java

@@ -0,0 +1,91 @@
+package org.dromara.base.utils;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import org.dromara.common.core.exception.ServiceException;
+
+public class AssertUtil {
+
+    /**
+     * 断言不为空
+     */
+    public static void notEmpty(Object obj, String errStr, Object... params) {
+        if (ObjectUtil.isEmpty(obj)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言不为空
+     */
+    public static void notNull(Object obj, String errStr, Object... params) {
+        if (ObjectUtil.isNull(obj)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言不为空
+     */
+    public static void notBlank(String str, String errStr, Object... params) {
+        if (StrUtil.isBlank(str)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言为0
+     */
+    public static void eqZero(Integer integer, String errStr, Object... params) {
+        if (ObjectUtil.notEqual(integer, 0)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言为0
+     */
+    public static void eqZero(Long along, String errStr, Object... params) {
+        if (ObjectUtil.notEqual(along, 0L)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言为1
+     */
+    public static void eqOne(Integer integer, String errStr, Object... params) {
+        if (ObjectUtil.notEqual(integer, 1)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言为1
+     */
+    public static void eqOne(Long along, String errStr, Object... params) {
+        if (ObjectUtil.notEqual(along, 1L)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言为真
+     */
+    public static void eqTrue(Boolean flag, String errStr, Object... params) {
+        if (Boolean.TRUE.equals(flag)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+    /**
+     * 断言对象相等
+     */
+    public static void equals(Object obj1, Object obj2, String errStr, Object... params) {
+        if (ObjectUtil.notEqual(obj1, obj2)) {
+            throw new ServiceException(StrUtil.format(errStr, params));
+        }
+    }
+
+}

+ 1 - 1
base-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1 +1 @@
-org.dromara.web.ScanConfig
+org.dromara.base.config.ScanConfig

+ 0 - 80
my-test/src/main/java/org/example/join/Test.java

@@ -1,80 +0,0 @@
-package org.example.join;
-
-import org.example.join.domain.QueryColumn;
-import org.example.join.domain.Table;
-
-public class Test extends Table {
-
-    public static final Test sys_dept = new Test();
-    public final QueryColumn dept_id = new QueryColumn(this, "dept_id");
-    public final QueryColumn tenant_id = new QueryColumn(this, "tenant_id");
-    public final QueryColumn parent_id = new QueryColumn(this, "parent_id");
-    public final QueryColumn ancestors = new QueryColumn(this, "ancestors");
-
-    public Test() {
-        super("sys_dept");
-    }
-
-
-    //public static void main(String[] args) {
-    //
-    //    Sql.create(SysUser.class)
-    //
-    //            .distinct()
-    //
-    //            .select(
-    //                    test_table.field_1,
-    //                    test_table.field_2.tableAs("tt2").add(test_table.field_3.tableAs("tt3")).add(2).as(SysUser::getEmail),
-    //                    test_table.field_3
-    //            )
-    //
-    //            .from(test_table)
-    //            .leftJoin(test_table.as("tt2")).on(test_table.field_4.eq(test_table.field_3), test_table.id.eq("sss"))
-    //            .leftJoin(test_table.as("tt3")).on(test_table.field_4)
-    //
-    //            .where(
-    //                    test_table.field_1.eq( test_table.field_1),
-    //                    test_table.field_1.eq("6777")
-    //            )
-    //            .list()
-    //
-    //
-    //    //.unionAll()
-    //    //
-    //    //
-    //    //.list()
-    //    //.page()
-    //    //.one()
-    //
-    //    ;
-    //
-    //    HashMap<String, String> map = new HashMap<>();
-    //    map.put("test_table", "t1");
-    //
-    //    QueryColumnAlias add3 = test_table.field_1
-    //            .add(test_table.field_2.subtract(test_table.field_3.divide(222).multiply(test_table.field_3)).add(1))
-    //            .add(test_table.field_3).as(SysUser::getEmail);
-    //    String sql = add3.getQueryColumn().toSql(map);
-    //
-    //    System.out.println(sql);
-    //
-    //    //System.out.println(
-    //    //
-    //    //        test_table.field_1.eq(111)
-    //    //                .and(test_table.field_2.eq(222).or(test_table.field_3.eq(333).and(test_table.field_4.eq(444))))
-    //    //
-    //    //
-    //    //                .toSql()
-    //    //);
-    //    //
-    //    //
-    //    //System.out.println(
-    //    //
-    //    //        test_table.field_1.eq(111)
-    //    //                .toSql()
-    //    //);
-    //
-    //
-    //}
-
-}

+ 5 - 22
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/ServiceException.java

@@ -3,7 +3,9 @@ package org.dromara.common.core.exception;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 
 import java.io.Serial;
 
@@ -12,6 +14,7 @@ import java.io.Serial;
  *
  * @author ruoyi
  */
+@Getter
 @Data
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
@@ -29,11 +32,13 @@ public final class ServiceException extends RuntimeException {
     /**
      * 错误提示
      */
+    @Setter
     private String message;
 
     /**
      * 错误明细,内部调试错误
      */
+    @Setter
     private String detailMessage;
 
     public ServiceException(String message) {
@@ -45,26 +50,4 @@ public final class ServiceException extends RuntimeException {
         this.code = code;
     }
 
-    public String getDetailMessage() {
-        return detailMessage;
-    }
-
-    public ServiceException setDetailMessage(String detailMessage) {
-        this.detailMessage = detailMessage;
-        return this;
-    }
-
-    @Override
-    public String getMessage() {
-        return message;
-    }
-
-    public ServiceException setMessage(String message) {
-        this.message = message;
-        return this;
-    }
-
-    public Integer getCode() {
-        return code;
-    }
 }