- 
                Notifications
    
You must be signed in to change notification settings  - Fork 116
 
common
        sika-code edited this page Jul 20, 2019 
        ·
        1 revision
      
    common【不依赖于外部资源的公共组件】
- 通用工具集合
 - 基础接口和基础类集合
 
- 规范编码
 - 减少重复性工作
 - 提高开发效率
 
- 集成apache-common等组件
 - 集成hutool组件
 - 集成FastJson进行json的序列化和反序列化
 - 集成lombok组件优化代码结构
 - 抽象业务通性形成基础接口和类
 
| 名称 | 备注 | 
|---|---|
| basic | 基础类和接口 | 
| common | 通用工具类集合 | 
| config | 通用配置 | 
| consumer | 消费组件 | 
| database | 数据库公共类 | 
| exception | 异常处理组件 | 
| informer | 通知组件 | 
| no | 编号组件 | 
| result | 返回结果组件 | 
| 名称 | 备注 | 
|---|---|
| BaseErrorCode | 错误枚举类、配合BusinessException使用 | 
| TypeEnumInf | 类型枚举类 | 
| BaseService | 提供基础业务逻辑功能 | 
| BaseDomain | 基础领域类、提供访问spring容器管理的Bean | 
| BaseMsgDTO | 基础消息数据传输类、统一消息格式 | 
| BaseRequestBO | 基础请求逻辑类 | 
| BaseResponseBO | 基础响应逻辑类 | 
| BaseUtil | 基础工具类、提供基础的判空和判等方法 | 
| Assert | 断言工具类、提供基础校验 | 
| 名称 | 备注 | 
|---|---|
| DateUtil | 日期工具、提供操作日期的公共方法 | 
| BeanFactory | 实例工厂、创建实例 | 
| RequestUtil | 请求工具、封装请求相关的方法 | 
| JSONUtil | json序列化反序列化工具、封装了通用的序列化和反序列化方法 | 
| LogUtil | 日志工具、提供统一格式的日志处理方式 | 
| NumberUtil | 数值工具、提供数值型的公共方法 | 
| SpringUtil | 获取Spring容器实例工具 | 
| StringUtil | 处理字符串工具 | 
| Executors | 管理线程池的创建、对Executors的基础封装 | 
| ThreadLocalManager | 本地线程管理工具、简化ThreadLocal的使用、自动清理ThreadLocal对象 | 
| TreeBuilder | 树结构构造者 | 
| WorkspaceProperties | 工作空间属性、区分实例部署的工作空间 | 
| 名称 | 备注 | 
|---|---|
| JacksonConfig | Jackson序列化和反序列化配置 | 
| CorsConfig | 跨域支持配置 | 
| 名称 | 备注 | 
|---|---|
| ExceptionAdvice | 统一异常处理 | 
| ExceptionConfig | 异常配置 | 
| BaseBusinessExceptionDTO | 基础服务异常数据传输对象 | 
| ExceptionProperties | 异常属性 | 
| BusinessException | 业务系统异常 | 
【消息通知组件】【可以依据消息链表进行通知】
| 名称 | 备注 | 
|---|---|
| NoFactory | 变成工厂、封装常用的编号生成方法 | 
| InformerConfig | 通知配置类 | 
| DingdingMessageDTO | 钉钉通知的数据传输对 | 
| InformerForDingding | 通知到钉钉群 | 
| InformerForLog | 通知到Log | 
| InformerProperties | 通知属性 | 
| BaseInformer | 通知基础类、不同的通知者通过继承该类来实现自己的通知机制 | 
【编号组件】【封装编号生成策略】
| 名称 | 备注 | 
|---|---|
| NoFactory | 编号创建工厂、封装常用的编号生成方法 | 
| NoGenerator | 编号生成者、具体生成编号的类 | 
| NoProperties | 编号属性 | 
| NoGeneratorTimeFormatStrategy | 编号时间格式化策略 | 
| NoGeneratorOrderSuffixStrategy | 有序后缀策略 | 
| NoGeneratorRandomSuffixStrategy | 随机后缀策略 | 
【统一的返回结果】
| 名称 | 备注 | 
|---|---|
| Result | 统一的返回对象 | 
| ResultConfig | 配置 | 
| ResultGenerator | Result对象生成者 | 
BaseErrorCode
/**
 * 
 * <p>
 * 错误代码常量示例枚举
 * </p>
 *
 * @author daiqi
 * 创建时间    2018年2月2日 下午4:07:03
 */
