← 返回博客首页 | Y2Ksoft 官网

芒果 ERP 代码审计实录:客户说主页很好看,我只改底层,不改视觉

Y2Ksoft 实战笔记 99 | 2026-10-19 | 农业产业 ERP | Node.js 服务端 | 4K 系统实拍
这次项目最特别的约束不是功能,而是客户的一句话:“主页我觉得很好看,不要改。” 所以我们没有重做设计,没有换掉暖金芒果主题,也没有把 260px 侧栏和 Bento 看板改成通用后台。真正改动的是它下面的代码:数据从浏览器本地存储迁到服务端,登录变成真正的会话认证,权限、金额、XSS、外部依赖和交付文档全部重做。视觉是客户的资产,代码才是这次审计的战场。
20
业务页面
19
数据集合
3
角色权限
22
浏览器回归项
0
外部资源请求

一、先定边界:视觉不动,代码全部可查

茂井镇芒果 ERP 的原始页面已经包含销售渠道、基地、农户、品种、物候、农事、水肥、病虫害、采摘、库存、订单、物流、客户、销售、收支、结算、成本、利润和设置。页面设计也不是标准后台,而是暖金芒果色、Bento 卡片和数据看板混排。

如果直接套用通用模板,功能可能更快统一,但客户喜欢的东西会消失。因此这次把“页面视觉”和“底层实现”拆开处理:布局、颜色、字号、圆角、卡片和动效全部保留;数据、认证、权限、校验、持久化和构建方式重新做。

客户明确说好看的页面,不应该被开发者的审美重新教育。

二、审计发现的真正问题

问题原实现修复方向
数据持久化业务数据写 localStorageNode.js 服务端 + data/db.json 原子写入
登录安全账号密码写在前端脚本scrypt 哈希 + HttpOnly Cookie + 登录限流
角色权限所有登录用户都能删除管理员 / 操作员 / 只读访客三层控制
XSS用户输入直接拼 innerHTML渲染前统一 HTML 转义
金额最多两位小数显示,内部浮点计算统一两位小数展示并收口金额显示
外部依赖Chart.js 与登录背景走外网本地 Chart.js + 本地同图背景
交付单文件、双入口、无手册服务端版本 + 使用手册 + PDF + 部署包

三、保留原视觉,具体是怎么做的

我们没有改动原来的主页 CSS 结构,而是把数据和事件层接上服务端。页面仍然使用原来的渲染函数、卡片样式和图表布局;登录框只补了标准 form 与无障碍标签,按钮和输入框位置不变。

主页 CSS 与修复前逐行对比,最终只有两处非视觉调整:登录背景 URL 从 Unsplash 换成本地下载的同一张图片;新增一个视觉隐藏的 .sr-only 工具类。260px 侧栏、暖金配色、Bento 看板、渐变、光晕和动效都没有重做。

原页面→API 数据适配→服务端持久化→权限与安全→视觉原样

四、20 个页面如何串成一条芒果产业链

🏭
基地与农户
基地面积、负责人、主栽品种、亩产、认证和农户归属。
🌱
生产全周期
物候期、农事、水肥、病虫害与防治效果连续记录。
🧺
采销存协同
采摘批次、糖度分级、库存、订单、物流与客户。
💰
财务核算
销售、收支、农户结算、成本与利润报表统一口径。

数据模型不是把页面拼在一起,而是让记录之间能互相解释:基地影响产量,采摘形成库存,订单形成销售,销售进入收支,结算再扣除农资成本。最终利润报表不应该再依赖手工抄数。

五、权限不是隐藏按钮,而是服务端拒绝

这次把管理员、操作员和只读访客分开。前端会隐藏越权操作,但真正决定能不能保存的是服务端:访客不能写,操作员可以新增和编辑但不能删除,也不能修改系统参数;管理员拥有完整权限。保存失败时页面会提示并重新加载服务端数据,而不是悄悄丢掉记录。

数据写入采用临时文件加原子替换,刷新页面后数据还在;导出仍然保留 JSON 备份;修改密码后旧会话立即失效。

六、代码、手册和验收一起交付

最终交付不是只有一个 HTML。目录里包含服务端、种子数据、模块配置、前端、使用手册 HTML/PDF、标注截图、API 测试、权限/XSS E2E 和完整 CRUD 测试。所有 JavaScript 文件通过语法检查,20 个页面完成无障碍结构检查,外部资源请求为 0。

这次项目最重要的经验是:视觉保真不是“看一眼差不多”,而是可以被逐行比较的约束;代码安全也不是能不能运行,而是换一个用户、断一次网、刷新一次页面之后还成不成立。

七、4K 系统截图

01 · 登录页:保留原芒果暖金视觉

清空输入框后截图,登录卡片、背景图与原有动效保持不变。
01 · 登录页:保留原芒果暖金视觉

02 · 数据看板:Bento 经营驾驶舱

KPI、渠道卡片、趋势图、品种占比、临期库存与未完成订单仍在原布局中。
02 · 数据看板:Bento 经营驾驶舱

03 · 销售渠道:6 大渠道经营分析

渠道名称、营收、订单、销量与增长率进入统一数据表。
03 · 销售渠道:6 大渠道经营分析

04 · 基地管理:基地、品种与技术体系

基地面积、负责人、所属村、亩产与认证信息可维护。
04 · 基地管理:基地、品种与技术体系

05 · 农事记录:种植过程留痕

日期、地块、任务、工时和产量形成可追溯记录。
05 · 农事记录:种植过程留痕

06 · 采摘入库:批次与等级

批次、糖度、等级、仓库与负责人串起采收环节。
06 · 采摘入库:批次与等级

07 · 库存管理:库存与临期提醒

在库数量、价值、库位和临期预警在看板联动。
07 · 库存管理:库存与临期提醒

08 · 利润报表:收入、支出与成本

利润和成本结构从业务数据计算,不再使用单独写死的数字。
08 · 利润报表:收入、支出与成本

09 · 系统设置:合作社与产业信息

保留原设置页面的信息组织方式,并接入权限与数据恢复。
09 · 系统设置:合作社与产业信息

八、这次留下的清单

芒果 ERP 的页面没有换脸,但底层已经变成一套可以继续维护、继续扩展、可以交给客户的服务端系统。

上一篇:招聘与薪酬工作台 | 下一篇:火龙果 + 百香果双品类 ERP
博客首页:www.y2ksoft.cn/blog/ | 官网:www.y2ksoft.cn