
简介这是一套面向中小企业信息化建设者、PHP开发者与运维人员的开源一体化办公平台OA系统源代码基于php5.2与MySQL构建可运行于Windows或Linux环境并支持PC与手机双端访问还能接入钉钉和企业微信。系统不止于基础OA还整合了流程与表单配置、公文管理、人事管理EHR、会员管理、行政管理、客户关系管理CRM、财务管理、工程管理、项目管理及知识管理等多个业务模块适合用于二次开发、企业内部部署或教学研究。压缩包共1403个文件以702个php业务逻辑文件、177个html页面、169个js脚本、90个png与231个gif界面素材为主另含19个css样式、1个sql数据库脚本及少量字体与音频文件整体约2.53MB目录结构清晰。目前已有221人学习下载读者可据此快速搭建完整办公平台理解模块划分与前后端组织方式并在此基础上进行功能裁剪或扩展。1. 从一份 OA 源码包说起PHP5.2 环境下的企业一体化办公平台能跑出什么很多做企业信息化的朋友拿到「企业一体化办公平台OA系统源代码.rar」这类资源时第一反应是「先解压看看有没有安装说明」第二反应是「这玩意儿到底能不能跑起来」。我拆过不少类似的 PHP 老系统这份包的特点很明确它不是单纯的 OA而是把公文、人事、行政、客户、财务、工程、项目、知识库这些模块全塞进了一套代码里前端还混用了 bootstrap_cerulean、font-awesome、weui 这几套样式PC 和手机端都做了适配甚至预留了钉钉和企业微信的接入位。技术栈是 PHP5.2 MySQL运行环境 Win/Linux 都行。适合谁适合手里有老服务器、需要快速搭一套内部办公系统做二次开发或功能验证的团队也适合想研究传统 PHP 一体化架构的开发者。但别指望它开箱即用——安装步骤里藏着几个必须手动处理的坑后面会逐个拆。2. 环境准备与数据库导入PHP5.2 不是随便找个 PHP7 就能糊弄的2.1 为什么必须锁定 PHP5.2 和 MySQL 版本这份源码的摘要里写得很清楚php5.2 MYSQL。这不是建议是硬约束。PHP5.2 和 PHP7 之间的语法差异大到什么程度mysql_*函数在 PHP7 里直接被移除而这类老 OA 系统几乎全是mysql_query、mysql_fetch_array走天下。你拿 PHP7 去跑第一屏就是致命错误。MySQL 这边老系统常用TYPEMyISAM建表语句MySQL 5.5 之后虽然还能识别但会警告MySQL 8.0 直接不认。所以我的建议是用 PHP5.2 到 PHP5.4 之间的版本MySQL 用 5.1 到 5.5 之间的版本别追新。如果你手头只有 PHP7 环境常见做法是装个 PHP5.2 的独立运行环境或者用虚拟机单独跑一个老版本。别想着改代码去适配 PHP7那工作量够你重写一遍系统。2.2 建库与导入 db.sql 的具体操作数据库文件在webmain/install/db.sql这个路径是摘要里明确给出的。操作步骤不复杂但字符集和权限容易翻车。# 登录 MySQL创建数据库字符集建议用 utf8 而不是 utf8mb4 mysql -u root -p CREATE DATABASE oa_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE oa_db; # 导入 SQL 文件注意路径要写对 source /path/to/webmain/install/db.sql; # 导入完成后检查表数量正常应该有几十张表 SHOW TABLES;逻辑说明CREATE DATABASE那行指定了 utf8 字符集因为老系统的 SQL 文件里建表语句大概率是 utf8 的你用 utf8mb4 导入可能遇到索引长度超限的问题。source命令后面跟绝对路径别用相对路径否则容易找不到文件。导入完成后SHOW TABLES看一眼如果表数量明显偏少说明 SQL 文件没导完检查文件是否完整。参数说明数据库名oa_db你可以自己改但后面配置文件里要对应上。字符集utf8_general_ci是排序规则老系统用这个最稳。导入过程中如果报ERROR 1064语法错误大概率是 SQL 文件里有 MySQL 新版本不支持的语法换老版本 MySQL 即可。提示导入前先看一眼 db.sql 文件大小如果只有几 KB那可能是空文件或者被截断了别急着往下走。2.3 目录权限与运行环境检查Linux 下跑这套系统webmain目录需要给 Web 服务器写权限因为系统运行时会生成缓存文件、上传附件。常见做法是chmod -R 755 webmain如果还不行就chown -R www-data:www-data webmain。Windows 下一般不用管权限但要注意 PHP 的upload_max_filesize和post_max_size别设太小不然后面传附件会失败。检查 PHP 扩展mysql、gd、mbstring、curl这几个必须开。gd用于验证码和图片处理curl用于钉钉和企业微信的接口调用。缺哪个就在 php.ini 里把对应扩展前面的分号去掉重启 Web 服务器。3. 配置文件改造与安装目录清理randkey 不填等于白装3.1 webmainConfig.php1 改名与参数填写摘要里第 3 步和第 4 步是连在一起的进入webmain目录把webmainConfig.php1改成webmainConfig.php然后配置数据库、地址等信息。这个改名操作看起来简单但很多人会漏掉randkey的填写。// webmain/webmainConfig.php 关键配置段 $db_host 127.0.0.1; // 数据库主机本地就写 127.0.0.1 $db_user root; // 数据库用户名 $db_pass your_password; // 数据库密码 $db_name oa_db; // 数据库名和前面创建的要一致 $db_charset utf8; // 字符集 // 这个 randkey 必须填摘要里给了固定值 $randkey almvhcusrywkxvnzgdjtciodnu; // 站点地址本地测试就写 http://127.0.0.1/ $site_url http://127.0.0.1/;逻辑说明webmainConfig.php1是模板文件改名后系统才能读取配置。randkey这个参数是系统内部加密用的盐值摘要里明确说了「这个一定要写」不写的话登录会话、表单令牌这些都会出问题表现就是登录后一直跳回登录页或者提交表单提示非法请求。site_url影响页面里静态资源的引用路径写错了 CSS 和 JS 加载不出来页面会裸奔。参数说明db_host如果数据库和 Web 服务器不在同一台机器写实际 IP。db_charset和建库时保持一致。randkey就用摘要里给的那串别自己改改了可能和数据库里已有的加密数据对不上。3.2 删除安装文件与目录的必要性摘要第 6 步删除webmain/webmainConfig.php1删除webmain/install目录。这两步不是可选项是安全要求。install目录里通常有重新安装的入口留着的话别人访问http://你的域名/install/就能重装系统、覆盖数据库。webmainConfig.php1是模板文件留着虽然不直接泄密但属于冗余文件删掉干净。# 在 webmain 目录下执行 rm -f webmainConfig.php1 rm -rf install/逻辑说明rm -f强制删除文件rm -rf递归删除目录。执行前确认当前目录是webmain别在根目录乱删。删完后刷新页面如果还能访问安装入口说明删错了位置。注意删除前最好把install目录备份到 Web 根目录之外的地方万一后面需要重装还能找回来。3.3 初始登录与后台功能验证浏览器打开http://127.0.0.1/用admin/123456登录。登录后别急着点各个菜单先做三件事第一看右上角有没有报错弹窗有的话多半是某个模块的配置文件没写对第二进「系统设置」看数据库连接状态第三随便点开一个流程配置或表单配置的页面确认能正常加载。如果登录后页面空白打开浏览器的开发者工具看 Network 面板大概率是某个 CSS 或 JS 文件 404。回到webmainConfig.php检查site_url是否和实际访问地址一致。如果提示「数据库连接失败」检查db_user、db_pass、db_name三项。4. 模块功能拆解与二次开发入口从流程配置到钉钉接入4.1 流程配置与表单配置的实现逻辑这套 OA 的核心卖点是「支持流程配置、表单配置」这意味着你不需要改代码就能定义审批流和表单字段。流程配置通常存在flow或workflow相关的表里表单配置存在form相关的表里。二次开发时如果你想加一个新的审批类型常见做法是先在后台的流程管理里新建一个流程绑定表单然后在前台发起测试。-- 查看流程定义表结构表名可能因版本而异 SHOW TABLES LIKE %flow%; SHOW TABLES LIKE %form%; -- 查看某个流程的节点配置 SELECT * FROM oa_flow_node WHERE flow_id 1;逻辑说明先通过SHOW TABLES LIKE找到实际的表名老系统的表名不一定叫oa_flow可能是webmain_flow或者带前缀。找到后查节点表看流程的审批节点是怎么串起来的。参数说明flow_id换成你实际创建的流程 ID。4.2 公文、人事、CRM 等模块的代码分布摘要里列了一长串模块公文管理、人事管理(EHR)、会员管理、行政管理、客户关系管理(CRM)、财务管理、工程管理、项目管理、知识管理。这些模块在代码目录里通常是按文件夹分开的比如webmain/下面会有document、hr、crm、finance这样的子目录。每个模块有自己的控制器、模型和视图。# 查看 webmain 下的模块目录结构 ls -d webmain/*/ # 典型输出可能包括 # webmain/document/ 公文 # webmain/hr/ 人事 # webmain/crm/ 客户关系 # webmain/finance/ 财务 # webmain/project/ 项目逻辑说明ls -d */只列出目录不展开内容。找到模块目录后进去看index.php或controller文件夹就能定位到具体的业务逻辑。参数说明不同版本的目录名可能有差异以实际为准。4.3 钉钉与企业微信接入的配置位置摘要提到「可接入钉钉和企业微信」这类接入通常需要在后台填 AppKey、AppSecret、AgentId 这些参数。配置入口一般在「系统设置」或「第三方接入」菜单里。代码层面接口调用的逻辑可能在webmain/api/或webmain/include/下面。// 常见的钉钉配置参数示例实际字段名以系统为准 $dingtalk_config [ app_key your_app_key, app_secret your_app_secret, agent_id your_agent_id, ];逻辑说明钉钉和企业微信的接入都需要在对应开放平台创建应用拿到凭证后填到系统里。参数说明app_key和app_secret是应用身份标识agent_id是微应用 ID。填完后在手机端测试消息推送和审批跳转。提示接入前先在钉钉或企业微信后台配置好回调域名否则接口会报 redirect_uri 不匹配。5. 避坑与排查老 PHP 系统的血泪经验5.1 登录后无限跳回登录页现象输入 admin / 123456 后页面闪一下又回到登录页或者提示「请先登录」。原因randkey没填或填错导致会话加密校验失败。另一个可能是site_url和实际访问地址不一致Cookie 域不匹配。解决打开webmainConfig.php确认randkey的值是almvhcusrywkxvnzgdjtciodnu一个字符都不能差。然后检查site_url本地测试就写http://127.0.0.1/别写localhost两者 Cookie 域不同。5.2 页面样式全丢只剩文字现象登录后页面没有颜色、没有图标排版全乱。原因site_url配置错误导致 CSS 和 JS 文件路径 404。或者webmain目录下的css、js文件夹权限不对Web 服务器读不到。解决浏览器开发者工具看 Network 面板找到 404 的文件根据路径反推site_url应该怎么写。Linux 下执行chmod -R 755 webmain/css webmain/js。5.3 导入 db.sql 时报语法错误现象source db.sql执行到一半报ERROR 1064或ERROR 1067。原因MySQL 版本太新不支持老 SQL 文件里的TYPEMyISAM或ENGINEMyISAM写法。或者 SQL 文件本身不完整。解决换 MySQL 5.1 到 5.5 之间的版本重新导入。如果换版本还报错用文本编辑器打开 db.sql搜索TYPE改成ENGINE保存后再导入。5.4 手机端访问排版错乱现象PC 端正常手机浏览器打开后页面元素重叠、按钮点不到。原因这套系统用了 weui.min.css 做移动端适配但site_url或视图层的 viewport 配置可能有问题。解决检查页面头部有没有meta nameviewport contentwidthdevice-width, initial-scale1.0。没有的话在公共头部文件里加上。另外确认weui.min.css的路径正确别被site_url带偏。5.5 删除 install 目录后系统报错现象删掉webmain/install后访问某些页面提示「文件不存在」。原因系统某些初始化逻辑可能依赖 install 目录下的文件虽然摘要说可以删但个别版本可能有残留引用。解决先恢复 install 目录全局搜索代码里有没有install/的引用找到后把相关逻辑注释掉或改成不依赖该目录。确认无引用后再删。6. 进阶技巧用 SQL 直接查模块数据与二次开发验证这套系统跑起来之后真正干活的时候不可能全靠后台点鼠标。我一般会直接连数据库查数据尤其是做二次开发验证的时候。比如你想确认某个模块的表结构或者想批量导出客户列表SQL 比后台翻页快得多。-- 查看所有表按模块前缀分组 SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA oa_db ORDER BY TABLE_NAME; -- 查客户关系模块的客户列表表名以实际为准 SELECT id, customer_name, contact, phone, create_time FROM oa_crm_customer WHERE create_time 2024-01-01 LIMIT 20; -- 查人事模块的员工信息 SELECT id, real_name, department, position, mobile FROM oa_hr_employee WHERE status 1;逻辑说明第一条 SQL 从information_schema里查所有表TABLE_ROWS是估算行数老系统可能不准但能看出哪些表有数据。第二条和第三条是实际业务查询表名和字段名需要根据你的系统实际结构替换。参数说明TABLE_SCHEMA换成你的数据库名LIMIT控制返回条数避免一次拉太多。二次开发验证的时候我习惯先改数据库里的配置项看页面反应再决定要不要动代码。比如流程配置的某个开关先在数据库里找到对应的配置表改一个值刷新页面看效果。这样比直接改 PHP 文件快而且改错了容易回滚。还有一个技巧这套系统支持 PC 和手机但手机端的模板文件通常和 PC 端分开。如果你想改手机端的显示别去改 PC 端的 CSS找mobile或wap相关的模板目录。改之前先备份老系统的模板文件经常互相引用改一处崩三处。从那以后我每次拿到这类 PHP 老系统都强制走一遍「建库 → 导数据 → 改配置 → 删安装目录 → 登录验证 → 查表结构」的流程一步不跳。希望帮到你。本文还有配套的精品资源点击获取