# Backend Kotlin + Spring Boot 模块化单体。计划模块:`boot`、`identity`、`organization`、`authorization`、`workflow`、`form`、`approval`、`document`、`notification`、`ai-orchestration` 和 `audit`。 模块必须通过应用接口协作,不能直接访问其他模块拥有的表。 ## 本地构建 ```bash export JAVA_HOME=/usr/local/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home export GRADLE_USER_HOME=/tmp/aioa-gradle-home ./gradlew test ``` 本机默认 `~/.gradle` 原生缓存存在加载问题,因此当前建议为项目构建显式设置 `GRADLE_USER_HOME`。 ## 当前能力 - Spring Boot 3.5.3 / Kotlin 2.1.21 / JDK 21 - OAuth2 Resource Server,健康检查匿名可访问,业务 API 默认要求认证 - `X-Trace-Id` 接收、校验、生成、响应回传与日志上下文 - RFC 9457 `application/problem+json` 风格的统一异常处理 - PostgreSQL、jOOQ 与 Flyway - 基础 Schema 和审计事件表迁移 - 租户、用户、部门、岗位、任职关系和业务角色模型 - `/api/v1/me` 根据 JWT 租户与 Subject 查询 OA 权威用户数据 - 请假草稿创建、修改、本人查询和列表 - UUIDv7、写入幂等、租户隔离和乐观锁冲突处理 - 请假提交、撤回、状态时间线与事务内审计 ## 开发身份 本地 Keycloak Realm 为 `aioa`,移动端公共客户端为 `aioa-mobile`,启用 Authorization Code + PKCE。为了便于本地联调,还暂时启用了 Direct Access Grant。 开发环境的 OIDC Issuer 固定为 `http://localhost:8081/realms/aioa`;客户端和后端不能混用 `127.0.0.1`,因为 JWT Issuer 必须完全一致。 | 用户名 | 密码 | 角色 | |---|---|---| | `employee` | `Employee123!` | 普通员工 | | `manager` | `Manager123!` | 员工、部门主管 | | `admin` | `Admin123!` | 员工、OA 管理员 | 这些凭据只允许用于本地开发,生产 Realm 不得导入测试用户,也不得启用密码模式。 PostgreSQL 使用版本化开发卷 `postgres-data-v1`,避免复用其他项目或旧凭据初始化的数据目录。切换卷版本不会删除旧卷。 开发数据库通过宿主机端口 `15432` 访问,容器内部仍使用 PostgreSQL 默认端口 `5432`。