简介:信呼协同办公OA系统开源版v2.1.7是一套面向中小企业及开发者的跨平台办公自动化解决方案,支持APP、PC网页端与Windows客户端三端协同,解决组织内部流程审批、任务提醒、即时沟通与自定义应用管理等核心办公需求。资源包共1332个文件,以653个PHP后端逻辑文件为主干,辅以231个GIF与90个PNG图形资源、164个HTML页面模板、159个JS交互脚本及19个CSS样式文件,涵盖Bootstrap、WeUI、Font Awesome等主流前端框架,整体压缩包仅2.95MB,轻量易部署。目前已有269人学习下载,适合PHP全栈开发者二次开发、IT管理员快速搭建私有化办公系统,或教学场景中用于理解OA系统模块设计(如问卷调查、退货单等新增业务模块)、权限体系实现与前后端协同架构。
1. 信呼协同办公OA系统开源版v2.1.7:一个能真正在中小团队跑起来的轻量级OA落地选择
很多技术负责人在选型时会陷入误区——把“开源”等同于“免运维”,把“支持APP+PC网页版+PC客户端”当成功能罗列,却忽略了最核心的问题:这个系统能否在30分钟内完成本地部署、5人小团队当天就能用上审批流、且不依赖云厂商账号或SaaS订阅?信呼v2.1.7开源版恰恰卡在这个临界点上:它不是Laravel或Django写的“教学Demo OA”,而是基于ThinkPHP 6.0深度定制的企业级协同底座,数据库层兼容MySQL 5.7+与MariaDB 10.3+,前端采用Vue 2.x+Element UI构建,关键模块如流程引擎、权限中心、消息总线全部自研,不调用任何外部SAAS接口。它面向的是有基础Linux运维能力、但无专职DevOps的IT岗或行政兼管IT的中小企业;典型场景包括:制造业车间班组长用安卓APP提设备报修,财务用PC客户端批量导出报销单Excel,HR在Chrome里配置组织架构并实时同步到所有终端。v2.1.7版本特别强化了离线表单缓存与SQLite本地数据桥接能力,这是它区别于其他“伪开源OA”的硬分水岭。
2. 从零部署信呼v2.1.7:绕过常见环境陷阱的最小可行路径
2.1 环境准备:为什么必须用PHP 7.4而非8.x,以及Nginx重写规则的底层逻辑
信呼v2.1.7的ThinkPHP 6.0内核存在两个关键约束:一是其think-orm组件对PHP 8.0+的JIT编译器存在兼容性问题,会导致流程节点保存后无法加载;二是其静态资源路由依赖Nginx的try_files指令实现SPA模式回退,Apache用户若强行改用.htaccess,90%概率触发/index.php无限重定向。因此生产环境必须锁定PHP 7.4.33(非7.4.0),并使用Nginx 1.18+。验证命令如下:
# 检查PHP版本与关键扩展 php -v | head -n1 php -m | grep -E "(pdo|mysql|openssl|curl|gd|mbstring|xml|json|zip)" # 输出应为:PHP 7.4.33 (cli) ... 及包含上述扩展名的列表 # Nginx配置核心段(/etc/nginx/conf.d/xinhoo.conf) server { listen 80; server_name oa.example.com; root /var/www/xinhoo/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }提示:
try_files $uri $uri/ /index.php?$query_string这行是信呼前端路由的命脉。若漏掉$query_string,会导致APP端发起的带参数请求(如/api/v1/workflow?node_id=123)被截断,返回404。这是线上部署失败率最高的配置项。
2.2 数据库初始化:跳过GUI安装向导的手动建库与SQL注入要点
信呼开源版未提供install.php图形化安装页,必须手动执行SQL初始化。解压后进入/database/目录,你会看到三个文件:xinhoo.sql(主库结构)、xinhoo_data.sql(默认组织/用户/流程模板)、xinhoo_upgrade_v2.1.6_to_v2.1.7.sql(增量补丁)。执行顺序不可颠倒:
# 创建数据库(字符集必须为utf8mb4,否则中文搜索失效) mysql -u root -p -e "CREATE DATABASE xinhoo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # 导入主结构(注意:-f参数强制忽略重复键错误,避免因多次执行中断) mysql -u root -p xinhoo < /var/www/xinhoo/database/xinhoo.sql # 导入初始数据(此步生成admin/admin账号) mysql -u root -p xinhoo < /var/www/xinhoo/database/xinhoo_data.sql # 应用v2.1.7专属补丁(修复PC客户端登录态校验漏洞) mysql -u root -p xinhoo < /var/www/xinhoo/database/xinhoo_upgrade_v2.1.6_to_v2.1.7.sql2.2.1 关键参数校验表:确保5个字段值与实际环境严格匹配
| 配置文件位置 | 参数名 | 推荐值 | 错误后果 |
|---|---|---|---|
/config/database.php | 'hostname' | 127.0.0.1 | 若填localhost,MySQL 8.0+会走socket连接,导致PC客户端无法认证 |
/config/app.php | 'default_timezone' | 'Asia/Shanghai' | 不设置将导致审批时间戳比实际晚8小时 |
/config/cache.php | 'type' | 'file' | redis类型需额外部署Redis服务,新手建议先用file |
/config/jwt.php | 'secret' | 随机32位字符串(如base64_encode(random_bytes(32))) | secret泄露=APP登录态可被伪造 |
/public/.htaccess | RewriteBase | / | 若部署在子目录(如/oa/),此处必须改为/oa/,否则APP图片上传403 |
2.3 PC客户端与APP的证书签名机制:如何生成合法的Android APK与Windows签名证书
信呼v2.1.7的PC客户端(Windows版)和Android APP均采用代码签名验证,未签名包会被系统拦截。Windows客户端需.pfx证书,Android需.jks密钥库,二者不可混用:
# 生成Windows签名证书(OpenSSL) openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout xinhoo_win.key -out xinhoo_win.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Xinhoo/CN=OA-Client" openssl pkcs12 -export -in xinhoo_win.crt -inkey xinhoo_win.key \ -out xinhoo_win.pfx -name "Xinhoo OA Client" # 生成Android签名密钥库(keytool) keytool -genkeypair -v -keystore xinhoo_android.jks \ -alias xinhoo_app -keyalg RSA -keysize 2048 -validity 10000 \ -dname "CN=Xinhoo, OU=IT, O=Xinhoo, L=Beijing, ST=Beijing, C=CN"注意:Android打包时必须在
/build.gradle中配置signingConfigs,且keyAlias必须与keytool生成时的-alias完全一致(本例为xinhoo_app)。若填错,APK安装后打开即闪退,logcat显示java.lang.SecurityException: Permission Denial。
3. 流程引擎实战:用3个真实业务场景配置审批流并调试异常节点
3.1 场景一:采购申请单(含多级会签与金额阈值分支)
采购流程需满足:单笔≤5000元由部门经理审批;5000~50000元追加财务总监会签;>50000元触发法务部并行审核。信呼通过“条件分支网关”实现,配置路径:后台管理 > 流程管理 > 新建流程 > 节点设置。关键操作如下:
- 在“采购申请”表单中添加数字字段
total_amount(类型:decimal(10,2)) - 设置第一个网关节点,表达式填写:
// ThinkPHP语法,注意:字段名必须用下划线,不能用驼峰 {$total_amount} <= 5000 ? 'dept_manager' : ({$total_amount} <= 50000 ? 'finance_director' : 'legal_dept') - 为
finance_director分支添加“会签节点”,勾选“所有审批人通过才进入下一节点”
3.1.1 调试技巧:查看流程实例的完整执行日志
当流程卡在某节点时,不要盲目重启服务。直接查询数据库表xinhoo_workflow_log,按workflow_id和instance_id筛选:
SELECT node_name, status, create_time, remark FROM xinhoo_workflow_log WHERE instance_id = 'WF20231015001' ORDER BY create_time DESC LIMIT 10;若出现status=0(待处理)但长时间不更新,90%是xinhoo_cron定时任务未启动。检查Linux crontab:
# 每分钟检查一次待办任务 * * * * * cd /var/www/xinhoo && php think cron:check >> /dev/null 2>&13.2 场景二:离职交接清单(PC客户端离线填写+网络恢复后自动提交)
信呼v2.1.7的PC客户端内置SQLite本地数据库,当网络中断时,用户在“离职交接”表单中填写的文档清单、资产编号、交接人等数据会暂存于%APPDATA%\Xinhoo\offline.db。恢复网络后,客户端自动执行同步。要验证该机制是否生效:
- 断开网线,用PC客户端打开离职流程,填写3项交接内容并点击“暂存”
- 查看
offline.db中的offline_forms表:SELECT form_data FROM offline_forms WHERE form_type='resignation'; -- 返回JSON字符串,包含"assets":["A001","A002"]等字段 - 重连网络,观察客户端右下角托盘图标是否由灰色变为绿色,此时数据已推送到服务端
提示:若同步失败,检查服务端
/config/offline.php中sync_url是否为http://oa.example.com/api/v1/offline/sync(必须是HTTP,HTTPS需额外配置SSL证书)
3.3 场景三:APP端扫码审批(集成企业微信/钉钉扫码回调)
信呼v2.1.7支持将审批链接转为二维码,员工用微信扫描后直接跳转APP内审批页。实现需两步:
- 后台启用“扫码审批”开关:
系统设置 > 移动端设置 > 启用扫码审批 - 在APP端
/src/utils/qrcode.js中修改回调地址:// 原始代码(指向测试域名) const redirectUrl = 'https://test.xinhoo.com/approval?id=' + id; // 修改为生产域名(必须与APP签名证书绑定的域名一致) const redirectUrl = 'https://oa.example.com/approval?id=' + id;
验证方法:用企业微信“工作台 > 扫一扫”扫描后台生成的二维码,若跳转至APP内页面且显示审批单详情,则成功;若跳转浏览器则说明redirectUrl域名未在APP签名证书的Subject Alternative Name中声明。
4. 权限体系进阶:用RBAC模型控制PC客户端菜单可见性与APP数据范围
4.1 动态菜单渲染:让不同角色看到不同的PC客户端左侧导航栏
信呼v2.1.7的PC客户端菜单并非静态HTML,而是由服务端API动态返回。关键接口为GET /api/v1/menu,其响应体结构决定客户端显示哪些菜单项。例如,销售部员工不应看到“生产计划”菜单,需在数据库中操作:
-- 查询当前角色ID(以销售部角色为例) SELECT id FROM xinhoo_role WHERE name = '销售部'; -- 删除该角色对生产计划模块的权限(模块ID=15) DELETE FROM xinhoo_role_access WHERE role_id = 5 AND node_id = 15; -- 插入新权限:仅允许查看客户管理(模块ID=8) INSERT INTO xinhoo_role_access (role_id, node_id, level) VALUES (5, 8, 1); -- level=1表示查看,2为编辑,3为删除客户端收到菜单数据后,会根据level字段渲染按钮。若level=0,则整个菜单项不显示。
4.2 APP端数据隔离:用租户字段实现同一套APP服务多个子公司
当集团下属A/B两家子公司共用一套信呼服务时,需确保A公司员工APP登录后只能看到A公司的客户、合同、审批单。信呼v2.1.7通过tenant_id字段实现,但需手动开启:
- 修改
/config/tenant.php,将'enable' => false改为true - 在所有需隔离的数据表(如
xinhoo_customer,xinhoo_contract)中添加tenant_id INT UNSIGNED NOT NULL DEFAULT 0字段 - 在APP登录接口
/api/v1/login的返回JSON中,增加tenant_id字段:{ "user_id": 1001, "username": "zhangsan", "tenant_id": 1, // A公司ID "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." } - 客户端每次请求API时,在Header中携带
X-Tenant-ID: 1
服务端中间件会自动为所有SELECT/UPDATE/INSERT语句追加WHERE tenant_id = ?条件,无需修改业务代码。
5. 故障排查黄金组合:5条命令定位90%的线上问题
5.1 检查PHP-FPM进程状态与慢日志
当PC客户端频繁提示“网络错误”,但网页版正常时,大概率是PHP-FPM子进程崩溃。执行以下命令获取实时状态:
# 查看PHP-FPM运行状态(需先配置pm.status_path) sudo systemctl reload php7.4-fpm curl http://127.0.0.1/status?full # 输出关键字段解读: # start time: 1697385600 -> 服务启动时间戳 # accepted conn: 1245 -> 已接受连接数 # slow requests: 3 -> 慢请求次数(>request_slowlog_timeout定义的阈值) # pool www: 127.0.0.1:9000 -> 实际监听地址,确认与Nginx fastcgi_pass一致若slow requests持续增长,检查/var/log/php7.4-fpm-slow.log,典型错误如:
[15-Oct-2023 14:22:33] [pool www] pid 12345 script_filename = /var/www/xinhoo/public/index.php [0x00007f8b1c0a1234] mysqli_query() /var/www/xinhoo/thinkphp/library/think/db/connector/Mysql.php:67这表明MySQL查询超时,需优化对应SQL或增加wait_timeout。
5.2 抓取APP与服务端的HTTPS通信明文
安卓APP使用OkHttp 4.9+,默认启用TLS 1.3,传统Wireshark无法解密。正确做法是配置OkHttp的sslSocketFactory并导出密钥:
// 在APP源码Application类中添加 private void enableSSLDebug() { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, new SecureRandom()); // 导出密钥到/tmp/sslkey.log,供Wireshark读取 System.setProperty("javax.net.debug", "ssl:handshake"); System.setProperty("javax.net.debug", "ssl:keymanager"); } catch (Exception e) { e.printStackTrace(); } }然后在Wireshark中设置:Edit > Preferences > Protocols > TLS > (Pre)-Master-Secret log filename指向/tmp/sslkey.log,即可看到APP发送的/api/v1/workflow/submit请求明文。
5.3 验证PC客户端与服务端的时间同步精度
信呼v2.1.7的JWT Token有效期为2小时,若客户端系统时间比服务端快3分钟,会导致Token提前失效。用以下命令校准:
# 服务端执行(获取标准时间) date -u +%s # PC客户端执行(Windows PowerShell) (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss") # 时间差超过60秒即需修正 # Windows客户端校准命令: w32tm /resync /force5.4 检查APP推送服务的证书链完整性
信呼APP使用华为/小米推送通道,若用户收不到审批提醒,先验证证书:
# 下载华为推送证书(.p12文件) openssl pkcs12 -info -in huawei_push.p12 # 检查证书是否过期及私钥是否匹配 openssl x509 -in huawei_push.crt -text -noout | grep "Not After" openssl rsa -in huawei_push.key -check -noout若输出RSA key ok,说明私钥有效;若提示unable to load Private Key,则需重新导出.p12文件。
5.5 快速定位PC客户端SQLite写入失败
当PC客户端“暂存”按钮点击无反应时,检查SQLite数据库权限:
# 查看客户端数据目录权限(Windows路径示例) ls -la "C:\Users\Administrator\AppData\Roaming\Xinhoo\" # 正确权限应为: # drwxr-xr-x 1 Administrator Users 0 Oct 15 14:22 Xinhoo # -rw-r--r-- 1 Administrator Users 12288 Oct 15 14:22 offline.db # 若offline.db属主为SYSTEM,需修正: icacls "C:\Users\Administrator\AppData\Roaming\Xinhoo\offline.db" /grant "Administrators:F"修正后重启PC客户端,暂存功能立即恢复。
本文还有配套的精品资源,点击获取