项目结构
Monorepo 结构
Section titled “Monorepo 结构”IAM/├── apps/│ ├── web/│ │ ├── e2e/ # Playwright 用例│ │ └── src/│ │ ├── app/ # Next.js App Router 页面与代理 route│ │ ├── components/ # shadcn/ui 与业务组件│ │ ├── hooks/ # 客户端 hooks│ │ ├── lib/ # auth、代理、访问控制与工具│ │ └── utils/ # tRPC 客户端│ ├── server/│ │ └── src/│ │ ├── worker.ts # Worker 入口,导出 app 与 scheduled Cron│ │ ├── index.ts # Hono 应用与全部外部路由│ │ ├── node.ts # Node 本地运行入口│ │ ├── uploads.ts # R2 上传与读取│ │ ├── wecom-callback.ts # 企微通讯录回调│ │ ├── provisioning-snapshot.ts # 应用开通快照端点│ │ └── scheduled-maintenance.ts # Cron 维护任务│ └── docs/│ └── src/content/docs/ # Starlight Markdown/MDX├── packages/│ ├── contracts/src/ # 前后端共享契约与纯函数│ ├── api/src/routers/ # tRPC 领域路由│ ├── auth/src/ # Better Auth、企微、邮件、限流和授权│ ├── db/src/│ │ ├── schema/ # auth、wecom、provisioning schema│ │ └── migrations/ # Drizzle migrations│ ├── env/src/ # server.ts / web.ts│ └── config/ # 共享 tsconfig├── README.md├── TODO.md├── turbo.json└── pnpm-workspace.yamlapps/web
Section titled “apps/web”- 登录、资料补全、个人设置、我的应用和管理控制台
- 通过 Better Auth Client 调用同源
/api/auth/* - 通过 tRPC + TanStack Query 获取服务端数据
/api/[...path]和/trpc/[...path]代理到iam-apisrc/proxy.ts处理页面登录态、资料完整性与管理端路由权限
Web 不得运行时导入 @IAM/auth、@IAM/db、@IAM/env/server,对 @IAM/api 只允许类型导入。
apps/server
Section titled “apps/server”- Better Auth handler 与 OAuth/OIDC 端点
- tRPC endpoint
- RFC 8414 / OIDC discovery
- R2 上传与文件读取
- 企业微信通讯录回调和内部全量同步
- 应用开通快照(
POST /api/internal/provisioning/snapshot) - Worker 原生 Cron:企微全量同步与开通投递对账(
src/worker.ts的scheduled) - 健康检查、CORS 和 Worker Binding 注入
apps/docs
Section titled “apps/docs”Astro Starlight 文档站。内容、导航和根 README/TODO 应随代码能力同步更新。
| Package | 职责 |
|---|---|
@IAM/contracts |
共享类型、Zod schema、枚举和不依赖服务端的纯函数 |
@IAM/api |
tRPC context、权限守卫及 users、oauth-clients、sessions、dashboard、audit-logs、profile、search、provisioning、wecom 路由 |
@IAM/auth |
Better Auth 实例、插件、企微身份、应用授权、开通投递、邮件、审计和限流 |
@IAM/db |
Drizzle 数据库实例、auth/wecom/provisioning schema 与 migrations |
@IAM/env |
服务端和前端环境变量校验 |
@IAM/config |
共享 TypeScript 配置 |
apps/web ──► @IAM/contracts ◄── @IAM/api ──► @IAM/auth ──► @IAM/db ──► @IAM/env ▲ └──────────── apps/server ────────────────────────────────►边界原则:
- 前后端共享类型、Zod schema 和纯函数放入
@IAM/contracts。 - 认证标准能力优先调用 Better Auth 原生 API。
- 业务数据从 Web 端优先通过 tRPC 获取。
- 数据库与 secret 只在 Server/API/Auth/DB 层使用。
- 公开:
/login、/login/email、/oauth-login、/forgot-password、/reset-password - 登录用户:
/apps、/profile、/complete-profile、/consent - 管理端:
/admin/dashboard、users、organization、roles、sessions、audit-logs、oauth-clients、consents、settings、profile、identity-sources/wecom - 其他:
/forbidden(无权限提示页)
/consent 位于登录态分组下,未登录访问会先跳转登录,因此不计入公开页面。