# IMTIM Portal 企业级门户登录基座应用 ## 技术栈 - **后端**: Node.js + Koa (ES Modules) - **前端**: Next.js 16 (App Router) + React 19 + TypeScript - **UI组件库**: Radix UI + Lucide Icons + TailwindCSS v4 - **数据库**: SQLite + Prisma ORM - **认证**: Casdoor v3.18.0 (OAuth 2.0) - **状态管理**: Zustand - **部署**: Docker (多阶段构建) + Nginx ## 快速开始 ### 前置要求 - Node.js >= 20 - Casdoor v3.18.0 (本地Docker部署) ### 开发环境 1. **配置后端** ```bash cd backend cp .env.example .env # 编辑Casdoor凭据 npm install npx prisma migrate dev npx prisma generate npm run dev # 启动于 http://localhost:3001 ``` 2. **启动前端** ```bash cd frontend npm install npm run dev # 启动于 http://localhost:3000 ``` 3. **访问应用** - 前端: http://localhost:3000 - 后端API: http://localhost:3001 ### Docker 部署 ```bash docker build -t imtim-portal:latest . docker run -d \ --name imtim-portal \ -p 3000:3000 \ -e CASDOOR_SERVER_URL=http://your-casdoor:8000 \ -e CASDOOR_CLIENT_ID=xxx \ -e CASDOOR_CLIENT_SECRET=xxx \ -e JWT_SECRET=xxx \ imtim-portal:latest ``` ## 项目结构 ``` base-imtim/ ├── backend/ # Koa后端服务 │ ├── prisma/ │ │ ├── migrations/ # 数据库迁移 │ │ └── schema.prisma # 数据模型 │ └── src/ │ ├── config/ # 配置文件 │ ├── controllers/ # 控制器 │ ├── middleware/ # 中间件(认证等) │ ├── routes/ # 路由 │ ├── services/ # 业务逻辑 │ └── index.js # 入口文件 ├── frontend/ # Next.js前端应用 │ └── src/ │ ├── app/ # App Router页面 │ │ ├── api/ # API代理路由 │ │ ├── dashboard/ # 仪表板(需认证) │ │ ├── login/ # 登录页 │ │ └── page.tsx # 首页 │ ├── components/ # React组件 │ │ ├── header.tsx # 导航栏 │ │ ├── layout.tsx # 布局组件 │ │ └── protected-route.tsx │ └── lib/ │ ├── api.ts # HTTP客户端 │ └── auth-store.ts # 认证状态管理 ├── docker/ # Docker配置 │ ├── Dockerfile # 多阶段构建 │ ├── nginx.conf # 反向代理 │ └── start.sh # 启动脚本 ├── docs/ # 文档 │ └── casdoor-setup.md # Casdoor配置手册 ├── docker-compose.yml # 开发环境编排 ├── PLAN.md # 开发计划 └── README.md ``` ## API文档 | 方法 | 路径 | 描述 | 认证 | |------|------|------|------| | POST | /api/auth/login | 获取Casdoor登录URL | 无 | | GET | /api/auth/callback | OAuth回调处理 | 无 | | POST | /api/auth/logout | 登出 | 需要Token | | GET | /api/auth/user | 获取当前用户信息 | 需要Token | | GET | /api/health | 健康检查 | 无 | ## 环境变量 ### 后端 (backend/.env) | 变量 | 描述 | 默认值 | |------|------|--------| | CASDOOR_SERVER_URL | Casdoor服务器URL | http://localhost:8000 | | CASDOOR_CLIENT_ID | 客户端ID | - | | CASDOOR_CLIENT_SECRET | 客户端密钥 | - | | CASDOOR_ORG_NAME | 组织名称 | imtim | | CASDOOR_APP_NAME | 应用名称 | base-imtim | | CASDOOR_REDIRECT_URI | OAuth回调URL | http://localhost:3000/api/auth/callback | | JWT_SECRET | JWT密钥 | - | | APP_PORT | 后端端口 | 3001 | | FRONTEND_URL | 前端URL | http://localhost:3000 | ### 前端 (frontend/.env.local) | 变量 | 描述 | 默认值 | |------|------|--------| | NEXT_PUBLIC_API_URL | 后端API地址 | http://localhost:3001/api | | BACKEND_URL | 后端服务器URL | http://localhost:3001 | | FRONTEND_URL | 前端服务器URL | http://localhost:3000 | ## 认证流程 ``` 1. 用户访问 /login → 点击登录按钮 2. 前端请求 /api/auth/login → 获取Casdoor授权URL 3. 用户跳转到Casdoor登录页面 4. 登录成功后Casdoor回调 /api/auth/callback?code=xxx 5. Next.js API路由重定向到后端 /api/auth/callback 6. 后端用code换取token,获取用户信息 7. 创建/更新本地用户,生成JWT 8. 重定向到 /dashboard?token=xxx 9. 前端存储token到localStorage,后续请求自动携带 ``` ## 文档 - [开发计划](PLAN.md) - [Casdoor配置手册](docs/casdoor-setup.md) ## License MIT