# 快速构建

接下来,我们来看下,如何快速简单的构建一个后端应用。

# 1. 使用idea创建新工程

打开你的IDEA,File > New > Project,新建一个SpringBoot项目

提示

Group: 一律使用com.jfbrother

Artifact: 请使用你的项目名,不要和旧项目名称重复

因为这是一个demo项目,所以这里使用demo

Java Version: 一律使用java:8

其他项可以使用默认

提示

Maven依赖项,可以不选择,后续可直接在pom.xml手动进行添加。

# 2. 项目构建

提示

如果右侧没有自动出现Maven标签卡,则在项目的pom.xml文件上右键,选择Add as Maven Project

# 3. 添加Maven依赖

提示

parent标签是V6基础库的必须依赖。请注意版本号,如果新项目,如无特殊要求,建议使用最新版本。

最新版本号可在公司Git仓库(opens new window) 进行查看。

⭐️该URL需要进行登录,如果你没有公司的Git账号,请向你的上属领导咨询。

其余依赖和插件配置均可留空,如果需要自定义的依赖,可按照Maven规则继续添加






 
 
 
 
 
 












<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.jfbrother</groupId>
        <artifactId>parent</artifactId>
        <version>4.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.jfbrother</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>

    </dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 4. 添加配置文件

注意

为了统一风格,所有配置文件,一律采用yaml文件进行管理。

禁止使用properties文件(log4jdbc.log4j2.properties较特殊,暂时无法采用yaml方式)

首先你要现将默认生成的配置文件进行删除

在相同目录下,手动创建以下通用配置文件

application.yml 主配置文件
server:
  port: 8990
  servlet:
    session:
      tracking-modes: cookie
      cookie:
        # 去掉url中的jsessionid,只允许cookie传输
        http-only: true
  max-http-header-size: 65546
spring:
  profiles:
    active: dev
    include: logging,white-list,aj,knife4j,xxl,rabbit-mq
  main:
    allow-bean-definition-overriding: true
  datasource:
    druid:
      validation-query: select 1
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      type: com.alibaba.druid.pool.DruidDataSource
      # 启用监控页面,10+版本要手动开启监控页面
      stat-view-servlet:
        enabled: true
        #        login-username: root
        #        login-password: jfbrother_2016
        allow:
      filters: config,stat,wall,slf4j,mergeStat
      filter:
        stat:
          # 慢sql记录
          slow-sql-millis: 5000
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        # dialect: org.hibernate.dialect.Oracle10gDialect
        dialect: org.hibernate.dialect.MySQL5Dialect
      hibernate.format_sql: true
  freemarker:
    template-loader-path:
      - classpath:/template
  activiti:
    check-process-definitions: false
  servlet:
    multipart:
      enabled: true
      max-file-size: 300MB
      max-request-size: 300MB
  application:
    name: 共享加工平台
  boot:
    admin:
      client:
        url: http://springboot.jfbrother.com
        instance:
          prefer-ip: true
          # 如果你不能自动获取局域网ip注册到springboot-admin,你可以这样主动设置
          # service-base-url: http://ip:端口
  data:
    redis:
      repositories:
        # 用于解决redis提示【Could not safely identify store assignment for repository candidate interface】的问题
        enabled: false
#设置欢迎页面(默认是swagger2文档首页)
welcome: doc.html
system:
  api:
    listAll:
      max: 100
    pageable:
      default:
        page: 0
        size: 10
        sort: createTime
  password:
    default: 123456
  # 系统数据的公司id(暂时是固定的)
  companyId: ff8080816cd213cd016cd23a68610000
  file:
    upload: ./temp
retrofit:
  # 启用日志打印
  enable-log: true
  global-converter-factories:
    - com.alibaba.fastjson.support.retrofit.Retrofit2ConverterFactory
  enable-degrade: true
management:
  endpoints:
    web:
      exposure:
        include: ["*"]
cas:
  server-url-prefix: http://cas.jfbrother.com/cas-jfsso
  server-login-url: http://cas.jfbrother.com/cas-jfsso/login
  client-host-url: http://localhost:${server.port}
  validation-type: cas
  authentication-url-patterns:
    - /api/v1/system/cas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
