Skip to content

快速开始

技术栈:

  • BladeX 4.0.1.RELEASE
  • JDK 17
  • JOOQ 3.19.8
  • MYSQL
  • Redis
  • NACOS
  • MAVEN >= 3.8.6

环境:

  • JDK 17
  • NACOS
  • Redis
  • MAVEN

1.导入NACOS以下文件

  • 1.1 blade.yaml 基础配置
yaml
#服务器配置
server:
  undertow:
    threads:
      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
      io: 16
      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
      worker: 400
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    buffer-size: 1024
    # 是否分配的直接内存
    direct-buffers: true

#spring配置
spring:
  cloud:
    nacos:
      discovery:
        # 禁用云命名空间解析,防止和云平台环境变量冲突
        isUseCloudNamespaceParsing: false
      config:
        # 禁用云命名空间解析,防止和云平台环境变量冲突
        isUseCloudNamespaceParsing: false
    sentinel:
      eager: true
  devtools:
    restart:
      log-condition-evaluation-delta: false
    livereload:
      port: 23333

#feign配置
feign:
  sentinel:
    enabled: true
  okhttp:
    enabled: true
  httpclient:
    enabled: false

#对外暴露端口
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

#knife4j配置
knife4j:
  #启用
  enable: true
  #基础认证
  basic:
    enable: false
    username: blade
    password: blade
  #增强配置
  setting:
    enableSwaggerModels: true
    enableDocumentManage: true
    enableHost: false
    enableHostText: http://localhost
    enableRequestCache: true
    enableFilterMultipartApis: false
    enableFilterMultipartApiMethodType: POST
    language: zh_cn
    enableFooter: false
    enableFooterCustom: true
    footerCustomContent: Copyright © 2023 BladeX All Rights Reserved

#swagger公共信息
swagger:
  title: BladeX 接口文档系统
  description: BladeX 接口文档系统
  version: 4.0.1.RELEASE
  license: Powered By BladeX
  license-url: https://bladex.cn
  terms-of-service-url: https://bladex.cn
  contact:
    name: 翼宿
    email: bladejava@qq.com
    url: https://gitee.com/smallc