@Getter
@AllArgsConstructor
public enum DemoErrorCodeEnum implements BaseErrorCode {
	/** 成功---BASE_000000 */
	SUCCESS("BASE_000000", "成功"),
	/** 异常---系统错误---BASE_000001 */
	SYS_ERROR("BASE_000001", "系统错误"),
	;
	private String code;
	private String message;
}
TypeEnumInf
/**
 * <p>
 * 示例类型枚举
 * </p>
 *
 * @author daiqi
 * @创建时间 2018年6月8日 上午11:42:53
 */
@Getter
@AllArgsConstructor
public enum DemoTypeEnum implements TypeEnumInf {
    /**
     * 示例1---1---示例
     */
    DEMO1(1, "示例"),
    ;
    private Integer type;
    private String desc;
}
BaseService
/**
 * <p>Description: 自定义类</p>
 *
 * <pre>
 *     泛型顺序
 *     1 Mapper
 *     2 Entity
 *     3 DTO
 *     其中Mapper和Entity的顺序必须放在最前
 * </pre>
 *
 * @author daiqi
 * @date 2018/8/30
 */
public abstract class DemoServiceImpl<M extends BaseSMapper<Entity>, Entity extends BaseEntity, DTO extends BaseDTO> extends BaseService<M, Entity> {
}
BaseDomain
/**
 * <p>
 * 示例 领域类
 * </p>
 *
 * @author daiqi
 * @since 2019-05-29 19:55:01
 */
public interface DemoDomain extends BaseDomain {
    /**
     * <p>
     * 获取当前模块的service
     * </p>
     *
     * @param
     * @return DemoService
     * @author daiqi
     * @date 2019/5/13 13:53
     */
    default DemoService service() {
        return getBean(DemoService.class);
    }
    /**
     * <p>
     * 获取demoLogic
     * </p>
     *
     * @param
     * @return DemoLogic
     * @author daiqi
     * @date 2019/5/13 13:53
     */
    default DemoLogic logic() {
        return getBean(DemoLogic.class);
    }
}
BaseMsgDTO
/**
 * 消息队列数据传输对象
 *
 * @author daiqi
 * @create 2019-06-29 20:42
 */
@Data
@Accessors(chain = true)
public class MqMsgDTO extends BaseMsgDTO {
    /**
     * 数据类型
     */
    private MqDataType dataType;
    public MqMsgDTO() {
    }
    public MqMsgDTO(Object data) {
        init(data, BaseErrorCodeEnum.SUCCESS);
    }
    public MqMsgDTO(Object data, BaseErrorCode errorCode) {
        init(data, errorCode);
    }
    /**
     * <p>
     * 根据数据创建实例
     * </p>
     *
     * @param data : 传输的数据
     * @return MqMsgDTO
     * @author daiqi
     * @date 2019/6/29 21:01
     */
    public static MqMsgDTO newInstance(Object data) {
        return new MqMsgDTO(data);
    }
    /**
     * <p>
     * 创建MqDTO对象
     * </p>
     *
     * @param data      : 具体数据
     * @param errorCode : 错误枚举类
     * @return MqMsgDTO
     * @author daiqi
     * @date 2019/6/29 21:54
     */
    public static MqMsgDTO newInstance(Object data, BaseErrorCode errorCode) {
        return new MqMsgDTO(data, errorCode);
    }
}
JSONUtil
/**
 * 测试JSONUtil方法
 */
