# 职来 (mydreamjob) 后端服务 > Spring Boot 3.2.5 + Java 17 | 职来大学生求职服务平台后端基线 ## 项目结构 ``` mydreamjob-server/ ├── pom.xml # Maven 依赖配置 ├── .gitignore # Git 忽略规则 └── src/ ├── main/ │ ├── java/com/mydreamjob/ │ │ ├── MyDreamjobApplication.java │ │ ├── config/ # 配置类 │ │ │ ├── SecurityConfig.java │ │ │ ├── RedisConfig.java │ │ │ ├── RabbitConfig.java │ │ │ ├── WebMvcConfig.java │ │ │ └── SchedulingConfig.java │ │ ├── common/ │ │ │ ├── api/ # 统一响应格式 │ │ │ │ ├── ApiResponse.java │ │ │ │ └── PageResponse.java │ │ │ ├── exception/ # 异常处理 │ │ │ │ ├── BusinessException.java │ │ │ │ ├── ErrorCode.java │ │ │ │ └── GlobalExceptionHandler.java │ │ │ ├── logging/ # 日志过滤 │ │ │ │ ├── RequestIdFilter.java │ │ │ │ └── RequestLoggingFilter.java │ │ │ └── health/ # 健康检查 │ │ │ └── HealthController.java │ │ ├── auth/ # 认证模块 │ │ │ ├── User.java │ │ │ ├── SmsVerificationCode.java │ │ │ ├── AuthToken.java │ │ │ ├── UserRepository.java │ │ │ ├── SmsVerificationCodeRepository.java │ │ │ ├── AuthTokenRepository.java │ │ │ ├── JwtTokenProvider.java │ │ │ ├── JwtAuthenticationFilter.java │ │ │ ├── SmsVerificationService.java │ │ │ └── AuthService.java │ │ ├── audit/ # 审计模块 │ │ │ ├── AuditLog.java │ │ │ ├── AuditLogRepository.java │ │ │ └── AuditService.java │ │ ├── controller/ # 控制器 │ │ │ ├── AuthController.java │ │ │ ├── SystemController.java │ │ │ └── ApiController.java │ │ ├── job/ # 岗位模块(骨架) │ │ ├── career/ # 投递模块(骨架) │ │ ├── messaging/ # 聊天模块(骨架) │ │ └── profile/ # 评分模块(骨架) │ ├── resources/ │ │ ├── application.yml # 主配置 │ │ ├── application-dev.yml # 开发环境配置 │ │ ├── application-dev.example.yml # 配置模板 │ │ └── db/migration/ │ │ ├── V1__base_schema.sql # 基础表结构 │ │ └── V1_1__seed_data.sql # 种子数据 │ └── test/java/com/mydreamjob/ │ ├── MyDreamjobApplicationTest.java │ ├── auth/ │ │ ├── SmsVerificationServiceTest.java │ │ └── JwtTokenProviderTest.java └── docs/ # 项目文档 ├── ERD.md ├── api-v0.1.md └── acceptance-week1.md ``` ## 快速启动 ### 1. 启动基础设施 ```bash cd backend-infra docker compose up -d ``` ### 2. 验证依赖服务 ```bash # MySQL (3307) mysql -h 127.0.0.1 -P 3307 -u root -p"$MYSQL_ROOT_PASSWORD" -e 'SELECT 1' # Redis (6379) redis-cli -h 127.0.0.1 -p 6379 ping # RabbitMQ 管理界面 (非 guest,使用环境变量账号) curl http://127.0.0.1:15672/api/health/check-alive -u "$RABBITMQ_USERNAME:$RABBITMQ_PASSWORD" ``` ### 3. 编译与测试 ```bash cd mydreamjob-server mvn clean compile mvn test ``` ### 4. 启动应用 ```bash mvn spring-boot:run -Dspring-boot.run.profiles=dev ``` ### 5. 验证接口 ```bash # 健康检查 curl http://localhost:8080/api/v1/health # 发送验证码 curl -X POST "http://localhost:8080/api/v1/auth/sms/send?phone=13800000001&purpose=login" # 登录(从日志获取验证码) curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"phone":"13800000001","code":"<验证码>"}' # 查看用户信息 curl http://localhost:8080/api/v1/auth/me \ -H "Authorization: Bearer " ``` ## 环境变量 > **生产安全要求**:`JWT_SECRET`、`DB_PASSWORD`、`RABBITMQ_USERNAME`、`RABBITMQ_PASSWORD` **必须**通过环境变量显式提供,禁止使用默认值或写入代码。缺失时应用启动失败。 | 变量 | 默认值 | 说明 | |------|--------|------| | SPRING_PROFILES_ACTIVE | dev | 激活的 Spring Profile | | DB_URL | jdbc:mysql://127.0.0.1:3307/mydreamjob | 数据库连接 URL | | DB_USERNAME | mydreamjob | 数据库用户名 | | DB_PASSWORD | **必填** | 数据库密码(无默认值) | | REDIS_HOST | 127.0.0.1 | Redis 主机 | | REDIS_PORT | 6379 | Redis 端口 | | REDIS_PASSWORD | (空) | Redis 密码 | | RABBITMQ_HOST | 127.0.0.1 | RabbitMQ 主机 | | RABBITMQ_PORT | 5672 | RabbitMQ 端口 | | RABBITMQ_USERNAME | **必填** | RabbitMQ 用户名(禁止 guest) | | RABBITMQ_PASSWORD | **必填** | RabbitMQ 密码(禁止 guest) | | JWT_SECRET | **必填** | JWT 签名密钥(至少 256 位,无默认值) | | JWT_EXPIRATION_MS | 86400000 | Access Token 过期时间 (毫秒) | | JWT_REFRESH_EXPIRATION_MS | 604800000 | Refresh Token 过期时间 (毫秒) | | SMS_MOCK_ENABLED | true | 是否启用 Mock 短信 | | SMS_CODE_EXPIRE_SECONDS | 300 | 验证码有效期 (秒) | | SMS_LOCKOUT_SECONDS | 300 | 锁定时间 (秒) | ### Windows 启动方式 ```powershell # PowerShell 设置环境变量(每次新终端需重设) $env:DB_URL = "jdbc:mysql://127.0.0.1:3307/mydreamjob?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai" $env:DB_USERNAME = "mydreamjob" $env:DB_PASSWORD = "<你的数据库密码>" $env:RABBITMQ_USERNAME = "mydreamjob_dev" $env:RABBITMQ_PASSWORD = "<你的 RabbitMQ 密码>" $env:JWT_SECRET = "<至少256位的随机密钥>" $env:SMS_MOCK_ENABLED = "true" # 启动 cd mydreamjob-server mvn spring-boot:run -Dspring-boot.run.profiles=dev ``` Mock 验证码打印在服务日志中:`MOCK SMS CODE: phone=... code=<6位验证码>` ## 端口说明 | 服务 | 端口 | 说明 | |------|------|------| | 后端 API | 8080 | Spring Boot 应用 | | MySQL | 3307 | Docker 容器 (127.0.0.1:3307:3306) | | Redis | 6379 | Docker 容器 (127.0.0.1:6379:6379) | | RabbitMQ | 5672 | Docker 容器 (127.0.0.1:5672:5672) | | RabbitMQ 管理 | 15672 | Docker 容器 (127.0.0.1:15672:15672) | | Swagger UI | 8080/swagger-ui.html | OpenAPI 文档 | ## 技术栈 - **Spring Boot 3.2.5** - 应用框架 - **Java 17** - 编程语言 - **Spring Security** - 安全框架 - **Spring Data JPA** - ORM - **Spring Data Redis** - 缓存 - **Spring AMQP** - 消息队列 - **Flyway** - 数据库迁移 - **JWT (jjwt 0.12.5)** - 认证 - **SpringDoc OpenAPI** - API 文档 - **MySQL 8.4** - 数据库 - **Redis 7.4** - 缓存/验证码存储 - **RabbitMQ 3.13** - 消息队列 - **Lombok** - 代码简化 ## 测试账号 | 角色 | 手机号 | 用途 | |------|--------|------| | ADMIN | 13800000001 | 管理员测试 | | STUDENT | 13800000002 | 学生测试 | | COMPANY | 13800000003 | 企业测试 | > 注: 使用 Mock 短信验证码登录,验证码从应用日志中获取 ## 文档 - [ERD 设计](docs/ERD.md) - [API v0.1 接口清单](docs/api-v0.1.md) - [Week 1 验收文档](docs/acceptance-week1.md) ## 已知限制 1. 短信验证码为 Mock 实现,仅打印到日志(`MOCK SMS CODE: ... code=<6位>`) 2. 生产环境配置需通过环境变量提供(JWT_SECRET / DB_PASSWORD / RabbitMQ 账号),不提交真实密钥 3. `career/CareerService.java` 为历史遗留空接口占位(投递功能已由 application 模块实现),待产品确认