#blade配置
blade:
  #token配置
  token:
    #是否有状态
    state: false
    #是否单用户登录
    single: false
    #单用户登录范围
    single-level: all
    #token签名 使用blade-auth服务 @org.springblade.test.SignKeyGenerator 获取
    sign-key: 7fABAXjQXuVHttC9QU7aXcz6AulpW4cp
    #token加密 使用blade-auth服务 @org.springblade.test.CryptoKeyGenerator 获取
    crypto-key: Fykm3bLron2BGRY2bF51E6cikTzH9AtE
  #接口配置
  api:
    #报文加密配置
    crypto:
      #启用报文加密配置
      enabled: false
      #使用blade-auth服务 @org.springblade.test.CryptoKeyGenerator 获取,需和前端保持一致
      aes-key: Fe7mQ8N0bOIbUG9OwlSGwJ6oejxPYfsW
      #使用blade-auth服务 @org.springblade.test.CryptoKeyGenerator 获取,需和前端保持一致
      des-key: fGPEuUg8e558dOW4
  #jackson配置
  jackson:
    #null自动转空值
    null-to-empty: true
    #大数字自动转字符串
    big-num-to-string: true
    #支持text文本请求,与报文加密同时开启
    support-text-plain: false
  #redis序列化方式
  redis:
    serializer-type: protostuff
  #日志配置
  log:
    request:
      #开启控制台请求日志
      enabled: true
      #控制台请求日志忽略
      skip-url:
        - /blade-desk/notice/list
        - /blade-chat/weixin/**
      #开启错误日志入库
      error-log: true
  #xss配置
  xss:
    enabled: true
    skip-url:
      - /weixin
      - /notice/submit
      - /model/submit
      - /datasource/submit
  #安全框架配置
  secure:
    #严格模式
    #缺失令牌字段则取消授权
    strict-token: true
    #缺失请求头则取消授权
    strict-header: false
    #接口放行
    skip-url:
      - /test/**
    #授权认证配置
    auth:
      - method: ALL
        pattern: /chat/wechat/**
        expression: "hasAuth()"
      - method: ALL
        pattern: /chat/qq/**
        expression: "hasStrictToken()"
      - method: ALL
        pattern: /chat/ding/**
        expression: "hasStrictHeader()"
      - method: POST
        pattern: /dashboard/upload
        expression: "hasTimeAuth(9, 17)"
      - method: POST
        pattern: /dashboard/submit
        expression: "hasAnyRole('administrator', 'admin', 'user')"
    #基础认证配置
    basic:
      - method: ALL
        pattern: /dashboard/info
        username: "blade"
        password: "blade"
    #动态签名认证配置
    sign:
      - method: ALL
        pattern: /dashboard/sign
        crypto: "sha1"
    #多终端认证配置
    client:
      - client-id: sword
        path-patterns:
          - /sword/**
      - client-id: saber
        path-patterns:
          - /saber/**
  #多租户配置
  tenant:
    #多租户增强
    enhance: true
    #多租户授权保护
    license: false
    #动态数据源功能
    dynamic-datasource: false
    #动态数据源全局扫描
    dynamic-global: false
    #多租户字段名
    column: tenant_id
    #排除多租户逻辑
    exclude-tables:
      - blade_user
  #分库分表配置
  sharding:
    enabled: false
  • 1.2 blade-dev.yaml, 下面为开发环境yaml文件,请逐项修改为真实配置.如需配置测试或生产环境,请参照开发环境配置
yaml
#spring配置
spring:
  data:
    redis:
      ##redis 单机环境配置
      host: 127.0.0.1
      port: 6379
      password: xxx
      database: 0
      ssl:
        enabled: false
      ##redis 集群环境配置
      #cluster:
      #  nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
      #  commandTimeout: 5000
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    #driver-class-name: org.postgresql.Driver
    #driver-class-name: oracle.jdbc.OracleDriver
    #driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    #driver-class-name: dm.jdbc.driver.DmDriver
    #driver-class-name: com.yashandb.jdbc.Driver
    druid:
      # MySql、PostgreSQL、SqlServer、DaMeng校验
      validation-query: select 1
      # Oracle、YashanDB校验
      #oracle: true
      #validation-query: select 1 from dual
#项目模块集中配置
blade:
  #分布式锁配置
  lock:
    enabled: false
    address: redis://127.0.0.1:6888
  #多团队协作服务配置
  loadbalancer:
    #开启配置
    enabled: true
    #负载均衡优先调用的ip段
    prior-ip-pattern:
      - 192.168.0.*
      - 127.0.0.1
  #通用开发生产环境数据库地址(特殊情况可在对应的子工程里配置覆盖)
  datasource:
    dev:
      # MySql
      url: jdbc:mysql://127.0.0.1:3306/bladex_su_code?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
      username: root
      password: root
  • 1.3 su-code-service-dev.yaml, 下面为开发环境su-code-service.yaml文件,请逐项修改为真实配置.如需配置测试或生产环境,请参照开发环境配置
yaml
#服务器配置
server:
  undertow:
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    io-threads: 16
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    worker-threads: 400
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    buffer-size: 1024
    # 是否分配的直接内存
    direct-buffers: true
#spring配置
spring:
  cloud:
    sentinel:
      eager: true
  devtools:
    restart:
      log-condition-evaluation-delta: false
    livereload:
      port: 23333
  redis:
    host: 127.0.0.1
    port: 6888
    password: 
    database: 0
    ssl: false
    max-idle: 8
    max-total: 32
    max-wait-millis: 1000
    test-on-borrow: true
  datasource:
    druid:
      validation-query: select 1
    dynamic:
      hikari:
        connection-timeout: 30000  # 30 秒
        validation-timeout: 5000   # 5 秒
        idle-timeout: 600000       # 10 分钟
        max-lifetime: 1800000      # 30 分钟
        max-pool-size: 200          # 最大连接池大小,视需求调整
        min-idle: 10               # 最小空闲连接数
        leak-detection-threshold: 2000 # 2 秒(根据实际情况调整)
  kafka:
    bootstrap-servers: 127.0.0.1:9092
#feign配置
feign:
  sentinel:
    enabled: true
  okhttp:
    enabled: true
  httpclient:
    enabled: false

#hystrix配置
hystrix:
  threadpool:
    default:
      coreSize: 300
      maxQueueSize: 1000
      queueSizeRejectionThreshold: 800
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

#ribbon配置
ribbon:
  #对当前实例的重试次数
  MaxAutoRetries: 1
  #切换实例的重试次数
  MaxAutoRetriesNextServer: 2
  #请求处理的超时时间
  ReadTimeout: 60000
  #请求连接的超时时间
  ConnectTimeout: 60000
  #对所有操作请求都进行重试
  OkToRetryOnAllOperations: true

#对外暴露端口
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

#knife4j配置
knife4j:
  #启用
  enable: true
  #基础认证
  basic:
    enable: false
    username: blade
    password: blade
  #增强配置
  setting:
    enableSwaggerModels: true
    enableDocumentManage: true
    enableHost: false
    enableHostText: http://localhost
    enableRequestCache: true
    enableFilterMultipartApis: false
    enableFilterMultipartApiMethodType: POST
    language: zh-CN
    enableFooter: false
    enableFooterCustom: true
    footerCustomContent: Copyright © 2021 BladeX All Rights Reserved

#swagger公共信息
swagger:
    title: xxxx
    description: xxxx
    version: 1.0.0.bate1
    license: Powered By Suconnect
    license-url: xxxx
    terms-of-service-url: xxxxx
    contact:
        name: xxx
        email: xxxx
        url: xxxx

#blade配置
blade:
  #token配置
  token:
    #是否有状态
    state: false
  #redis序列化方式
  redis:
    serializer-type: protostuff
  #接口配置
  api:
    #报文加密配置
    crypto:
      #启用报文加密配置
      enabled: false
      #使用AesUtil.genAesKey()生成
      aes-key: O2BEeIv399qHQNhD6aGW8R8DEj4bqHXm
      #使用DesUtil.genDesKey()生成
      des-key: jMVCBsFGDQr1USHo
  #jackson配置
  jackson:
    #null自动转空值
    null-to-empty: true
    #大数字自动转字符串
    big-num-to-string: true
    #支持text文本请求,与报文加密同时开启
    support-text-plain: false
  #xss配置
  xss:
    enabled: true
    skip-url:
      - /model/web
      - /model/web/
      - /web
      - /web/
      - /history/**
  #安全框架配置
  secure:
    #接口放行
    skip-url:
      - /test/**
    #授权认证配置
    auth:
      - method: ALL
        pattern: /weixin/**
        expression: "hasAuth()"
      - method: POST
        pattern: /dashboard/upload
        expression: "hasTimeAuth(9, 17)"
      - method: POST
        pattern: /dashboard/submit
        expression: "hasAnyRole('administrator', 'admin', 'user')"
    #基础认证配置
    basic:
      - method: ALL
        pattern: /dashboard/info
        username: "blade"
        password: "blade"
    #动态签名认证配置
    sign:
      - method: ALL
        pattern: /dashboard/sign
        crypto: "sha1"
    #多终端认证配置
    client:
      - client-id: sword
        path-patterns:
          - /sword/**
      - client-id: saber
        path-patterns:
          - /saber/**
  #多租户配置
  tenant:
    #多租户增强
    enhance: true
    #多租户授权保护
    license: false
    #动态数据源功能
    dynamic-datasource: false
    #动态数据源全局扫描
    dynamic-global: false
    #多租户字段名
    column: tenant_id
    #排除多租户逻辑
    exclude-tables:
      - blade_user
  lock:
    enabled: false
    address: redis://127.0.0.1:6379
  ribbon:
    rule:
      enabled: true
      prior-ip-pattern:
        - 192.168.0.*
        - 127.0.0.1
  datasource:
    dev:
      url: jdbc:mysql://127.0.0.1:3306/bladex_su_code?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
      username: root
      password: root
xxl:
  job:
    user-name: admin
    password: 123456
    job-group: 2
    service: xxlJobService
    appname: znyd-dynamic-tag-service
    access-token: su-blade-low-code
    executor-ip: 
    admin:
      host: http://127.0.0.1:7009/xxl-job-admin
      addresses: http://127.0.0.1:7009/xxl-job-admin
su:
  datasource:
    type: mysql
    pool-name: master
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/bladex_su_code?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
  docking:
    user-table-name: blade_user
    user-data-source-name: master
    dept-table-name: blade_dept
    dept-data-source-name: master

2.MAVEN setting.xml配置

xml
<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
    <localRepository>D:\software\apache-maven-3.8.6\repository</localRepository>

    <pluginGroups>

    </pluginGroups>


    <proxies>

    </proxies>


    <servers>
        <server>
            <id>jooq-pro</id>
            <username>xxxxx@xxxxx</username>
            <password>xxxx-xxxx-xxxx-xxxx-xxxx</password>
        </server>
        <server>
            <id>bladex</id>
            <configuration>
                <httpHeaders>
                    <property>
                        <name>Authorization</name>
                        <value>token xxxxx</value>
                    </property>
                </httpHeaders>
            </configuration>
        </server>
    </servers>

    <mirrors>
        <mirror>
            <id>aliyun-mirror</id>
            <mirrorOf>"*,!bladex,!evcharge"</mirrorOf>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
</settings>

3.导入MYSQl脚本文件以下文件

  • 文件路径: blade-su-code-service下src/main/resources/mysql

4.修改源码中环境变量

  • 4.1 在blade-biz-common 服务下 org.springblade.common.constant.LauncherConstant类中,维护着nacos xxl-job等配置,系统启动依赖于这些.故需要把相关配置改成真实配置
java
package org.springblade.common.constant;

import org.springblade.core.launch.constant.AppConstant;

import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;

/**
 * 通用常量
 *
 * @author Chill
 */
