This commit is contained in:
2025-06-20 18:58:09 +08:00
parent e9f4a9c3e2
commit f5781a7282
293 changed files with 3535 additions and 3637 deletions
+18
View File
@@ -10,6 +10,24 @@
https://github.com/odboy-tianjun/cutejava
#### 编码规范
- 和数据库表一一对应的类, 以`Tb`结尾
- 前端请求参数类名, 以`Args`结尾
- 返回给前端的数据类名, 以`Vo`结尾
- 事件驱动类名,以`Event`结尾
- 消息队列/Socket传输类名,以`Message`结尾
- 原框架以外的所有辅助类的类名, 以`Cs`开头
- 查询分页、查询列表的方法,一律为同一个方法名
- 查询分页:queryUserListByArgs(args, page)
- 查询列表:queryUserListByArgs(args)
- MapperXml:这样mapper.xml文件中的实现方法只需要写一个queryUserListByArgs
- Mapper层查询方法,统一使用以下命名规则
- 分页、列表:query{TableName}ListByArgs
- 精确查询:get{TableName}{By FieldName}
- 统计数量:get{具体语义}Count{By FieldName}
- 枚举类名,以`Enum`结尾
#### 主要特性
- 使用最新技术栈,社区资源丰富。
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>cutejava</artifactId>
<groupId>cn.odboy</groupId>
<version>1.3.1</version>
<version>1.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cutejava-common</artifactId>
@@ -1,11 +1,6 @@
package cn.odboy.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.*;
/**
* 用于标记匿名访问方法
@@ -3,11 +3,8 @@ package cn.odboy.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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;
import java.lang.annotation.*;
/**
* Annotation for mapping HTTP {@code DELETE} requests onto specific handler
@@ -3,11 +3,8 @@ package cn.odboy.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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;
import java.lang.annotation.*;
/**
* Annotation for mapping HTTP {@code GET} requests onto specific handler
@@ -3,11 +3,8 @@ package cn.odboy.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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;
import java.lang.annotation.*;
/**
* Annotation for mapping HTTP {@code PATCH} requests onto specific handler
@@ -3,11 +3,8 @@ package cn.odboy.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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;
import java.lang.annotation.*;
/**
* Annotation for mapping HTTP {@code POST} requests onto specific handler
@@ -3,11 +3,8 @@ package cn.odboy.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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;
import java.lang.annotation.*;
/**
* Annotation for mapping HTTP {@code PUT} requests onto specific handler
@@ -9,6 +9,7 @@ import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import java.lang.reflect.Field;
import java.util.Date;
@@ -20,7 +21,7 @@ import java.util.Date;
*/
@Getter
@Setter
public class MyLogicEntity extends MyObject {
public class CsBaseUserTimeLogicTb extends CsSerializeObject {
@CreatedBy
@TableField(value = "create_by", fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建人", hidden = true)
@@ -9,6 +9,7 @@ import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import java.lang.reflect.Field;
import java.util.Date;
@@ -16,7 +17,7 @@ import java.util.Date;
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
public class MyEntity extends MyObject {
public class CsBaseUserTimeTb extends CsSerializeObject {
@CreatedBy
@TableField(fill = FieldFill.INSERT)
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@@ -17,7 +18,7 @@ import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageArgs<T> implements Serializable {
public class CsPageArgs<T> implements Serializable {
@NotNull(message = "参数page不能为空")
@Min(value = 1, message = "参数page最小值为1")
@ApiModelProperty(value = "页码", example = "1")
@@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class BaseResult<T> extends MyObject {
public class CsResultVo<T> extends CsSerializeObject {
private T content;
private long totalElements;
}
@@ -15,11 +15,8 @@
*/
package cn.odboy.base;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.*;
import java.util.Map;
/**
@@ -33,7 +30,7 @@ import java.util.Map;
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class MyMetaOption extends MyObject {
public class CsSelectOptionItemVo extends CsSerializeObject {
private String label;
private String value;
private Map<String, Object> ext;
@@ -8,6 +8,6 @@ import java.io.Serializable;
* @author odboy
* @date 2022-01-12
*/
public class MyObject implements Serializable {
public class CsSerializeObject implements Serializable {
private static final long serialVersionUID = 1L;
}
@@ -1,19 +0,0 @@
package cn.odboy.base;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 分页结果封装类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class PageResult<T> extends MyObject {
private List<T> content;
private long totalElements;
}
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Component;
*/
@Slf4j
@Component
public class BeanLoadFinishListener implements ApplicationListener<ContextRefreshedEvent> {
public class CsBeanLoadFinishListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
log.info("所有的Bean都加载完毕了");
@@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -30,7 +31,7 @@ import java.net.UnknownHostException;
* @date 2024-04-20
*/
@Slf4j
public class BootApplication {
public class CsBootApplication {
@Bean
public SpringBeanHolder springContextHolder() {
return new SpringBeanHolder();
@@ -19,13 +19,8 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.script.ScriptRuntimeException;
import cn.odboy.exception.BadRequestException;
import org.springframework.stereotype.Component;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import javax.script.*;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
@@ -39,7 +34,7 @@ import java.util.Set;
* @date 2023-12-05
*/
@Component
public class ScriptHelper {
public class CsScriptHelper {
private static final String FUNCTION_TAG = "function";
private final ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
@@ -2,6 +2,7 @@ package cn.odboy.context;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
@@ -7,6 +7,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -2,6 +2,7 @@ package cn.odboy.exception;
import lombok.Getter;
import org.springframework.http.HttpStatus;
import static org.springframework.http.HttpStatus.BAD_REQUEST;
/**
@@ -13,6 +13,7 @@ import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import static org.springframework.http.HttpStatus.NOT_FOUND;
@Slf4j
@@ -16,7 +16,7 @@
package cn.odboy.monitor.controller;
import cn.odboy.annotation.AnonymousGetMapping;
import cn.odboy.monitor.service.HealthCheckPointService;
import cn.odboy.monitor.service.CsHealthCheckPointService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -31,9 +31,9 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RequestMapping("/healthCheck")
@Api(tags = "系统:健康检查接口")
public class HealthCheckController {
public class CsHealthCheckController {
@Autowired
private HealthCheckPointService healthCheckPointService;
private CsHealthCheckPointService healthCheckPointService;
/**
* 就绪检查
@@ -2,7 +2,7 @@ package cn.odboy.monitor.service;
import org.springframework.http.ResponseEntity;
public interface HealthCheckPointService {
public interface CsHealthCheckPointService {
/**
* 就绪检查
*/
@@ -23,6 +23,7 @@ import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.HashMap;
@@ -7,21 +7,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.ConvertingCursor;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisConnectionUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -7,13 +7,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
/**
* 匿名标记工具
@@ -3,6 +3,7 @@ package cn.odboy.util;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -17,6 +17,7 @@ package cn.odboy.util;
import cn.hutool.core.codec.Base64Encoder;
import cn.hutool.core.util.IdUtil;
import java.nio.charset.StandardCharsets;
/**
@@ -25,8 +26,8 @@ import java.nio.charset.StandardCharsets;
* @author odboy
* @date 2022-11-16
*/
public final class Base64SecretUtil {
private Base64SecretUtil() {
public final class CsBase64SecretUtil {
private CsBase64SecretUtil() {
}
public static String build() {
@@ -15,17 +15,13 @@
*/
package cn.odboy.util;
import cn.odboy.base.MyMetaOption;
import cn.odboy.base.CsSelectOptionItemVo;
import com.alibaba.fastjson2.JSON;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -36,7 +32,7 @@ import java.util.stream.Collectors;
* @author odboy
* @date 2022-11-09
*/
public final class CollUtil extends cn.hutool.core.collection.CollUtil {
public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
private static <T, K> Predicate<T> distinctPredicate(Function<? super T, ? extends K> keyMapper) {
Map<Object, Boolean> map = new HashMap<>(3);
return (t) -> null == map.putIfAbsent(keyMapper.apply(t), true);
@@ -108,7 +104,7 @@ public final class CollUtil extends cn.hutool.core.collection.CollUtil {
* @return /
*/
public static Double streamDoubleAdd(List<Double> data) {
if (CollUtil.isNotEmpty(data)) {
if (CsCollUtil.isNotEmpty(data)) {
return data.stream().filter(Objects::nonNull).reduce(Double::sum).orElse(0.0);
}
return 0.0;
@@ -123,7 +119,7 @@ public final class CollUtil extends cn.hutool.core.collection.CollUtil {
* @return /
*/
public static BigDecimal streamBigDecimalAdd(List<BigDecimal> data) {
if (CollUtil.isNotEmpty(data)) {
if (CsCollUtil.isNotEmpty(data)) {
return data.stream().filter(Objects::nonNull).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
}
return BigDecimal.ZERO;
@@ -199,25 +195,25 @@ public final class CollUtil extends cn.hutool.core.collection.CollUtil {
}
public static void main(String[] args) {
List<MyMetaOption> testData = new ArrayList<>();
MyMetaOption selectOption1 = MyMetaOption.builder().label("苹果").value("apple").build();
MyMetaOption selectOption2 = MyMetaOption.builder().label("苹果").value("apple").build();
MyMetaOption selectOption3 = MyMetaOption.builder().label("香蕉").value("banana").build();
MyMetaOption selectOption4 = MyMetaOption.builder().label("猫").value("cat").build();
List<CsSelectOptionItemVo> testData = new ArrayList<>();
CsSelectOptionItemVo selectOption1 = CsSelectOptionItemVo.builder().label("苹果").value("apple").build();
CsSelectOptionItemVo selectOption2 = CsSelectOptionItemVo.builder().label("苹果").value("apple").build();
CsSelectOptionItemVo selectOption3 = CsSelectOptionItemVo.builder().label("香蕉").value("banana").build();
CsSelectOptionItemVo selectOption4 = CsSelectOptionItemVo.builder().label("猫").value("cat").build();
testData.add(selectOption1);
testData.add(selectOption2);
testData.add(selectOption3);
testData.add(selectOption4);
List<MyMetaOption> selectOptions1 = CollUtil.streamAscSort(testData, MyMetaOption::getValue);
List<CsSelectOptionItemVo> selectOptions1 = CsCollUtil.streamAscSort(testData, CsSelectOptionItemVo::getValue);
System.out.println(JSON.toJSONString(selectOptions1));
List<MyMetaOption> selectOptions2 = CollUtil.streamDescSort(testData, MyMetaOption::getValue);
List<CsSelectOptionItemVo> selectOptions2 = CsCollUtil.streamDescSort(testData, CsSelectOptionItemVo::getValue);
System.out.println(JSON.toJSONString(selectOptions2));
List<MyMetaOption> selectOptions3 = CollUtil.streamDistinct(testData, MyMetaOption::getValue);
List<CsSelectOptionItemVo> selectOptions3 = CsCollUtil.streamDistinct(testData, CsSelectOptionItemVo::getValue);
System.out.println(JSON.toJSONString(selectOptions3));
Map<String, String> selectMap1 = CollUtil.streamToMap(testData, MyMetaOption::getValue, MyMetaOption::getLabel);
Map<String, String> selectMap1 = CsCollUtil.streamToMap(testData, CsSelectOptionItemVo::getValue, CsSelectOptionItemVo::getLabel);
System.out.println(JSON.toJSONString(selectMap1));
// 这只是一个示范
BigDecimal total1 = CollUtil.streamBigDecimalAdd(testData, "value");
BigDecimal total1 = CsCollUtil.streamBigDecimalAdd(testData, "value");
System.out.println(total1);
}
}
@@ -8,7 +8,7 @@ import java.util.concurrent.atomic.AtomicLong;
* @author odboy
* @date 2025-04-05
*/
public final class DistributedIdUtil {
public final class CsDistributedIdUtil {
/**
* 起始毫秒时间戳,2020-12-30
*/
@@ -73,7 +73,7 @@ public final class DistributedIdUtil {
* 单例实例持有者类
*/
private static class InstanceHolder {
private static final DistributedIdUtil INSTANCE = new DistributedIdUtil(20, 12, 5, 5, 12);
private static final CsDistributedIdUtil INSTANCE = new CsDistributedIdUtil(20, 12, 5, 5, 12);
}
/**
@@ -85,7 +85,7 @@ public final class DistributedIdUtil {
* @param workerIdBits 机器 ID 所占位数
* @param sequenceBits 序列号所占位数
*/
public DistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, long sequenceBits) {
public CsDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, long sequenceBits) {
this.dataCenterIdBits = dataCenterIdBits;
this.workerIdBits = workerIdBits;
this.sequenceBits = sequenceBits;
@@ -176,7 +176,7 @@ public final class DistributedIdUtil {
new Thread(() -> {
long id = Thread.currentThread().getId();
for (int j = 0; j < 20; j++) {
System.out.println(id + " - " + DistributedIdUtil.fastNextId());
System.out.println(id + " - " + CsDistributedIdUtil.fastNextId());
}
}).start();
}
@@ -17,6 +17,7 @@ package cn.odboy.util;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import java.util.List;
import java.util.Map;
@@ -26,7 +27,7 @@ import java.util.Map;
* @author odboy
* @date 2024-10-01
*/
public final class JsonUtil {
public final class CsJsonUtil {
public static <K, V> Map<K, V> toMap(String jsonStr, Class<K> kClass, Class<V> vClass) {
return JSON.parseObject(jsonStr, new TypeReference<Map<K, V>>() {
});
@@ -39,8 +40,8 @@ public final class JsonUtil {
public static void main(String[] args) {
String mapStr = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
System.err.println(JsonUtil.toMap(mapStr, String.class, String.class));
System.err.println(CsJsonUtil.toMap(mapStr, String.class, String.class));
String listStr = "[\"value1\", \"value2\"]";
System.err.println(JsonUtil.toList(listStr, String.class));
System.err.println(CsJsonUtil.toList(listStr, String.class));
}
}
@@ -16,7 +16,8 @@
package cn.odboy.util;
import cn.hutool.core.date.DateTime;
import cn.odboy.base.MyEntity;
import cn.odboy.base.CsBaseUserTimeTb;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
@@ -28,7 +29,7 @@ import java.util.stream.Collectors;
* @author odboy
* @date 2024-10-01
*/
public final class ListUtil {
public final class CsListUtil {
/**
* 根据对象T的属性去重
*
@@ -48,10 +49,10 @@ public final class ListUtil {
* list转map,保留旧值 -> Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing));
*/
public static void main(String[] args) {
List<MyEntity> entities = new ArrayList<>();
List<CsBaseUserTimeTb> entities = new ArrayList<>();
int total = 50;
for (int i = 0; i < total; i++) {
MyEntity entity = new MyEntity();
CsBaseUserTimeTb entity = new CsBaseUserTimeTb();
if (i % 2 == 0) {
entity.setCreateBy("odboy");
} else {
@@ -62,7 +63,7 @@ public final class ListUtil {
entity.setUpdateTime(DateTime.now().toTimestamp());
entities.add(entity);
}
List<MyEntity> entities1 = ListUtil.distinctByArgs(entities, MyEntity::getCreateBy);
List<CsBaseUserTimeTb> entities1 = CsListUtil.distinctByArgs(entities, CsBaseUserTimeTb::getCreateBy);
System.err.println(entities1);
}
}
@@ -21,7 +21,7 @@ package cn.odboy.util;
* @author odboy
* @date 2025-01-13
*/
public final class LogFmtUtil {
public final class CsLogFmtUtil {
/**
* 替换字符串中的占位符 {} 为传入的参数
*
@@ -27,7 +27,7 @@ import java.util.Set;
* @author odboy
* @date 2025-01-15
*/
public final class ValidationUtil {
public final class CsValidUtil {
private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();
public static <T> void validate(T object) {
@@ -11,14 +11,11 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.text.DecimalFormat;
@@ -28,10 +25,8 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.odboy.constant.SystemConst.SYMBOL_ADD;
import static cn.odboy.constant.SystemConst.SYMBOL_AT;
import static cn.odboy.constant.SystemConst.SYMBOL_EQUAL;
import static cn.odboy.constant.SystemConst.SYMBOL_SUBTRACT;
import static cn.odboy.constant.SystemConst.*;
/**
* File工具类,扩展 hutool 工具包
@@ -3,6 +3,7 @@ package cn.odboy.util;
import cn.odboy.context.SpringBeanHolder;
import net.dreamlu.mica.ip2region.core.Ip2regionSearcher;
import net.dreamlu.mica.ip2region.core.IpInfo;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
@@ -1,14 +1,18 @@
package cn.odboy.util;
import cn.odboy.base.PageResult;
import cn.odboy.base.CsResultVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 分页工具
*
* @author odboy
*/
public final class PageUtil extends cn.hutool.core.util.PageUtil {
@@ -31,32 +35,39 @@ public final class PageUtil extends cn.hutool.core.util.PageUtil {
/**
* Page 数据处理
*/
public static <T> PageResult<T> toPage(IPage<T> page) {
return new PageResult<>(page.getRecords(), page.getTotal());
public static <T> CsResultVo<List<T>> toPage(IPage<T> page) {
return new CsResultVo<>(page.getRecords(), page.getTotal());
}
/**
* 自定义分页
*/
public static <T> PageResult<T> toPage(List<T> list) {
return new PageResult<>(list, list.size());
public static <T> CsResultVo<List<T>> toPage(List<T> list) {
return new CsResultVo<>(list, list.size());
}
/**
* 返回空数据
*/
public static <T> PageResult<T> noData() {
return new PageResult<>(null, 0);
public static <T> CsResultVo<List<T>> emptyListData() {
return new CsResultVo<>(new ArrayList<>(), 0);
}
/**
* 返回空数据
*/
public static <T> CsResultVo<T> emptyData() {
return new CsResultVo<>(null, 0);
}
/**
* 自定义分页
*/
public static <T> PageResult<T> toPage(List<T> list, long totalElements) {
return new PageResult<>(list, totalElements);
public static <T> CsResultVo<List<T>> toPage(List<T> list, long totalElements) {
return new CsResultVo<>(list, totalElements);
}
public static Page<Object> getCount(BaseMapper<?> baseMapper) {
public static <T> Page<T> getCount(BaseMapper<T> baseMapper) {
return new Page<>(1, baseMapper.selectCount(null));
}
}
@@ -1,14 +1,10 @@
package cn.odboy.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
@@ -1,6 +1,7 @@
package cn.odboy.util;
import lombok.extern.slf4j.Slf4j;
import java.util.Calendar;
import java.util.Date;
@@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
* @date 2024-06-07
*/
@Component
public class WebSocketServerFactory implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
public class CsWebSocketServerFactory implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
@Override
public void customize(UndertowServletWebServerFactory factory) {
@@ -1,7 +1,7 @@
package cn.odboy.websocket.constant;
public enum WebSocketMessageBizTypeEnum {
public enum CsWebSocketBizTypeEnum {
/**
* 连接
*/
@@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class WebSocketClientManager {
public class CsWebSocketClientManager {
/**
* concurrent包的线程安全Map,用来存放每个客户端对应的MyWebSocket对象。(分布式必出问题)
*/
@@ -0,0 +1,15 @@
package cn.odboy.websocket.context;
import cn.odboy.websocket.constant.CsWebSocketBizTypeEnum;
import lombok.Data;
@Data
public class CsWebSocketMessage {
private String message;
private CsWebSocketBizTypeEnum bizType;
public CsWebSocketMessage(String message, CsWebSocketBizTypeEnum bizType) {
this.message = message;
this.bizType = bizType;
}
}
@@ -1,14 +1,10 @@
package cn.odboy.websocket.context;
import cn.odboy.websocket.dto.WebSocketMessageDto;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
@@ -35,7 +31,7 @@ public class WebSocketServer {
public void onOpen(Session session, @PathParam("sid") String sid) {
this.session = session;
this.sid = sid;
WebSocketClientManager.addClient(sid, this);
CsWebSocketClientManager.addClient(sid, this);
}
/**
@@ -43,7 +39,7 @@ public class WebSocketServer {
*/
@OnClose
public void onClose() {
WebSocketClientManager.removeClient(this.sid);
CsWebSocketClientManager.removeClient(this.sid);
}
/**
@@ -63,7 +59,7 @@ public class WebSocketServer {
* @param message /
*/
private static void sendToAll(String message) {
for (WebSocketServer item : WebSocketClientManager.getAllClient()) {
for (WebSocketServer item : CsWebSocketClientManager.getAllClient()) {
try {
item.innerSendMessage(message);
} catch (IOException e) {
@@ -88,14 +84,14 @@ public class WebSocketServer {
/**
* 群发自定义消息
*/
public static void sendMessage(WebSocketMessageDto webSocketMessageDto, @PathParam("sid") String sid) throws IOException {
String message = JSON.toJSONString(webSocketMessageDto);
public static void sendMessage(CsWebSocketMessage webSocketMessage, @PathParam("sid") String sid) throws IOException {
String message = JSON.toJSONString(webSocketMessage);
log.info("推送消息到{},推送内容:{}", sid, message);
try {
if (sid == null) {
sendToAll(message);
} else {
WebSocketClientManager.getClientBySid(sid).innerSendMessage(message);
CsWebSocketClientManager.getClientBySid(sid).innerSendMessage(message);
}
} catch (IOException ignored) {
}
@@ -1,15 +0,0 @@
package cn.odboy.websocket.dto;
import cn.odboy.websocket.constant.WebSocketMessageBizTypeEnum;
import lombok.Data;
@Data
public class WebSocketMessageDto {
private String message;
private WebSocketMessageBizTypeEnum bizType;
public WebSocketMessageDto(String message, WebSocketMessageBizTypeEnum bizType) {
this.message = message;
this.bizType = bizType;
}
}
+2 -2
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>cutejava</artifactId>
<groupId>cn.odboy</groupId>
<version>1.3.1</version>
<version>1.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -15,7 +15,7 @@
<dependency>
<groupId>cn.odboy</groupId>
<artifactId>cutejava-system</artifactId>
<version>1.3.1</version>
<version>1.4.0</version>
</dependency>
</dependencies>
@@ -1,19 +1,20 @@
package cn.odboy;
import cn.odboy.annotation.AnonymousGetMapping;
import cn.odboy.context.BootApplication;
import cn.odboy.context.CsBootApplication;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import java.net.UnknownHostException;
@Slf4j
@RestController
@Api(hidden = true)
@SpringBootApplication
public class AppRun extends BootApplication {
public class AppRun extends CsBootApplication {
public static void main(String[] args) throws UnknownHostException {
SpringApplication springApplication = new SpringApplication(AppRun.class);
@@ -1,7 +1,8 @@
package cn.odboy;
import cn.odboy.core.framework.mybatisplus.util.CmdGenHelper;
import cn.odboy.core.framework.mybatisplus.core.CsMpCmdGenUtil;
import java.util.List;
/**
@@ -11,7 +12,7 @@ import java.util.List;
*/
public class GenCode {
public static void main(String[] args) {
CmdGenHelper generator = new CmdGenHelper();
CsMpCmdGenUtil generator = new CsMpCmdGenUtil();
generator.setDatabaseUrl(String.format("jdbc:mysql://%s:%s/%s", "localhost", 3306, "cutejava20250321"));
generator.setDriverClassName("com.mysql.cj.jdbc.Driver");
generator.setDatabaseUsername("root");
@@ -19,7 +20,7 @@ public class GenCode {
genCareer(generator);
}
private static void genCareer(CmdGenHelper generator) {
private static void genCareer(CsMpCmdGenUtil generator) {
generator.gen("tool_", List.of(
// "tool_qiniu_content",
));
@@ -1,13 +1,13 @@
package cn.odboy.monitor;
import cn.odboy.core.service.system.SystemDictService;
import cn.odboy.monitor.service.HealthCheckPointService;
import cn.odboy.monitor.service.CsHealthCheckPointService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
@Component
public class HealthCheckPointerImpl implements HealthCheckPointService {
public class HealthCheckPointerImpl implements CsHealthCheckPointService {
@Autowired
private SystemDictService systemDictService;
@@ -6,10 +6,10 @@ server:
undertow:
threads:
# 工作线程数,默认设置为io-threads * 8。如果你的应用程序有很多同步阻塞操作,可以适当增加这个值
worker: 4
worker: 8
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
io: 2
io: 4
# 设置为true以使用直接内存(堆外内存)来存储缓冲区。这可以减少垃圾回收的开销。
direct-buffers: true
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
@@ -54,9 +54,9 @@ spring:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://127.0.0.1:3306/cutejava20250321?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
url: jdbc:p6spy:mysql://127.0.0.1:3306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: 123456
password: root123456
# 初始连接数,建议设置为与最小空闲连接数相同
initial-size: 2
# 最小空闲连接数,保持足够的空闲连接以应对请求
@@ -111,7 +111,7 @@ spring:
database: ${REDIS_DB:1}
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:123456}
password: ${REDIS_PWD:root123456}
# 连接超时时间
timeout: 5000
# 连接池配置
@@ -125,7 +125,6 @@ spring:
max-idle: 20
# 连接池中的最小空闲连接数
min-idle: 1
# 持久层
mybatis-plus:
configuration:
# 开启 Mybatis 二级缓存,默认为 true
@@ -218,6 +217,15 @@ app:
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
pipeline-task-pool:
# 核心线程池大小
core-pool-size: 10
# 最大线程数
max-pool-size: 200
# 活跃时间
keep-alive-seconds: 60
# 队列容量
queue-capacity: 300
# oss
oss:
# 七牛云
@@ -228,7 +236,6 @@ app:
captchaSetting:
# 邮箱验证码有效时间/秒
expiration: 300
## 启用debug
#debug: true
#logging:
@@ -6,10 +6,10 @@ server:
undertow:
threads:
# 工作线程数,默认设置为io-threads * 8。如果你的应用程序有很多同步阻塞操作,可以适当增加这个值
worker: 4
worker: 8
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
io: 2
io: 4
# 设置为true以使用直接内存(堆外内存)来存储缓冲区。这可以减少垃圾回收的开销。
direct-buffers: true
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
@@ -54,9 +54,9 @@ spring:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://127.0.0.1:3306/cutejava20250321?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
url: jdbc:p6spy:mysql://127.0.0.1:3306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: 123456
password: root123456
# 初始连接数,建议设置为与最小空闲连接数相同
initial-size: 2
# 最小空闲连接数,保持足够的空闲连接以应对请求
@@ -111,7 +111,7 @@ spring:
database: ${REDIS_DB:1}
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
password: ${REDIS_PWD:123456}
password: ${REDIS_PWD:root123456}
# 连接超时时间
timeout: 5000
# 连接池配置
@@ -125,7 +125,6 @@ spring:
max-idle: 20
# 连接池中的最小空闲连接数
min-idle: 1
# 持久层
mybatis-plus:
configuration:
# 开启 Mybatis 二级缓存,默认为 true
@@ -188,7 +187,7 @@ app:
# 登录
login:
# 是否限制单用户登录
single: true
single: false
# 验证码
captchaSetting:
# 验证码类型配置 查看 LoginProperties 类
@@ -207,7 +206,7 @@ app:
font-size: 25
# 是否开启 swagger-ui
swagger:
enabled: false
enabled: true
# 针对@Async
async-task-pool:
# 核心线程池大小
@@ -218,6 +217,15 @@ app:
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
pipeline-task-pool:
# 核心线程池大小
core-pool-size: 10
# 最大线程数
max-pool-size: 200
# 活跃时间
keep-alive-seconds: 60
# 队列容量
queue-capacity: 300
# oss
oss:
# 七牛云
@@ -228,3 +236,8 @@ app:
captchaSetting:
# 邮箱验证码有效时间/秒
expiration: 300
## 启用debug
#debug: true
#logging:
# level:
# root: debug
@@ -1,31 +1,42 @@
# 配置 quartz 分布式支持, sql 文件在 sql 目录下,需要导入到数据库,并且需要修改 application.yml 文件的 active: dev 配置
spring:
# Quartz集群, 数据库表名称一定要不区分大小写!
quartz:
# Quartz集群, 数据库表名称一定要不区分大小写!
# 必需,指定使用 JDBC 存储
job-store-type: jdbc
properties:
org:
quartz:
scheduler:
# 必需,指定调度器实例的名称
instanceName: ClusteredScheduler
# 必需,指定调度器实例的 ID
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 20000
useProperties: false
dataSource: myDS
threadPool:
class: org.quartz.simpl.SimpleThreadPool
# 可选,线程池的线程数量,可以根据需要调整
threadCount: 10
threadsInheritContextClassLoaderOfInitializingThread: true
dataSource:
myDS:
jobStoreDataSource:
driver: com.mysql.cj.jdbc.Driver
URL: jdbc:mysql://127.0.0.1:3306/cutejava20250321?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
URL: jdbc:mysql://127.0.0.1:3306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
user: root
password: 123456
maxConnections: 5
validationQuery: select 1
password: root123456
maxConnections: 10
validationQuery: select 1
jobStore:
# 可选,如果你不需要集群,可以去掉
isClustered: true
# 可选,集群检查间隔时间,可以根据需要调整
clusterCheckinInterval: 10000
# class: org.quartz.impl.jdbcjobstore.JobStoreTX
# 必需,指定 JDBC 驱动代理类
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 可选,是否使用属性存储,可以根据需要调整
useProperties: false
# 必需,指定表的前缀
tablePrefix: QRTZ_
# 可选,指定误触发阈值,可以根据需要调整
misfireThreshold: 60000
dataSource: jobStoreDataSource
@@ -5,4 +5,4 @@
| |___ | |_| | | | | |___ | |_| | / / | | | |/ / / / | |
\_____| \_____/ |_| |_____| \_____/ /_/ |_| |___/ /_/ |_|
Spring Boot Version: (${spring-boot.version}),CuteJava Version: (1.3.0)
Spring Boot Version: (${spring-boot.version}),CuteJava Version: (1.4.0)
@@ -1,7 +1,7 @@
# 应用的拦截模块
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=cn.odboy.core.framework.mybatisplus.context.CustomP6SpyLogger
logMessageFormat=cn.odboy.core.framework.mybatisplus.config.MpCustomP6SpyLogger
# 日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 日期格式
@@ -2,6 +2,7 @@ package cn.odboy.util;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import static cn.odboy.util.DesEncryptUtil.desDecrypt;
import static cn.odboy.util.DesEncryptUtil.desEncrypt;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -2,10 +2,8 @@ package cn.odboy.util;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockMultipartFile;
import static cn.odboy.util.FileUtil.getPrefix;
import static cn.odboy.util.FileUtil.getSize;
import static cn.odboy.util.FileUtil.getSuffix;
import static cn.odboy.util.FileUtil.toFile;
import static cn.odboy.util.FileUtil.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class FileUtilTest {
@@ -1,7 +1,7 @@
package cn.odboy.util;
import cn.odboy.core.framework.flow.context.PipelineManager;
import cn.odboy.core.framework.flow.context.PipelineProcessManager;
import cn.odboy.core.framework.flow.core.PipelineManager;
import cn.odboy.core.framework.flow.core.PipelineProcessManager;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -2,12 +2,11 @@ package cn.odboy.util;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import static cn.odboy.util.StringUtil.getWeekDay;
import static cn.odboy.util.StringUtil.toCamelCase;
import static cn.odboy.util.StringUtil.toCapitalizeCamelCase;
import static cn.odboy.util.StringUtil.toUnderScoreCase;
import static cn.odboy.util.StringUtil.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -4,7 +4,7 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.odboy.base.MyObject;
import cn.odboy.base.CsSerializeObject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@@ -22,7 +22,7 @@ import java.util.Map;
public class PipelineTests {
@Getter
@Setter
public static class PipelineNodeVo extends MyObject {
public static class PipelineNodeVo extends CsSerializeObject {
/**
* Service Code
*/
@@ -65,7 +65,7 @@ public class PipelineTests {
private List<ButtonVo> buttonList;
@Getter
public static class ButtonVo extends MyObject {
public static class ButtonVo extends CsSerializeObject {
/**
* 按钮类型(get:带参get请求 link:带参跳转)
*/
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>cutejava</artifactId>
<groupId>cn.odboy</groupId>
<version>1.3.1</version>
<version>1.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -23,7 +23,7 @@
<dependency>
<groupId>cn.odboy</groupId>
<artifactId>cutejava-common</artifactId>
<version>1.3.1</version>
<version>1.4.0</version>
</dependency>
<!-- jwt -->
@@ -62,14 +62,14 @@
<version>6.6.5</version>
</dependency>
<!--邮件依赖-->
<!-- 邮件依赖 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${mail.version}</version>
</dependency>
<!--七牛云存储-->
<!-- 七牛云存储 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
@@ -80,10 +80,16 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<exclusions>
<exclusion>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<artifactId>quartz</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
@@ -1,19 +0,0 @@
package cn.odboy.core.api.system;
import cn.odboy.core.dal.dataobject.system.User;
import java.util.List;
/**
* 数据权限服务类
*/
public interface SystemDataApi {
/**
* 获取数据权限
*
* @param user /
* @return /
*/
List<Long> describeDeptIdListByUserIdWithDeptId(User user);
}
@@ -1,93 +0,0 @@
package cn.odboy.core.api.system;
import cn.odboy.base.BaseResult;
import cn.odboy.core.dal.dataobject.system.Dept;
import cn.odboy.core.service.system.dto.QueryDeptRequest;
import java.util.List;
import java.util.Set;
public interface SystemDeptApi {
/**
* 查询所有数据
*
* @param criteria 条件
* @param isQuery /
* @return /
* @throws Exception /
*/
List<Dept> describeDeptList(QueryDeptRequest criteria, Boolean isQuery) throws Exception;
/**
* 根据ID查询
*
* @param id /
* @return /
*/
Dept describeDeptById(Long id);
/**
* 根据PID查询
*
* @param pid /
* @return /
*/
List<Dept> describeDeptListByPid(long pid);
/**
* 根据角色ID查询
*
* @param id /
* @return /
*/
Set<Dept> describeDeptByRoleId(Long id);
/**
* 获取部门下所有关联的部门
*
* @param deptList /
* @param depts /
* @return /
*/
Set<Dept> describeRelationDeptSet(List<Dept> deptList, Set<Dept> depts);
/**
* 根据ID获取同级与上级数据
*
* @param dept /
* @param depts /
* @return /
*/
List<Dept> describeSuperiorDeptListByPid(Dept dept, List<Dept> depts);
/**
* 构建树形数据
*
* @param depts /
* @return /
*/
BaseResult<Object> buildDeptTree(List<Dept> depts);
/**
* 获取
*
* @param deptList 、
* @return 、
*/
List<Long> describeChildDeptIdListByDeptIds(List<Dept> deptList);
/**
* 验证是否被角色或用户关联
*
* @param depts /
*/
void verifyBindRelationByIds(Set<Dept> depts);
/**
* 遍历所有部门和子部门
*
* @param ids /
* @param depts /
*/
void traverseDeptByIdWithPids(Set<Long> ids, Set<Dept> depts);
}
@@ -1,26 +0,0 @@
package cn.odboy.core.api.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.dal.dataobject.system.Dict;
import cn.odboy.core.service.system.dto.QueryDictRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface SystemDictApi {
/**
* 分页查询
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<Dict> describeDictPage(QueryDictRequest criteria, Page<Object> page);
/**
* 查询全部数据
*
* @param criteria /
* @return /
*/
List<Dict> describeDictList(QueryDictRequest criteria);
}
@@ -1,26 +0,0 @@
package cn.odboy.core.api.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.dal.dataobject.system.DictDetail;
import cn.odboy.core.service.system.dto.QueryDictDetailRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface SystemDictDetailApi {
/**
* 分页查询
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<DictDetail> describeDictDetailPage(QueryDictDetailRequest criteria, Page<Object> page);
/**
* 根据字典名称获取字典详情
*
* @param name 字典名称
* @return /
*/
List<DictDetail> describeDictDetailListByName(String name);
}
@@ -1,44 +0,0 @@
package cn.odboy.core.api.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.dal.dataobject.job.QuartzJob;
import cn.odboy.core.dal.dataobject.job.QuartzLog;
import cn.odboy.core.service.system.dto.QueryQuartzJobRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface SystemQuartzJobApi {
/**
* 分页查询
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<QuartzJob> describeQuartzJobPage(QueryQuartzJobRequest criteria, Page<Object> page);
/**
* 查询全部
*
* @param criteria 条件
* @return /
*/
List<QuartzJob> describeQuartzJobList(QueryQuartzJobRequest criteria);
/**
* 分页查询日志
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<QuartzLog> describeQuartzLogPage(QueryQuartzJobRequest criteria, Page<Object> page);
/**
* 查询全部
*
* @param criteria 条件
* @return /
*/
List<QuartzLog> describeQuartzLogList(QueryQuartzJobRequest criteria);
}
@@ -1,206 +0,0 @@
package cn.odboy.core.api.system.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.odboy.base.BaseResult;
import cn.odboy.core.api.system.SystemDeptApi;
import cn.odboy.core.constant.DataScopeEnum;
import cn.odboy.core.constant.SystemRedisKey;
import cn.odboy.core.dal.dataobject.system.Dept;
import cn.odboy.core.dal.mysql.system.DeptMapper;
import cn.odboy.core.dal.mysql.system.RoleMapper;
import cn.odboy.core.dal.mysql.system.UserMapper;
import cn.odboy.core.framework.permission.util.SecurityHelper;
import cn.odboy.core.service.system.dto.QueryDeptRequest;
import cn.odboy.exception.BadRequestException;
import cn.odboy.redis.RedisHelper;
import cn.odboy.util.ClassUtil;
import cn.odboy.util.StringUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class SystemDeptApiImpl implements SystemDeptApi {
private final DeptMapper deptMapper;
private final RoleMapper roleMapper;
private final UserMapper userMapper;
private final RedisHelper redisHelper;
/**
* 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表
*/
private List<Dept> deduplication(List<Dept> list) {
List<Dept> deptList = new ArrayList<>();
// 使用 Set 存储所有部门的 id
Set<Long> idSet = list.stream().map(Dept::getId).collect(Collectors.toSet());
// 遍历部门列表,筛选出没有父部门的部门
for (Dept dept : list) {
if (!idSet.contains(dept.getPid())) {
deptList.add(dept);
}
}
return deptList;
}
@Override
public List<Dept> describeDeptList(QueryDeptRequest criteria, Boolean isQuery) throws Exception {
String dataScopeType = SecurityHelper.getDataScopeType();
if (isQuery) {
if (dataScopeType.equals(DataScopeEnum.ALL.getValue())) {
criteria.setPidIsNull(true);
}
List<Field> fields = ClassUtil.getAllFields(criteria.getClass(), new ArrayList<>());
List<String> fieldNames = new ArrayList<>() {{
add("pidIsNull");
add("enabled");
}};
for (Field field : fields) {
// 设置对象的访问权限,保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if (fieldNames.contains(field.getName())) {
continue;
}
if (ObjectUtil.isNotNull(val)) {
criteria.setPidIsNull(null);
break;
}
}
}
// 数据权限
criteria.setIds(SecurityHelper.getCurrentUserDataScope());
List<Dept> list = deptMapper.queryDeptListByArgs(criteria);
// 如果为空,就代表为自定义权限或者本级权限,就需要去重,不理解可以注释掉,看查询结果
if (StringUtil.isBlank(dataScopeType)) {
return deduplication(list);
}
return list;
}
@Override
public Dept describeDeptById(Long id) {
String key = SystemRedisKey.DEPT_ID + id;
Dept dept = redisHelper.get(key, Dept.class);
if (dept == null) {
dept = deptMapper.selectById(id);
redisHelper.set(key, dept, 1, TimeUnit.DAYS);
}
return dept;
}
@Override
public List<Dept> describeDeptListByPid(long pid) {
return deptMapper.queryDeptListByPid(pid);
}
@Override
public Set<Dept> describeDeptByRoleId(Long id) {
return deptMapper.queryDeptSetByRoleId(id);
}
@Override
public Set<Dept> describeRelationDeptSet(List<Dept> menuList, Set<Dept> deptSet) {
for (Dept dept : menuList) {
deptSet.add(dept);
List<Dept> deptList = deptMapper.queryDeptListByPid(dept.getId());
if (CollUtil.isNotEmpty(deptList)) {
describeRelationDeptSet(deptList, deptSet);
}
}
return deptSet;
}
@Override
public List<Long> describeChildDeptIdListByDeptIds(List<Dept> deptList) {
List<Long> list = new ArrayList<>();
deptList.forEach(dept -> {
if (dept != null && dept.getEnabled()) {
List<Dept> deptList1 = deptMapper.queryDeptListByPid(dept.getId());
if (CollUtil.isNotEmpty(deptList1)) {
list.addAll(describeChildDeptIdListByDeptIds(deptList1));
}
list.add(dept.getId());
}
}
);
return list;
}
@Override
public List<Dept> describeSuperiorDeptListByPid(Dept dept, List<Dept> deptList) {
if (dept.getPid() == null) {
deptList.addAll(deptMapper.queryDeptListByPidIsNull());
return deptList;
}
deptList.addAll(deptMapper.queryDeptListByPid(dept.getPid()));
return describeSuperiorDeptListByPid(describeDeptById(dept.getPid()), deptList);
}
@Override
public BaseResult<Object> buildDeptTree(List<Dept> deptList) {
Set<Dept> trees = new LinkedHashSet<>();
Set<Dept> deptSet = new LinkedHashSet<>();
List<String> deptNames = deptList.stream().map(Dept::getName).collect(Collectors.toList());
boolean isChild;
for (Dept dept : deptList) {
isChild = false;
if (dept.getPid() == null) {
trees.add(dept);
}
for (Dept it : deptList) {
if (it.getPid() != null && dept.getId().equals(it.getPid())) {
isChild = true;
if (dept.getChildren() == null) {
dept.setChildren(new ArrayList<>());
}
dept.getChildren().add(it);
}
}
if (isChild) {
deptSet.add(dept);
} else if (dept.getPid() != null && !deptNames.contains(describeDeptById(dept.getPid()).getName())) {
deptSet.add(dept);
}
}
if (CollectionUtil.isEmpty(trees)) {
trees = deptSet;
}
BaseResult<Object> baseResult = new BaseResult<>();
baseResult.setContent(CollectionUtil.isEmpty(trees) ? deptSet : trees);
baseResult.setTotalElements(deptSet.size());
return baseResult;
}
@Override
public void verifyBindRelationByIds(Set<Dept> deptSet) {
Set<Long> deptIds = deptSet.stream().map(Dept::getId).collect(Collectors.toSet());
if (userMapper.getUserCountByDeptIds(deptIds) > 0) {
throw new BadRequestException("所选部门存在用户关联,请解除后再试!");
}
if (roleMapper.getRoleCountByDeptIds(deptIds) > 0) {
throw new BadRequestException("所选部门存在角色关联,请解除后再试!");
}
}
@Override
public void traverseDeptByIdWithPids(Set<Long> ids, Set<Dept> depts) {
for (Long id : ids) {
// 根部门
depts.add(describeDeptById(id));
// 子部门
List<Dept> deptList = describeDeptListByPid(id);
if (CollectionUtil.isNotEmpty(deptList)) {
depts = describeRelationDeptSet(deptList, depts);
}
}
}
}
@@ -1,30 +0,0 @@
package cn.odboy.core.api.system.impl;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemDictApi;
import cn.odboy.core.dal.dataobject.system.Dict;
import cn.odboy.core.dal.mysql.system.DictMapper;
import cn.odboy.core.service.system.dto.QueryDictRequest;
import cn.odboy.util.PageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class SystemDictApiImpl implements SystemDictApi {
private final DictMapper dictMapper;
@Override
public PageResult<Dict> describeDictPage(QueryDictRequest criteria, Page<Object> page) {
IPage<Dict> dicts = dictMapper.queryDictPageByArgs(criteria, page);
return PageUtil.toPage(dicts);
}
@Override
public List<Dict> describeDictList(QueryDictRequest criteria) {
return dictMapper.queryDictPageByArgs(criteria, PageUtil.getCount(dictMapper)).getRecords();
}
}
@@ -1,41 +0,0 @@
package cn.odboy.core.api.system.impl;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemQuartzJobApi;
import cn.odboy.core.dal.dataobject.job.QuartzJob;
import cn.odboy.core.dal.dataobject.job.QuartzLog;
import cn.odboy.core.dal.mysql.job.QuartzJobMapper;
import cn.odboy.core.dal.mysql.job.QuartzLogMapper;
import cn.odboy.core.service.system.dto.QueryQuartzJobRequest;
import cn.odboy.util.PageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class SystemQuartzJobApiImpl implements SystemQuartzJobApi {
private final QuartzJobMapper quartzJobMapper;
private final QuartzLogMapper quartzLogMapper;
@Override
public PageResult<QuartzJob> describeQuartzJobPage(QueryQuartzJobRequest criteria, Page<Object> page) {
return PageUtil.toPage(quartzJobMapper.queryQuartzJobPageByArgs(criteria, page));
}
@Override
public PageResult<QuartzLog> describeQuartzLogPage(QueryQuartzJobRequest criteria, Page<Object> page) {
return PageUtil.toPage(quartzLogMapper.queryQuartzLogPageByArgs(criteria, page));
}
@Override
public List<QuartzJob> describeQuartzJobList(QueryQuartzJobRequest criteria) {
return quartzJobMapper.queryQuartzJobPageByArgs(criteria, PageUtil.getCount(quartzJobMapper)).getRecords();
}
@Override
public List<QuartzLog> describeQuartzLogList(QueryQuartzJobRequest criteria) {
return quartzLogMapper.queryQuartzLogPageByArgs(criteria, PageUtil.getCount(quartzLogMapper)).getRecords();
}
}
@@ -1,13 +0,0 @@
package cn.odboy.core.api.tools;
import cn.odboy.core.dal.dataobject.tools.EmailConfig;
public interface EmailApi {
/**
* 查询配置
*
* @return EmailConfig 邮件配置
*/
EmailConfig describeEmailConfig();
}
@@ -1,27 +0,0 @@
package cn.odboy.core.api.tools;
import cn.odboy.base.PageResult;
import cn.odboy.core.dal.dataobject.tools.LocalStorage;
import cn.odboy.core.service.tools.dto.QueryLocalStorageRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface LocalStorageApi {
/**
* 分页查询
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<LocalStorage> describeLocalStoragePage(QueryLocalStorageRequest criteria, Page<Object> page);
/**
* 查询全部数据
*
* @param criteria 条件
* @return /
*/
List<LocalStorage> describeLocalStorageList(QueryLocalStorageRequest criteria);
}
@@ -1,13 +0,0 @@
package cn.odboy.core.api.tools;
import cn.odboy.core.dal.dataobject.tools.QiniuConfig;
public interface QiniuConfigApi {
/**
* 查询配置
*
* @return QiniuConfig
*/
QiniuConfig describeQiniuConfig();
}
@@ -1,27 +0,0 @@
package cn.odboy.core.api.tools;
import cn.odboy.base.PageResult;
import cn.odboy.core.dal.dataobject.tools.QiniuContent;
import cn.odboy.core.service.tools.dto.QueryQiniuRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface QiniuContentApi {
/**
* 分页查询
*
* @param criteria 条件
* @param page 分页参数
* @return /
*/
PageResult<QiniuContent> describeQiniuContentPage(QueryQiniuRequest criteria, Page<Object> page);
/**
* 查询全部
*
* @param criteria 条件
* @return /
*/
List<QiniuContent> describeQiniuContentList(QueryQiniuRequest criteria);
}
@@ -1,23 +0,0 @@
package cn.odboy.core.api.tools.impl;
import cn.odboy.core.api.tools.EmailApi;
import cn.odboy.core.dal.dataobject.tools.EmailConfig;
import cn.odboy.core.dal.mysql.tools.EmailConfigMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
@CacheConfig(cacheNames = "email")
public class EmailApiImpl implements EmailApi {
private final EmailConfigMapper emailConfigMapper;
@Override
@Cacheable(key = "'config'")
public EmailConfig describeEmailConfig() {
EmailConfig emailConfig = emailConfigMapper.selectById(1L);
return emailConfig == null ? new EmailConfig() : emailConfig;
}
}
@@ -1,28 +0,0 @@
package cn.odboy.core.api.tools.impl;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.tools.LocalStorageApi;
import cn.odboy.core.dal.dataobject.tools.LocalStorage;
import cn.odboy.core.dal.mysql.tools.LocalStorageMapper;
import cn.odboy.core.service.tools.dto.QueryLocalStorageRequest;
import cn.odboy.util.PageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class LocalStorageApiImpl implements LocalStorageApi {
private final LocalStorageMapper localStorageMapper;
@Override
public PageResult<LocalStorage> describeLocalStoragePage(QueryLocalStorageRequest criteria, Page<Object> page) {
return PageUtil.toPage(localStorageMapper.queryLocalStoragePageByArgs(criteria, page));
}
@Override
public List<LocalStorage> describeLocalStorageList(QueryLocalStorageRequest criteria) {
return localStorageMapper.queryLocalStoragePageByArgs(criteria, PageUtil.getCount(localStorageMapper)).getRecords();
}
}
@@ -1,23 +0,0 @@
package cn.odboy.core.api.tools.impl;
import cn.odboy.core.api.tools.QiniuConfigApi;
import cn.odboy.core.dal.dataobject.tools.QiniuConfig;
import cn.odboy.core.dal.mysql.tools.QiniuConfigMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
@CacheConfig(cacheNames = "qiNiu")
public class QiniuConfigApiImpl implements QiniuConfigApi {
private final QiniuConfigMapper qiniuConfigMapper;
@Override
@Cacheable(key = "'config'")
public QiniuConfig describeQiniuConfig() {
QiniuConfig qiniuConfig = qiniuConfigMapper.selectById(1L);
return qiniuConfig == null ? new QiniuConfig() : qiniuConfig;
}
}
@@ -1,30 +0,0 @@
package cn.odboy.core.api.tools.impl;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.tools.QiniuContentApi;
import cn.odboy.core.dal.dataobject.tools.QiniuContent;
import cn.odboy.core.dal.mysql.tools.QiniuContentMapper;
import cn.odboy.core.service.tools.dto.QueryQiniuRequest;
import cn.odboy.util.PageUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
@CacheConfig(cacheNames = "qiNiu")
public class QiniuContentApiImpl implements QiniuContentApi {
private final QiniuContentMapper qiniuContentMapper;
@Override
public PageResult<QiniuContent> describeQiniuContentPage(QueryQiniuRequest criteria, Page<Object> page) {
return PageUtil.toPage(qiniuContentMapper.queryQiniuContentPageByArgs(criteria, page));
}
@Override
public List<QiniuContent> describeQiniuContentList(QueryQiniuRequest criteria) {
return qiniuContentMapper.queryQiniuContentPageByArgs(criteria, PageUtil.getCount(qiniuContentMapper)).getRecords();
}
}
@@ -1,13 +0,0 @@
package cn.odboy.core.cache.api;
import cn.odboy.core.service.system.dto.UserJwtVo;
public interface SystemUserJwtApi {
/**
* 返回用户缓存
*
* @param username 用户名
* @return UserJwtVo
*/
UserJwtVo describeUserJwtModelByUsername(String username);
}
@@ -1,4 +1,4 @@
package cn.odboy.core.constant;
package cn.odboy.core.constant.system;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -8,7 +8,7 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum CaptchaBizEnum {
public enum SystemCaptchaBizEnum {
/* 通过手机号码重置邮箱 */
PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "通过手机号码重置邮箱"),
@@ -35,8 +35,8 @@ public enum CaptchaBizEnum {
*/
private final String description;
public static CaptchaBizEnum getByBizCode(String bizCode) {
for (CaptchaBizEnum value : CaptchaBizEnum.values()) {
public static SystemCaptchaBizEnum getByBizCode(String bizCode) {
for (SystemCaptchaBizEnum value : SystemCaptchaBizEnum.values()) {
if (value.getBizCode().equals(bizCode)) {
return value;
}
@@ -1,4 +1,4 @@
package cn.odboy.core.constant;
package cn.odboy.core.constant.system;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -8,7 +8,7 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum DataScopeEnum {
public enum SystemDataScopeEnum {
/* 全部的数据权限 */
ALL("全部", "全部的数据权限"),
@@ -22,8 +22,8 @@ public enum DataScopeEnum {
private final String value;
private final String description;
public static DataScopeEnum find(String val) {
for (DataScopeEnum dataScopeEnum : DataScopeEnum.values()) {
public static SystemDataScopeEnum find(String val) {
for (SystemDataScopeEnum dataScopeEnum : SystemDataScopeEnum.values()) {
if (dataScopeEnum.getValue().equals(val)) {
return dataScopeEnum;
}
@@ -4,16 +4,16 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.odboy.annotation.AnonymousPostMapping;
import cn.odboy.constant.SystemConst;
import cn.odboy.core.cache.service.impl.SystemUserOnlineServiceImpl;
import cn.odboy.core.dal.redis.system.SystemUserOnlineServiceImpl;
import cn.odboy.core.constant.LoginCodeEnum;
import cn.odboy.core.constant.SystemRedisKey;
import cn.odboy.core.dal.model.UserInfoResponse;
import cn.odboy.core.framework.permission.TokenProvider;
import cn.odboy.core.framework.permission.UserDetailsServiceImpl;
import cn.odboy.core.framework.permission.util.SecurityHelper;
import cn.odboy.core.dal.redis.system.SystemRedisKey;
import cn.odboy.core.dal.model.system.SystemUserInfoVo;
import cn.odboy.core.framework.permission.core.SecurityHelper;
import cn.odboy.core.framework.permission.core.handler.TokenProvider;
import cn.odboy.core.framework.permission.core.handler.UserDetailsHandler;
import cn.odboy.core.framework.properties.AppProperties;
import cn.odboy.core.service.system.dto.UserJwtVo;
import cn.odboy.core.service.system.dto.UserLoginRequest;
import cn.odboy.core.dal.model.system.SystemUserJwtVo;
import cn.odboy.core.dal.model.system.SystemUserLoginArgs;
import cn.odboy.exception.BadRequestException;
import cn.odboy.redis.RedisHelper;
import cn.odboy.util.RsaEncryptUtil;
@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@@ -47,17 +48,17 @@ import java.util.concurrent.TimeUnit;
@RequestMapping("/auth")
@RequiredArgsConstructor
@Api(tags = "系统:系统授权接口")
public class AuthController {
public class SystemAuthController {
private final RedisHelper redisHelper;
private final SystemUserOnlineServiceImpl onlineUserService;
private final TokenProvider tokenProvider;
private final AppProperties properties;
private final PasswordEncoder passwordEncoder;
private final UserDetailsServiceImpl userDetailsService;
private final UserDetailsHandler userDetailsService;
@ApiOperation("登录授权")
@AnonymousPostMapping(value = "/login")
public ResponseEntity<Object> login(@Validated @RequestBody UserLoginRequest loginRequest, HttpServletRequest request) throws Exception {
public ResponseEntity<Object> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, HttpServletRequest request) throws Exception {
// 密码解密
String password = RsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword());
// 查询验证码
@@ -71,7 +72,7 @@ public class AuthController {
throw new BadRequestException("验证码错误");
}
// 获取用户信息
UserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername());
SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername());
// 验证用户密码
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
throw new BadRequestException("登录密码错误");
@@ -83,7 +84,7 @@ public class AuthController {
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<>(2) {{
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
put("user", BeanUtil.copyProperties(jwtUser, UserInfoResponse.class));
put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class));
}};
if (properties.getLogin().isSingle()) {
// 踢掉之前已经登录的token
@@ -97,10 +98,10 @@ public class AuthController {
@ApiOperation("获取用户信息")
@PostMapping(value = "/info")
public ResponseEntity<UserInfoResponse> getUserInfo() {
UserJwtVo jwtUser = (UserJwtVo) SecurityHelper.getCurrentUser();
UserInfoResponse userInfoResponse = BeanUtil.copyProperties(jwtUser, UserInfoResponse.class);
return ResponseEntity.ok(userInfoResponse);
public ResponseEntity<SystemUserInfoVo> getUserInfo() {
SystemUserJwtVo jwtUser = (SystemUserJwtVo) SecurityHelper.getCurrentUser();
SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class);
return ResponseEntity.ok(userInfoVo);
}
@ApiOperation("获取验证码")
@@ -1,8 +1,8 @@
package cn.odboy.core.controller.system;
import cn.odboy.core.constant.CaptchaBizEnum;
import cn.odboy.core.service.tools.CaptchaService;
import cn.odboy.core.service.tools.EmailService;
import cn.odboy.core.constant.system.SystemCaptchaBizEnum;
import cn.odboy.core.service.system.SystemCaptchaService;
import cn.odboy.core.service.system.SystemEmailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -12,15 +12,16 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/code")
@Api(tags = "系统:验证码管理")
public class CaptchaController {
private final CaptchaService captchaService;
private final EmailService emailService;
public class SystemCaptchaController {
private final SystemCaptchaService captchaService;
private final SystemEmailService emailService;
/**
* 除了这个其他的接口都没有用上
@@ -30,27 +31,27 @@ public class CaptchaController {
@ApiOperation("重置邮箱,发送验证码")
@PostMapping(value = "/sendResetEmailCaptcha")
public ResponseEntity<Object> sendResetEmailCaptcha(@RequestParam String email) {
emailService.sendEmail(captchaService.renderCodeTemplate(email, CaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getRedisKey()));
emailService.sendEmail(captchaService.renderCodeTemplate(email, SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getRedisKey()));
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("重置密码,发送验证码")
@PostMapping(value = "/sendResetPasswordCaptcha")
public ResponseEntity<Object> sendResetPasswordCaptcha(@RequestParam String email) {
emailService.sendEmail(captchaService.renderCodeTemplate(email, CaptchaBizEnum.EMAIL_RESET_PWD_CODE.getRedisKey()));
emailService.sendEmail(captchaService.renderCodeTemplate(email, SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE.getRedisKey()));
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("验证码验证")
@PostMapping(value = "/checkCodeAvailable")
public ResponseEntity<Object> checkCodeAvailable(@RequestParam String email, @RequestParam String code, @RequestParam String codeBi) {
CaptchaBizEnum biEnum = CaptchaBizEnum.getByBizCode(codeBi);
SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(codeBi);
switch (Objects.requireNonNull(biEnum)) {
case EMAIL_RESET_EMAIL_CODE:
captchaService.checkCodeAvailable(CaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), email, code);
captchaService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), email, code);
break;
case EMAIL_RESET_PWD_CODE:
captchaService.checkCodeAvailable(CaptchaBizEnum.EMAIL_RESET_PWD_CODE.getBizCode(), email, code);
captchaService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE.getBizCode(), email, code);
break;
default:
break;
@@ -1,11 +1,10 @@
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemDeptApi;
import cn.odboy.core.dal.dataobject.system.Dept;
import cn.odboy.core.service.system.SystemDeptService;
import cn.odboy.core.service.system.dto.CreateDeptRequest;
import cn.odboy.core.service.system.dto.QueryDeptRequest;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.dal.dataobject.system.SystemDeptTb;
import cn.odboy.core.service.system.ookkoko.SystemDeptService;
import cn.odboy.core.dal.model.system.CreateSystemDeptArgs;
import cn.odboy.core.dal.model.system.QuerySystemDeptArgs;
import cn.odboy.util.PageUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,40 +13,31 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
@Api(tags = "系统:部门管理")
@RequestMapping("/api/dept")
public class DeptController {
private final SystemDeptApi systemDeptApi;
public class SystemDeptController {
private final SystemDeptService systemDeptService;
@ApiOperation("导出部门数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('dept:list')")
public void exportDept(HttpServletResponse response, QueryDeptRequest criteria) throws Exception {
systemDeptService.downloadDeptExcel(systemDeptApi.describeDeptList(criteria, false), response);
public void exportDept(HttpServletResponse response, QuerySystemDeptArgs criteria) throws Exception {
systemDeptService.downloadDeptExcel(systemDeptService.describeDeptList(criteria, false), response);
}
@ApiOperation("查询部门")
@GetMapping
@PreAuthorize("@el.check('user:list','dept:list')")
public ResponseEntity<PageResult<Dept>> describeDeptPage(QueryDeptRequest criteria) throws Exception {
List<Dept> depts = systemDeptApi.describeDeptList(criteria, true);
public ResponseEntity<CsResultVo<List<SystemDeptTb>>> describeDeptPage(QuerySystemDeptArgs criteria) throws Exception {
List<SystemDeptTb> depts = systemDeptService.describeDeptList(criteria, true);
return new ResponseEntity<>(PageUtil.toPage(depts), HttpStatus.OK);
}
@@ -55,12 +45,12 @@ public class DeptController {
@PostMapping("/describeDeptSuperiorTree")
@PreAuthorize("@el.check('user:list','dept:list')")
public ResponseEntity<Object> describeDeptSuperiorTree(@RequestBody List<Long> ids, @RequestParam(defaultValue = "false") Boolean exclude) {
Set<Dept> deptSet = new LinkedHashSet<>();
Set<SystemDeptTb> deptSet = new LinkedHashSet<>();
for (Long id : ids) {
Dept dept = systemDeptApi.describeDeptById(id);
List<Dept> depts = systemDeptApi.describeSuperiorDeptListByPid(dept, new ArrayList<>());
SystemDeptTb dept = systemDeptService.describeDeptById(id);
List<SystemDeptTb> depts = systemDeptService.describeSuperiorDeptListByPid(dept, new ArrayList<>());
if (exclude) {
for (Dept data : depts) {
for (SystemDeptTb data : depts) {
if (data.getId().equals(dept.getPid())) {
data.setSubCount(data.getSubCount() - 1);
}
@@ -70,13 +60,13 @@ public class DeptController {
}
deptSet.addAll(depts);
}
return new ResponseEntity<>(systemDeptApi.buildDeptTree(new ArrayList<>(deptSet)), HttpStatus.OK);
return new ResponseEntity<>(systemDeptService.buildDeptTree(new ArrayList<>(deptSet)), HttpStatus.OK);
}
@ApiOperation("新增部门")
@PostMapping(value = "/saveDept")
@PreAuthorize("@el.check('dept:add')")
public ResponseEntity<Object> saveDept(@Validated @RequestBody CreateDeptRequest resources) {
public ResponseEntity<Object> saveDept(@Validated @RequestBody CreateSystemDeptArgs resources) {
systemDeptService.saveDept(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -84,7 +74,7 @@ public class DeptController {
@ApiOperation("修改部门")
@PostMapping(value = "/modifyDept")
@PreAuthorize("@el.check('dept:edit')")
public ResponseEntity<Object> modifyDept(@Validated(Dept.Update.class) @RequestBody Dept resources) {
public ResponseEntity<Object> modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb resources) {
systemDeptService.modifyDept(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -93,11 +83,10 @@ public class DeptController {
@PostMapping(value = "/removeDeptByIds")
@PreAuthorize("@el.check('dept:del')")
public ResponseEntity<Object> removeDeptByIds(@RequestBody Set<Long> ids) {
Set<Dept> depts = new HashSet<>();
// 获取部门,和其所有子部门
systemDeptApi.traverseDeptByIdWithPids(ids, depts);
Set<SystemDeptTb> depts = systemDeptService.traverseDeptByIdWithPids(ids);
// 验证是否被角色或用户关联
systemDeptApi.verifyBindRelationByIds(depts);
systemDeptService.verifyBindRelationByIds(depts);
systemDeptService.removeDeptByIds(depts);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -1,11 +1,11 @@
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemDictApi;
import cn.odboy.core.dal.dataobject.system.Dict;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.service.system.SystemDictApi;
import cn.odboy.core.dal.dataobject.system.SystemDictTb;
import cn.odboy.core.service.system.SystemDictService;
import cn.odboy.core.service.system.dto.CreateDictRequest;
import cn.odboy.core.service.system.dto.QueryDictRequest;
import cn.odboy.core.dal.model.system.CreateSystemDictArgs;
import cn.odboy.core.dal.model.system.QuerySystemDictArgs;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,11 +14,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@@ -28,36 +25,36 @@ import java.util.Set;
@RequiredArgsConstructor
@Api(tags = "系统:字典管理")
@RequestMapping("/api/dict")
public class DictController {
public class SystemDictController {
private final SystemDictApi systemDictApi;
private final SystemDictService systemDictService;
@ApiOperation("导出字典数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('dict:list')")
public void exportDict(HttpServletResponse response, QueryDictRequest criteria) throws IOException {
public void exportDict(HttpServletResponse response, QuerySystemDictArgs criteria) throws IOException {
systemDictService.downloadDictExcel(systemDictApi.describeDictList(criteria), response);
}
@ApiOperation("查询字典")
@PostMapping(value = "/queryAllDict")
@PreAuthorize("@el.check('dict:list')")
public ResponseEntity<List<Dict>> queryAllDict() {
return new ResponseEntity<>(systemDictApi.describeDictList(new QueryDictRequest()), HttpStatus.OK);
public ResponseEntity<List<SystemDictTb>> queryAllDict() {
return new ResponseEntity<>(systemDictApi.describeDictList(new QuerySystemDictArgs()), HttpStatus.OK);
}
@ApiOperation("查询字典")
@GetMapping
@PreAuthorize("@el.check('dict:list')")
public ResponseEntity<PageResult<Dict>> queryDict(QueryDictRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemDictTb>>> queryDict(QuerySystemDictArgs criteria) {
Page<SystemDictTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemDictApi.describeDictPage(criteria, page), HttpStatus.OK);
}
@ApiOperation("新增字典")
@PostMapping(value = "/saveDict")
@PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Object> saveDict(@Validated @RequestBody CreateDictRequest resources) {
public ResponseEntity<Object> saveDict(@Validated @RequestBody CreateSystemDictArgs resources) {
systemDictService.saveDict(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -65,7 +62,7 @@ public class DictController {
@ApiOperation("修改字典")
@PostMapping(value = "/modifyDictById")
@PreAuthorize("@el.check('dict:edit')")
public ResponseEntity<Object> modifyDictById(@Validated(Dict.Update.class) @RequestBody Dict resources) {
public ResponseEntity<Object> modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb resources) {
systemDictService.modifyDictById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -1,11 +1,11 @@
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemDictDetailApi;
import cn.odboy.core.dal.dataobject.system.DictDetail;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.service.system.SystemDictDetailApi;
import cn.odboy.core.dal.dataobject.system.SystemDictDetailTb;
import cn.odboy.core.service.system.SystemDictDetailService;
import cn.odboy.core.service.system.dto.CreateDictDetailRequest;
import cn.odboy.core.service.system.dto.QueryDictDetailRequest;
import cn.odboy.core.dal.model.system.CreateSystemDictDetailArgs;
import cn.odboy.core.dal.model.system.QuerySystemDictDetailArgs;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,12 +14,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -28,22 +24,22 @@ import java.util.Map;
@RequiredArgsConstructor
@Api(tags = "系统:字典详情管理")
@RequestMapping("/api/dictDetail")
public class DictDetailController {
public class SystemDictDetailController {
private final SystemDictDetailService systemDictDetailService;
private final SystemDictDetailApi systemDictDetailApi;
@ApiOperation("查询字典详情")
@GetMapping
public ResponseEntity<PageResult<DictDetail>> describeDictDetailPage(QueryDictDetailRequest criteria) {
public ResponseEntity<CsResultVo<List<SystemDictDetailTb>>> queryDictDetailListByArgs(QuerySystemDictDetailArgs criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemDictDetailApi.describeDictDetailPage(criteria, page), HttpStatus.OK);
return new ResponseEntity<>(systemDictDetailApi.queryDictDetailListByArgs(criteria, page), HttpStatus.OK);
}
@ApiOperation("查询多个字典详情")
@GetMapping(value = "/getDictDetailMaps")
public ResponseEntity<Object> getDictDetailMaps(@RequestParam String dictName) {
String[] names = dictName.split("[,,]");
Map<String, List<DictDetail>> dictMap = new HashMap<>(16);
Map<String, List<SystemDictDetailTb>> dictMap = new HashMap<>(16);
for (String name : names) {
dictMap.put(name, systemDictDetailApi.describeDictDetailListByName(name));
}
@@ -53,7 +49,7 @@ public class DictDetailController {
@ApiOperation("新增字典详情")
@PostMapping(value = "/saveDictDetail")
@PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Object> saveDictDetail(@Validated @RequestBody CreateDictDetailRequest resources) {
public ResponseEntity<Object> saveDictDetail(@Validated @RequestBody CreateSystemDictDetailArgs resources) {
systemDictDetailService.saveDictDetail(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -61,7 +57,7 @@ public class DictDetailController {
@ApiOperation("修改字典详情")
@PostMapping(value = "/modifyDictDetailById")
@PreAuthorize("@el.check('dict:edit')")
public ResponseEntity<Object> modifyDictDetailById(@Validated(DictDetail.Update.class) @RequestBody DictDetail resources) {
public ResponseEntity<Object> modifyDictDetailById(@Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb resources) {
systemDictDetailService.modifyDictDetailById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -69,7 +65,7 @@ public class DictDetailController {
@ApiOperation("删除字典详情")
@PostMapping(value = "/removeDictDetailById")
@PreAuthorize("@el.check('dict:del')")
public ResponseEntity<Object> removeDictDetailById(@RequestBody DictDetail args) {
public ResponseEntity<Object> removeDictDetailById(@RequestBody SystemDictDetailTb args) {
systemDictDetailService.removeDictDetailById(args.getId());
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -1,9 +1,9 @@
package cn.odboy.core.controller.tools;
package cn.odboy.core.controller.system;
import cn.odboy.core.api.tools.EmailApi;
import cn.odboy.core.dal.dataobject.tools.EmailConfig;
import cn.odboy.core.service.tools.EmailService;
import cn.odboy.core.service.tools.dto.SendEmailRequest;
import cn.odboy.core.dal.dataobject.system.SystemEmailConfigTb;
import cn.odboy.core.service.system.SystemEmailApi;
import cn.odboy.core.service.system.SystemEmailService;
import cn.odboy.core.dal.model.system.SendSystemEmailArgs;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -22,26 +22,26 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RequestMapping("api/email")
@Api(tags = "工具:邮件管理")
public class EmailController {
private final EmailApi emailApi;
private final EmailService emailService;
public class SystemEmailController {
private final SystemEmailApi emailApi;
private final SystemEmailService emailService;
@ApiOperation("查询配置")
@PostMapping(value = "/describeEmailConfig")
public ResponseEntity<EmailConfig> describeEmailConfig() {
public ResponseEntity<SystemEmailConfigTb> describeEmailConfig() {
return new ResponseEntity<>(emailApi.describeEmailConfig(), HttpStatus.OK);
}
@ApiOperation("配置邮件")
@PostMapping(value = "/modifyEmailConfig")
public ResponseEntity<Object> modifyEmailConfig(@Validated @RequestBody EmailConfig emailConfig) throws Exception {
public ResponseEntity<Object> modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) throws Exception {
emailService.modifyEmailConfigOnPassChange(emailConfig);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("发送邮件")
@PostMapping(value = "/sendEmail")
public ResponseEntity<Object> sendEmail(@Validated @RequestBody SendEmailRequest sendEmailRequest) {
public ResponseEntity<Object> sendEmail(@Validated @RequestBody SendSystemEmailArgs sendEmailRequest) {
emailService.sendEmail(sendEmailRequest);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -1,11 +1,11 @@
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemJobApi;
import cn.odboy.core.dal.dataobject.system.Job;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.service.system.SystemJobApi;
import cn.odboy.core.dal.dataobject.system.SystemJobTb;
import cn.odboy.core.service.system.SystemJobService;
import cn.odboy.core.service.system.dto.CreateJobRequest;
import cn.odboy.core.service.system.dto.QueryJobRequest;
import cn.odboy.core.dal.model.system.CreateSystemJobArgs;
import cn.odboy.core.dal.model.system.QuerySystemJobArgs;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -14,13 +14,11 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;
@@ -28,29 +26,29 @@ import java.util.Set;
@RequiredArgsConstructor
@Api(tags = "系统:岗位管理")
@RequestMapping("/api/job")
public class JobController {
public class SystemJobController {
private final SystemJobApi systemJobApi;
private final SystemJobService systemJobService;
@ApiOperation("导出岗位数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('job:list')")
public void exportJob(HttpServletResponse response, QueryJobRequest criteria) throws IOException {
public void exportJob(HttpServletResponse response, QuerySystemJobArgs criteria) throws IOException {
systemJobService.downloadJobExcel(systemJobApi.describeJobList(criteria), response);
}
@ApiOperation("查询岗位")
@GetMapping
@PreAuthorize("@el.check('job:list','user:list')")
public ResponseEntity<PageResult<Job>> queryJob(QueryJobRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemJobTb>>> queryJob(QuerySystemJobArgs criteria) {
Page<SystemJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemJobApi.describeJobPage(criteria, page), HttpStatus.OK);
}
@ApiOperation("新增岗位")
@PostMapping(value = "/saveJob")
@PreAuthorize("@el.check('job:add')")
public ResponseEntity<Object> saveJob(@Validated @RequestBody CreateJobRequest resources) {
public ResponseEntity<Object> saveJob(@Validated @RequestBody CreateSystemJobArgs resources) {
systemJobService.saveJob(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -58,7 +56,7 @@ public class JobController {
@ApiOperation("修改岗位")
@PostMapping(value = "/modifyJobById")
@PreAuthorize("@el.check('job:edit')")
public ResponseEntity<Object> modifyJobById(@Validated(Job.Update.class) @RequestBody Job resources) {
public ResponseEntity<Object> modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb resources) {
systemJobService.modifyJobById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -1,11 +1,11 @@
package cn.odboy.core.controller.tools;
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.base.CsResultVo;
import cn.odboy.constant.FileTypeEnum;
import cn.odboy.core.api.tools.LocalStorageApi;
import cn.odboy.core.dal.dataobject.tools.LocalStorage;
import cn.odboy.core.service.tools.LocalStorageService;
import cn.odboy.core.service.tools.dto.QueryLocalStorageRequest;
import cn.odboy.core.dal.dataobject.system.SystemLocalStorageTb;
import cn.odboy.core.service.system.SystemLocalStorageApi;
import cn.odboy.core.service.system.SystemLocalStorageService;
import cn.odboy.core.dal.model.system.QuerySystemLocalStorageArgs;
import cn.odboy.exception.BadRequestException;
import cn.odboy.util.FileUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,36 +16,33 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@RestController
@RequiredArgsConstructor
@Api(tags = "工具:本地存储管理")
@RequestMapping("/api/localStorage")
public class LocalStorageController {
private final LocalStorageService localStorageService;
private final LocalStorageApi localStorageApi;
public class SystemLocalStorageController {
private final SystemLocalStorageService localStorageService;
private final SystemLocalStorageApi localStorageApi;
@ApiOperation("查询文件")
@GetMapping
@PreAuthorize("@el.check('storage:list')")
public ResponseEntity<PageResult<LocalStorage>> queryFile(QueryLocalStorageRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemLocalStorageTb>>> queryFile(QuerySystemLocalStorageArgs criteria) {
Page<SystemLocalStorageTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(localStorageApi.describeLocalStoragePage(criteria, page), HttpStatus.OK);
}
@ApiOperation("导出数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('storage:list')")
public void exportFile(HttpServletResponse response, QueryLocalStorageRequest criteria) throws IOException {
public void exportFile(HttpServletResponse response, QuerySystemLocalStorageArgs criteria) throws IOException {
localStorageService.downloadExcel(localStorageApi.describeLocalStorageList(criteria), response);
}
@@ -59,20 +56,20 @@ public class LocalStorageController {
@ApiOperation("上传图片")
@PostMapping("/uploadPicture")
public ResponseEntity<LocalStorage> uploadPicture(@RequestParam MultipartFile file) {
public ResponseEntity<SystemLocalStorageTb> uploadPicture(@RequestParam MultipartFile file) {
// 判断文件是否为图片
String suffix = FileUtil.getSuffix(file.getOriginalFilename());
if (!FileTypeEnum.IMAGE.getCode().equals(FileUtil.getFileType(suffix))) {
throw new BadRequestException("只能上传图片");
}
LocalStorage localStorage = localStorageService.uploadFile(null, file);
SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file);
return new ResponseEntity<>(localStorage, HttpStatus.OK);
}
@ApiOperation("修改文件")
@PostMapping(value = "/modifyLocalStorageById")
@PreAuthorize("@el.check('storage:edit')")
public ResponseEntity<Object> modifyLocalStorageById(@Validated @RequestBody LocalStorage resources) {
public ResponseEntity<Object> modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb resources) {
localStorageService.modifyLocalStorageById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -1,13 +1,13 @@
package cn.odboy.core.controller.system;
import cn.hutool.core.collection.CollectionUtil;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemMenuApi;
import cn.odboy.core.dal.dataobject.system.Menu;
import cn.odboy.core.dal.model.MenuResponse;
import cn.odboy.core.framework.permission.util.SecurityHelper;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.service.system.SystemMenuApi;
import cn.odboy.core.dal.dataobject.system.SystemMenuTb;
import cn.odboy.core.dal.model.system.SystemMenuVo;
import cn.odboy.core.framework.permission.core.SecurityHelper;
import cn.odboy.core.service.system.SystemMenuService;
import cn.odboy.core.service.system.dto.QueryMenuRequest;
import cn.odboy.core.dal.model.system.QuerySystemMenuArgs;
import cn.odboy.exception.BadRequestException;
import cn.odboy.util.PageUtil;
import io.swagger.annotations.Api;
@@ -17,18 +17,10 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@@ -36,7 +28,7 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
@Api(tags = "系统:菜单管理")
@RequestMapping("/api/menus")
public class MenuController {
public class SystemMenuController {
private static final String ENTITY_NAME = "menu";
private final SystemMenuApi systemMenuApi;
private final SystemMenuService systemMenuService;
@@ -44,22 +36,22 @@ public class MenuController {
@ApiOperation("导出菜单数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('menu:list')")
public void exportMenu(HttpServletResponse response, QueryMenuRequest criteria) throws Exception {
public void exportMenu(HttpServletResponse response, QuerySystemMenuArgs criteria) throws Exception {
systemMenuService.downloadMenuExcel(systemMenuApi.describeMenuList(criteria, false), response);
}
@PostMapping(value = "/buildMenus")
@ApiOperation("获取前端所需菜单")
public ResponseEntity<List<MenuResponse>> buildMenus() {
List<Menu> menuList = systemMenuApi.describeMenuListByUserId(SecurityHelper.getCurrentUserId());
List<Menu> menus = systemMenuApi.buildMenuTree(menuList);
return new ResponseEntity<>(systemMenuApi.buildMenuResponse(menus), HttpStatus.OK);
public ResponseEntity<List<SystemMenuVo>> buildMenus() {
List<SystemMenuTb> menuList = systemMenuApi.describeMenuListByUserId(SecurityHelper.getCurrentUserId());
List<SystemMenuTb> menus = systemMenuApi.buildMenuTree(menuList);
return new ResponseEntity<>(systemMenuApi.buildMenuVo(menus), HttpStatus.OK);
}
@ApiOperation("返回全部的菜单")
@PostMapping(value = "/describeMenuListByPid")
@PreAuthorize("@el.check('menu:list','roles:list')")
public ResponseEntity<List<Menu>> describeMenuListByPid(@RequestParam Long pid) {
public ResponseEntity<List<SystemMenuTb>> describeMenuListByPid(@RequestParam Long pid) {
return new ResponseEntity<>(systemMenuApi.describeMenuListByPid(pid), HttpStatus.OK);
}
@@ -67,32 +59,32 @@ public class MenuController {
@PostMapping(value = "/describeChildMenuSet")
@PreAuthorize("@el.check('menu:list','roles:list')")
public ResponseEntity<Object> describeChildMenuSet(@RequestParam Long id) {
Set<Menu> menuSet = new HashSet<>();
List<Menu> menuList = systemMenuApi.describeMenuListByPid(id);
Set<SystemMenuTb> menuSet = new HashSet<>();
List<SystemMenuTb> menuList = systemMenuApi.describeMenuListByPid(id);
menuSet.add(systemMenuApi.describeMenuById(id));
menuSet = systemMenuApi.describeChildMenuSet(menuList, menuSet);
Set<Long> ids = menuSet.stream().map(Menu::getId).collect(Collectors.toSet());
Set<Long> ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet());
return new ResponseEntity<>(ids, HttpStatus.OK);
}
@GetMapping
@ApiOperation("查询菜单")
@PreAuthorize("@el.check('menu:list')")
public ResponseEntity<PageResult<Menu>> queryMenu(QueryMenuRequest criteria) throws Exception {
List<Menu> menuList = systemMenuApi.describeMenuList(criteria, true);
public ResponseEntity<CsResultVo<List<SystemMenuTb>>> queryMenu(QuerySystemMenuArgs criteria) throws Exception {
List<SystemMenuTb> menuList = systemMenuApi.describeMenuList(criteria, true);
return new ResponseEntity<>(PageUtil.toPage(menuList), HttpStatus.OK);
}
@ApiOperation("查询菜单:根据ID获取同级与上级数据")
@PostMapping("/describeMenuSuperior")
@PreAuthorize("@el.check('menu:list')")
public ResponseEntity<List<Menu>> describeMenuSuperior(@RequestBody List<Long> ids) {
Set<Menu> menus = new LinkedHashSet<>();
public ResponseEntity<List<SystemMenuTb>> describeMenuSuperior(@RequestBody List<Long> ids) {
Set<SystemMenuTb> menus = new LinkedHashSet<>();
if (CollectionUtil.isNotEmpty(ids)) {
for (Long id : ids) {
Menu menu = systemMenuApi.describeMenuById(id);
List<Menu> menuList = systemMenuApi.describeSuperiorMenuList(menu, new ArrayList<>());
for (Menu data : menuList) {
SystemMenuTb menu = systemMenuApi.describeMenuById(id);
List<SystemMenuTb> menuList = systemMenuApi.describeSuperiorMenuList(menu, new ArrayList<>());
for (SystemMenuTb data : menuList) {
if (data.getId().equals(menu.getPid())) {
data.setSubCount(data.getSubCount() - 1);
}
@@ -109,7 +101,7 @@ public class MenuController {
@ApiOperation("新增菜单")
@PostMapping(value = "/saveMenu")
@PreAuthorize("@el.check('menu:add')")
public ResponseEntity<Object> saveMenu(@Validated @RequestBody Menu resources) {
public ResponseEntity<Object> saveMenu(@Validated @RequestBody SystemMenuTb resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
@@ -120,7 +112,7 @@ public class MenuController {
@ApiOperation("修改菜单")
@PostMapping(value = "/modifyMenuById")
@PreAuthorize("@el.check('menu:edit')")
public ResponseEntity<Object> modifyMenuById(@Validated(Menu.Update.class) @RequestBody Menu resources) {
public ResponseEntity<Object> modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb resources) {
systemMenuService.modifyMenuById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -129,9 +121,9 @@ public class MenuController {
@PostMapping(value = "/removeMenuByIds")
@PreAuthorize("@el.check('menu:del')")
public ResponseEntity<Object> removeMenuByIds(@RequestBody Set<Long> ids) {
Set<Menu> menuSet = new HashSet<>();
Set<SystemMenuTb> menuSet = new HashSet<>();
for (Long id : ids) {
List<Menu> menuList = systemMenuApi.describeMenuListByPid(id);
List<SystemMenuTb> menuList = systemMenuApi.describeMenuListByPid(id);
menuSet.add(systemMenuApi.describeMenuById(id));
menuSet = systemMenuApi.describeChildMenuSet(menuList, menuSet);
}
@@ -1,6 +1,6 @@
package cn.odboy.core.controller.system;
import cn.odboy.core.api.system.SystemMonitorApi;
import cn.odboy.core.service.system.SystemMonitorApi;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@Api(tags = "系统-服务监控管理")
@RequestMapping("/api/monitor")
public class MonitorController {
public class SystemMonitorController {
private final SystemMonitorApi serverService;
@@ -1,9 +1,9 @@
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.cache.api.SystemUserOnlineApi;
import cn.odboy.core.cache.service.SystemUserOnlineService;
import cn.odboy.core.service.system.dto.UserOnlineVo;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.dal.redis.system.SystemUserOnlineApi;
import cn.odboy.core.dal.redis.system.SystemUserOnlineService;
import cn.odboy.core.dal.model.system.SystemUserOnlineVo;
import cn.odboy.util.DesEncryptUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -12,13 +12,11 @@ import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;
@@ -26,14 +24,14 @@ import java.util.Set;
@RequiredArgsConstructor
@RequestMapping("/auth/online")
@Api(tags = "系统:在线用户管理")
public class OnlineController {
public class SystemOnlineController {
private final SystemUserOnlineApi systemUserOnlineApi;
private final SystemUserOnlineService systemUserOnlineService;
@ApiOperation("查询在线用户")
@GetMapping
@PreAuthorize("@el.check()")
public ResponseEntity<PageResult<UserOnlineVo>> queryOnlineUser(String username, Pageable pageable) {
public ResponseEntity<CsResultVo<List<SystemUserOnlineVo>>> queryOnlineUser(String username, Pageable pageable) {
return new ResponseEntity<>(systemUserOnlineApi.describeUserOnlineModelPage(username, pageable), HttpStatus.OK);
}
@@ -1,13 +1,13 @@
package cn.odboy.core.controller.tools;
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.tools.QiniuConfigApi;
import cn.odboy.core.api.tools.QiniuContentApi;
import cn.odboy.core.dal.dataobject.tools.QiniuConfig;
import cn.odboy.core.dal.dataobject.tools.QiniuContent;
import cn.odboy.core.service.tools.QiniuConfigService;
import cn.odboy.core.service.tools.QiniuContentService;
import cn.odboy.core.service.tools.dto.QueryQiniuRequest;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.dal.dataobject.system.SystemQiniuConfigTb;
import cn.odboy.core.dal.dataobject.system.SystemQiniuContentTb;
import cn.odboy.core.service.system.SystemQiniuConfigApi;
import cn.odboy.core.service.system.SystemQiniuConfigService;
import cn.odboy.core.service.system.SystemQiniuContentApi;
import cn.odboy.core.service.system.SystemQiniuContentService;
import cn.odboy.core.dal.model.system.QuerySystemQiniuArgs;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -16,18 +16,13 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -38,21 +33,21 @@ import java.util.Map;
@RequiredArgsConstructor
@RequestMapping("/api/qiNiuContent")
@Api(tags = "工具:七牛云存储管理")
public class QiniuController {
private final QiniuContentService qiniuContentService;
private final QiniuConfigService qiNiuConfigService;
private final QiniuConfigApi qiniuConfigApi;
private final QiniuContentApi qiniuContentApi;
public class SystemQiniuController {
private final SystemQiniuContentService qiniuContentService;
private final SystemQiniuConfigService qiNiuConfigService;
private final SystemQiniuConfigApi qiniuConfigApi;
private final SystemQiniuContentApi qiniuContentApi;
@ApiOperation("查询七牛云存储配置")
@PostMapping(value = "/describeQiniuConfig")
public ResponseEntity<QiniuConfig> describeQiniuConfig() {
public ResponseEntity<SystemQiniuConfigTb> describeQiniuConfig() {
return new ResponseEntity<>(qiniuConfigApi.describeQiniuConfig(), HttpStatus.OK);
}
@ApiOperation("配置七牛云存储")
@PostMapping(value = "/modifyQiniuConfig")
public ResponseEntity<Object> modifyQiniuConfig(@Validated @RequestBody QiniuConfig qiniuConfig) {
public ResponseEntity<Object> modifyQiniuConfig(@Validated @RequestBody SystemQiniuConfigTb qiniuConfig) {
qiNiuConfigService.saveQiniuConfig(qiniuConfig);
qiNiuConfigService.modifyQiniuConfigType(qiniuConfig.getType());
return new ResponseEntity<>(HttpStatus.OK);
@@ -60,21 +55,21 @@ public class QiniuController {
@ApiOperation("导出数据")
@GetMapping(value = "/download")
public void exportQiNiu(HttpServletResponse response, QueryQiniuRequest criteria) throws IOException {
public void exportQiNiu(HttpServletResponse response, QuerySystemQiniuArgs criteria) throws IOException {
qiniuContentService.downloadExcel(qiniuContentApi.describeQiniuContentList(criteria), response);
}
@ApiOperation("查询文件")
@GetMapping
public ResponseEntity<PageResult<QiniuContent>> queryQiNiu(QueryQiniuRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemQiniuContentTb>>> queryQiNiu(QuerySystemQiniuArgs criteria) {
Page<SystemQiniuContentTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(qiniuContentApi.describeQiniuContentPage(criteria, page), HttpStatus.OK);
}
@ApiOperation("上传文件")
@PostMapping
public ResponseEntity<Object> uploadQiNiu(@RequestParam MultipartFile file) {
QiniuContent qiniuContent = qiniuContentService.uploadFile(file);
SystemQiniuContentTb qiniuContent = qiniuContentService.uploadFile(file);
Map<String, Object> map = new HashMap<>(3);
map.put("id", qiniuContent.getId());
map.put("errno", 0);
@@ -1,13 +1,13 @@
package cn.odboy.core.controller.job;
package cn.odboy.core.controller.system;
import cn.odboy.base.PageResult;
import cn.odboy.base.CsResultVo;
import cn.odboy.context.SpringBeanHolder;
import cn.odboy.core.api.system.SystemQuartzJobApi;
import cn.odboy.core.dal.dataobject.job.QuartzJob;
import cn.odboy.core.dal.dataobject.job.QuartzLog;
import cn.odboy.core.dal.dataobject.system.SystemQuartzJobTb;
import cn.odboy.core.dal.dataobject.system.SystemQuartzLogTb;
import cn.odboy.core.service.system.SystemQuartzJobApi;
import cn.odboy.core.service.system.SystemQuartzJobService;
import cn.odboy.core.service.system.dto.QueryQuartzJobRequest;
import cn.odboy.core.service.system.dto.UpdateQuartzJobRequest;
import cn.odboy.core.dal.model.system.QuerySystemQuartzJobArgs;
import cn.odboy.core.dal.model.system.UpdateSystemQuartzJobArgs;
import cn.odboy.exception.BadRequestException;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
@@ -18,16 +18,11 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;
@@ -36,7 +31,7 @@ import java.util.Set;
@RequiredArgsConstructor
@RequestMapping("/api/jobs")
@Api(tags = "系统:定时任务管理")
public class QuartzJobController {
public class SystemQuartzJobController {
private static final String ENTITY_NAME = "quartzJob";
private final SystemQuartzJobService systemQuartzJobService;
private final SystemQuartzJobApi systemQuartzJobApi;
@@ -44,37 +39,37 @@ public class QuartzJobController {
@ApiOperation("查询定时任务")
@GetMapping
@PreAuthorize("@el.check('timing:list')")
public ResponseEntity<PageResult<QuartzJob>> queryQuartzJob(QueryQuartzJobRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemQuartzJobTb>>> queryQuartzJob(QuerySystemQuartzJobArgs criteria) {
Page<SystemQuartzJobTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemQuartzJobApi.describeQuartzJobPage(criteria, page), HttpStatus.OK);
}
@ApiOperation("导出任务数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('timing:list')")
public void exportQuartzJob(HttpServletResponse response, QueryQuartzJobRequest criteria) throws IOException {
public void exportQuartzJob(HttpServletResponse response, QuerySystemQuartzJobArgs criteria) throws IOException {
systemQuartzJobService.downloadQuartzJobExcel(systemQuartzJobApi.describeQuartzJobList(criteria), response);
}
@ApiOperation("导出日志数据")
@GetMapping(value = "/logs/download")
@PreAuthorize("@el.check('timing:list')")
public void exportQuartzJobLog(HttpServletResponse response, QueryQuartzJobRequest criteria) throws IOException {
public void exportQuartzJobLog(HttpServletResponse response, QuerySystemQuartzJobArgs criteria) throws IOException {
systemQuartzJobService.downloadQuartzLogExcel(systemQuartzJobApi.describeQuartzLogList(criteria), response);
}
@ApiOperation("查询任务执行日志")
@GetMapping(value = "/logs")
@PreAuthorize("@el.check('timing:list')")
public ResponseEntity<PageResult<QuartzLog>> queryQuartzJobLog(QueryQuartzJobRequest criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
public ResponseEntity<CsResultVo<List<SystemQuartzLogTb>>> queryQuartzJobLog(QuerySystemQuartzJobArgs criteria) {
Page<SystemQuartzLogTb> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemQuartzJobApi.describeQuartzLogPage(criteria, page), HttpStatus.OK);
}
@ApiOperation("新增定时任务")
@PostMapping
@PreAuthorize("@el.check('timing:add')")
public ResponseEntity<Object> createQuartzJob(@Validated @RequestBody QuartzJob resources) {
public ResponseEntity<Object> createQuartzJob(@Validated @RequestBody SystemQuartzJobTb resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
@@ -87,7 +82,7 @@ public class QuartzJobController {
@ApiOperation("修改定时任务")
@PutMapping
@PreAuthorize("@el.check('timing:edit')")
public ResponseEntity<Object> updateQuartzJob(@Validated(QuartzJob.Update.class) @RequestBody UpdateQuartzJobRequest resources) {
public ResponseEntity<Object> updateQuartzJob(@Validated(SystemQuartzJobTb.Update.class) @RequestBody UpdateSystemQuartzJobArgs resources) {
// 验证Bean是不是合法的,合法的定时任务 Bean 需要用 @Service 定义
checkBean(resources.getBeanName());
systemQuartzJobService.modifyQuartzJobResumeCron(resources);
@@ -1,13 +1,13 @@
package cn.odboy.core.controller.system;
import cn.hutool.core.lang.Dict;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemRoleApi;
import cn.odboy.core.dal.dataobject.system.Role;
import cn.odboy.core.framework.permission.util.SecurityHelper;
import cn.odboy.base.CsResultVo;
import cn.odboy.core.service.system.SystemRoleApi;
import cn.odboy.core.dal.dataobject.system.SystemRoleTb;
import cn.odboy.core.framework.permission.core.SecurityHelper;
import cn.odboy.core.service.system.SystemRoleService;
import cn.odboy.core.service.system.dto.CreateRoleRequest;
import cn.odboy.core.service.system.dto.QueryRoleRequest;
import cn.odboy.core.dal.model.system.CreateSystemRoleArgs;
import cn.odboy.core.dal.model.system.QuerySystemRoleArgs;
import cn.odboy.exception.BadRequestException;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
@@ -17,11 +17,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
@@ -34,35 +31,35 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
@Api(tags = "系统:角色管理")
@RequestMapping("/api/roles")
public class RoleController {
public class SystemRoleController {
private final SystemRoleApi systemRoleApi;
private final SystemRoleService systemRoleService;
@ApiOperation("获取单个role")
@PostMapping(value = "/describeRoleById")
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<Role> describeRoleById(@RequestBody Role args) {
public ResponseEntity<SystemRoleTb> describeRoleById(@RequestBody SystemRoleTb args) {
return new ResponseEntity<>(systemRoleApi.describeRoleById(args.getId()), HttpStatus.OK);
}
@ApiOperation("导出角色数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('role:list')")
public void exportRole(HttpServletResponse response, QueryRoleRequest criteria) throws IOException {
public void exportRole(HttpServletResponse response, QuerySystemRoleArgs criteria) throws IOException {
systemRoleService.downloadRoleExcel(systemRoleApi.describeRoleList(criteria), response);
}
@ApiOperation("返回全部的角色")
@PostMapping(value = "/describeRoleList")
@PreAuthorize("@el.check('roles:list','user:add','user:edit')")
public ResponseEntity<List<Role>> describeRoleList() {
public ResponseEntity<List<SystemRoleTb>> describeRoleList() {
return new ResponseEntity<>(systemRoleApi.describeRoleList(), HttpStatus.OK);
}
@ApiOperation("查询角色")
@GetMapping
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<PageResult<Role>> describeRolePage(QueryRoleRequest criteria) {
public ResponseEntity<CsResultVo<List<SystemRoleTb>>> describeRolePage(QuerySystemRoleArgs criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
return new ResponseEntity<>(systemRoleApi.describeRolePage(criteria, page), HttpStatus.OK);
}
@@ -76,7 +73,7 @@ public class RoleController {
@ApiOperation("新增角色")
@PostMapping(value = "/saveRole")
@PreAuthorize("@el.check('roles:add')")
public ResponseEntity<Object> saveRole(@Validated @RequestBody CreateRoleRequest resources) {
public ResponseEntity<Object> saveRole(@Validated @RequestBody CreateSystemRoleArgs resources) {
checkRoleLevels(resources.getLevel());
systemRoleService.saveRole(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
@@ -85,7 +82,7 @@ public class RoleController {
@ApiOperation("修改角色")
@PostMapping(value = "/modifyRoleById")
@PreAuthorize("@el.check('roles:edit')")
public ResponseEntity<Object> modifyRoleById(@Validated(Role.Update.class) @RequestBody Role resources) {
public ResponseEntity<Object> modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleTb resources) {
checkRoleLevels(resources.getLevel());
systemRoleService.modifyRoleById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
@@ -94,8 +91,8 @@ public class RoleController {
@ApiOperation("修改角色菜单")
@PostMapping(value = "/modifyBindMenuById")
@PreAuthorize("@el.check('roles:edit')")
public ResponseEntity<Object> modifyBindMenuById(@RequestBody Role resources) {
Role role = systemRoleService.getById(resources.getId());
public ResponseEntity<Object> modifyBindMenuById(@RequestBody SystemRoleTb resources) {
SystemRoleTb role = systemRoleService.getById(resources.getId());
checkRoleLevels(role.getLevel());
systemRoleService.modifyBindMenuById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
@@ -106,7 +103,7 @@ public class RoleController {
@PreAuthorize("@el.check('roles:del')")
public ResponseEntity<Object> removeRoleByIds(@RequestBody Set<Long> ids) {
for (Long id : ids) {
Role role = systemRoleService.getById(id);
SystemRoleTb role = systemRoleService.getById(id);
checkRoleLevels(role.getLevel());
}
// 验证是否被用户关联
@@ -121,7 +118,7 @@ public class RoleController {
* @return /
*/
private int checkRoleLevels(Integer level) {
List<Integer> levels = systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(Role::getLevel).collect(Collectors.toList());
List<Integer> levels = systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).collect(Collectors.toList());
int min = Collections.min(levels);
if (level != null) {
if (level < min) {
@@ -1,22 +1,19 @@
package cn.odboy.core.controller.system;
import cn.hutool.core.collection.CollectionUtil;
import cn.odboy.base.MyMetaOption;
import cn.odboy.base.PageResult;
import cn.odboy.core.api.system.SystemDataApi;
import cn.odboy.core.api.system.SystemDeptApi;
import cn.odboy.core.api.system.SystemRoleApi;
import cn.odboy.core.api.system.SystemUserApi;
import cn.odboy.core.constant.CaptchaBizEnum;
import cn.odboy.core.dal.dataobject.system.Dept;
import cn.odboy.core.dal.dataobject.system.Role;
import cn.odboy.core.dal.dataobject.system.User;
import cn.odboy.core.dal.model.UpdateUserPasswordResponse;
import cn.odboy.core.framework.permission.util.SecurityHelper;
import cn.odboy.base.CsResultVo;
import cn.odboy.base.CsSelectOptionItemVo;
import cn.odboy.core.service.system.*;
import cn.odboy.core.service.system.ookkoko.SystemDataService;
import cn.odboy.core.constant.system.SystemCaptchaBizEnum;
import cn.odboy.core.dal.dataobject.system.SystemDeptTb;
import cn.odboy.core.dal.dataobject.system.SystemRoleTb;
import cn.odboy.core.dal.dataobject.system.SystemUserTb;
import cn.odboy.core.dal.model.system.UpdateSystemUserPasswordArgs;
import cn.odboy.core.framework.permission.core.SecurityHelper;
import cn.odboy.core.framework.properties.AppProperties;
import cn.odboy.core.service.system.SystemUserService;
import cn.odboy.core.service.system.dto.QueryUserRequest;
import cn.odboy.core.service.tools.CaptchaService;
import cn.odboy.core.dal.model.system.QuerySystemUserArgs;
import cn.odboy.core.service.system.ookkoko.SystemDeptService;
import cn.odboy.exception.BadRequestException;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RsaEncryptUtil;
@@ -32,58 +29,49 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "系统:用户管理")
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
public class SystemUserController {
private final PasswordEncoder passwordEncoder;
private final SystemUserService systemUserService;
private final SystemDataApi systemDataApi;
private final SystemDeptApi systemDeptApi;
private final SystemDataService systemDataService;
private final SystemDeptService systemDeptService;
private final SystemRoleApi systemRoleApi;
private final SystemUserApi systemUserApi;
private final CaptchaService verificationCodeService;
private final SystemCaptchaService verificationCodeService;
private final AppProperties properties;
@ApiOperation("导出用户数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check('user:list')")
public void downloadUserExcel(HttpServletResponse response, QueryUserRequest criteria) throws IOException {
public void downloadUserExcel(HttpServletResponse response, QuerySystemUserArgs criteria) throws IOException {
systemUserService.downloadUserExcel(systemUserApi.describeUserList(criteria), response);
}
@ApiOperation("查询用户")
@GetMapping
@PreAuthorize("@el.check('user:list')")
public ResponseEntity<PageResult<User>> queryUser(QueryUserRequest criteria) {
public ResponseEntity<CsResultVo<List<SystemUserTb>>> queryUser(QuerySystemUserArgs criteria) {
Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
if (!ObjectUtils.isEmpty(criteria.getDeptId())) {
criteria.getDeptIds().add(criteria.getDeptId());
// 先查找是否存在子节点
List<Dept> data = systemDeptApi.describeDeptListByPid(criteria.getDeptId());
List<SystemDeptTb> data = systemDeptService.describeDeptListByPid(criteria.getDeptId());
// 然后把子节点的ID都加入到集合中
criteria.getDeptIds().addAll(systemDeptApi.describeChildDeptIdListByDeptIds(data));
criteria.getDeptIds().addAll(systemDeptService.describeChildDeptIdListByDeptIds(data));
}
// 数据权限
List<Long> dataScopes = systemDataApi.describeDeptIdListByUserIdWithDeptId(systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername()));
List<Long> dataScopes = systemDataService.describeDeptIdListByUserIdWithDeptId(systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername()));
// criteria.getDeptIds() 不为空并且数据权限不为空则取交集
if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) {
// 取交集
@@ -96,13 +84,13 @@ public class UserController {
criteria.getDeptIds().addAll(dataScopes);
return new ResponseEntity<>(systemUserApi.describeUserPage(criteria, page), HttpStatus.OK);
}
return new ResponseEntity<>(PageUtil.noData(), HttpStatus.OK);
return new ResponseEntity<>(PageUtil.emptyData(), HttpStatus.OK);
}
@ApiOperation("新增用户")
@PostMapping(value = "/saveUser")
@PreAuthorize("@el.check('user:add')")
public ResponseEntity<Object> saveUser(@Validated @RequestBody User resources) {
public ResponseEntity<Object> saveUser(@Validated @RequestBody SystemUserTb resources) {
checkLevel(resources);
// 默认密码 123456
resources.setPassword(passwordEncoder.encode("123456"));
@@ -113,7 +101,7 @@ public class UserController {
@ApiOperation("修改用户")
@PostMapping(value = "/modifyUserById")
@PreAuthorize("@el.check('user:edit')")
public ResponseEntity<Object> modifyUserById(@Validated(User.Update.class) @RequestBody User resources) throws Exception {
public ResponseEntity<Object> modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb resources) throws Exception {
checkLevel(resources);
systemUserService.modifyUserById(resources);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
@@ -121,7 +109,7 @@ public class UserController {
@ApiOperation("修改用户:个人中心")
@PostMapping(value = "modifyUserCenterInfoById")
public ResponseEntity<Object> modifyUserCenterInfoById(@Validated(User.Update.class) @RequestBody User resources) {
public ResponseEntity<Object> modifyUserCenterInfoById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb resources) {
if (!resources.getId().equals(SecurityHelper.getCurrentUserId())) {
throw new BadRequestException("不能修改他人资料");
}
@@ -134,8 +122,8 @@ public class UserController {
@PreAuthorize("@el.check('user:del')")
public ResponseEntity<Object> removeUserByIds(@RequestBody Set<Long> ids) {
for (Long id : ids) {
Integer currentLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(Role::getLevel).collect(Collectors.toList()));
Integer optLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(id).stream().map(Role::getLevel).collect(Collectors.toList()));
Integer currentLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).collect(Collectors.toList()));
Integer optLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(id).stream().map(SystemRoleTb::getLevel).collect(Collectors.toList()));
if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足,不能删除:" + systemUserApi.describeUserById(id).getUsername());
}
@@ -146,10 +134,10 @@ public class UserController {
@ApiOperation("修改密码")
@PostMapping(value = "/modifyUserPasswordByUsername")
public ResponseEntity<Object> modifyUserPasswordByUsername(@RequestBody UpdateUserPasswordResponse passVo) throws Exception {
public ResponseEntity<Object> modifyUserPasswordByUsername(@RequestBody UpdateSystemUserPasswordArgs passVo) throws Exception {
String oldPass = RsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass());
String newPass = RsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass());
User user = systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername());
SystemUserTb user = systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername());
if (!passwordEncoder.matches(oldPass, user.getPassword())) {
throw new BadRequestException("修改失败,旧密码错误");
}
@@ -176,13 +164,13 @@ public class UserController {
@ApiOperation("修改邮箱")
@PostMapping(value = "/modifyUserEmailByUsername/{code}")
public ResponseEntity<Object> modifyUserEmailByUsername(@PathVariable String code, @RequestBody User resources) throws Exception {
public ResponseEntity<Object> modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb resources) throws Exception {
String password = RsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), resources.getPassword());
User user = systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername());
SystemUserTb user = systemUserApi.describeUserByUsername(SecurityHelper.getCurrentUsername());
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadRequestException("密码错误");
}
verificationCodeService.checkCodeAvailable(CaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), resources.getEmail(), code);
verificationCodeService.checkCodeAvailable(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE.getBizCode(), resources.getEmail(), code);
systemUserService.modifyUserEmailByUsername(user.getUsername(), resources.getEmail());
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -192,8 +180,8 @@ public class UserController {
*
* @param resources /
*/
private void checkLevel(User resources) {
Integer currentLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(Role::getLevel).collect(Collectors.toList()));
private void checkLevel(SystemUserTb resources) {
Integer currentLevel = Collections.min(systemRoleApi.describeRoleListByUsersId(SecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).collect(Collectors.toList()));
Integer optLevel = systemRoleApi.describeDeptLevelByRoles(resources.getRoles());
if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足");
@@ -203,17 +191,17 @@ public class UserController {
@ApiOperation("查询用户基础数据")
@PostMapping(value = "/describeUserMetadataOptions")
@PreAuthorize("@el.check('user:list')")
public ResponseEntity<List<MyMetaOption>> queryUserMetadataOptions(@Validated @RequestBody QueryUserRequest criteria) {
public ResponseEntity<List<CsSelectOptionItemVo>> queryUserMetadataOptions(@Validated @RequestBody QuerySystemUserArgs criteria) {
int maxPageSize = 50;
return new ResponseEntity<>(systemUserService.page(new Page<>(criteria.getPage(), maxPageSize), new LambdaQueryWrapper<User>()
return new ResponseEntity<>(systemUserService.page(new Page<>(criteria.getPage(), maxPageSize), new LambdaQueryWrapper<SystemUserTb>()
.and(c -> {
c.eq(User::getPhone, criteria.getBlurry());
c.eq(SystemUserTb::getPhone, criteria.getBlurry());
c.or();
c.eq(User::getEmail, criteria.getBlurry());
c.eq(SystemUserTb::getEmail, criteria.getBlurry());
c.or();
c.like(User::getUsername, criteria.getBlurry());
c.like(SystemUserTb::getUsername, criteria.getBlurry());
c.or();
c.like(User::getNickName, criteria.getBlurry());
c.like(SystemUserTb::getNickName, criteria.getBlurry());
})
).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1);
@@ -221,7 +209,7 @@ public class UserController {
ext.put("deptId", m.getDeptId());
ext.put("email", m.getEmail());
ext.put("phone", m.getPhone());
return MyMetaOption.builder()
return CsSelectOptionItemVo.builder()
.label(m.getNickName())
.value(m.getUsername())
.ext(ext)
@@ -1,6 +1,6 @@
package cn.odboy.core.dal.dataobject.system;
import cn.odboy.base.MyEntity;
import cn.odboy.base.CsBaseUserTimeTb;
import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@@ -18,7 +19,7 @@ import java.util.Set;
@Getter
@Setter
@TableName("system_dept")
public class Dept extends MyEntity {
public class SystemDeptTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class)
@TableId(value = "dept_id", type = IdType.AUTO)
@@ -28,11 +29,11 @@ public class Dept extends MyEntity {
@TableField(exist = false)
@JSONField(serialize = false)
@ApiModelProperty(value = "角色")
private Set<Role> roles;
private Set<SystemRoleTb> roles;
@TableField(exist = false)
@ApiModelProperty(value = "子部门")
private List<Dept> children;
private List<SystemDeptTb> children;
@ApiModelProperty(value = "排序")
private Integer deptSort;
@@ -59,7 +60,7 @@ public class Dept extends MyEntity {
if (o == null || getClass() != o.getClass()) {
return false;
}
Dept dept = (Dept) o;
SystemDeptTb dept = (SystemDeptTb) o;
return Objects.equals(id, dept.id) &&
Objects.equals(name, dept.name);
}
@@ -1,6 +1,6 @@
package cn.odboy.core.dal.dataobject.system;
import cn.odboy.base.MyEntity;
import cn.odboy.base.CsBaseUserTimeTb;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -8,12 +8,13 @@ import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
@Getter
@Setter
@TableName("system_dict_detail")
public class DictDetail extends MyEntity {
public class SystemDictDetailTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class)
@ApiModelProperty(value = "ID", hidden = true)
@@ -26,7 +27,7 @@ public class DictDetail extends MyEntity {
@TableField(exist = false)
@ApiModelProperty(value = "字典")
private Dict dict;
private SystemDictTb dict;
@ApiModelProperty(value = "字典标签")
private String label;
@@ -1,14 +1,11 @@
package cn.odboy.core.dal.dataobject.system;
import cn.odboy.base.MyEntity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.odboy.base.CsBaseUserTimeTb;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@@ -16,7 +13,7 @@ import javax.validation.constraints.NotNull;
@Getter
@Setter
@TableName("system_dict")
public class Dict extends MyEntity {
public class SystemDictTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class)
@ApiModelProperty(value = "ID", hidden = true)
@@ -1,20 +1,21 @@
package cn.odboy.core.dal.dataobject.tools;
package cn.odboy.core.dal.dataobject.system;
import cn.odboy.base.MyObject;
import cn.odboy.base.CsSerializeObject;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
/**
* 邮件配置类,数据存覆盖式存入数据存
*/
@Data
@TableName("tool_email_config")
@TableName("system_email_config")
@EqualsAndHashCode(callSuper = false)
public class EmailConfig extends MyObject {
public class SystemEmailConfigTb extends CsSerializeObject {
@TableId("config_id")
private Long id;
@@ -1,12 +1,13 @@
package cn.odboy.core.dal.dataobject.system;
import cn.odboy.base.MyEntity;
import cn.odboy.base.CsBaseUserTimeTb;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Objects;
@@ -15,7 +16,7 @@ import java.util.Objects;
@Getter
@Setter
@TableName("system_job")
public class Job extends MyEntity {
public class SystemJobTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class)
@TableId(value = "id", type = IdType.AUTO)
@@ -42,7 +43,7 @@ public class Job extends MyEntity {
if (o == null || getClass() != o.getClass()) {
return false;
}
Job job = (Job) o;
SystemJobTb job = (SystemJobTb) o;
return Objects.equals(id, job.id);
}

Some files were not shown because too many files have changed in this diff Show More