4ceb5eac7e
文件结构优化: - 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>
602 lines
20 KiB
Markdown
602 lines
20 KiB
Markdown
# 企业内部工具系统 - 实现计划
|
||
|
||
## 项目概述
|
||
|
||
开发一个企业内部工具系统平台,以出差审批为首个功能模块,后续可持续扩展新功能。系统主要支持移动 H5,嵌入飞书应用中使用。
|
||
|
||
### 核心目标
|
||
- **H5 移动端优先**:专注于移动端体验,PC 端后期扩展
|
||
- 从工具台层面设计可扩展的页面结构
|
||
- **审批模块作为独立通用工具**:支持多样化审批场景,业务可复用
|
||
- 良好的飞书集成能力(多公司、多应用架构)
|
||
|
||
---
|
||
|
||
## 技术方案
|
||
|
||
### 技术架构
|
||
|
||
#### 前端技术栈(H5 移动端)
|
||
| 技术 | 用途 | 说明 |
|
||
|------|------|------|
|
||
| React 18 | 前端框架 | 配合 TypeScript |
|
||
| Ant Design Mobile | UI 组件库 | 移动端组件库 |
|
||
| Vant | 补充组件 | 必要时补充使用 |
|
||
| Vite | 构建工具 | 快速开发体验 |
|
||
| React Router | 路由管理 | 支持多页面应用 |
|
||
| Zustand / Jotai | 状态管理 | 轻量级方案 |
|
||
| React Query | 数据请求 | 服务端状态管理 |
|
||
| PostCSS + pxtorem | 移动端适配 | rem 转换 |
|
||
| VConsole | 调试工具 | 移动端调试 |
|
||
|
||
#### 后端技术栈
|
||
| 技术 | 用途 | 说明 |
|
||
|------|------|------|
|
||
| Webman | PHP 框架 | 高性能常驻内存框架 |
|
||
| MySQL | 数据库 | 关系型数据库 |
|
||
| Redis | 缓存 | 会话、缓存存储 |
|
||
| JWT | 认证 | Token 认证机制 |
|
||
|
||
### 多租户架构设计
|
||
|
||
**核心概念**:
|
||
- 系统**不按公司隔离用户**,用户全局唯一
|
||
- 用户关联所属公司,用于选择对应飞书应用配置
|
||
- 审批流程跨公司,只识别人员
|
||
- 飞书仅提供:系统入口 + 人员识别鉴权
|
||
|
||
**数据模型**:
|
||
|
||
```sql
|
||
-- 公司表(飞书应用配置)
|
||
CREATE TABLE company (
|
||
id BIGINT PRIMARY KEY,
|
||
name VARCHAR(100),
|
||
feishu_app_id VARCHAR(100),
|
||
feishu_app_secret VARCHAR(255),
|
||
feishu_tenant_key VARCHAR(100),
|
||
status TINYINT DEFAULT 1
|
||
);
|
||
|
||
-- 用户表(全局用户)
|
||
CREATE TABLE user (
|
||
id BIGINT PRIMARY KEY,
|
||
company_id BIGINT, -- 所属公司
|
||
feishu_user_id VARCHAR(100), -- 飞书用户ID
|
||
feishu_union_id VARCHAR(100),-- 飞书UnionID(跨应用唯一)
|
||
name VARCHAR(50),
|
||
email VARCHAR(100),
|
||
phone VARCHAR(20),
|
||
avatar VARCHAR(255),
|
||
status TINYINT DEFAULT 1
|
||
);
|
||
|
||
-- 用户与飞书应用关联(支持用户切换不同公司应用)
|
||
CREATE TABLE user_feishu_binding (
|
||
id BIGINT PRIMARY KEY,
|
||
user_id BIGINT,
|
||
company_id BIGINT,
|
||
feishu_open_id VARCHAR(100),
|
||
created_at TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 项目目录结构(前后端分离)
|
||
|
||
```
|
||
x-server-mobile/ # 项目根目录
|
||
├── frontend/ # 前端项目(React + Vite)
|
||
│ ├── src/
|
||
│ │ ├── components/ # 通用组件
|
||
│ │ │ ├── approval/ # 审批组件(可复用)
|
||
│ │ │ ├── layout/ # 布局组件
|
||
│ │ │ └── common/ # 通用组件
|
||
│ │ ├── pages/ # 页面
|
||
│ │ │ ├── dashboard/ # 工具台首页
|
||
│ │ │ ├── business-trip/ # 出差审批
|
||
│ │ │ └── profile/ # 个人中心
|
||
│ │ ├── hooks/ # 自定义 Hooks
|
||
│ │ ├── services/ # API 服务
|
||
│ │ ├── stores/ # 状态管理
|
||
│ │ ├── utils/ # 工具函数
|
||
│ │ ├── types/ # TypeScript 类型
|
||
│ │ └── config/ # 配置文件
|
||
│ ├── public/
|
||
│ ├── package.json
|
||
│ └── vite.config.ts
|
||
│
|
||
└── backend/ # 后端项目(Webman)
|
||
├── app/
|
||
│ ├── controller/
|
||
│ ├── model/
|
||
│ ├── service/
|
||
│ ├── middleware/
|
||
│ └── util/
|
||
├── config/
|
||
├── routes/
|
||
├── support/
|
||
├── composer.json
|
||
└── start.php
|
||
```
|
||
|
||
### 后端项目结构(Webman)
|
||
```
|
||
backend/
|
||
├── app/
|
||
│ ├── controller/
|
||
│ │ ├── ApprovalController.php # 审批控制器
|
||
│ │ ├── BusinessTripController.php # 出差审批控制器
|
||
│ │ ├── UserController.php # 用户控制器
|
||
│ │ ├── CompanyController.php # 公司管理控制器
|
||
│ │ └── BaseController.php # 基础控制器
|
||
│ ├── model/
|
||
│ │ ├── Approval.php # 审批模型
|
||
│ │ ├── ApprovalNode.php # 审批节点模型
|
||
│ │ ├── BusinessTrip.php # 出差模型
|
||
│ │ ├── User.php # 用户模型
|
||
│ │ ├── Company.php # 公司模型
|
||
│ │ └── UserFeishuBinding.php # 用户飞书绑定模型
|
||
│ ├── service/
|
||
│ │ ├── ApprovalService.php # 审批服务
|
||
│ │ ├── FeishuService.php # 飞书服务(多应用)
|
||
│ │ ├── FeishuAppManager.php # 飞书应用配置管理
|
||
│ │ ├── UserService.php # 用户服务
|
||
│ │ └── CompanyService.php # 公司服务
|
||
│ ├── middleware/
|
||
│ │ ├── AuthMiddleware.php # 认证中间件
|
||
│ │ ├── CompanyResolveMiddleware.php # 公司识别中间件
|
||
│ │ └── CorsMiddleware.php # 跨域中间件
|
||
│ └── util/
|
||
│ ├── JwtUtil.php # JWT工具
|
||
│ └── Response.php # 响应封装
|
||
├── config/
|
||
│ ├── route.php # 路由配置
|
||
│ ├── database.php # 数据库配置
|
||
│ ├── redis.php # Redis配置
|
||
│ └── feishu.php # 飞书应用配置模板
|
||
├── routes/
|
||
│ └── api.php # API路由定义
|
||
└── support/
|
||
└── Bootstrap.php # 启动文件
|
||
```
|
||
|
||
### API 接口设计
|
||
|
||
#### 通用 API 规范
|
||
```
|
||
基础URL: /api/v1
|
||
响应格式:
|
||
{
|
||
"code": 0, // 0表示成功
|
||
"message": "success",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
#### 审批相关接口
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | /approval/list | 获取审批列表 |
|
||
| GET | /approval/detail/:id | 获取审批详情 |
|
||
| POST | /approval/submit | 提交审批申请 |
|
||
| POST | /approval/approve/:id | 审批通过 |
|
||
| POST | /approval/reject/:id | 审批拒绝 |
|
||
| POST | /approval/cancel/:id | 撤销申请 |
|
||
| GET | /approval/flow/:type | 获取审批流程配置 |
|
||
|
||
#### 出差审批接口
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | /business-trip/list | 获取出差列表 |
|
||
| GET | /business-trip/detail/:id | 获取出差详情 |
|
||
| POST | /business-trip/apply | 提交出差申请 |
|
||
| PUT | /business-trip/:id | 更新出差申请(草稿状态) |
|
||
|
||
#### 用户认证接口(多飞书应用)
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| POST | /auth/login | 用户登录 |
|
||
| POST | /auth/feishu-login | 飞书免登(自动识别公司应用) |
|
||
| GET | /user/info | 获取用户信息 |
|
||
| GET | /user/menu | 获取用户菜单权限 |
|
||
| GET | /user/companies | 获取用户可切换的公司列表 |
|
||
| POST | /user/switch-company | 切换当前公司 |
|
||
|
||
#### 飞书应用管理接口(管理端)
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | /admin/company/list | 获取公司列表 |
|
||
| POST | /admin/company/add | 添加公司飞书应用配置 |
|
||
| PUT | /admin/company/:id | 更新公司飞书配置 |
|
||
| DELETE | /admin/company/:id | 删除公司配置 |
|
||
|
||
---
|
||
|
||
## 功能模块设计
|
||
|
||
### 1. 工具台架构(Dashboard - H5 移动端)
|
||
|
||
**设计理念**:工具台作为统一入口,支持模块化扩展,专注于移动端体验
|
||
|
||
```
|
||
工具台首页(H5)
|
||
├── 顶部导航栏
|
||
│ ├── Logo + 系统名称
|
||
│ ├── 搜索框(全局搜索)
|
||
│ ├── 通知图标
|
||
│ └── 用户头像
|
||
├── 主内容区
|
||
│ ├── 待办事项卡片(横向滚动)
|
||
│ ├── 快捷入口(九宫格/宫格)
|
||
│ ├── 数据统计卡片
|
||
│ └── 最新动态列表
|
||
└── 底部导航栏(TabBar)
|
||
├── 首页
|
||
├── 应用(宫格展开所有工具)
|
||
├── 消息
|
||
└── 我的
|
||
```
|
||
|
||
**移动端适配要点**:
|
||
- 使用 TabBar 替代侧边栏(符合移动端习惯)
|
||
- 750px 设计稿 → rem 自适应转换
|
||
- 触摸手势支持(下拉刷新、上拉加载)
|
||
- 安全区域适配(刘海屏、底部横条)
|
||
|
||
**关键文件**:
|
||
- `src/pages/dashboard/index.tsx` - 工具台主页
|
||
- `src/components/layout/MobileLayout.tsx` - 移动端主布局
|
||
- `src/components/layout/TabBar.tsx` - 底部导航栏
|
||
- `src/components/layout/Header.tsx` - 顶部栏
|
||
|
||
### 2. 通用审批模块设计(独立工具)
|
||
|
||
**设计理念**:审批模块作为独立的通用工具,与具体业务解耦,支持多样化的审批场景
|
||
|
||
**核心特性**:
|
||
- ✅ 业务无关:不绑定特定业务表单和流程
|
||
- ✅ 流程灵活:支持单级、多级、会签、或签、抄送等任意组合
|
||
- ✅ 动态配置:审批流程可动态配置和调整
|
||
- ✅ 易于集成:任何业务都可快速接入审批模块
|
||
|
||
**核心数据模型**:
|
||
|
||
```typescript
|
||
// 审批流程节点类型
|
||
enum ApprovalNodeType {
|
||
APPROVER = 'approver', // 审批人(单人)
|
||
AND_APPROVE = 'and_approve', // 会签(需所有人通过)
|
||
OR_APPROVE = 'or_approve', // 或签(任一人通过)
|
||
NOTIFY = 'notify' // 抄送(通知用)
|
||
}
|
||
|
||
// 审批单状态
|
||
enum ApprovalStatus {
|
||
DRAFT = 'draft', // 草稿
|
||
PENDING = 'pending', // 审批中
|
||
APPROVED = 'approved', // 已通过
|
||
REJECTED = 'rejected', // 已拒绝
|
||
CANCELLED = 'cancelled' // 已撤销
|
||
}
|
||
|
||
// 审批流程配置(业务无关)
|
||
interface ApprovalFlow {
|
||
id: string;
|
||
businessType: string; // 业务类型标识(如:business-trip, purchase)
|
||
name: string;
|
||
nodes: ApprovalNode[]; // 流程节点
|
||
}
|
||
|
||
// 审批节点
|
||
interface ApprovalNode {
|
||
id: string;
|
||
type: ApprovalNodeType;
|
||
approvers: User[]; // 审批人列表
|
||
order: number; // 节点顺序
|
||
conditions?: any; // 条件判断(可选,用于条件分支)
|
||
}
|
||
|
||
// 审批单(业务通用)
|
||
interface ApprovalOrder {
|
||
id: string;
|
||
businessType: string; // 业务类型
|
||
businessId: string; // 业务单据ID
|
||
title: string; // 审批标题
|
||
applicant: User; // 申请人
|
||
status: ApprovalStatus;
|
||
currentNodes: string[]; // 当前待审批节点ID
|
||
flowId: string; // 使用的流程ID
|
||
formData: any; // 业务表单数据(JSON存储)
|
||
attachments: Attachment[]; // 附件
|
||
timeline: ApprovalTimeline[]; // 审批轨迹
|
||
}
|
||
```
|
||
|
||
**审批模块架构**:
|
||
|
||
```
|
||
src/modules/approval/ # 审批模块(独立)
|
||
├── components/ # UI组件
|
||
│ ├── ApprovalFlow.tsx # 流程可视化
|
||
│ ├── ApprovalDetail.tsx # 审批详情
|
||
│ ├── ApprovalList.tsx # 审批列表
|
||
│ └── ApprovalAction.tsx # 审批操作
|
||
├── hooks/ # 自定义Hooks
|
||
│ ├── useApprovalSubmit.ts # 提交审批
|
||
│ ├── useApprovalAction.ts # 审批操作
|
||
│ └── useApprovalList.ts # 获取列表
|
||
├── services/ # API服务
|
||
│ └── approval.ts
|
||
├── types/ # 类型定义
|
||
│ └── index.ts
|
||
└── utils/ # 工具函数
|
||
├── flowParser.ts # 流程解析
|
||
└── statusCalculator.ts # 状态计算
|
||
```
|
||
|
||
**业务接入示例(出差审批)**:
|
||
|
||
```typescript
|
||
// 业务模块只需要调用审批模块的Hook
|
||
import { useApprovalSubmit } from '@/modules/approval/hooks'
|
||
|
||
function BusinessTripApply() {
|
||
const { submitApproval } = useApprovalSubmit('business-trip')
|
||
|
||
const handleSubmit = async (formData: BusinessTripFormData) => {
|
||
// 1. 先保存业务数据
|
||
const businessTripId = await saveBusinessTrip(formData)
|
||
|
||
// 2. 提交审批(传入业务类型和业务ID)
|
||
await submitApproval({
|
||
businessId: businessTripId,
|
||
title: `出差申请 - ${formData.destination}`,
|
||
formData: formData,
|
||
flowType: 'default' // 使用的流程模板
|
||
})
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. 出差审批模块
|
||
|
||
**页面结构**:
|
||
```
|
||
出差审批
|
||
├── 申请列表页
|
||
│ ├── 我发起的
|
||
│ ├── 待我审批
|
||
│ ├── 我已审批
|
||
│ └── 抄送我的
|
||
├── 申请表单页
|
||
│ ├── 基本信息(出差事由、时间、地点)
|
||
│ ├── 行程明细
|
||
│ ├── 费用预算
|
||
│ └── 附件上传
|
||
└── 审批详情页
|
||
├── 表单内容展示
|
||
├── 流程进度可视化
|
||
├── 审批历史
|
||
└── 操作按钮
|
||
```
|
||
|
||
**关键文件**:
|
||
- `src/pages/business-trip/list.tsx` - 列表页
|
||
- `src/pages/business-trip/apply.tsx` - 申请表单
|
||
- `src/pages/business-trip/detail.tsx` - 详情页
|
||
- `src/pages/business-trip/types.ts` - 出差相关类型
|
||
|
||
### 4. 飞书集成(多应用架构)
|
||
|
||
**集成要点**:
|
||
|
||
#### 后端 - 多飞书应用管理
|
||
```php
|
||
// 飞书应用管理器
|
||
class FeishuAppManager
|
||
{
|
||
// 根据飞书租户Key获取公司配置
|
||
public function getCompanyByTenantKey(string $tenantKey): Company
|
||
{
|
||
// 从数据库查询对应的飞书应用配置
|
||
}
|
||
|
||
// 获取指定公司的飞书 access_token
|
||
public function getAccessToken(int $companyId): string
|
||
{
|
||
// 缓存 access_token,过期自动刷新
|
||
}
|
||
|
||
// 根据用户ID获取其所属公司的飞书配置
|
||
public function getUserFeishuConfig(int $userId): array
|
||
{
|
||
// 返回用户所属公司的飞书 AppID、AppSecret 等
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 前端 - 飞书 SDK 封装
|
||
```typescript
|
||
// src/utils/feishu.ts
|
||
export const FeishuSDK = {
|
||
// 获取免登授权码
|
||
getAuthCode: () => { /* ... */ },
|
||
|
||
// 判断是否在飞书环境
|
||
isFeishuEnv: () => { /* ... */ },
|
||
|
||
// 获取当前租户信息(用于后端识别公司)
|
||
getTenantContext: () => {
|
||
// 从飞书容器获取 tenant_key 或其他标识
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 飞书免登流程(多应用)
|
||
```
|
||
1. 用户在飞书中打开应用
|
||
2. 前端获取 auth_code 和 tenant_key
|
||
3. 调用后端 /auth/feishu-login
|
||
4. 后端根据 tenant_key 查询对应公司配置
|
||
5. 使用该公司的 AppSecret 换取用户信息
|
||
6. 生成 JWT Token(包含 user_id 和 company_id)
|
||
7. 返回登录信息
|
||
```
|
||
|
||
---
|
||
|
||
## 实施步骤
|
||
|
||
### 阶段一:项目初始化
|
||
**前端:**
|
||
1. 初始化 Vite + React + TypeScript 项目
|
||
2. 安装 Ant Design 及相关依赖
|
||
3. 配置路由、状态管理、请求库(axios + React Query)
|
||
4. 配置 Tailwind CSS
|
||
|
||
**后端:**
|
||
1. 安装 Webman 框架
|
||
2. 配置 MySQL、Redis 连接
|
||
3. 配置 JWT 认证
|
||
4. 设置 CORS 中间件
|
||
5. **创建多租户数据表(company, user, user_feishu_binding)**
|
||
|
||
### 阶段二:工具台框架(H5)
|
||
**前端:**
|
||
1. 实现 MobileLayout 移动端布局组件
|
||
2. 实现 TabBar 底部导航栏
|
||
3. 实现 Header 组件
|
||
4. 创建工具台首页 Dashboard(H5 适配)
|
||
5. 配置 rem 移动端适配
|
||
|
||
**后端:**
|
||
1. 实现 /auth/login 登录接口
|
||
2. **实现 /auth/feishu-login 飞书免登(多应用识别)**
|
||
3. 实现 /user/info 用户信息接口
|
||
4. 实现 /user/menu 菜单权限接口
|
||
5. **实现 FeishuAppManager 服务(多应用配置管理)**
|
||
6. **实现 CompanyResolveMiddleware 中间件**
|
||
|
||
### 阶段三:独立审批模块(通用工具)
|
||
**前端:**
|
||
1. 创建 `src/modules/approval/` 独立模块目录
|
||
2. 定义审批相关 TypeScript 类型(业务无关)
|
||
3. 实现 ApprovalFlow 流程可视化组件
|
||
4. 实现 ApprovalDetail 详情页(通用)
|
||
5. 实现 ApprovalList 列表页(通用)
|
||
6. 实现 ApprovalAction 操作组件
|
||
7. **封装审批 Hooks(useApprovalSubmit, useApprovalAction)**
|
||
8. **提供业务接入示例**
|
||
|
||
**后端:**
|
||
1. 设计审批流程数据表(approval_flow, approval_node)
|
||
2. 设计审批单数据表(approval_order, approval_record)
|
||
3. 实现审批服务层逻辑(单级、多级、会签、或签)
|
||
4. **确保业务无关性,通过 businessType + businessId 关联业务**
|
||
5. 实现审批相关 API 接口
|
||
|
||
### 阶段四:出差审批业务(作为审批模块的使用示例)
|
||
**前端:**
|
||
1. 创建出差申请表单页面
|
||
2. **调用审批模块的 useApprovalSubmit Hook**
|
||
3. 创建出差审批列表(复用审批模块组件)
|
||
4. 创建出差审批详情(复用审批模块组件 + 业务表单展示)
|
||
|
||
**后端:**
|
||
1. 设计出差数据表(business_trip, business_trip_itinerary)
|
||
2. 实现出差业务逻辑(与审批解耦)
|
||
3. 实现出差相关 API 接口
|
||
4. **配置出差审批的默认流程模板**
|
||
|
||
### 阶段五:飞书集成与 H5 适配(多应用架构)
|
||
**前端:**
|
||
1. 集成飞书 JSAPI SDK
|
||
2. 实现飞书免登逻辑(获取 tenant_key)
|
||
3. **H5 移动端样式优化**
|
||
4. **配置 pxtorem(750px 设计稿适配)**
|
||
5. **安全区域适配(刘海屏、底部横条)**
|
||
6. 集成 VConsole 调试工具
|
||
|
||
**后端:**
|
||
1. **实现 FeishuService(支持多应用配置)**
|
||
2. **实现飞书应用配置管理接口(增删改查)**
|
||
3. **实现用户切换公司功能**
|
||
4. **实现飞书消息推送(根据用户所属公司推送)**
|
||
|
||
---
|
||
|
||
## 待确认问题
|
||
|
||
1. **飞书应用配置**:是否有飞书应用的 App ID、App Secret?
|
||
2. **权限设计**:是否需要 RBAC 权限系统?
|
||
3. **数据 Mock**:开发阶段是否需要 Mock 数据?
|
||
4. **部署环境**:开发/测试/生产环境配置?
|
||
|
||
---
|
||
|
||
## 关键文件清单
|
||
|
||
### 前端核心文件(H5)
|
||
| 文件路径 | 说明 |
|
||
|---------|------|
|
||
| `src/App.tsx` | 应用入口 |
|
||
| `src/main.tsx` | React 挂载点 |
|
||
| `src/router/index.tsx` | 路由配置 |
|
||
| `src/components/layout/MobileLayout.tsx` | 移动端主布局 |
|
||
| `src/components/layout/TabBar.tsx` | 底部导航栏 |
|
||
| `src/components/layout/Header.tsx` | 顶部栏 |
|
||
| `src/pages/dashboard/index.tsx` | 工具台首页 |
|
||
| `src/modules/approval/` | **审批模块(独立)** |
|
||
| `src/pages/business-trip/` | 出差审批业务 |
|
||
| `src/services/api.ts` | API 基础配置 |
|
||
| `src/utils/feishu.ts` | 飞书 SDK 封装 |
|
||
| `src/config/rem.ts` | rem 转换配置 |
|
||
| `package.json` | 项目依赖 |
|
||
| `vite.config.ts` | Vite 配置 |
|
||
| `tsconfig.json` | TypeScript 配置 |
|
||
| `postcss.config.js` | PostCSS 配置(pxtorem) |
|
||
|
||
### 后端核心文件
|
||
| 文件路径 | 说明 |
|
||
|---------|------|
|
||
| `app/controller/BaseController.php` | 基础控制器 |
|
||
| `app/controller/ApprovalController.php` | 审批控制器 |
|
||
| `app/controller/BusinessTripController.php` | 出差审批控制器 |
|
||
| `app/controller/UserController.php` | 用户控制器 |
|
||
| `app/model/Approval.php` | 审批模型 |
|
||
| `app/model/ApprovalNode.php` | 审批节点模型 |
|
||
| `app/service/ApprovalService.php` | 审批服务 |
|
||
| `app/service/FeishuService.php` | 飞书服务 |
|
||
| `app/middleware/AuthMiddleware.php` | 认证中间件 |
|
||
| `config/route.php` | 路由配置 |
|
||
| `config/database.php` | 数据库配置 |
|
||
| `routes/api.php` | API 路由定义 |
|
||
|
||
---
|
||
|
||
## 验证计划
|
||
|
||
### 前端验证(H5)
|
||
1. **运行项目**:`npm run dev` 确保项目启动
|
||
2. **路由测试**:访问各个页面确保路由正常
|
||
3. **审批模块测试**:验证审批组件的通用性和可复用性
|
||
4. **H5 适配测试**:
|
||
- 测试不同屏幕尺寸(375px - 768px)
|
||
- 测试刘海屏和底部横条适配
|
||
- 测试触摸手势交互
|
||
5. **飞书环境测试**:
|
||
- 在飞书中测试免登
|
||
- 在飞书中测试 H5 适配
|
||
- 测试多公司应用切换
|
||
6. **真机测试**:在真实移动设备上测试
|
||
|
||
### 后端验证
|
||
1. **启动 Webman**:`php start.php start` 确保服务启动
|
||
2. **API 测试**:使用 Postman/Apifox 测试各接口
|
||
3. **数据库测试**:验证数据表创建和 CRUD 操作
|
||
4. **认证测试**:验证 JWT 认证流程
|
||
5. **多租户测试**:
|
||
- 测试多公司飞书应用配置
|
||
- 测试跨公司审批流程
|
||
6. **飞书集成测试**:验证飞书免登和消息推送
|