Skip to content

如何新建项目 例如新建电商服务

1. 新建一个模块,如 yipeng-shopping

效果图 img30

2. 在 yipeng-shopping 的 pom.xml 文件中添加以下依赖即可

xml
    <dependencies>
        <!--核心包-->
        <dependency>
            <groupId>com.yipeng.framework</groupId>
            <artifactId>framework-core</artifactId>
        </dependency>

        <!--权限校验-->
        <dependency>
            <groupId>com.yipeng.framework</groupId>
            <artifactId>framework-security</artifactId>
        </dependency>
    
    </dependencies>

    <!--打包配置-->
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

3. 在项目启动类上添加以下注解内容即可

java
package com.kp.framework;

import com.kp.framework.utils.kptool.KPIconUtil;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.util.Arrays;

@SpringBootApplication
@MapperScan({"com.**.modules.*.mapper", "com.**.mapper"})
@EnableConfigurationProperties
@EnableAsync
@EnableScheduling
public class ShoppingApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShoppingApplication.class, args);
        KPIconUtil.ok(KPIconUtil.GREEN);
        String[] details = {
                "本地接口地址:http://127.0.0.1:9001/doc.html",
                "本地Druid地址:http://127.0.0.1:9001/druid/index.html",

                "正式接口地址:http://kpopen.cn/doc.html",
                "正式前端地址:http://kpopen.cn/front",
                "测试接口地址:http://kpopen.cn/doc.html",
                "测试前端地址:http://kpopen.cn/front"
        };
        KPIconUtil.println(KPIconUtil.YELLOW, Arrays.asList(details), false);
    }
}

4. 在`resources` 目录下新建 `application.yml` 和 `logback-spring.xml` 配置文件,并添加以下内容

application.yml
env: dev

server:
  port: 9001

