YOJ·环境搭建

后端

maven依赖

Java版本要选8

用的是阿里云脚手架建的项目,有些依赖可以直接勾选不会有bug。

但如果是Spring官方的脚手架,可能有bug,尤其是lombok。

框架和驱动

Spring Boot 2.7.2:阿里云脚手架没有显式引入spring boot starter,在dependecy managenment中配好了

Spring Web

Spring Boot starter aop:AOP支持

Spring Configuration Processor:配置数据处理器

MySQL Driver

MyBatis

MyBatis Plus

工具

lombok

swagger、knife4j:knife4j的父依赖自带了openAPI / swagger的依赖

apache commons lang3

docker java

docker client

hutool

可加可不加

Spring Boot Freemarker:更好的页面展示,但是选择和前端联调的话,也无所谓

Spring Session:给后续的微服务改造准备的,也不一定用得上

完整pom.xml

注意修改项目名

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?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>
<groupId>com.crowntit</groupId>
<artifactId>Y-OJ-backend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Y-OJ-backend</name>
<description>Y-OJ-backend</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
<dependencies>
<!--Spring Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring Boot starter aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--spring boot configuration processor-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--MySQL driver-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!--MyBatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!--apache commons lang3-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!--docker java-->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.3.0</version>
</dependency>
<!--docker client-->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.3.0</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>
<!--其他-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.crowntit.yojbackend.YOjBackendApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

application.yml

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
spring:
application:
name: <group_name>-<project_name> # 应用名称,指定 Spring Boot 项目的名称
profiles:
active: dev # 指定当前使用的配置文件环境,默认为 dev 环境
mvc:
pathmatch:
matching-strategy: ant_path_matcher # 使用 ant_path_matcher 匹配策略,兼容传统路径匹配方式
session:
timeout: 2592000 # session 超时时间,以秒为单位,2592000 秒即为 30 天
# 数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 数据库驱动类
url: jdbc:mysql://localhost:3306/<your_db_name> # 数据库连接地址,需替换为实际数据库名
username: root # 数据库用户名
password: 123456 # 数据库密码
# web 配置
server:
address: 0.0.0.0 # 项目运行的地址,0.0.0.0 表示绑定到所有 IP 地址
port: 8121 # 项目启动时的端口号
servlet:
context-path: /api # 设置项目的上下文路径,例如 /api 表示接口前缀
session:
cookie:
max-age: 2592000 # cookie 有效期,以秒为单位,2592000 秒即为 30 天
# MyBatis 配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 是否启用下划线转驼峰命名转换,false 表示关闭
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # MyBatis 日志实现,打印 SQL 日志到控制台
global-config:
db-config:
logic-delete-field: is_delete # 全局逻辑删除字段名,数据库中表示是否被删除
logic-delete-value: 1 # 表示已删除的值(默认为 1)
logic-not-delete-value: 0 # 表示未删除的值(默认为 0)
# 接口文档配置
knife4j:
enable: true # 是否启用 Knife4j 接口文档,true 表示启用
openapi:
title: "接口文档" # 接口文档的标题
version: 1.0 # 接口文档的版本号
group:
default:
api-rule: package # 接口分组规则,基于包名
api-rule-resources:
- com.<group_name>.<project_name>.controller # 定义接口扫描的包路径,用于生成文档

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
src/main/java/com/[group_name]/[project_name]/
--common/
--controller/
--config/
--constant/
--exception/
--mapper/
--model/
----dto/
----entity/
----vo/
--service/
----impl/
--util/
--Application启动类

建表语句

创建一个和src同级的sql目录 /sql/create_table.sql,存放sql脚本

这篇文档的建表语句部分有完整的sql脚本

注意:我使用的MySQL版本是MySQL 8

IDEA插件

IDEA插件商店直接搜就有了,一般都是第一个

  • Generate All Getter And Setter
  • MyBatis X

前端

Vite创建项目

  1. 先下node.js和npm (自己找教程下载,然后配一下环境变量),然后查看版本

    1
    2
    3
    4
    5
    6
    7
    8
    D:\Projects\Y-OJ\V1.0\frontend>npm version

    # 输出结果
    {
    npm: '10.9.2',
    node: '22.15.0',
    # ......
    }
  2. Vite官网找对应自己的node版本的Vite版本,和创建项目的命令

  3. 创建项目

    1
    2
    3
    4
    5
    6
    # 这个命令会在当前目录创建一个和<项目名>同名的目录,所以不需要额外建一个目录
    npm create vite@latest <项目名> -- --template vue-ts

    cd <项目名>
    npm install
    npm run dev

这里如果项目名有大写的话应该会问你一次 Package name,正常的话就是直接提示 “Done”

“Done”之后分别运行它给的三个命令就好,然后访问 http://localhost:5173/

如果出现Vite+Vue的页面就是完成创建啦,结束的话可以按 q + 回车

package.json

如果node、npm、Vite、Vue3等版本都一样的话可以直接copy下面的配置,但如果不一致,严谨起见还是去官方文档找一下对应的版本,防止因为版本不兼容出现的bug。

关于monaco-editor也需要去看一下官方文档,这个组件对不同打包方式的前端项目,有不同的引入和配置方式,或者问一下AI也可以。似乎也有其他开发者封装好的面向Vite的直接可用的monaco-editor组件,可以自行查找。

这两段复制一下,覆盖掉你创建的项目的package.json的dependencies和devDependencies部分,然后运行npm install就好了

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
"dependencies": {
"@bytemd/plugin-gfm": "^1.22.0",
"@bytemd/plugin-highlight": "^1.22.0",
"@bytemd/vue-next": "^1.22.0",
"axios": "^1.9.0",
"moment": "^2.30.1",
"monaco-editor": "^0.52.2",
"pinia": "^3.0.1",
"vue": "^3.5.13",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@arco-design/web-vue": "^2.57.0",
"@tsconfig/node22": "^22.0.0",
"@types/node": "^22.13.9",
"@vitejs/plugin-vue": "^5.2.4",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.5.0",
"@vue/tsconfig": "^0.7.0",
"eslint": "^9.21.0",
"eslint-plugin-vue": "~10.0.0",
"jiti": "^2.4.2",
"npm-run-all2": "^7.0.2",
"openapi-typescript-codegen": "^0.29.0",
"prettier": "3.5.3",
"typescript": "~5.8.0",
"vite": "^6.3.5",
"vite-plugin-monaco-editor": "^1.1.0",
"vite-plugin-vue-devtools": "^7.7.2",
"vue-tsc": "^2.2.8"
}