public interface LauncherConstant {

	/**
	 * nacos 用户名
	 */
	String NACOS_USERNAME = "nacos";

	/**
	 * nacos 密码
	 */
	String NACOS_PASSWORD = "xxxxx";

	/**
	 * xxljob
	 */
	String APPLICATION_XXLJOB_NAME = APPLICATION_NAME_PREFIX + "xxljob";

	/**
	 * xxljob
	 */
	String APPLICATION_XXLJOB_ADMIN_NAME = APPLICATION_NAME_PREFIX + "xxljob-admin";

	/**
	 * nacos namespace id
	 */
	String NACOS_NAMESPACE = "4d22b512-af10-48ce-817f-af2978ea97f1";

	/**
	 * nacos dev 地址
	 */
	String NACOS_DEV_ADDR = "127.0.0.1:8848";

	/**
	 * nacos prod 地址
	 */
	String NACOS_PROD_ADDR = "127.0.0.1:8848";

	/**
	 * nacos test 地址
	 */
	String NACOS_TEST_ADDR = "127.0.0.1:8848";

	/**
	 * sentinel dev 地址
	 */
	String SENTINEL_DEV_ADDR = "127.0.0.1:8858";

	/**
	 * sentinel prod 地址
	 */
	String SENTINEL_PROD_ADDR = "172.30.0.58:8858";

