后端开发指南
本文档详细说明后端(Spring Boot)的开发规范、环境配置与启动流程。
环境准备
必备工具
- JDK 17+ - Java开发工具包
- Maven 3.8+ - 依赖管理与构建工具
- FFprobe - 媒体元数据提取(可选但推荐)
验证环境
bash
java -version
mvn -version
ffprobe -version # 可选代码结构规范
Java包结构
所有Java类位于 xyz.ezsky.anilink 基础包下,按职责严格分层:
src/main/java/xyz/ezsky/anilink/
├── config/ # 应用配置类(数据库、中间件、第三方服务等)
├── controller/ # API接口层
│ └── api/ # RESTful接口
├── service/ # 核心业务逻辑层
│ └── impl/ # Service实现类
├── repository/ # 数据访问层(Spring Data JPA接口)
├── listener/ # 启动事件与业务事件监听
├── model/ # 数据模型
│ ├── entity/ # @Entity 数据库实体
│ ├── dto/ # 数据传输对象(写入/更新)
│ └── vo/ # 视图对象(查询返回)
├── util/ # 工具类
│ └── [各类工具]
└── AniLinkApplication.java # 应用入口分层职责
Controller 层
- 仅负责:请求接收、参数验证、响应返回
- 不负责:业务逻辑、数据转换
- 示例:java
@RestController @RequestMapping("/api/v1/anime") public class AnimeController { @Autowired private AnimeService animeService; @GetMapping("/{id}") public AnimeVO getAnimeById(@PathVariable Long id) { return animeService.getAnimeVO(id); } }
Service 层
- 负责:业务逻辑实现、数据转换、事务管理
- 可调用:Repository、其他Service、工具类
- 示例:java
@Service public class AnimeService { @Autowired private AnimeRepository animeRepository; public AnimeVO getAnimeVO(Long id) { Anime entity = animeRepository.findById(id) .orElseThrow(() -> new RuntimeException("Not found")); return convertToVO(entity); // 转换为VO } private AnimeVO convertToVO(Anime entity) { // 转换逻辑 } }
Repository 层
- 负责:数据库查询与持久化
- 不负责:业务逻辑
- 示例:java
public interface AnimeRepository extends JpaRepository<Anime, Long> { List<Anime> findByNameContaining(String name); }
Model 层
Entity(数据库实体)
- 仅用于 Repository 与 Service 层内部使用
- 标注
@Entity、@Table,映射数据库表 - 示例:java
@Entity @Table(name = "anime") public class Anime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String summary; }
DTO(数据传输对象)
- 用于请求入参(写入/更新)
- 包含必要的验证注解 (
@NotNull,@NotBlank等) - 示例:java
public class AnimeCreateDTO { @NotBlank private String name; private String summary; }
VO(视图对象)
- 作为 Controller 返回给前端的数据结构
- 仅包含需要给前端的字段
- 示例:java
public class AnimeVO { private Long id; private String name; private String summary; private List<EpisodeVO> episodes; }
配置与环境管理
配置文件位置
src/main/resources/
├── application.properties # 通用配置(高优先级)
├── application-h2.properties # H2数据库配置
├── application-pgsql.properties # PostgreSQL数据库配置
├── logback-spring.xml # 日志配置
├── db/
│ └── changelog/ # Liquibase脚本
└── static/ # 静态资源(打包时用)环境切换
通过环境变量 DB_PROFILE 切换数据库:
bash
# H2(默认,开发环境)
mvn spring-boot:run
# 等同于
DB_PROFILE=h2 mvn spring-boot:run
# PostgreSQL(生产环境)
DB_PROFILE=pgsql \
DB_HOST=127.0.0.1 \
DB_PORT=5432 \
DB_NAME=anilink \
DB_USER=postgres \
DB_PASS=postgres \
mvn spring-boot:run本地开发启动
快速启动(H2)
bash
cd api
mvn spring-boot:run访问地址:
- 应用首页:
http://localhost:8081 - Swagger文档:
http://localhost:8081/swagger-ui/index.html - H2控制台:
http://localhost:8081/h2-console(默认密码为空)
使用PostgreSQL
首先启动PostgreSQL(推荐用Docker):
bash
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
postgres:16然后启动应用:
bash
cd api
DB_PROFILE=pgsql \
DB_HOST=127.0.0.1 \
DB_PORT=5432 \
DB_NAME=anilink \
DB_USER=postgres \
DB_PASS=postgres \
mvn spring-boot:run构建与测试
运行测试
bash
cd api
mvn clean test构建JAR包
bash
cd api
mvn clean package产物:api/target/anilink-server-xxx.jar
依赖管理
查看依赖树
bash
mvn dependency:tree更新依赖
bash
mvn versions:display-dependency-updates常见问题
1. 启动时 "FFprobe not found"
原因:系统未安装FFprobe
解决:
- Linux:
apt install ffmpeg - macOS:
brew install ffmpeg - 或在代码中配置FFprobe路径
2. H2数据库连接失败
原因:H2驱动版本不兼容或驱动未加载
解决:检查 pom.xml 中的H2依赖版本,确保与Spring Boot版本兼容
3. PostgreSQL连接超时
原因:PostgreSQL服务未启动或连接参数错误
解决:
- 验证 PostgreSQL 运行中:
docker ps | grep postgres - 验证连接参数:
echo $DB_HOST $DB_PORT $DB_NAME - 测试连接:
psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME
4. Maven构建缓慢
原因:网络差或仓库源配置不佳
解决:修改 ~/.m2/settings.xml,配置国内镜像源(如Aliyun)