@Slf4j
public class TestJSONUtil {
    /**
     * 测试对象-JSON字符串
     */
    @Test
    public void testToString() {
        BaseMsgDTO msgDTO = new BaseMsgDTO();
        msgDTO.setCode("T_00001");
        msgDTO.setMessage("测试");
        log.info("转换后的JSON字符串:{}", JSONUtil.toJSONString(msgDTO));
    }
    /**
     * 测试对象\JSON字符串 - 对象
     */
    @Test
    public void testParseObject() {
        BaseMsgDTO msgDTO = new BaseMsgDTO();
        msgDTO.setCode("T_00001");
        msgDTO.setMessage("测试");
        BaseMsgDTO msgDTONew = JSONUtil.parseObject(msgDTO, BaseMsgDTO.class);
        log.info("转换后的对象:{}", JSONUtil.toJSONString(msgDTONew));
    }
    /**
     * 测试对象列表\JSON数组字符串 - 对象列表
     */
    @Test
    public void testParseArray() {
        BaseMsgDTO msgDTO1 = new BaseMsgDTO();
        msgDTO1.setCode("T_00001");
        msgDTO1.setMessage("测试");
        BaseMsgDTO msgDTO2 = new BaseMsgDTO();
        msgDTO2.setCode("T_00001");
        msgDTO2.setMessage("测试");
        List<BaseMsgDTO> msgDTOS = Lists.newArrayList();
        msgDTOS.add(msgDTO1);
        msgDTOS.add(msgDTO2);
        List<BaseMsgDTO> msgDTOSNew = JSONUtil.parseArray(msgDTOS, BaseMsgDTO.class);
        log.info("转换后的数组:{}", JSONUtil.toJSONString(msgDTOSNew));
    }
}
ThreadLocalManager
    /** 测试ThreadLocal */
    public void testThreadLocal() {
        String accessRuleTypeKey = "access_rule_type:update";
        AccessRuleTypeDTO accessRuleTypeUpdate = new AccessRuleTypeDTO();
        /** 若不需要在子线程中设置则不需要手动清理ThreadLocal */
        // 默认的设置方法 --- 设置到ThreadLocal中
        ThreadLocalManager.set(accessRuleTypeKey, new AccessRuleTypeDTO());
        // 显示的设置到ThreadLocal中
        ThreadLocalManager.setThreadLocal(accessRuleTypeKey, accessRuleTypeUpdate);
        
        /** 注意 若使用如下方式需要意味着需要在子线程中进行使用、则建议手动的清理 */
        // 1:设置为手动清除
        ThreadLocalManager.setManualCleanToInheritable(true);
        // 2:显示的设置到InheritableThreadLocal
        ThreadLocalManager.setInheritable(accessRuleTypeKey, accessRuleTypeUpdate);
        // 1:设置为手动清除
        ThreadLocalManager.setManualCleanToAll(true);
        // 2:显示的设置到ThreadLocal和InheritableThreadLocal
        ThreadLocalManager.setThreadLocalAndInheritable(accessRuleTypeKey, accessRuleTypeUpdate);
        /**------------------------------------------------*/
    }
/**
 * 
 * <p>
 * 校验列表为空
 * </p>
 *
 * <pre>
 * 列表为空抛出异常
 * </pre>
 *
 * @param obj : List : 待校验的List实例
 * @param formatValues : Object... : 格式化错误信息的的值
 * @author daiqi
 * @创建时间 2018年6月9日 下午3:32:41
 */
public static void verifyListNull(Collection<?> obj, Object... formatValues) {
	if (BaseUtil.isNull(obj)) {
		throw new BusinessException(BaseErrorCodeEnum.LIST_NULL).buildFormatValues(formatValues);
	}
}
/**
 * <p>
 * 创建秒和有序的编号生产者
 * </p>
 *
 * @param init : 初始值
 * @return NoGenerator
 * @author daiqi
 * @date 2019/7/2 23:36
 */
public static NoGenerator createSecondShortOrder(long init) {
    NoGenerator noGenerator = new NoGenerator()
            .setFormatStrategy(NoGeneratorTimeFormatStrategy.SECOND_SHORT_YEAR)
            .setSuffixStrategy(new NoGeneratorOrderSuffixStrategy(init));
            
    // 编号前缀
    String prefix = "TS";
    // 后缀字符串的长度
    int suffixCount = 6;
    noGenerator.generateNoCore(prefix, suffixCount);
}
/**
 * 测试Result
 *
 * @author daiqi
 * @create 2018-11-29 20:22
 */
 @Component
public class DemoResult {
    @Autowired
    private ResultGenerator resultGenerator;
    protected Result generateResult(Object object) {
        return resultGenerator.generateResult(object);
    }
}