	/**
	 * sentinel test 地址
	 */
	String SENTINEL_TEST_ADDR = "172.30.0.58:8858";

	/**
	 * seata dev 地址
	 */
	String SEATA_DEV_ADDR = "127.0.0.1:8091";

	/**
	 * seata prod 地址
	 */
	String SEATA_PROD_ADDR = "172.30.0.68:8091";

	/**
	 * seata test 地址
	 */
	String SEATA_TEST_ADDR = "172.30.0.68:8091";

	/**
	 * dbuuo提供者
	 */
	String APPLICATION_DUBBO_PROVIDER_NAME = APPLICATION_NAME_PREFIX + "dubbo-provider";

	/**
	 * dbuuo消费者
	 */
	String APPLICATION_DUBBO_CONSUMER_NAME = APPLICATION_NAME_PREFIX + "dubbo-consumer";

	/**
	 * seata订单
	 */
	String APPLICATION_SEATA_ORDER_NAME = APPLICATION_NAME_PREFIX + "seata-order";

	/**
	 * seata库存
	 */
	String APPLICATION_SEATA_STORAGE_NAME = APPLICATION_NAME_PREFIX + "seata-storage";

	/**
	 * easypoi
	 */
	String APPLICATION_EASYPOI_NAME = APPLICATION_NAME_PREFIX + "easypoi";