spring:
  application:
    name: authentication
  servlet:
    # 应用的访问路径
    context-path: /
    multipart:
      enabled: true # 开启文件上传
      max-file-size: 100MB # 单个文件最大大小(根据你的业务调整,比如500MB)
      max-request-size: 100MB # 单次请求最大大小(需大于等于max-file-size)
      file-size-threshold: 5MB # 超过该大小的文件会写入磁盘,否则在内存
      location: /data/file # 临时文件存储目录

  devtools:
    restart:
      enabled: true # 启用开发工具自动重启功能,代码变更时自动重启应用(开发阶段使用)
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    dynamic:
      primary: yipeng_auth
      strict: true
      datasource:
        yipeng_auth:
          url: jdbc:mysql://127.0.0.1:3306/yipeng_auth_dev?useUnicode=true&autoReconnect=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL
          username: username
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver
      hikari:
        maxPoolSize: 20
        minIdle: 10
  data:
    redis:
      host: 127.0.0.1     # Redis服务器地址
      port: 6379          # Redis服务器连接端口
      password: password    # Redis服务器连接密码(默认为空)
      database: 0         # Redis数据库索引(默认为0)
      timeout: 60s        # 连接空闲超过N(s秒、ms毫秒,不加单位时使用毫秒)后关闭,0为禁用,这里配置值和tcp-keepalive值一致
      lettuce:  # Lettuce连接池配置
        pool:
          max-active: 10  # 允许最大连接数,默认8(负值表示没有限制),推荐值:大于cpu * 2,通常为(cpu * 2) + 2   Lettuce 是多路复用(single connection, async),不像 Jedis 那样每个操作占一个连接。 通常 1~2 个物理连接就能支撑高并发
          max-idle: 8     # 最大空闲连接数,默认8,推荐值:cpu * 2
          min-idle: 2     # 最小空闲连接数,默认0
          max-wait: 5s    # 连接用完时,新的请求等待时间(s秒、ms毫秒),超过该时间抛出异常,默认-1(负值表示没有限制)
  cache:
    type: redis                   # 指定缓存用Redis,开启缓存注解核心开关

  flyway:
    enabled: true # 是否开启 Flyway
    encoding: UTF-8 # 设置数据库编码格式
    locations: classpath:db # 设置 Flyway 的 SQL 文件位置
    baseline-on-migrate: true # 关键:Spring Boot 3.x 要求连字符命名
    sql-migration-prefix: V # 关键:连字符命名
    sql-migration-separator: _ # 关键:连字符命名
    sql-migration-suffixes: sql # 关键:连字符命名
    validate-on-migrate: true # 关键:连字符命名
    fail-on-missing-locations: false #当 Flyway 找不到配置的脚本目录时,是否终止启动并报错 false 表示「不报错,忽略这个问题」
    clean-disabled: true #是否禁用 Flyway 的 clean 命令 true 表示禁用,不允许执行 clean 操作

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*Mapper.xml,classpath:/mapper/**/custom/*CustomMapper.xml
  typeAliasesPackage: com.kp.framework.**.po,com.kp.framework.**.po.custom,com.kp.framework.**.po.param
  global-config:
    db-config:
      id-type: auto # 主键生成策略(数据库自增)
      logic-delete-value: -1  # 逻辑删除标记值(-1表示已删除)
      logic-not-delete-value: 0 # 逻辑未删除标记值(0表示未删除)
    banner: false # 关闭启动时的MyBatis-Plus横幅
    enable-sql-runner: true # 启用SQL执行器(打印SQL日志)
  configuration:
    map-underscore-to-camel-case: true # 启用驼峰命名映射(数据库下划线转Java驼峰)
    cache-enabled: true # 启用二级缓存
    call-setters-on-nulls: true  # 允许NULL值设置字段
    jdbc-type-for-null: 'null'  # JDBC中NULL值类型


# ===================== SpringDoc 核心配置(适配 OpenAPI 3.0) =====================
springdoc:
  default-consumes-media-type: application/json
  default-produces-media-type: application/json
  swagger-ui: # Swagger UI 前端页面配置
    path: /swagger-ui.html   # 自定义 Swagger UI 访问路径(默认是 /swagger-ui/index.html,这里改为更常用的 /swagger-ui.html)
    #    tags-sorter: alpha # 标签(Tag)排序规则:alpha 按字母序排序(可选:alpha/order,order 按定义顺序)
    operations-sorter: order  # 接口(Operation)排序规则:注释掉表示使用默认(alpha),开启 order 则按 @Operation(operationId) 或定义顺序
  api-docs: # OpenAPI 接口文档的 JSON 数据接口配置(供前端 UI 渲染使用)
    enabled: true
    path: /v3/api-docs  # 自定义 API 文档 JSON 数据的访问路径(默认 /v3/api-docs)
  info:
    title: 易鹏框架实体模块 # 文档标题(界面顶部显示)
    description: "易鹏微服务框架官方接口文档,提供用户、权限、资源等核心模块的接口定义" # 文档简介(界面“简介”区域)
    version: v1.0.0 # 文档版本(界面“版本”区域)
    contact: # 作者/联系方式(界面“作者”区域)
      name: 李鹏
      email: 920297199@qq.com
      url: http://kpopen.cn/author
    termsOfService: http://kpopen.cn/terms # API服务条款(界面“API服务条款”区域)
  #  group-configs:   # 接口文档分组配置(支持多模块/多版本分组)
  #    - group: 'default' # 分组名称(默认分组,可自定义如:user、order)
  #      #display-name: '分组名称'  # 分组显示名称(注释掉则使用 group 名)
  #      paths-to-match: '/**' # 匹配所有路径的接口(
  #      packages-to-scan: com.kp.framework # 扫描指定包下的接口
  default-flat-param-object: true  # 扁平化参数对象:true 表示将嵌套的 POJO 参数展平为单个参数列表(前端显示更友好)

# ===================== Knife4j 增强配置(基于 SpringDoc 扩展) =====================
knife4j: # 其他配置 参考 https://doc.xiaominfo.com/docs/features/enhance
  enable: true # 开启 Knife4j 增强功能
  production: false # 生产环境屏蔽配置:开启 production: true 则禁止访问文档(防止泄露接口信息)
  basic: # Knife4j 基础认证配置
    enable: false  # 是否开启基础认证
    username: username # 认证用户名(开启 basic.enable 后生效)
    password: password  # 认证密码(开启 basic.enable 后生效)
  setting: # Knife4j 界面自定义配置
    language: zh_cn # 界面语言:zh_cn 中文(默认),en 英文
    enable-version: true  # 是否显示接口版本号:true 显示(需接口上配置 @Operation(version = "1.0"))
    enable-swagger-models: false  # 是否显示 Swagger 模型(实体类):true 显示,false 隐藏
    swagger-model-name: 易鹏框架实体模块 # Swagger 模型的分组名称(前端显示的实体类模块名)
    enable-reload-cache-parameter: true #是否在每个Debug调试栏后显示刷新变量按钮,默认不显示
    enable-footer-custom: true #是否开启自定义Footer
    footer-custom-content: "易鹏微服务框架官方接口文档 官网地址:http://kpopen.cn/"
    enable-group: true # 开启分组排序支持


pagehelper:
  auto-dialect: true  # 自动检测数据库方言
  auto-runtime-dialect: true # 运行时自动检测数据库方言
  params: count=countSql  # 分页参数配置(计数SQL参数)

kp:
  token:
    header: Authorization # JWT令牌请求头名称
    secret: abcdefghijklmnopqrstuvwxyz # JWT签名密钥
    expireTime: 36000 # 令牌过期时间(秒)默认 1800  30分钟
    head: Bearer # 令牌类型前缀(如Bearer Token) 默认 Bearer
    multiAccess: false # 是否允许同一账号多人登录 默认false
  user:
    error-number: 5 #登录失败最大锁定次数 默认 5 
    lock-time: 1440 #锁定时间 单位 分 默认 24小时
    default-password: 123456 # 默认用户密码 默认 123456
  minio:
    url: http://127.0.0.1:9000
    user-name: minio
    password: password
  log:
    interface-log: true
    http-log: true
    interface-consume-num: 100 #接口记录日志 消费条数(每次读取队列多少条) 默认 100
    http-consume-num: 5 # http记录日志 消费条数(每次读取队列多少条) 默认 30
    interface-Archive-Day: 30 #接口记录日志归档天数 多少天以前的归档
    http-Archive-Day: 60 #http记录日志归档天数 多少天以前的归档
  project-name: 鉴权项目 # 项目名称
  green-channel-login:  # 可以进行免密登录的项目编号
    - authentication


logging:
  level:
    com.kp.framework.modules: DEBUG
logback-spring.xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- 核心修正:指定Spring Boot的Configurator,支持springProperty -->
<configuration scan="true" scanPeriod="30 seconds" contextName="daoben-framework">
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <!-- 文件存储地址 读取application.yml中的log.path配置 -->
    <springProperty name="logPath" scope="context" source="log.path" defaultValue="./logs"/>
    <!-- 自动创建history子目录(解决目录不存在问题) -->
    <property name="archivePath" value="${logPath}/history"/>
    <!-- 统一日志格式 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56} - %msg%n"/>
    <property name="LOG_CHARSET" value="UTF-8"/>

    <!-- 开发打印控制台日志 -->
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <!-- 1. 全部日志 Appender(核心修正:additivity=false 避免重复) -->
    <appender name="all" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 多进程安全写入 -->
        <prudent>false</prudent>
        <File>${logPath}/all.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${archivePath}/all-%d{yyyyMMdd}.%i.log</fileNamePattern>
            <!-- 修正:保留60天(原180天) -->
            <maxHistory>60</maxHistory>
            <maxFileSize>30MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
            <!-- 自动创建归档目录 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="all"/>
    </root>

    <!-- 2. HTTP请求日志 Appender(核心修正:additivity=false) -->
    <appender name="okHttp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <prudent>false</prudent>
        <File>${logPath}/http.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${archivePath}/http-%d{yyyyMMdd}.%i.log</fileNamePattern>
            <maxHistory>60</maxHistory>
            <maxFileSize>30MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>
    </appender>
    <logger name="com.kp.framework.utils.kptool.KPOkHttpHelperUtil" level="info" additivity="true">
        <appender-ref ref="okHttp"/>
    </logger>

</configuration>