mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-11-04 10:57:10 +08:00 
			
		
		
		
	优化:基于阿里巴巴 Java 开发手册(黄山版)优化常量
1.编程规约>常量定义>第1条: 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
This commit is contained in:
		@@ -35,6 +35,7 @@ import cn.hutool.core.lang.tree.Tree;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.annotation.CrudRequestMapping;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.model.query.PageQuery;
 | 
			
		||||
import top.charles7c.cnadmin.common.model.query.SortQuery;
 | 
			
		||||
import top.charles7c.cnadmin.common.model.vo.PageDataVO;
 | 
			
		||||
@@ -208,7 +209,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
 | 
			
		||||
    private void checkPermission(String subPermission) {
 | 
			
		||||
        CrudRequestMapping crudRequestMapping = this.getClass().getDeclaredAnnotation(CrudRequestMapping.class);
 | 
			
		||||
        String path = crudRequestMapping.value();
 | 
			
		||||
        String permissionPrefix = String.join(":", StrUtil.splitTrim(path, "/"));
 | 
			
		||||
        String permissionPrefix = String.join(StringConsts.COLON, StrUtil.splitTrim(path, StringConsts.SLASH));
 | 
			
		||||
        StpUtil.checkPermission(String.format("%s:%s", permissionPrefix, subPermission));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ import cn.hutool.core.util.ClassUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.base.BaseEnum;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Easy Excel 枚举基类转换器
 | 
			
		||||
@@ -63,7 +64,7 @@ public class ExcelBaseEnumConverter implements Converter<BaseEnum<Integer, Strin
 | 
			
		||||
    public WriteCellData<String> convertToExcelData(BaseEnum<Integer, String> value,
 | 
			
		||||
        ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
 | 
			
		||||
        if (ObjectUtil.isNull(value)) {
 | 
			
		||||
            return new WriteCellData<>("");
 | 
			
		||||
            return new WriteCellData<>(StringConsts.EMPTY);
 | 
			
		||||
        }
 | 
			
		||||
        return new WriteCellData<>(value.getDescription());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,7 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 | 
			
		||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.base.BaseEnum;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Jackson 配置
 | 
			
		||||
@@ -59,10 +60,6 @@ public class JacksonConfiguration {
 | 
			
		||||
     */
 | 
			
		||||
    @Bean
 | 
			
		||||
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
 | 
			
		||||
        String dateTimeFormatPattern = "yyyy-MM-dd HH:mm:ss";
 | 
			
		||||
        String dateFormatPattern = "yyyy-MM-dd";
 | 
			
		||||
        String timeFormatPattern = "HH:mm:ss";
 | 
			
		||||
 | 
			
		||||
        return builder -> {
 | 
			
		||||
            // 针对数值类型:Long、BigInteger、BigDecimal 的序列化和反序列化
 | 
			
		||||
            JavaTimeModule javaTimeModule = new JavaTimeModule();
 | 
			
		||||
@@ -72,15 +69,15 @@ public class JacksonConfiguration {
 | 
			
		||||
            javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
 | 
			
		||||
 | 
			
		||||
            // 针对时间类型:LocalDateTime、LocalDate、LocalTime 的序列化和反序列化
 | 
			
		||||
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormatPattern);
 | 
			
		||||
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(StringConsts.NORM_DATE_TIME_PATTERN);
 | 
			
		||||
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
 | 
			
		||||
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
 | 
			
		||||
 | 
			
		||||
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(dateFormatPattern);
 | 
			
		||||
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(StringConsts.NORM_DATE_PATTERN);
 | 
			
		||||
            javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter));
 | 
			
		||||
            javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter));
 | 
			
		||||
 | 
			
		||||
            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(timeFormatPattern);
 | 
			
		||||
            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(StringConsts.NORM_TIME_PATTERN);
 | 
			
		||||
            javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter));
 | 
			
		||||
            javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter));
 | 
			
		||||
            builder.modules(javaTimeModule);
 | 
			
		||||
 
 | 
			
		||||
@@ -19,16 +19,16 @@ package top.charles7c.cnadmin.common.constant;
 | 
			
		||||
