4.6 KiB
4.6 KiB
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部署)
开发环境
- 配置后端
cd backend
cp .env.example .env # 编辑Casdoor凭据
npm install
npx prisma migrate dev
npx prisma generate
npm run dev # 启动于 http://localhost:3001
- 启动前端
cd frontend
npm install
npm run dev # 启动于 http://localhost:3000
- 访问应用
- 前端: http://localhost:3000
- 后端API: http://localhost:3001
Docker 部署
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,后续请求自动携带
文档
License
MIT