Files
threeonecheck_web/代码结构分析与优化建议.md

18 KiB
Raw Permalink Blame History

三查一曝光小程序 — 代码结构分析与优化建议

文档生成日期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.vueview.vuerectification.vueacceptance.vueassignment.vue
pages/closeout/ application.vueeditor.vue
pages/equipmentregistration/ equipmentregistration.vue
pages/area/ management.vue
pages/Inspectionwarning/ Inspectionwarning.vue
pages/personalcenter/ my.vuehelpcenter.vuenotification.vuesettings.vueaccount.vueedit.vue
pages/login/ login.vuereg.vuesuccess.vueforget.vueagreement.vueenterprise.vue

TabBar 页面pages.jsonindexInspectionwarningpersonalcenter/my

2.2 components/(仅 1 个文件)

文件 用途
components/AreaFormPopup.vue 区域新增/编辑弹窗(被 pages/area/management.vue 引用)

2.3 request/21 个文件)

路径 说明
request/request.js 核心封装:requestAPIbaseUrltoImageUrltoRelativeFilePath
request/api.js 单体大文件,约 40+ 个 API隐患、巡检、企业、检查表、AI 等)
request/three_one_api/info.js 个人信息:getProfileDetailupdateProfileupdatePassword
request/three_one_api/license.js 证照 CRUD + getLicenseEnterpriseSelect
request/three_one_api/area.js 区域 CRUD + getAreaSelectgetEnterpriseSelect
request/luch-request/ 完整 luch-request 库14 个文件)

2.4 相关工具层

路径 说明
utils/upload.js 七牛直传、createUploadListHandlersuploadToCloud
utils/watermark.js 图片时间戳水印

三、文件夹 / 命名问题

3.1 pages 分组不一致

  • 有业务分组: hiddendanger/closeout/login/personalcenter/area/
  • 散落顶层: Inspectionresult/Idphotomanagement/membermanagemen/

3.2 命名风格混用

模式 示例 问题
全小写 checklistplandetailmembermanagemen 与驼峰混用
驼峰首字母大写 InspectionresultIdphotomanagement 与全小写混用
拼写错误 membermanagemen 少字母 tmanagement
缩写不一致 editcompanInformation vs corporateInformation compan vs corporate
单文件大写 hiddendanger/Inspection.vue 同目录其他文件小写

3.3 UI 库混用

pages.json 同时配置 wd-*wot-design-uniu-* / up-*uview-plus页面中两种前缀并存。


四、组件层几乎为空 — 重复最严重

components/ 目前只有 AreaFormPopup.vue,而 9 个以上页面各自内联了几乎相同的弹窗结构(popup-header / popup-footer / 取消 / 确定):

  • pages/hiddendanger/Inspection.vue
  • pages/Inspectionresult/Inspectionresult.vue
  • pages/closeout/application.vue
  • pages/Idphotomanagement/Idphotomanagement.vue
  • pages/membermanagemen/membermanagemen.vue
  • pages/equipmentregistration/equipmentregistration.vue
  • pages/editchecklist/editchecklist.vue
  • pages/hiddendanger/rectification.vue
  • pages/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 hazardFormDatafileList1 vs hazardFileList)。

风险: 改一个字段要改两处,很容易不同步。

5.2 P0 — 草稿恢复逻辑4 处复制)

涉及文件:

  • pages/Inspectionresult/Inspectionresult.vue
  • pages/hiddendanger/assignment.vue
  • pages/hiddendanger/rectification.vue
  • pages/hiddendanger/acceptance.vue

各自实现 showRestoreBannerclearDraftrestoreDraftlocalStorage 读写Banner HTML 与 inline style 在各文件中完全相同。

5.3 P0 — 电子签名 + 上传2 处复制)

涉及文件:

  • pages/hiddendanger/acceptance.vue
  • pages/hiddendanger/rectification.vue

重复内容:

  • 隐藏 canvas-id="watermarkCanvas"
  • wd-signature 组件
  • uploadToCloud 上传签名
  • onSignatureConfirm → 触发 executeSubmit 的流程

onSignatureConfirmreSignclearSignature 等逻辑在两文件中结构几乎相同。

5.4 P1 — 部门-人员级联选择2 处复制)

