156 lines
4.6 KiB
Markdown
156 lines
4.6 KiB
Markdown
|
|
# 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
|