18 KiB
三查一曝光小程序 — 代码结构分析与优化建议
文档生成日期:2026-06-13
分析范围:pages/、request/、components/及相关工具层
一、总体判断
| 维度 | 现状 | 问题程度 |
|---|---|---|
| 文件夹结构 | 34 个页面,18 个目录,命名风格不统一 | 中 |
| 组件复用 | components/ 只有 1 个文件 |
高 |
| 请求层 | api.js 单体 400+ 行,与 three_one_api/ 分层不一致 |
高 |
| 页面逻辑 | 多处大段复制粘贴 | 很高 |
结论: 不是业务乱,而是缺少分层和抽象,同一套东西在不同页面各写一遍。功能覆盖面广,但组织方式偏「页面堆叠式开发」。
二、当前结构总览
2.1 pages/(34 个 Vue 文件,18 个子目录)
| 子目录 | 文件 |
|---|---|
pages/index/ |
index.vue |
pages/map/ |
map.vue |
pages/plandetail/ |
plandetail.vue |
pages/Inspectionresult/ |
Inspectionresult.vue |
pages/membermanagemen/ |
membermanagemen.vue |
pages/corporateInformation/ |
corporateInformation.vue |
pages/editcompanInformation/ |
editcompanInformation.vue |
pages/checklist/ |
checklist.vue |
pages/editchecklist/ |
editchecklist.vue |
pages/Inspectionlog/ |
Inspectionlog.vue |
pages/Inspectionchecklist/ |
Inspectionchecklist.vue |
pages/Idphotomanagement/ |
Idphotomanagement.vue |
pages/hiddendanger/ |
Inspection.vue、view.vue、rectification.vue、acceptance.vue、assignment.vue |
pages/closeout/ |
application.vue、editor.vue |
pages/equipmentregistration/ |
equipmentregistration.vue |
pages/area/ |
management.vue |
pages/Inspectionwarning/ |
Inspectionwarning.vue |
pages/personalcenter/ |
my.vue、helpcenter.vue、notification.vue、settings.vue、account.vue、edit.vue |
pages/login/ |
login.vue、reg.vue、success.vue、forget.vue、agreement.vue、enterprise.vue |
TabBar 页面(pages.json):index、Inspectionwarning、personalcenter/my
2.2 components/(仅 1 个文件)
| 文件 | 用途 |
|---|---|
components/AreaFormPopup.vue |
区域新增/编辑弹窗(被 pages/area/management.vue 引用) |
2.3 request/(21 个文件)
| 路径 | 说明 |
|---|---|
request/request.js |
核心封装:requestAPI、baseUrl、toImageUrl、toRelativeFilePath |
request/api.js |
单体大文件,约 40+ 个 API(隐患、巡检、企业、检查表、AI 等) |
request/three_one_api/info.js |
个人信息:getProfileDetail、updateProfile、updatePassword |
request/three_one_api/license.js |
证照 CRUD + getLicenseEnterpriseSelect |
request/three_one_api/area.js |
区域 CRUD + getAreaSelect、getEnterpriseSelect |
request/luch-request/ |
完整 luch-request 库(14 个文件) |
2.4 相关工具层
| 路径 | 说明 |
|---|---|
utils/upload.js |
七牛直传、createUploadListHandlers、uploadToCloud |
utils/watermark.js |
图片时间戳水印 |
三、文件夹 / 命名问题
3.1 pages 分组不一致
- 有业务分组:
hiddendanger/、closeout/、login/、personalcenter/、area/ - 散落顶层:
Inspectionresult/、Idphotomanagement/、membermanagemen/等
3.2 命名风格混用
| 模式 | 示例 | 问题 |
|---|---|---|
| 全小写 | checklist、plandetail、membermanagemen |
与驼峰混用 |
| 驼峰首字母大写 | Inspectionresult、Idphotomanagement |
与全小写混用 |
| 拼写错误 | membermanagemen |
少字母 t(management) |
| 缩写不一致 | editcompanInformation vs corporateInformation |
compan vs corporate |
| 单文件大写 | hiddendanger/Inspection.vue |
同目录其他文件小写 |
3.3 UI 库混用
pages.json 同时配置 wd-*(wot-design-uni)与 u-* / up-*(uview-plus),页面中两种前缀并存。
四、组件层几乎为空 — 重复最严重
components/ 目前只有 AreaFormPopup.vue,而 9 个以上页面各自内联了几乎相同的弹窗结构(popup-header / popup-footer / 取消 / 确定):
pages/hiddendanger/Inspection.vuepages/Inspectionresult/Inspectionresult.vuepages/closeout/application.vuepages/Idphotomanagement/Idphotomanagement.vuepages/membermanagemen/membermanagemen.vuepages/equipmentregistration/equipmentregistration.vuepages/editchecklist/editchecklist.vuepages/hiddendanger/rectification.vuepages/hiddendanger/assignment.vue
对比: 区域管理已抽成 AreaFormPopup.vue,而证照管理(Idphotomanagement.vue)仍是内联弹窗 —— 同一模式,有的抽了、有的没抽。
五、逻辑重复详情(按影响排序)
5.1 P0 — 隐患新增表单(两处大文件几乎一样)
涉及文件:
pages/hiddendanger/Inspection.vue(约 1360 行)pages/Inspectionresult/Inspectionresult.vue(约 1480 行)
重复内容:
- 检查形式
up-choose - 隐患图片
up-upload+watermarkCanvas - AI 识别按钮
analyzeHazardImage - 标题、等级、位置(含
chooseLocation) - 法律依据弹窗(搜索
getRegulationList) - 隐患区域选择(
getAreaList) - 描述、标签
getHiddenDangerLabelList
两处模板从「检查形式」到「隐患标签」字段布局、文案、交互一致,仅变量名不同(formData vs hazardFormData,fileList1 vs hazardFileList)。
风险: 改一个字段要改两处,很容易不同步。
5.2 P0 — 草稿恢复逻辑(4 处复制)
涉及文件:
pages/Inspectionresult/Inspectionresult.vuepages/hiddendanger/assignment.vuepages/hiddendanger/rectification.vuepages/hiddendanger/acceptance.vue
各自实现 showRestoreBanner、clearDraft、restoreDraft(localStorage 读写),Banner HTML 与 inline style 在各文件中完全相同。
5.3 P0 — 电子签名 + 上传(2 处复制)
涉及文件:
pages/hiddendanger/acceptance.vuepages/hiddendanger/rectification.vue
重复内容:
- 隐藏
canvas-id="watermarkCanvas" wd-signature组件uploadToCloud上传签名onSignatureConfirm→ 触发executeSubmit的流程
onSignatureConfirm、reSign、clearSignature 等逻辑在两文件中结构几乎相同。
5.4 P1 — 部门-人员级联选择(2 处复制)
涉及文件:
pages/hiddendanger/assignment.vue— 单选整改责任人(getDepartmentPersonUsers)pages/hiddendanger/rectification.vue— 安全管理人员多选 + 整改责任人多选
两者 UI 均为左侧部门列 + 右侧人员列 + popup-footer,rectification.vue 中相关逻辑约 200+ 行,与 assignment.vue 大量重叠。
5.5 P1 — 隐患详情只读展示 vs 表单字段镜像
pages/hiddendanger/view.vue 的只读展示字段(图片、标题、等级、位置、法律依据、区域、描述、标签)与上述新增表单字段一一对应,但未复用同一「隐患信息展示/编辑」组件。
5.6 P1 — 用户信息重复拉取
涉及文件:
pages/index/index.vuepages/personalcenter/my.vuepages/personalcenter/edit.vue
均调用 getProfileDetail() + toImageUrl 处理头像,没有统一的用户状态管理。
5.7 P1 — 设置类页面几乎克隆
pages/personalcenter/settings.vue 与 pages/personalcenter/notification.vue 结构、脚本、样式完全一致,仅开关文案不同。
5.8 P1 — 登录注册验证码逻辑复制
pages/login/reg.vue 与 pages/login/forget.vue 共享:
codeText倒计时计算getCode/startCountdown/clearCountdown- 均直接
uni.request到http://example.com/api/code(占位 URL,未走requestAPI)
5.9 其他页面逻辑重复
| 场景 | 涉及文件 | 说明 |
|---|---|---|
| 企业信息编辑 | corporateInformation.vue vs editcompanInformation.vue |
后者无 API、无跳转入口,疑似废弃草稿 |
| 列表 + 弹窗 CRUD | area/management.vue vs Idphotomanagement.vue |
模式相同,仅前者用了组件 |
| 首页隐患列表 vs 隐患排查页 | index.vue vs hiddendanger/Inspection.vue |
都拉隐患列表,Tab 筛选逻辑类似 |
| 检查记录 | Inspectionlog.vue + Inspectionchecklist.vue |
硬编码 mock 数据,无 API |
六、request 层问题
6.1 API 完全重复
request/api.js 中:
// 获取我的隐患排查列表
export function getMyHiddenDangerList(params) {
return requestAPI({
url: '/frontend/hazard/my/list',
method: 'GET',
data: params
});
}
// 获取隐患排查列表
export function getHiddenDangerList(params) {
return requestAPI({
url: '/frontend/hazard/my/list', // 同一 URL
method: 'GET',
data: params
});
}
getMyHiddenDangerList→pages/hiddendanger/Inspection.vuegetHiddenDangerList→pages/index/index.vue
应合并为一个函数。
6.2 API 分层不一致
| 已拆分模块 | 位置 | 示例 |
|---|---|---|
| 个人信息 | three_one_api/info.js |
getProfileDetail |
| 证照 | three_one_api/license.js |
getLicenseList |
| 区域 | three_one_api/area.js |
getAreaList |
| 隐患、巡检、企业、检查表、AI、成员… | 全部在 api.js |
addHiddenDanger、getCheckPlanList |
页面侧 import 来源混杂,例如 Inspection.vue 同时从 api.js 和 three_one_api/area.js 引入。
6.3 /frontend 与 /admin 路径混用
小程序端接口前缀不统一(同一 api.js):
- 隐患流程:
/frontend/hazard/* - 检查表、法规、预警:
/admin/oneTable/*、/admin/regulation/*、/admin/warning/* - 销号详情:
/admin/hazard/writeoff/getWriteOffApplyDetail/${applyId}(closeout/editor.vue使用)
6.4 未使用的 API(死代码)
| 文件 | 函数 | 说明 |
|---|---|---|
request/api.js |
uploadFile |
本地上传旧接口,页面已迁移至 utils/upload.js 七牛直传 |
request/api.js |
getCheckTableDetail |
无任何引用 |
request/three_one_api/area.js |
getEnterpriseSelect |
仅定义,无引用 |
request/three_one_api/area.js |
getAreaSelect |
仅定义,无引用 |
6.5 两套请求栈并存
request/request.js:创建luch-request的http实例,但实际请求走uni.request;http未被使用request/luch-request/整包存在,与uni_modules/uview-plus/libs/luch-request功能重复pages/login/reg.vue、forget.vue仍直接用uni.request,绕过统一封装(无 token、无统一错误处理)
6.6 命名不一致的 API 函数
| 函数名 | 问题 |
|---|---|
getEnterprisetype |
无驼峰 |
getindustry |
全小写开头 |
getEnterpriseinfo |
info 无驼峰 |
detailcheckPoint |
动词开头,与同文件 getCheckTableDetail 风格不一致 |
七、疑似死代码 / 未完成页面
| 路径 | 状态 |
|---|---|
pages/map/map.vue |
仅显示「一张图功能开发中」;TabBar 入口已注释 |
pages/editcompanInformation/editcompanInformation.vue |
在 pages.json 注册,无任何 navigateTo 引用;表单未绑 API |
pages/Inspectionlog/Inspectionlog.vue |
硬编码「和谐矿业每日巡检」等 mock 数据 |
pages/Inspectionchecklist/Inspectionchecklist.vue |
静态预览页,无 script 逻辑 |
pages/equipmentregistration/equipmentregistration.vue |
UI 完整但 handleAdd 仅 toast「新增成功」,无 API |
pages/personalcenter/helpcenter.vue |
仅静态图片,无交互 |
pages/personalcenter/settings.vue、notification.vue |
开关无持久化、无 API |
pages/login/reg.vue、forget.vue |
验证码请求指向 example.com 占位地址 |
pages/login/enterprise.vue |
表单未绑定、注册逻辑不完整 |
request/api.js 中 uploadFile、getCheckTableDetail |
无引用 |
request/request.js 中 http(luch-request 实例) |
创建后未使用 |
八、优化建议(按优先级)
8.1 P0 — 高影响,应优先
| 序号 | 优化项 | 说明 | 预期收益 |
|---|---|---|---|
| 1 | 抽取 HazardForm 组件(或 composable) |
合并 Inspection.vue 与 Inspectionresult.vue 的隐患新增表单 + 法规弹窗 + 区域选择 + AI 识别 + 水印上传 |
减少 500–800 行重复代码 |
| 2 | 合并重复 API | 删除 getHiddenDangerList 或 getMyHiddenDangerList 之一;删除未使用的 uploadFile、getCheckTableDetail、getEnterpriseSelect、getAreaSelect |
减少维护成本 |
| 3 | 抽取 useFormDraft composable |
统一 4 个页面的草稿 Banner + localStorage 逻辑 | 避免 key 命名和恢复逻辑分叉 |
| 4 | 抽取 SignaturePad 组件 + useSignatureSubmit |
合并 acceptance.vue 与 rectification.vue 的签名上传与提交链 |
减少重复逻辑 |
8.2 P1 — 中高影响
| 序号 | 优化项 | 说明 |
|---|---|---|
| 5 | 抽取 DeptUserPicker 组件 |
支持单选/多选模式,供 assignment.vue 与 rectification.vue 复用 |
| 6 | 抽取通用 FormPopup 壳组件 |
统一 header/footer/取消/确定,替代 9+ 页面内联弹窗结构;Idphotomanagement 可仿照 AreaFormPopup 拆出 LicenseFormPopup |
| 7 | 登录模块接入 requestAPI |
替换 reg.vue、forget.vue 的 uni.request('http://example.com/...'),或明确标注并下线未完成页面 |
| 8 | 清理死页面 | 删除或合并 editcompanInformation.vue;决定 map.vue 是否保留;为 Inspectionlog、equipmentregistration 接 API 或移出主包 |
| 9 | api.js 按业务域拆分 |
拆分到 three_one_api/hazard.js、plan.js、enterprise.js 等,对齐已有分层风格 |
8.3 P2 — 规范与维护性
| 序号 | 优化项 | 说明 |
|---|---|---|
| 10 | 统一 pages 命名 | 目录改小写+连字符(如 inspection-result),修正 membermanagemen;API 函数统一驼峰 |
| 11 | 统一 /frontend vs /admin 前缀策略 |
与后端协商,避免小程序直连 admin 接口的安全与权限问题 |
| 12 | 清理 request/luch-request/ 与未使用的 http 实例 |
或全面迁移到 luch-request 并删除 requestAPI 中的重复实现 |
| 13 | 个人中心优化 | 合并 settings.vue 与 notification.vue 为配置页 + 子项;getProfileDetail 抽到 stores/user.js 或 composable |
| 14 | 抽取共享 SCSS | page-bg.scss、popup.scss 减少样式复制 |
| 15 | 统一 UI 库 | 逐步收敛到 wot-design 或 uview 之一 |
九、推荐的目标目录结构
threeonecheck_小程序/
├── components/ # 公共组件
│ ├── common/
│ │ └── FormPopup.vue # 通用弹窗壳
│ ├── hazard/
│ │ ├── HazardForm.vue # 隐患新增/编辑表单
│ │ ├── HazardDetail.vue # 隐患只读展示
│ │ ├── DeptUserPicker.vue # 部门人员选择
│ │ └── SignaturePad.vue # 电子签名
│ ├── area/
│ │ └── AreaFormPopup.vue # 已有
│ └── license/
│ └── LicenseFormPopup.vue # 证照表单弹窗
├── composables/ # 组合式逻辑
│ ├── useFormDraft.js # 草稿恢复
│ ├── useSignatureSubmit.js # 签名提交
│ └── useUserProfile.js # 用户信息
├── request/
│ ├── request.js # 核心封装
│ └── three_one_api/
│ ├── info.js # 已有
│ ├── license.js # 已有
│ ├── area.js # 已有
│ ├── hazard.js # 新增:隐患相关
│ ├── plan.js # 新增:巡检计划
│ ├── enterprise.js # 新增:企业信息
│ ├── checklist.js # 新增:检查表
│ └── member.js # 新增:成员管理
├── stores/
│ └── user.js # 用户状态
├── styles/
│ ├── page-bg.scss # 页面背景
│ └── popup.scss # 弹窗样式
└── pages/ # 按业务域分组(逐步重组)
├── index/
├── inspection/ # 巡检相关
├── hazard/ # 隐患相关(原 hiddendanger)
├── closeout/ # 销号
├── enterprise/ # 企业信息
├── personal/ # 个人中心(原 personalcenter)
└── login/
十、优化路线图
当前状态
│
▼
P0:抽核心复用(HazardForm、useFormDraft、SignaturePad、合并重复 API)
│ 预计减少 30%–40% 页面重复代码
▼
P1:统一请求层 + 清理死代码(api 拆分、FormPopup、DeptUserPicker、登录接入 requestAPI)
│
▼
P2:命名规范 + 目录重组(pages 命名、stores、共享 SCSS、UI 库收敛)
十一、总结
该项目业务功能覆盖面较广(巡检、隐患全流程、销号、证照、区域、成员等),但在 components/ 几乎为空 的前提下,大量 UI 与逻辑散落在各 page 中。
最突出的重复:
- 隐患新增表单(两处大文件)
- 草稿恢复(四处)
- 签名提交(两处)
- 部门人员选择(两处)
- 弹窗壳子(九处以上)
request 层: api.js 单体过大且存在重复/死 API,与 three_one_api/ 的分层不一致。
若按 P0 建议推进,预计可减少约 30%–40% 的页面重复代码,并显著降低隐患字段改动时的同步成本。
本文档供团队内部参考,后续重构时可按 P0 → P1 → P2 顺序逐步推进。