Files
x-server-mobile/CLAUDE.md
T
root 4ceb5eac7e chore: 重组项目文件结构,文档和部署文件归档
文件结构优化:
- docs/ 归档所有项目文档(PROJECT.md, PROJECT_ISSUES.md 等)
- deploy/ 归档所有部署相关文件(docker-compose.prod.yml, nginx 配置等)
- scripts/ 归档脚本文件(deploy.sh, rollback.sh)
- tests/ 归档测试文件(test_data.php)

更新引用路径:
- CLAUDE.md 更新文档路径引用
- 部署文档更新配置文件路径引用

清理文件:
- 移除非必要的测试文件(TestController, 测试脚本等)
- 移除重复/错误的目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:01:17 +08:00

303 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# X-Server Mobile 项目文档
## 项目概述
这是一个基于飞书的企业内部H5移动工具平台,采用多租户架构,支持审批流程引擎。
**关键特性:**
- 支持5种语言:中文、英文、俄语、西语、法语
- 多租户架构(用户全局唯一,关联多个公司)
- 审批流程引擎(单人审批、会签、或签、通知)
- 飞书免登集成
**技术栈:**
- 前端:React 18.3.1 + TypeScript + Vite + Ant Design Mobile
- 后端:PHP 8.5 + Webman 2.x + MySQL + Redis
- 部署:Docker
## 国际化 (i18n) - 重要!
### 前端
- 配置:`frontend/src/i18n/`
- 翻译文件:`frontend/src/i18n/locales/{zh,en,ru,es,fr}.json`
- 语言切换:
- 首页右上角国旗按钮
- 个人中心 -> 语言设置
- 存储位置:localStorage `i18nextLng`
使用方式:
```tsx
import { useTranslation } from 'react-i18next'
const { t } = useTranslation()
<div>{t('common.confirm')}</div>
```
### 后端
- 翻译文件:`backend/lang/{zh,en,ru,es,fr}.php`
- 工具类:`backend/app/Util/Lang.php`
使用方式:
```php
use App\Util\Lang;
$message = Lang::get('common.confirm');
Lang::setLocale('en');
```
## 目录结构
```
/www/x-server-mobile/
├── frontend/ # React 前端 (运行在 5173)
│ ├── src/
│ │ ├── i18n/ # 国际化配置
│ │ ├── components/ # 组件
│ │ ├── pages/ # 页面
│ │ ├── modules/ # 业务模块 (approval等)
│ │ └── router/ # 路由
│ └── package.json
├── backend/ # PHP 后端 (运行在 8787)
│ ├── app/
│ │ ├── Controller/ # 控制器 (PascalCase命名)
│ │ ├── Model/ # 模型 (PascalCase命名)
│ │ ├── Service/ # 服务层
│ │ ├── Util/ # 工具类
│ │ └── Middleware/ # 中间件
│ ├── config/ # 配置
│ ├── lang/ # 语言文件
│ └── composer.json
├── docker-compose.yml # Docker 编排
├── nginx/ # OpenResty 配置
├── frpc/ # frpc 配置
├── docs/ # 项目文档
│ ├── PROJECT.md # 项目详细文档
│ └── IMPLEMENTATION_PLAN.md # 实现计划
```
## 环境配置
### 端口
- Frontend (Vite): 5173
- Backend (Webman): 8787
- OpenResty: 8080
- MySQL: 3306
- Redis: 6379
### 数据库
- 数据库名:xserver
- 密码:mysql_xEsdPa
- 容器名:1Panel-mysql-409s
- 网络:1panel-network
### Docker 容器
- 后端容器:x-server-backend
- 使用 Dockerfile:`backend/Dockerfile`
- PHP 版本:8.5
## 关键文件路径
### 前端关键文件
- 入口:`frontend/src/main.tsx`
- 路由:`frontend/src/router/index.tsx`
- 布局:`frontend/src/components/layout/`
- 状态管理:`frontend/src/stores/`
- rem 适配:`frontend/src/utils/rem.ts`
### 后端关键文件
- 入口:`backend/start.php`
- 路由:`backend/config/route.php`
- 数据库配置:`backend/config/database.php`
- Redis 配置:`backend/config/redis.php`
- 容器配置:`backend/config/container.php`
### 重要配置文件
- Docker 编排:`docker-compose.yml`
- OpenResty 配置:`nginx/x-server-api.conf`
- frpc 配置:`frpc/frpc-dev.ini`
## 审批流程引擎
### 节点类型
- `single_approve` - 单人审批
- `and_sign` - 会签(所有人通过)
- `or_sign` - 或签(任一人通过)
- `notify` - 通知节点
### 状态
- pending: 待审批
- approved: 已通过
- rejected: 已拒绝
- cancelled: 已撤销
### 关键文件
- 服务:`backend/app/Service/ApprovalService.php`
- 控制器:`backend/app/Controller/ApprovalController.php`
- 模型:`backend/app/Model/ApprovalOrder.php`, `ApprovalFlow.php`, `ApprovalNode.php`, `ApprovalRecord.php`
- 前端列表页:`frontend/src/pages/approval/list.tsx`
- 前端详情页:`frontend/src/pages/approval/detail.tsx`
### 列表过滤逻辑
- **我发起的 (my)**: `applicant_id = current_user_id`
- **待我审批 (pending)**: 订单状态为 pending + 当前用户在当前节点的审批人列表中 + 未审批
- **我已审批 (approved)**: 用户有审批记录(approve/reject)+ 订单状态为已完成(approved/rejected/cancelled)
### 测试数据
运行测试数据脚本:
```bash
docker exec x-server-backend php test_data.php
```
该脚本会创建:
- 2 个待审批的订单(其他用户提交,用户1审批)
- 1 个已通过的订单(用户1已审批)
- 1 个已拒绝的订单(用户1已拒绝)
## 飞书集成
### 免登接口
- 回调:`POST /api/v1/auth/feishu-login`
### 环境变量
```env
FEISHU_APP_ID=cli_xxxxxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxx
FEISHU_ENCRYPT_KEY=xxxxxxxxxxxxxxxxxxxx
FEISHU_VERIFICATION_TOKEN=xxxxxxxxxxxxxxxxxxxx
```
## 常用命令
### 前端
```bash
cd /www/x-server-mobile/frontend
npm install
npm run dev
npm run build
```
### 后端
```bash
cd /www/x-server-mobile/backend
composer install
php start.php start
php start.php stop
```
### Docker
```bash
cd /www/x-server-mobile
docker compose up -d
docker compose restart backend
docker logs x-server-backend -f
```
## 反向代理配置(开发环境)
用户已有 frpc 和 OpenResty,配置用于调试飞书登录。
1. OpenResty 监听 8080,代理到 8787
2. frpc 将 8080 暴露到公网
3. 飞书回调地址配置为公网域名
### Webman 框架要点
**PSR-4 自动加载**
- 目录名必须是 PascalCase(Controller、Model、Service、Util)
**数据库连接**
- 使用 Webman 官方 `webman/database` 包
- 使用 `support\Db` facade 进行数据库操作
- 使用 `Db::connection()` 获取数据库连接进行事务处理
**Bootstrap 接口**
- 方法签名:`public static function start(?\Workerman\Worker $worker): void`
**官方依赖包**
```bash
composer require workerman/webman:^2.0
composer require webman/database:^2.0
composer require webman/redis:^2.0
composer require illuminate/pagination:^11.0
composer require illuminate/events:^11.0
composer require symfony/var-dumper:^7.0
```
### 前端框架要点
**React 版本**
- 必须使用 React 18.3.1(不能用19)
- @types/react 和 @types/react-dom 也要用 v18
**Ant Design Mobile**
- 必须导入全局样式:`import 'antd-mobile/es/global'`
- DatePicker 使用 `visible` 属性控制弹框显示
**Zustand 状态管理**
- 登录时必须调用 `login(user, token)` 方法设置状态
- Token 存储在 localStorage,key 为 `token`
**类型定义**
- `User.id` 是 `number` 类型(后端返回整型)
- `User.company_id` 是 `number` 类型(数据库字段名)
## 语言切换位置
1. **首页** - 右上角显示当前语言国旗,点击切换
2. **个人中心** -> 语言设置
## 当前开发状态
- ✅ 前端基础框架搭建完成
- ✅ 后端 API 框架搭建完成
- ✅ 5语言国际化支持完成
- ✅ Docker 开发环境配置完成
- ✅ 审批流程引擎完成
- ✅ 通用审批列表页(我发起的/待我审批/我已审批)
- ✅ 通用审批详情页(支持审批通过/拒绝/撤销操作)
- ✅ 出差申请功能完成
- ✅ 出差申请页(含行程管理、审批人选择、抄送人选择)
- ✅ 草稿自动保存/恢复功能
- ✅ 默认审批人自动加载
## 下一步工作
1. 完善审批流程的会签、或签逻辑测试
2. 实现公司切换功能
3. 完善权限控制
4. 添加更多业务类型(费用报销、请假申请、采购申请)
---
## 快速参考
### 查看问题汇总
所有历史问题已整理在 `docs/PROJECT_ISSUES.md` 文件中。
### 让 CLAUDE 加载问题文档
```
请参考 docs/PROJECT_ISSUES.md 中的问题汇总
```
### 调试后端
```bash
# 查看日志
docker logs x-server-backend -f --tail 50
# 重启后端
docker compose restart backend
# 复制文件到容器
docker cp host_file x-server-backend:/app/app/service/xxx.php
# 重载 workers(不重启整个服务)
docker exec x-server-backend php /app/webman reload
```
### 数据库操作
```bash
# 进入 MySQL 容器
docker exec -it 1Panel-mysql-409s mysql -uroot -pmysql_xEsdPa xserver
# 运行测试数据脚本
docker exec x-server-backend php /app/test_data.php
```