本文目录导读:

用 PHP 搭建一套完整的 OA (办公自动化) 系统是一个不小的工程,它不仅涉及技术选型,还涉及对业务流程(如考勤、审批、报销、文档管理)的深刻理解。
下面是一份从零到一的系统性指南,包含架构设计、技术选型、核心模块实现和注意事项。
第一步:需求分析与模块划分
在写任何代码之前,需要先明确你的 OA 系统包含哪些功能,对于中型企业,通常包含以下核心模块:
- 用户与组织管理:
部门树、岗位、角色、权限 (RBAC,基于角色的访问控制)。
- 工作流引擎(最复杂的部分):
- 请假、报销、合同审批、用印申请等。
- 核心:支持“条件分支”(金额>5000 需要总经理审批)。
- 考勤管理:
打卡(位置、WIFI)、排班、请假/加班统计、月度报表。
- 任务与项目管理:
Kanban 看板、甘特图、任务分配与进度追踪。
- 文档与知识库:
在线预览(Office/PDF)、版本管理、全文检索。
- 公告与通知:
系统消息、邮件提醒、企业微信/钉钉/飞书推送。
- 日程与会议管理:
日历视图、会议室预订、冲突检测。
第二步:技术选型(PHP 生态)
核心框架
- 推荐:Laravel,理由:
- 自带完善的 Eloquent ORM(对象关系映射)。
- 强大的 队列系统(用于处理通知、邮件、报表导出)。
- 有 Spastie/laravel-permission 等现成的权限包。
- 社区活跃,遇到工作流问题有解决方案。
- 备选:ThinkPHP(国内流行,文档中文友好,但生态不如 Laravel)。
数据库
- MySQL 8.0+(必选,支持 JSON 字段用于存储流程表单数据)。
- Redis(必选,用于缓存、Session 管理、锁、队列)。
前端与交互(重要)
现代 OA 系统不建议纯后端输出 HTML,建议采用前后端分离:
- 方案 A(最推荐):Laravel + Vue 3 + Element Plus (或者 Ant Design Vue),PHP 只提供 API 接口。
- 方案 B(单体应用):Laravel + Livewire,适合小团队,PHP 7.4+ 即可,开发极快。
- 方案 C(纯后端):Laravel + Bootstrap + jQuery(仅适用于极简内部工具,不推荐未来扩展)。
关键扩展包
- 工作流:可参考
symfony/workflow或自己基于状态机实现。 - 权限:
spatie/laravel-permission。 - 富文本:TinyMCE 或 WangEditor。
- Excel 导入导出:
maatwebsite/laravel-excel(用于到处考勤表)。 - 队列驱动:
Redis或Database驱动。
第三步:核心架构设计
数据库模型设计(核心表结构)
-- 1. 用户与部门
CREATE TABLE `departments` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent_id` int unsigned DEFAULT NULL, -- 无限级分类
PRIMARY KEY (`id`)
);
CREATE TABLE `users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`department_id` int unsigned DEFAULT NULL, -- 所属部门
`position` varchar(255) DEFAULT NULL, -- 岗位
PRIMARY KEY (`id`)
);
-- 2. 权限 (RBAC 标准表,使用 Spatie 包自动生成)
-- roles, permissions, model_has_roles, role_has_permissions 等
-- 3. 工作流 (这是 OA 的灵魂)
CREATE TABLE `oa_workflows` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL, -- "请假审批流程"
`table_name` varchar(255) DEFAULT NULL, -- 关联的业务表,'oa_leaves'
`config_json` json DEFAULT NULL, -- 流程步骤配置 (JSON 格式)
PRIMARY KEY (`id`)
);
CREATE TABLE `oa_approvals` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`workflow_id` int unsigned NOT NULL,
`business_id` int unsigned NOT NULL, -- 关联具体业务记录 ID
`current_step` int unsigned DEFAULT 1, -- 当前审批步骤
`status` enum('pending','approved','rejected') DEFAULT 'pending',
`created_by` int unsigned NOT NULL, -- 申请人
PRIMARY KEY (`id`)
);
CREATE TABLE `oa_approval_records` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`approval_id` int unsigned NOT NULL,
`approver_id` int unsigned NOT NULL, -- 审批人
`step_number` int unsigned NOT NULL,
`action` enum('approve','reject','forward') DEFAULT NULL,
`comment` text,
`created_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
工作流引擎设计(重点)
这是最复杂的地方,不要让代码写死“部门经理→总监→CEO”,而是采用 配置化:
- 节点定义:每个节点包含
assignee_type(如:直接上级、部门主管、指定角色、发起人自选) 和condition(条件分支)。 - 流程图:在前端(Vue)使用类似
bpmn.js的库绘制流程图,后端存储为 JSON 数据。 - 处理逻辑:
- 用户提交申请 → 创建
oa_approvals记录。 current_step指向第一个节点。- 系统根据配置找到对应的审批人(查找用户的直接上级)。
- 审批人操作(同意/驳回)→ 更新
oa_approval_records。 - 如果同意且非最后一步 →
current_step++;如果驳回 → 状态改为rejected。
- 用户提交申请 → 创建
第四步:开发实施路径
建议按以下顺序迭代开发,快速交付最小可用产品(MVP):
-
第 1 周:基础框架搭建
- 部署 Laravel + Vue。
- 完成用户登录、注册、部门/岗位管理。
- 实现 RBAC 权限系统(管理员能配置角色/菜单)。
-
第 2-3 周:核心审批模块
- 开发:实现请假、报销两个最简单的审批流程(硬编码流程,暂不配流程图)。
- 功能:提交申请、审批列表、已办/待办、消息通知(站内信 + 邮件)。
-
第 4 周:考勤与排班
- 完成打卡 API(需考虑 GPS 校验或绑定 WIFI MAC)。
- 排班表(支持轮班、固定班次)。
- 生成月度考勤统计(借助
Laravel-Excel导出)。
-
第 5-6 周:工作流引擎重构成动态配置
- 将第 2 步硬编码的审批流重构为通过后台管理界面配置。
- 实现流程图的前端可视化编辑(使用
bpmn-js或自建拖拽组件)。
-
第 7-8 周:协同与通知
- 任务管理(看板功能)。
- 文档管理(集成
OnlyOffice或Collabora实现在线编辑)。 - 对接企业微信/钉钉/飞书(发送审批通知)。
第五步:生产环境注意事项
-
安全性:
- CSRF:Laravel 默认已防。
- SQL 注入:使用 Eloquent ORM 即可避免。
- XSS:前端渲染时对用户输入进行转义。
- 接口鉴权:所有 API 必须验证
token(Sanctum 或 Passport)。 - 文件上传:限制上传类型(如禁止上传 PHP 文件),文件名 UUID 重命名,存储于
storage/app/private(禁止直接public访问)。
-
性能与扩展:
- 队列:将邮件发送、审批通知、报表生成丢入队列(
QUEUE_CONNECTION=redis)。 - 缓存:用
Redis缓存用户权限列表、部门树(不频繁变动的数据)。 - 数据库:为
oa_approvals的status、created_by加索引。
- 队列:将邮件发送、审批通知、报表生成丢入队列(
-
二次开发与维护:
- 模块化:使用 Laravel 的
Modules包(如nWidart/laravel-modules)将不同功能(审批、考勤、文档)拆分成独立模块。 - API 版本控制:
/api/v1/...方便后续升级。
- 模块化:使用 Laravel 的
| 步骤 | 核心任务 | 技术关键点 |
|---|---|---|
| 选型 | 选 Laravel + Vue | 前后端分离,ORM 熟练 |
| 最难 | 工作流引擎 | 状态机 + JSON 配置化 + 分支条件 |
| 最烦 | 考勤规则 | 排班、迟到早退、加班规则计算 |
| 必须做 | 权限与安全 | RBAC + CSRF + 文件白名单 |
| 不能省 | 异步任务 | Redis 队列处理通知、报表 |
建议:不要试图一次性开发完所有功能,先从 “用户管理 + 请假审批 + 考勤打卡” 这三个核心模块开始,上线使用后根据反馈逐步增加,这样更可控,也更能满足实际需求。