application-logging.yml 日志相关配置
# 日志设置
logging:
  level:
    # 在使用@ApiModelProperty注解在字段上时,
    # 如果字段的类型为Long或是int类型,
    # 那么程序启动后,访问swagger-ui.html的页面,程序会报错
    # java.lang.NumberFormatException: For input string: ""
    # 在swagger的官方文档中介绍是一个bug;可以忽略这个错误,如果看着不爽,可以调整日志的级别为error
    io.swagger.models.parameters.AbstractSerializableParameter: error
    org.hibernate.SQL: error
    org.hibernate.type.descriptor.sql.BasicBinder: error
    com.jfbrother: trace
    com.jfbrother.baseserver.version.CustomRequestMappingHandlerMapping: error
    # 配合log4jdbc使用
    jdbc.connection: off
    jdbc.resultset: off
    jdbc.resultsettable: off
    jdbc.audit: off
    jdbc.sqlonly: off
    # log4jdbc的sql详细,建议需要打开时,通过http://springboot.jfbrother.com,调整日志级别进行输出
    jdbc.sqltiming: off
    # 去除类似Generating unique operation named: getUsingGET_1的无用日志
    springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator: off
    # retrofit日志
    com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor: off
  pattern:
    console: "%clr(%d{yyyy/MM/dd-HH:mm:ss}){cyan} [%thread] %clr(%-5p)level %clr(%logger){magenta}- %msg%n"
    file: "%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n"
  file:
    max-history: 7
    max-size: 10MB
  path: logs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
