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

424 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 三查一曝光小程序 — 代码结构分析与优化建议
> 文档生成日期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.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 `hazardFormData``fileList1` vs `hazardFileList`)。
**风险:** 改一个字段要改两处,很容易不同步。
### 5.2 P0 — 草稿恢复逻辑4 处复制)
**涉及文件:**
- `pages/Inspectionresult/Inspectionresult.vue`
- `pages/hiddendanger/assignment.vue`
- `pages/hiddendanger/rectification.vue`
- `pages/hiddendanger/acceptance.vue`
各自实现 `showRestoreBanner``clearDraft``restoreDraft`localStorage 读写Banner HTML 与 inline style 在各文件中完全相同。
### 5.3 P0 — 电子签名 + 上传2 处复制)
**涉及文件:**
- `pages/hiddendanger/acceptance.vue`
- `pages/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.vue`
- `pages/personalcenter/my.vue`
- `pages/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` 中:
```javascript
// 获取我的隐患排查列表
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.vue`
- `getHiddenDangerList``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 识别 + 水印上传 | 减少 500800 行重复代码 |
| 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 中。
**最突出的重复:**
1. 隐患新增表单(两处大文件)
2. 草稿恢复(四处)
3. 签名提交(两处)
4. 部门人员选择(两处)
5. 弹窗壳子(九处以上)
**request 层:** `api.js` 单体过大且存在重复/死 API`three_one_api/` 的分层不一致。
若按 P0 建议推进,预计可减少约 **30%40%** 的页面重复代码,并显著降低隐患字段改动时的同步成本。
---
*本文档供团队内部参考,后续重构时可按 P0 → P1 → P2 顺序逐步推进。*