import lombok.AccessLevel;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.text.CharPool;
 | 
			
		||||
import cn.hutool.core.text.StrPool;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 字符相关常量
 | 
			
		||||
 * 字符串相关常量
 | 
			
		||||
 *
 | 
			
		||||
 * @author Charles7c
 | 
			
		||||
 * @since 2023/2/10 20:14
 | 
			
		||||
 */
 | 
			
		||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
 | 
			
		||||
public class CharConsts implements CharPool {
 | 
			
		||||
public class StringConsts implements StrPool {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 分号
 | 
			
		||||
@@ -39,4 +39,29 @@ public class CharConsts implements CharPool {
 | 
			
		||||
     * 空字符串
 | 
			
		||||
     */
 | 
			
		||||
    public static final String EMPTY = "";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标准日期时间格式
 | 
			
		||||
     */
 | 
			
		||||
    public static final String NORM_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标准日期时间格式(紧凑)
 | 
			
		||||
     */
 | 
			
		||||
    public static final String PURE_DATE_TIME_PATTERN = "yyyyMMddHHmmss";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标准日期时间格式(紧凑,带毫秒)
 | 
			
		||||
     */
 | 
			
		||||
    public static final String PURE_DATE_TIME_MS_PATTERN = "yyyyMMddHHmmssSSS";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标准日期格式
 | 
			
		||||
     */
 | 
			
		||||
    public static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 标准时间格式
 | 
			
		||||
     */
 | 
			
		||||
    public static final String NORM_TIME_PATTERN = "HH:mm:ss";
 | 
			
		||||
}
 | 
			