application-white-list.yml 白名单配置
# 白名单设置
system:
  white-list:
    paths:
      - /api/v1/system/login
      - /api/v1/system/logout
      - /api/v1/system/cas
      - /api/v1/system/cas/**/token
      - /api/v1/system/casCheck
      - /api/v1/person/account/telephone_register_code
      - /api/v1/person/account/telephone_register
      - /api/v1/person/account/username_check
      - /api/v1/person/account/default_login
      - /api/v1/person/account/telephone_login_code
      - /api/v1/person/account/telephone_login
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
application-knife4j.yml knife4j配置
# https://doc.xiaominfo.com/knife4j/documentation/enhance.html
knife4j:
  enable: true
  documents:
    - group: 2.X版本
      name: 接口签名
      locations: classpath:sign/*
  setting:
    language: zh-CN
    enableSwaggerModels: true
    enableDocumentManage: true
    swaggerModelName: 实体类列表
    enableVersion: false
    enableReloadCacheParameter: false
    enableAfterScript: true
    enableFilterMultipartApiMethodType: POST
    enableFilterMultipartApis: false
    enableRequestCache: true
    enableHost: false
    enableHostText: 192.168.0.193:8000
    enableHomeCustom: true
    homeCustomLocation: classpath:markdown/home.md
    enableSearch: true
    enableFooter: false
    enableFooterCustom: true
    footerCustomContent: "[浙江杰夫兄弟智慧科技有限公司](https://www.jfbrother.com) 浙ICP备:16044969号"
    enableDynamicParameter: false
    enableDebug: true
    enableOpenApi: false
    enableGroup: true
  cors: false
  production: false
  basic:
    enable: true
    username: root
    password: jfbrother_2016
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
application-aj.yml 行为验证码配置
aj:
  captcha:
    cache-type: redis
    # local定时清除过期缓存(单位秒),设置为0代表不执行
    timing-clear: 180
    # local缓存的阈值,达到这个值,清除缓存
    #    cache-number: 1000
    # 汉字统一使用Unicode,保证程序通过@value读取到是中文,可通过这个在线转换 https://tool.chinaz.com/tools/unicode.aspx 中文转Unicode
    # 右下角水印文字(我的水印)
    water-mark:
    #右下角水印字体(宋体)
    #water-font: 宋体
    #点选文字验证码的文字字体(宋体)
    #font-type: 宋体
    #校验滑动拼图允许误差偏移量(默认5像素)
    slip-offset: 5
    #aes加密坐标开启或者禁用(true|false)
    aes-status: true
    #滑动干扰项(0/1/2) 1.2.2版本新增
    interference-options: 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
application-xxl.yml 分布式定时任务配置
xxl:
  enable: false
  job:
    admin:
      addresses: http://xxl.jfbrother.com/xxl-job-admin
    accessToken:
    executor:
      appname: kungu
      address:
      ip:
      port:
      logpath: ./logs/xxl
      logretentiondays: 30
  login:
    username: admin
    password: 123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
application-rabbit-mq.yml rabbitMQ配置
spring:
  rabbitmq:
    host: 192.168.1.116
    port: 5672
    username: gxjg
    password: gxjg123
    virtual-host: /gxjg
    listener:
      simple:
        # 手动进行消息确认
        acknowledge-mode: manual
        # 消费者最小数量
        concurrency: 3
        # 消费者最大数量
        max-concurrency: 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
log4jdbc.log4j2.properties log4jdbc
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
1

继续创建以下3个默认环境配置文件

提示

  1. db_name,db_username,db_password请按照实际情况进行修改。

如果还没有对应项目的数据库,请向你的直属领导咨询。

  1. 注释掉的druid.urldruid.driver-class-name,是最原始的配置(jpa的默认日志输出格式是?1,?2这类格式,sql和参数分离),当前采用的配置可以实现sql的详细打印(包括sql语句和参数)

建议在生产环境中关闭该功能,将两个注释进行反转即可。

application-dev.yml 开发环境配置类
spring:
  datasource:
    druid:
      #      url: jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      url: jdbc:log4jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      username: { db_username }
      password: { db_password }
      #      driver-class-name: com.mysql.cj.jdbc.Driver
      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
  redis:
    database: 2
    host: 192.168.1.251
    #    host: 127.0.0.1
    port: 6379
swagger:
  enable: true
system:
  filter:
    sign:
      enable: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
application-test.yml 测试环境配置类
spring:
  datasource:
    druid:
      #      url: jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      url: jdbc:log4jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      username: { db_username }
      password: { db_password }
      #      driver-class-name: com.mysql.cj.jdbc.Driver
      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
  redis:
    database: 2
    host: 192.168.1.251
    #    host: 127.0.0.1
    port: 6379
swagger:
  enable: true
system:
  filter:
    sign:
      enable: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
application-prod.yml 生产环境配置类
spring:
  datasource:
    druid:
      #      url: jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      url: jdbc:log4jdbc:mysql://192.168.1.55:3306/{db_name}?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT
      username: { db_username }
      password: { db_password }
      #      driver-class-name: com.mysql.cj.jdbc.Driver
      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
  redis:
    database: 2
    host: 192.168.1.251
    #    host: 127.0.0.1
    port: 6379
swagger:
  enable: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 5. 修改启动类

注意

EnableJpaAuditing 用于开启数据库的审计功能

排除扫描DataSourceAutoConfiguration是为了防止循环引用错误

started方法用于显示指定时区,防止生产环境时区错乱

这些注解,目前是必加的。但是也不排除后续基础包的升级,默认将这些配置打入包中的可能。

警告

注意修改所属包路径!启动类必须位于com.jfbrother的根目录下,否则将无法扫描到基础包(com.jfbrother.baseserver)内的配置类。

package com.jfbrother;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import javax.annotation.PostConstruct;
import java.util.TimeZone;

/**
 * @author luosz
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableJpaAuditing
@Slf4j
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    /**
     * 显示指定时区,防止生产环境时区错乱
     */
    @PostConstruct
    void started() {
        String id = "Asia/Shanghai";
        log.info("显示指定服务器时区:{}", id);
        TimeZone.setDefault(TimeZone.getTimeZone(id));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 6. 删除默认生成的test测试类

提示

由于目前版本没有强制要求写测试类。

所以基础包没有默认引用Junit相关的包,如果你想写测试类,可以自己加入相关依赖。

如果不写测试类,则将默认生成的测试类进行删除即可

删除src/test/java下的com.jfbrother.demo.DemoApplicationTests

# 7. 使用启动类进行项目的启动

正常情况,IDEA会在RUN/DEBUG Configuration中自动生成启动配置,点击该配置的DEBUG模式可快速启动项目。

建议开发过程中一直保持DEBUG模式启动,不要选择RUN模式。

最后一次更新: 2021-6-2 16:28:35