	/**
	 * kafka
	 */
	String APPLICATION_KAFKA_NAME = APPLICATION_NAME_PREFIX + "kafka";

	/**
	 * rabbit
	 */
	String APPLICATION_RABBIT_NAME = APPLICATION_NAME_PREFIX + "rabbit";

	/**
	 * stream消费者
	 */
	String APPLICATION_STREAM_CONSUMER_NAME = APPLICATION_NAME_PREFIX + "stream-consumer";

	/**
	 * stream生产者
	 */
	String APPLICATION_STREAM_PROVIDER_NAME = APPLICATION_NAME_PREFIX + "stream-provider";

	/**
	 * seata file模式
	 */
	String FILE_MODE = "file";

	/**
	 * seata nacos模式
	 */
	String NACOS_MODE = "nacos";

	/**
	 * seata default模式
	 */
	String DEFAULT_MODE = "default";

	/**
	 * seata group后缀
	 */
	String GROUP_NAME = "-group";

	/**
	 * seata 服务组格式
	 *
	 * @param appName 服务名
	 * @return group
	 */
	static String seataServiceGroup(String appName) {
		return appName.concat(GROUP_NAME);
	}

	/**
	 * 动态获取nacos地址
	 *
	 * @param profile 环境变量
	 * @return addr
	 */
	static String nacosAddr(String profile) {
		switch (profile) {
			case (AppConstant.PROD_CODE):
				return NACOS_PROD_ADDR;
			case (AppConstant.TEST_CODE):
				return NACOS_TEST_ADDR;
			default:
				return NACOS_DEV_ADDR;
		}
	}

	/**
	 * 动态获取sentinel地址
	 *
	 * @param profile 环境变量
	 * @return addr
	 */
	static String sentinelAddr(String profile) {
		switch (profile) {
			case (AppConstant.PROD_CODE):
				return SENTINEL_PROD_ADDR;
			case (AppConstant.TEST_CODE):
				return SENTINEL_TEST_ADDR;
			default:
				return SENTINEL_DEV_ADDR;
		}
	}

	/**
	 * 动态获取seata地址
	 *
	 * @param profile 环境变量
	 * @return addr
	 */
	static String seataAddr(String profile) {
		switch (profile) {
			case (AppConstant.PROD_CODE):
				return SEATA_PROD_ADDR;
			case (AppConstant.TEST_CODE):
				return SEATA_TEST_ADDR;
			default:
				return SEATA_DEV_ADDR;
		}
	}

}
  • 4.2 blade-biz-common 服务下 org.springblade.common.launch.LauncherServiceImpl类,是系统启动配置的入口.需要结合实际确确认是否修改
java
package org.springblade.common.launch;

