# 🛠️ 开发指南 > 版本: 1.0 > 更新时间: 2026-03-04 ## 📋 目录 1. [开发环境搭建](#开发环境搭建) 2. [项目结构](#项目结构) 3. [开发规范](#开发规范) 4. [测试指南](#测试指南) 5. [调试技巧](#调试技巧) 6. [贡献指南](#贡献指南) 7. [常见问题](#常见问题) ## 🚀 开发环境搭建 ### 前置要求 | 工具 | 版本 | 说明 | |------|------|------| | JDK | 17+ | 推荐使用OpenJDK 17或21 | | Maven | 3.8+ | 构建工具 | | PostgreSQL | 12+ | 数据库 | | Redis | 6.0+ | 缓存(可选,开发环境可用内存模式) | | Git | 2.30+ | 版本控制 | | IDE | - | 推荐IntelliJ IDEA或VS Code | ### 1. 克隆项目 ```bash git clone https://github.com/your-org/mosquito.git cd mosquito ``` ### 2. 安装依赖 ```bash # 安装PostgreSQL(Ubuntu/Debian) sudo apt-get update sudo apt-get install postgresql postgresql-contrib # 安装Redis(可选) sudo apt-get install redis-server # 或使用Docker docker run -d --name mosquito-postgres -e POSTGRES_PASSWORD=dev_password -p 5432:5432 postgres:15 docker run -d --name mosquito-redis -p 6379:6379 redis:7-alpine ``` ### 3. 配置数据库 ```bash # 创建数据库 sudo -u postgres psql -c "CREATE DATABASE mosquito_dev;" sudo -u postgres psql -c "CREATE USER mosquito WITH PASSWORD 'dev_password';" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE mosquito_dev TO mosquito;" ``` ### 4. 配置开发环境 复制配置模板: ```bash cp src/main/resources/application-dev.yml.example src/main/resources/application-dev.yml ``` 编辑 `application-dev.yml`: ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/mosquito_dev username: mosquito password: dev_password data: redis: host: localhost port: 6379 app: api-key: encryption-key: dev_32_char_encryption_key_12 ``` ### 5. 构建项目 ```bash # 编译项目 mvn clean compile # 运行测试 mvn test # 打包 mvn package ``` ### 6. 启动应用 ```bash # 使用Maven mvn spring-boot:run -Dspring-boot.run.profiles=dev # 或使用JAR java -jar target/mosquito-1.0.0.jar --spring.profiles.active=dev ``` 访问 `http://localhost:8080/actuator/health` 验证启动成功。 ### 7. 工作区定期清理 为避免构建产物和测试产物污染仓库,建议在本地定期执行以下命令: ```bash # 只检查(发现 target/frontend/*/dist 或测试产物即返回非零) npm run clean:workspace:check # 归档清理(将产物移动到 /tmp/mosquito-archives/) npm run clean:workspace:apply # 历史日志归档(保留最近 1 天) npm run logs:health:check npm run logs:archive:check npm run logs:archive:apply npm run logs:archive:index ``` 说明: - `clean:workspace:check` 对应 `scripts/ci/clean-artifacts.sh --include-build-outputs --fail-on-found`。 - `clean:workspace:apply` 默认使用归档模式,不直接删除文件,便于回溯。 - `logs:health:check` 对应 `scripts/ci/logs-health-check.sh`,用于输出日志体积和历史候选文件数量(仅告警,不阻断)。 - `logs:archive:*` 对应 `scripts/ci/archive-logs.sh`,将按时间戳命名的历史运行日志移动到 `logs/archive//`。 - `logs:archive:index` 对应 `scripts/ci/update-log-archive-index.sh`,用于刷新 `logs/archive/README.md` 索引。 - 若本地正在运行 `spring-boot:run`、`vite` 或 `scripts/e2e_continuous_runner.sh`,`target` 与 `frontend/e2e/*` 可能被立即重建。建议先停止后台进程再执行清理。 ### 8. IDE配置 **IntelliJ IDEA:** 1. 导入项目:`File > Open` 选择项目根目录 2. 配置JDK:`File > Project Structure > Project SDK` 选择JDK 17 3. 启用注解处理:`Settings > Build > Compiler > Annotation Processors` 勾选 `Enable annotation processing` 4. 配置运行配置: - `Run > Edit Configurations` - 添加 `Spring Boot` 配置 - Main class: `com.mosquito.project.MosquitoApplication` - Active profiles: `dev` **VS Code:** 安装扩展: - Extension Pack for Java - Spring Boot Extension Pack - Lombok Annotations Support 配置 `.vscode/launch.json`: ```json { "version": "0.2.0", "configurations": [ { "type": "java", "name": "Spring Boot-MosquitoApplication", "request": "launch", "cwd": "${workspaceFolder}", "mainClass": "com.mosquito.project.MosquitoApplication", "projectName": "mosquito", "args": "--spring.profiles.active=dev", "envFile": "${workspaceFolder}/.env" } ] } ``` ## 📁 项目结构 ``` mosquito/ ├── src/ │ ├── main/ │ │ ├── java/com/mosquito/project/ │ │ │ ├── config/ # 配置类 │ │ │ │ ├── CacheConfig.java │ │ │ │ ├── OpenApiConfig.java │ │ │ │ └── WebMvcConfig.java │ │ │ ├── controller/ # REST控制器 │ │ │ │ ├── ActivityController.java │ │ │ │ ├── ApiKeyController.java │ │ │ │ ├── ShareTrackingController.java │ │ │ │ └── UserExperienceController.java │ │ │ ├── dto/ # 数据传输对象 │ │ │ │ ├── ApiResponse.java │ │ │ │ ├── CreateActivityRequest.java │ │ │ │ └── ActivityStatsResponse.java │ │ │ ├── exception/ # 异常处理 │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── BusinessException.java │ │ │ │ └── ResourceNotFoundException.java │ │ │ ├── persistence/ # 持久层 │ │ │ │ ├── entity/ # JPA实体 │ │ │ │ └── repository/ # JPA仓库 │ │ │ ├── service/ # 业务逻辑 │ │ │ │ ├── ActivityService.java │ │ │ │ ├── ShortLinkService.java │ │ │ │ └── ShareTrackingService.java │ │ │ ├── security/ # 安全相关 │ │ │ │ └── UserIntrospectionService.java │ │ │ ├── web/ # Web层(拦截器等) │ │ │ │ ├── ApiKeyAuthInterceptor.java │ │ │ │ └── RateLimitInterceptor.java │ │ │ └── MosquitoApplication.java │ │ └── resources/ │ │ ├── db/migration/ # Flyway迁移脚本 │ │ ├── application.properties │ │ ├── application-dev.yml │ │ └── logback-spring.xml │ └── test/ │ └── java/com/mosquito/project/ │ ├── controller/ # 控制器测试 │ ├── service/ # 服务测试 │ ├── integration/ # 集成测试 │ └── config/ # 测试配置 ├── docs/ # 文档 │ ├── api.md │ ├── PRD.md │ └── data-model.md ├── pom.xml └── README.md ``` ### 分层架构 ``` ┌─────────────────────────────────────┐ │ Controller Layer │ REST API端点 │ (ActivityController, etc.) │ └─────────────┬───────────────────────┘ │ ┌─────────────▼───────────────────────┐ │ Service Layer │ 业务逻辑 │ (ActivityService, etc.) │ └─────────────┬───────────────────────┘ │ ┌─────────────▼───────────────────────┐ │ Repository Layer │ 数据访问 │ (JPA Repositories) │ └─────────────┬───────────────────────┘ │ ┌─────────────▼───────────────────────┐ │ Database Layer │ PostgreSQL + Redis └──────────────────────────────────────┘ ``` ## 📝 开发规范 ### 代码风格 **Java代码规范:** - 遵循Google Java Style Guide - 使用4个空格缩进 - 类名使用PascalCase - 方法名和变量名使用camelCase - 常量使用UPPER_SNAKE_CASE **示例:** ```java public class ActivityService { private static final int DEFAULT_PAGE_SIZE = 20; private final ActivityRepository activityRepository; public ActivityService(ActivityRepository activityRepository) { this.activityRepository = activityRepository; } public Activity createActivity(CreateActivityRequest request) { // 实现逻辑 } } ``` ### 命名规范 **Controller:** - 类名:`XxxController` - 方法名:动词开头,如 `createActivity`, `getActivity`, `updateActivity` **Service:** - 类名:`XxxService` - 方法名:业务动作,如 `create`, `findById`, `update`, `delete` **Repository:** - 类名:`XxxRepository` - 方法名:遵循Spring Data JPA规范,如 `findByActivityId`, `existsByCode` **DTO:** - 请求:`XxxRequest` - 响应:`XxxResponse` - 通用:`XxxDto` ### 注释规范 **类注释:** ```java /** * 活动管理服务 * * 提供活动的创建、查询、更新和删除功能 * * @author Your Name * @since 1.0.0 */ public class ActivityService { } ``` **方法注释:** ```java /** * 创建新活动 * * @param request 活动创建请求 * @return 创建的活动实体 * @throws BusinessException 当活动名称重复时 */ public Activity createActivity(CreateActivityRequest request) { } ``` ### Git提交规范 遵循Conventional Commits规范: ``` ():