前要
項目設(shè)計–宿舍管理系統(tǒng)
項目建立
太長了,修改一下
導(dǎo)入依賴
暫時先加上下面依賴,還有的話以后在看
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<hutool.version>5.8.15</hutool.version>
<druid.version>1.2.16</druid.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<xxl-job.version>2.4.0</xxl-job.version>
<java-jwt.version>4.2.1</java-jwt.version>
<easyexcel.version>3.2.1</easyexcel.version>
<easy-captcha.version>1.6.2</easy-captcha.version>
<knife4j.version>4.0.0</knife4j.version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--mybatis-plus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--jwt令牌-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>${java-jwt.version}</version>
</dependency>
<!--連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--hutool工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--xxl-job定時任務(wù)-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job</artifactId>
<version>${xxl-job.version}</version>
</dependency>
<!--excel操作-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<!-- 驗證碼 -->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>${easy-captcha.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
配置文件
application.yml
spring:
application:
name: xiaoyu
profiles:
active: dev
application-dev.yml
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url:
username:
password:
data:
redis:
database: 6
host:
port:
password:
timeout: 10s
lettuce:
pool:
# 連接池最大連接數(shù) 默認(rèn)8 ,負(fù)數(shù)表示沒有限制
max-active: 8
# 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制) 默認(rèn)-1
max-wait: -1
# 連接池中的最大空閑連接 默認(rèn)8
max-idle: 8
# 連接池中的最小空閑連接 默認(rèn)0
min-idle: 0
mybatis-plus:
global-config:
db-config:
# 主鍵ID類型
id-type: none
# 邏輯刪除字段名稱
logic-delete-field: deleted
# 邏輯刪除-刪除值
logic-delete-value: 1
# 邏輯刪除-未刪除值
logic-not-delete-value: 0
configuration:
# 駝峰下劃線轉(zhuǎn)換
map-underscore-to-camel-case: true
# 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 認(rèn)證配置
auth:
token:
secret_key:
# token 有效期(單位:秒)
ttl:
# springdoc配置: https://springdoc.org/properties.html
springdoc:
swagger-ui:
enabled: true
operationsSorter: alpha
tags-sorter: alpha
api-docs:
enabled: true
# 驗證碼配置
easy-captcha:
# 驗證碼類型: arithmetic-算術(shù)
type: arithmetic
# 驗證碼有效時間(單位:秒)
ttl: 120
# xxl-job 定時任務(wù)配置
xxl:
job:
admin:
# 多個地址使用,分割
addresses:
accessToken:
executor:
appname:
address:
ip:
port:
logpath:
logretentiondays:
# 系統(tǒng)配置
system:
config:
# 數(shù)據(jù)權(quán)限開關(guān)
data-permission-enabled:
# 定時任務(wù) xxl-job 開關(guān)
xxl-job-enabled:
# WebSocket 開關(guān)
websocket-enabled:
配置目錄結(jié)構(gòu)
新加一個handler包,用于像mybatis自動填充的處理配置
config配置
mybatis-plus
具體配置mybaits-plus配置
注解
// 配置文件
@Configuration
// 開啟事務(wù)管理
@EnableTransactionManagement
// mapper掃描
@MapperScan("com.yu.mapper")
插件bean
這里先只配置分頁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分頁插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
自動填充bean
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
return globalConfig;
}
這里有2種寫法,注釋掉的是低版本的。高版本從3.3.0開始可以使用。不過3.3.0不要使用。有bug。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增填充創(chuàng)建時間
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
// this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
this.fillStrategy(metaObject,"createTime",LocalDateTime.now());
this.fillStrategy(metaObject,"updateTime",LocalDateTime.now());
}
/**
* 更新填充更新時間
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
this.fillStrategy(metaObject,"updateTime",LocalDateTime.now());
}
}
swagger
@Configuration
public class SwaggerConfig {
/**
* 接口信息
*/
@Bean
public OpenAPI apiInfo() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("Authorization",
new SecurityScheme().type(SecurityScheme.Type.HTTP)
.scheme("bearer").bearerFormat("JWT")
)
)
.info(new Info()
.title("xiao-yu-Dormitory 接口文檔")
.version("1.0.0")
.description("接口文檔")
);
}
/**
* 系統(tǒng)接口分組
*/
@Bean
public GroupedOpenApi systemApi() {
String[] paths = {"/**"};
String[] packagesToScan = {"com.yu.controller"};
return GroupedOpenApi.builder()
.group("系統(tǒng)接口")
.packagesToScan(packagesToScan)
.pathsToMatch(paths)
.build();
}
}
生成實體、mapper和service
我直接用mybatisX進(jìn)行生成
通過右鍵表可以
選擇模塊
基礎(chǔ)包文章來源:http://www.zghlxwxcb.cn/news/detail-661332.html
baseEntity
在common包下新建一個類
用于規(guī)范創(chuàng)建和更新時間的類文章來源地址http://www.zghlxwxcb.cn/news/detail-661332.html
@Data
public class BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@TableField(fill = FieldFill.INSERT)
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}
統(tǒng)一響應(yīng)實例
響應(yīng)碼接口
public interface IResultCode {
String getCode();
String getMsg();
}
響應(yīng)碼接口實現(xiàn)
@AllArgsConstructor
@NoArgsConstructor
public enum ResultCode implements IResultCode, Serializable {
SUCCESS("00000", "ok"),
@Override
public String getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
private String code;
private String msg;
@Override
public String toString() {
return "{" +
"\"code\":\"" + code + '\"' +
", \"msg\":\"" + msg + '\"' +
'}';
}
public static ResultCode getValue(String code){
for (ResultCode value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return SYSTEM_EXECUTION_ERROR;
}
}
統(tǒng)一響應(yīng)result
@EqualsAndHashCode(callSuper = true)
public record Result<T>(
String code,
T data,
String msg
) implements Serializable{
public static <T> Result<T> success() {
return success(null);
}
public static <T> Result<T> success(T data) {
return new Result<>(ResultCode.SUCCESS.getCode(),data,ResultCode.SUCCESS.getMsg());
}
public static <T> Result<T> failed() {
return result(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), ResultCode.SYSTEM_EXECUTION_ERROR.getMsg(), null);
}
public static <T> Result<T> failed(String msg) {
return result(ResultCode.SYSTEM_EXECUTION_ERROR.getCode(), msg, null);
}
public static <T> Result<T> judge(boolean status) {
if (status) {
return success();
} else {
return failed();
}
}
public static <T> Result<T> failed(IResultCode resultCode) {
return result(resultCode.getCode(), resultCode.getMsg(), null);
}
public static <T> Result<T> failed(IResultCode resultCode, String msg) {
return result(resultCode.getCode(), msg, null);
}
private static <T> Result<T> result(IResultCode resultCode, T data) {
return result(resultCode.getCode(), resultCode.getMsg(), data);
}
private static <T> Result<T> result(String code, String msg, T data) {
return new Result<>(code, data, msg);
}
public static boolean isSuccess(Result<?> result) {
return result != null && ResultCode.SUCCESS.getCode().equals(result.code());
}
}
統(tǒng)一分頁響應(yīng)
public record PageResult<T>(
String code,
Data<T> data,
String msg
) implements Serializable {
public static <T> PageResult<T> success(IPage<T> page) {
Data<T> data = new Data<T>(page.getRecords(), page.getTotal());
return new PageResult<T>(
ResultCode.SUCCESS.getCode(), data, ResultCode.SUCCESS.getMsg()
);
}
public record Data<T>(List<T> list, long total) {
}
}
到了這里,關(guān)于課程項目設(shè)計--項目建立--宿舍管理系統(tǒng)--springboot后端的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!