import org.springblade.common.constant.LauncherConstant;
import org.springblade.core.auto.service.AutoService;
import org.springblade.core.launch.service.LauncherService;
import org.springblade.core.launch.utils.PropsUtil;
import org.springframework.boot.builder.SpringApplicationBuilder;

import java.util.Properties;

/**
 * 启动参数拓展
 *
 * @author smallchil
 */
@AutoService(LauncherService.class)
public class LauncherServiceImpl implements LauncherService {

	@Override
	public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
		Properties props = System.getProperties();
		// 通用注册
		PropsUtil.setProperty(props, "spring.cloud.nacos.username", LauncherConstant.NACOS_USERNAME);
		PropsUtil.setProperty(props, "spring.cloud.nacos.password", LauncherConstant.NACOS_PASSWORD);
		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
		PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
		PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE);
		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE);


		//PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));

		// seata注册地址
		//PropsUtil.setProperty(props, "seata.service.grouplist.default", LauncherConstant.seataAddr(profile));
		// seata注册group格式
		//PropsUtil.setProperty(props, "seata.tx-service-group", LauncherConstant.seataServiceGroup(appName));
		// seata配置服务group
		//PropsUtil.setProperty(props, "seata.service.vgroup-mapping.".concat(LauncherConstant.seataServiceGroup(appName)), LauncherConstant.DEFAULT_MODE);
		// seata注册模式配置
		// PropsUtil.setProperty(props, "seata.registry.type", LauncherConstant.NACOS_MODE);
		// PropsUtil.setProperty(props, "seata.registry.nacos.server-addr", LauncherConstant.nacosAddr(profile));
		// PropsUtil.setProperty(props, "seata.config.type", LauncherConstant.NACOS_MODE);
		// PropsUtil.setProperty(props, "seata.config.nacos.server-addr", LauncherConstant.nacosAddr(profile));

	}

}

5.启动服务

  • 5.1 将bladex基础服务打成jar包,并启动
  • 5.2 将blade-su-code-service服务打成jar包,并启动

blade-su-code-service 目录说明

├─src
│  └─main
│      ├─java
│      │  └─com
│      │      └─su
│      │          └─code
│      │              │  SuCodeApplication.java 启动类
│      │              ├─common  工具包
│      │              │  ├─annotation 注解
│      │              │  ├─constant   常量
│      │              │  ├─enums      枚举
│      │              │  ├─exception  异常
│      │              │  ├─model      模型
│      │              │  └─util       工具
│      │              ├─config        配置
│      │              ├─controller    控制类
│      │              ├─datasource    数据源类
│      │              │  ├─aspect     切面
│      │              │  ├─config     配置
│      │              │  ├─constant   常量
│      │              │  ├─creator    数据源维护
│      │              │  ├─entity     对象
│      │              │  ├─manager    管理
│      │              │  │  └─impl    实现
│      │              │  ├─model      模型
│      │              │  ├─proxy      代理
│      │              │  └─service    服务
│      │              │      └─impl   实现类
│      │              ├─exception     异常
│      │              │  ├─config     配置
│      │              │  └─util       工具类
│      │              ├─linstener     监听 
│      │              ├─model         模型
│      │              │  └─dto        业务对象
│      │              ├─persistence   数据层
│      │              │  ├─command    命令
│      │              │  │  └─parser  解析    
│      │              │  ├─config     配置
│      │              │  ├─constant   常量
│      │              │  ├─dao        数据层
│      │              │  │  └─impl    实现层
│      │              │  ├─enums      枚举
│      │              │  ├─event      事件
│      │              │  ├─exception  异常
│      │              │  ├─model      模型 
│      │              │  │  └─jooq    jooq拓展
│      │              │  ├─result     数据返回封装层 
│      │              │  ├─service    服务层
│      │              │  │  └─impl    实现层
│      │              │  └─util       工具层
│      │              └─service       业务服务层
│      │                  └─impl      业务实现层