first commit
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user