如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):https://gitee.com/csps/mingyue
源码地址(前端):https://gitee.com/csps/mingyue-ui
文档地址:https://gitee.com/csps/mingyue/wikis
基础的东西就不再写了,本架构数据层采用
mybatis
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${mybatis-plus.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-annotationartifactId>
<version>${mybatis-plus.version}version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>${mybatis-plus.version}version>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-system-apiartifactId>
<version>${project.version}version>
dependency>
<dependencies>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-annotationartifactId>
dependency>
dependencies>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-common-coreartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-system-apiartifactId>
dependency>
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
dependency>
<dependency>
<groupId>org.apache.velocitygroupId>
<artifactId>velocity-engine-coreartifactId>
<version>2.3version>
dependency>
借助代码生成器可以缩减一些开发时间~
打开 com.csp.mingyue.system.gen.MysqlCodeGenerator 代码生成类
public static void main(String[] args) {
FastAutoGenerator.create(
"jdbc:mysql://mingyue-mysql:3306/mingyue?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true",
"root", "mingyue")
// 全局配置
.globalConfig(builder -> {
builder.author("Strive") // 设置作者
.commentDate("yyyy-MM-dd hh:mm:ss") //注释日期
.outputDir(System.getProperty("user.dir") + "/gen/src/main/java") // 指定输出目录
.disableOpenDir() //禁止打开输出目录,默认打开
;
})
// 包配置
.packageConfig(builder -> {
builder.parent("com.csp.mingyue.system") // 设置父包名
.pathInfo(Collections.singletonMap(OutputFile.xml,
System.getProperty("user.dir") + "/gen/src/main/resources/mappers")); // 设置mapperXml生成路径
})
// 策略配置
.strategyConfig(builder -> {
builder.addInclude("sys_user") // 设置需要生成的表名
//.addTablePrefix("sys_") // 设置过滤表前缀
// Entity 策略配置
.entityBuilder()
.enableLombok() //开启 Lombok
.enableFileOverride() // 覆盖已生成文件
.naming(NamingStrategy.underline_to_camel) //数据库表映射到实体的命名策略:下划线转驼峰命
.columnNaming(NamingStrategy.underline_to_camel) //数据库表字段映射到实体的命名策略:下划线转驼峰命
// Mapper 策略配置
.mapperBuilder()
.enableFileOverride() // 覆盖已生成文件
// Service 策略配置
.serviceBuilder()
.enableFileOverride() // 覆盖已生成文件
.formatServiceFileName("%sService") //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
.formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl
// Controller 策略配置
.controllerBuilder()
.enableFileOverride() // 覆盖已生成文件
;
})
.execute();
}
执行 mian
函数,代码会生成在根目录 gen
目录下,生成代码结构如下图:
生成的 SysUser 实体类,包路径为:com.csp.mingyue.system.entity.SysUser
,修改为:com.csp.mingyue.system.api.entity.SysUser
,再修改一下其他引入类的路径即可。
mingyue-system-biz 添加 MybatisPlusConfiguration 类配置 mybatis-plus 配置,如扫描路径、分页插件等
import cn.hutool.core.net.NetUtil;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* mybatis-plus 配置类
*
* @author Strive
*/
@AutoConfiguration
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfiguration {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
// 分页合理化
paginationInnerInterceptor.setOverflow(true);
return paginationInnerInterceptor;
}
/**
* 使用网卡信息绑定雪花生成器
* 防止集群雪花ID重复
*/
@Primary
@Bean
public IdentifierGenerator idGenerator() {
return new DefaultIdentifierGenerator(NetUtil.getLocalhost());
}
}
需要自动导入的类,将包路径放入 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中即可(利用的是 SPI 机制)
SPI(Service Provider Interface) 是 JDK 内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,例如 Dubbo、Spring、Common-Logging,JDBC 等采用采用 SPI 机制,针对同一接口采用不同的实现提供给不同的用户,从而提高了框架的扩展性。
com.csp.mingyue.system.config.MybatisPlusConfiguration
后续配置迁移到 nacos
# 端口
server:
port: 8000
spring:
application:
name: @artifactId@
profiles:
# 环境配置
active: @profiles.active@
cloud:
nacos:
# nacos 服务地址
server-addr: @nacos.server@
username: @nacos.username@
password: @nacos.password@
discovery:
# 注册组
group: @nacos.discovery.group@
namespace: ${spring.profiles.active}
config:
# 配置组
group: @nacos.config.group@
namespace: ${spring.profiles.active}
config:
import:
- optional:nacos:application-common.yml
- optional:nacos:${spring.application.name}.yml
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: mingyue
url: jdbc:mysql://mingyue-mysql:3306/mingyue?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
# MyBatis-Plus 配置
mybatis-plus:
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
# 例如 com.**.**.mapper
mapperPackage: com.csp.mingyue.**.mapper
# 对应的 XML 文件位置
mapperLocations: classpath*:/mapper/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.csp.mingyue.**.domain
# 启动时是否检查 MyBatis XML 文件的存在,默认不检查
checkConfigLocation: false
configuration:
# 自动驼峰命名规则(camel case)映射
mapUnderscoreToCamelCase: true
# MyBatis 自动映射策略
# NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
autoMappingBehavior: PARTIAL
# MyBatis 自动映射时未知列或未知属性处理策
# NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
autoMappingUnknownColumnBehavior: NONE
# 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl
# 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl
logImpl: org.apache.ibatis.logging.nologging.NoLoggingImpl
global-config:
# 是否打印 Logo banner
banner: true
dbConfig:
# 主键类型
# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
idType: ASSIGN_ID
# 逻辑已删除值
logicDeleteValue: 1
# 逻辑未删除值
logicNotDeleteValue: 0
insertStrategy: NOT_NULL
updateStrategy: NOT_NULL
where-strategy: NOT_NULL
测试接口,发送请求
curl --location --request GET 'http://127.0.0.1:8000/sysUser/getSysUsers' \
--header 'User-Agent: Apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8000' \
--header 'Connection: keep-alive'
接口返回:
{
"code": 200,
"msg": "操作成功",
"data": [
{
"userId": 1,
"username": "mingyue",
"nickname": "明月",
"sex": "0",
"password": "123456",
"phone": "13260718262",
"email": null,
"avatar": null,
"lockFlag": "0",
"delFlag": "0",
"createTime": null,
"updateTime": null,
"createBy": null,
"updateBy": null
}
]
}
下一篇准备优化一下代码结构,丰富一下接口(用户名查找用户信息接口),预备给 mingyue-auth 认证中心
使用。