优化:基于阿里巴巴 Java 开发手册(黄山版)优化常量

1.编程规约>常量定义>第1条:
【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
This commit is contained in:
Charles7c 2023-03-04 14:35:45 +08:00
parent c4d9bd3a75
commit 89a327920e
11 changed files with 65 additions and 26 deletions

View File

@ -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));
}
}

View File

@ -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());
}

View File

@ -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 -> {
// 针对数值类型LongBigIntegerBigDecimal 的序列化和反序列化
JavaTimeModule javaTimeModule = new JavaTimeModule();
@ -72,15 +69,15 @@ public class JacksonConfiguration {
javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
// 针对时间类型LocalDateTimeLocalDateLocalTime 的序列化和反序列化
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);

View File

@ -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";
}

View File

@ -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";
}

View File

@ -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);

View File

@ -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");

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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));
}

View File

@ -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);