涉及文件:

  • pages/hiddendanger/assignment.vue — 单选整改责任人(getDepartmentPersonUsers
  • pages/hiddendanger/rectification.vue — 安全管理人员多选 + 整改责任人多选

两者 UI 均为左侧部门列 + 右侧人员列 + popup-footerrectification.vue 中相关逻辑约 200+ 行,与 assignment.vue 大量重叠。

5.5 P1 — 隐患详情只读展示 vs 表单字段镜像

pages/hiddendanger/view.vue 的只读展示字段(图片、标题、等级、位置、法律依据、区域、描述、标签)与上述新增表单字段一一对应,但未复用同一「隐患信息展示/编辑」组件。

5.6 P1 — 用户信息重复拉取

涉及文件:

  • pages/index/index.vue
  • pages/personalcenter/my.vue
  • pages/personalcenter/edit.vue

均调用 getProfileDetail() + toImageUrl 处理头像,没有统一的用户状态管理。

5.7 P1 — 设置类页面几乎克隆

pages/personalcenter/settings.vuepages/personalcenter/notification.vue 结构、脚本、样式完全一致,仅开关文案不同。

5.8 P1 — 登录注册验证码逻辑复制

pages/login/reg.vuepages/login/forget.vue 共享:

  • codeText 倒计时计算
  • getCode / startCountdown / clearCountdown
  • 均直接 uni.requesthttp://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
  });
}
  • getMyHiddenDangerListpages/hiddendanger/Inspection.vue
  • getHiddenDangerListpages/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 addHiddenDangergetCheckPlanList

页面侧 import 来源混杂,例如 Inspection.vue 同时从 api.jsthree_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-requesthttp 实例,但实际请求走 uni.requesthttp 未被使用
  • request/luch-request/ 整包存在,与 uni_modules/uview-plus/libs/luch-request 功能重复
  • pages/login/reg.vueforget.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.vuenotification.vue 开关无持久化、无 API
pages/login/reg.vueforget.vue 验证码请求指向 example.com 占位地址
pages/login/enterprise.vue 表单未绑定、注册逻辑不完整
request/api.jsuploadFilegetCheckTableDetail 无引用
request/request.jshttpluch-request 实例) 创建后未使用

八、优化建议(按优先级)

8.1 P0 — 高影响,应优先

序号 优化项 说明 预期收益
1 抽取 HazardForm 组件(或 composable 合并 Inspection.vueInspectionresult.vue 的隐患新增表单 + 法规弹窗 + 区域选择 + AI 识别 + 水印上传 减少 500800 行重复代码
2 合并重复 API 删除 getHiddenDangerListgetMyHiddenDangerList 之一;删除未使用的 uploadFilegetCheckTableDetailgetEnterpriseSelectgetAreaSelect 减少维护成本
3 抽取 useFormDraft composable 统一 4 个页面的草稿 Banner + localStorage 逻辑 避免 key 命名和恢复逻辑分叉
4 抽取 SignaturePad 组件 + useSignatureSubmit 合并 acceptance.vuerectification.vue 的签名上传与提交链 减少重复逻辑

8.2 P1 — 中高影响

序号 优化项 说明
5 抽取 DeptUserPicker 组件 支持单选/多选模式,供 assignment.vuerectification.vue 复用
6 抽取通用 FormPopup 壳组件 统一 header/footer/取消/确定,替代 9+ 页面内联弹窗结构;Idphotomanagement 可仿照 AreaFormPopup 拆出 LicenseFormPopup
7 登录模块接入 requestAPI 替换 reg.vueforget.vueuni.request('http://example.com/...'),或明确标注并下线未完成页面
8 清理死页面 删除或合并 editcompanInformation.vue;决定 map.vue 是否保留;为 Inspectionlogequipmentregistration 接 API 或移出主包
9 api.js 按业务域拆分 拆分到 three_one_api/hazard.jsplan.jsenterprise.js 等,对齐已有分层风格

8.3 P2 — 规范与维护性

序号 优化项 说明
10 统一 pages 命名 目录改小写+连字符(如 inspection-result),修正 membermanagemenAPI 函数统一驼峰
11 统一 /frontend vs /admin 前缀策略 与后端协商,避免小程序直连 admin 接口的安全与权限问题
12 清理 request/luch-request/ 与未使用的 http 实例 或全面迁移到 luch-request 并删除 requestAPI 中的重复实现
13 个人中心优化 合并 settings.vuenotification.vue 为配置页 + 子项;getProfileDetail 抽到 stores/user.js 或 composable
14 抽取共享 SCSS page-bg.scsspopup.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 中。

最突出的重复:

  1. 隐患新增表单(两处大文件)
  2. 草稿恢复(四处)
  3. 签名提交(两处)
  4. 部门人员选择(两处)
  5. 弹窗壳子(九处以上)

request 层: api.js 单体过大且存在重复/死 APIthree_one_api/ 的分层不一致。

若按 P0 建议推进,预计可减少约 30%40% 的页面重复代码,并显著降低隐患字段改动时的同步成本。


本文档供团队内部参考,后续重构时可按 P0 → P1 → P2 顺序逐步推进。