		||||
@@ -42,4 +42,14 @@ public class SysConsts {
 | 
			
		||||
     * 默认密码
 | 
			
		||||
     */
 | 
			
		||||
    public static final String DEFAULT_PASSWORD = "123456";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 登录 URI
 | 
			
		||||
     */
 | 
			
		||||
    public static final String LOGIN_URI = "/auth/login";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 退出登录 URI
 | 
			
		||||
     */
 | 
			
		||||
    public static final String LOGOUT_URI = "/auth/logout";
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ import org.springframework.data.domain.Sort;
 | 
			
		||||
import cn.hutool.core.util.ArrayUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.CharConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 排序查询条件
 | 
			
		||||
@@ -62,10 +62,10 @@ public class SortQuery implements Serializable {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<Sort.Order> orders = new ArrayList<>(sort.length);
 | 
			
		||||
        if (StrUtil.contains(sort[0], CharConsts.COMMA)) {
 | 
			
		||||
        if (StrUtil.contains(sort[0], StringConsts.COMMA)) {
 | 
			
		||||
            // e.g "sort=published,desc&sort=title,asc"
 | 
			
		||||
            for (String s : sort) {
 | 
			
		||||
                List<String> sortList = StrUtil.splitTrim(s, CharConsts.COMMA);
 | 
			
		||||
                List<String> sortList = StrUtil.splitTrim(s, StringConsts.COMMA);
 | 
			
		||||
                Sort.Order order =
 | 
			
		||||
                    new Sort.Order(Sort.Direction.valueOf(sortList.get(1).toUpperCase()), sortList.get(0));
 | 
			
		||||
                orders.add(order);
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ import cn.hutool.core.date.DateUtil;
 | 
			
		||||
import cn.hutool.core.util.URLUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.config.easyexcel.ExcelBigNumberConverter;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.exception.ServiceException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -78,7 +79,8 @@ public class ExcelUtils {
 | 
			
		||||
    public static <V> void export(List<V> list, String fileName, String sheetName, Class<V> clazz,
 | 
			
		||||
        HttpServletResponse response) {
 | 
			
		||||
        try {
 | 
			
		||||
            fileName = String.format("%s_%s.xlsx", fileName, DateUtil.format(new Date(), "yyyyMMddHHmmss"));
 | 
			
		||||
            fileName =
 | 
			
		||||
                String.format("%s_%s.xlsx", fileName, DateUtil.format(new Date(), StringConsts.PURE_DATE_TIME_PATTERN));
 | 
			
		||||
            fileName = URLUtil.encode(fileName);
 | 
			
		||||
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
 | 
			
		||||
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ import cn.hutool.core.date.DateUtil;
 | 
			
		||||
import cn.hutool.core.io.file.FileNameUtil;
 | 
			
		||||
import cn.hutool.core.util.IdUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 文件工具类
 | 
			
		||||
 *
 | 
			
		||||
@@ -57,7 +59,7 @@ public class FileUtils {
 | 
			
		||||
        String filename;
 | 
			
		||||
        if (isKeepOriginalFilename) {
 | 
			
		||||
            filename = String.format("%s-%s.%s", FileNameUtil.getPrefix(originalFilename),
 | 
			
		||||
                DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmssS"), extensionName);
 | 
			
		||||
                DateUtil.format(LocalDateTime.now(), StringConsts.PURE_DATE_TIME_MS_PATTERN), extensionName);
 | 
			
		||||
        } else {
 | 
			
		||||
            filename = String.format("%s.%s", IdUtil.fastSimpleUUID(), extensionName);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ import cn.hutool.core.util.ArrayUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.extra.spring.SpringUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.CharConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -233,10 +233,10 @@ public class MailUtils {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<String> result;
 | 
			
		||||
        if (StrUtil.contains(addresses, CharConsts.COMMA)) {
 | 
			
		||||
            result = StrUtil.splitTrim(addresses, CharConsts.COMMA);
 | 
			
		||||
        } else if (StrUtil.contains(addresses, CharConsts.SEMICOLON)) {
 | 
			
		||||
            result = StrUtil.splitTrim(addresses, CharConsts.SEMICOLON);
 | 
			
		||||
        if (StrUtil.contains(addresses, StringConsts.COMMA)) {
 | 
			
		||||
            result = StrUtil.splitTrim(addresses, StringConsts.COMMA);
 | 
			
		||||
        } else if (StrUtil.contains(addresses, StringConsts.SEMICOLON)) {
 | 
			
		||||
            result = StrUtil.splitTrim(addresses, StringConsts.SEMICOLON);
 | 
			
		||||
        } else {
 | 
			
		||||
            result = CollUtil.newArrayList(addresses);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ import lombok.NoArgsConstructor;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.CharConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.StringConsts;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Stream 工具类
 | 
			
		||||
@@ -52,7 +52,7 @@ public class StreamUtils {
 | 
			
		||||
     */
 | 
			
		||||
    public static <E> String join(Collection<E> collection, Function<E, String> function, CharSequence delimiter) {
 | 
			
		||||
        if (CollUtil.isEmpty(collection)) {
 | 
			
		||||
            return CharConsts.EMPTY;
 | 
			
		||||
            return StringConsts.EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
        return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import cn.hutool.core.bean.BeanUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
 | 
			
		||||
import top.charles7c.cnadmin.common.constant.SysConsts;
 | 
			
		||||
import top.charles7c.cnadmin.common.model.query.PageQuery;
 | 
			
		||||
import top.charles7c.cnadmin.common.model.vo.PageDataVO;
 | 
			
		||||
import top.charles7c.cnadmin.common.service.CommonUserService;
 | 
			
		||||
@@ -95,8 +96,8 @@ public class LogServiceImpl implements LogService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageDataVO<LoginLogVO> page(LoginLogQuery query, PageQuery pageQuery) {
 | 
			
		||||
        QueryWrapper<LogDO> queryWrapper = QueryHelper.build(query);
 | 
			
		||||
        queryWrapper.lambda()
 | 
			
		||||
            .and(qw -> qw.like(LogDO::getRequestUrl, "/auth/login").or().like(LogDO::getRequestUrl, "/auth/logout"));
 | 
			
		||||
        queryWrapper.lambda().and(qw -> qw.like(LogDO::getRequestUrl, SysConsts.LOGIN_URI).or()
 | 
			
		||||
            .like(LogDO::getRequestUrl, SysConsts.LOGOUT_URI));
 | 
			
		||||
 | 
			
		||||
        // 限定查询信息
 | 
			
		||||
        String[] fieldsName = ReflectUtils.getNonStaticFieldsName(LoginLogVO.class);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user