hookehuyr

docs(utils): 添加 utils 工具函数库文档

- 新增 src/utils/README.md
- 涵盖核心模块:config、request、openid
- 包含工具函数:tools、debounce、eventBus
- 文档处理:documentIcons 文件类型判断
- 解析器:AI 提取和配置生成器
- 提供使用指南和最佳实践

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 +# Utils 工具函数库
2 +
3 +> 工具函数和核心配置模块
4 +
5 +---
6 +
7 +## 📖 目录
8 +
9 +- [核心模块](#核心模块)
10 +- [工具函数](#工具函数)
11 +- [文档处理](#文档处理)
12 +- [解析器](#解析器)
13 +- [使用指南](#使用指南)
14 +
15 +---
16 +
17 +## 核心模块
18 +
19 +### `config.js` - 环境配置
20 +
21 +**描述**:服务器环境配置和公共参数管理
22 +
23 +**导出**
24 +- `BASE_URL` - API 基础域名
25 +- `REQUEST_DEFAULT_PARAMS` - 默认请求参数 `{ f: 'manulife' }`
26 +
27 +**修改方式**
28 +```javascript
29 +// 修改开发/生产环境域名
30 +const BASE_URL = process.env.NODE_ENV === 'production'
31 + ? 'https://manulife.onwall.cn' // 生产
32 + : 'https://manulife.onwall.cn' // 开发
33 +```
34 +
35 +---
36 +
37 +### `request.js` - HTTP 请求封装
38 +
39 +**描述**:基于 axios-miniprogram 的 HTTP 客户端,包含:
40 +- 默认参数合并
41 +- 401 自动跳转登录页
42 +- 弱网/超时错误处理
43 +- sessionid 自动管理
44 +
45 +**导出**
46 +```javascript
47 +import service from '@/utils/request'
48 +
49 +// GET 请求
50 +service.get('/srv/', { params: { a: 'action' } })
51 +
52 +// POST 请求
53 +service.post('/srv/', { key: 'value' })
54 +```
55 +
56 +**工具函数**
57 +- `getSessionId()` - 获取 sessionid
58 +- `setSessionId(sessionid)` - 设置 sessionid
59 +- `clearSessionId()` - 清空 sessionid
60 +
61 +---
62 +
63 +### `openid.js` - 微信授权管理
64 +
65 +**描述**:处理小程序静默认证和会话管理
66 +
67 +**导出**
68 +```javascript
69 +import { miniProgramAuth, ensureOpenidAuthorized } from '@/utils/openid'
70 +
71 +// 小程序授权(静默获取 sessionid)
72 +const user = await miniProgramAuth()
73 +
74 +// 确保已授权
75 +await ensureOpenidAuthorized()
76 +```
77 +
78 +---
79 +
80 +## 工具函数
81 +
82 +### `tools.js` - 通用工具函数
83 +
84 +**描述**:常用工具函数集合
85 +
86 +| 函数 | 说明 |
87 +|------|------|
88 +| `formatDate(date)` | 格式化时间(YYYY-MM-DD HH:mm) |
89 +| `wxInfo()` | 获取设备信息(isAndroid, isiOS) |
90 +| `parseQueryString(url)` | 解析 URL 参数 |
91 +| `formatDatetime(data)` | 格式化日期时间范围 |
92 +| `mask_id_number(id, options)` | 证件号脱敏 |
93 +| `buildApiUrl(action, params)` | 构建 API 请求 URL |
94 +| `isVideoFile(file)` | 判断是否为视频文件 |
95 +| `optimizeImageUrl(url, options)` | CDN 图片优化 |
96 +
97 +---
98 +
99 +### `debounce.js` - 防抖函数
100 +
101 +**描述**:创建防抖函数,延迟执行
102 +
103 +```javascript
104 +import { debounce, debounceFn } from '@/utils/debounce'
105 +
106 +// 基本使用
107 +const debouncedSearch = debounce(() => {
108 + console.log('搜索')
109 +}, 500)
110 +
111 +// Hook 方式
112 +const handler = debounceFn(async () => {
113 + await fetchData()
114 +}, 500)
115 +```
116 +
117 +---
118 +
119 +### `eventBus.js` - 事件总线
120 +
121 +**描述**:跨页面/组件通信
122 +
123 +```javascript
124 +import eventBus, { Events } from '@/utils/eventBus'
125 +
126 +// 监听事件
127 +const off = eventBus.on(Events.FEEDBACK_SUBMIT, (data) => {
128 + console.log('收到事件:', data)
129 +})
130 +
131 +// 发送事件
132 +eventBus.emit(Events.FEEDBACK_SUBMIT, { id: 123 })
133 +
134 +// 取消监听
135 +off()
136 +```
137 +
138 +**事件常量**
139 +- `Events.FEEDBACK_SUBMIT` - 反馈提交成功
140 +- `Events.FAVORITES_UPDATE` - 收藏列表更新
141 +- `Events.USER_UPDATE` - 用户信息更新
142 +
143 +---
144 +
145 +## 文档处理
146 +
147 +### `documentIcons.js` - 文档图标工具
148 +
149 +**描述**:文件类型判断和图标获取
150 +
151 +**核心函数**
152 +
153 +```javascript
154 +import {
155 + getDocumentIcon, // 获取文档图标
156 + getDocumentLabel, // 获取文件类型标签
157 + extractExtensionFromFile, // 提取文件扩展名
158 + isPDF, // 判断是否为 PDF
159 + isImage, // 判断是否为图片
160 + isVideo // 判断是否为视频
161 +} from '@/utils/documentIcons'
162 +
163 +// 使用示例
164 +getDocumentIcon('报告.pdf') // 返回 PDF 图标路径
165 +getDocumentIcon({ extension: 'pdf' }) // 优先使用 extension 字段
166 +isPDF('document.pdf') // true
167 +isImage('photo.jpg') // true
168 +```
169 +
170 +**支持的文件类型**
171 +- 文档:PDF, Word, Excel, PPT
172 +- 图片:JPG, PNG, GIF, WebP, SVG
173 +- 视频:MP4, MOV, AVI, MKV
174 +- 其他:TXT, MD, ZIP, RAR
175 +
176 +---
177 +
178 +## 解析器
179 +
180 +### `parsers/config-generator.js` - 配置生成器
181 +
182 +**描述**:将产品配置转换为 `plan-templates.js` 代码
183 +
184 +```javascript
185 +import { generateConfigCode, previewConfig } from '@/utils/parsers/config-generator'
186 +
187 +// 生成配置代码
188 +const result = generateConfigCode({
189 + product_name: '宏挚传承保障计划',
190 + product_type: 'savings',
191 + currency: 'USD',
192 + ...
193 +})
194 +
195 +// 返回: { formSn, configCode, insertPosition, validation }
196 +
197 +// 预览配置
198 +const preview = previewConfig(config)
199 +```
200 +
201 +### `parsers/ai-extractor.js` - AI 提取器
202 +
203 +**描述**:从文档中提取产品配置(配合 AI 使用)
204 +
205 +---
206 +
207 +## 使用指南
208 +
209 +### 1. 添加新的工具函数
210 +
211 +`tools.js` 或创建新文件:
212 +
213 +```javascript
214 +/**
215 + * @description 函数描述
216 + * @param {Type} param - 参数说明
217 + * @returns {Type} 返回值说明
218 + */
219 +export const myUtility = (param) => {
220 + // 实现
221 +}
222 +```
223 +
224 +### 2. API 请求最佳实践
225 +
226 +```javascript
227 +import service from '@/utils/request'
228 +import { buildApiUrl } from '@/utils/tools'
229 +
230 +// 方式 1:使用 service
231 +const res = await service.get('/srv/', { params: { a: 'action' } })
232 +if (res.data.code === 1) {
233 + // 成功
234 +}
235 +
236 +// 方式 2:使用 buildApiUrl
237 +const url = buildApiUrl('action', { id: 123 })
238 +const res = await service.get(url)
239 +```
240 +
241 +### 3. 文件类型判断
242 +
243 +```javascript
244 +import { isPDF, isImage, isVideo } from '@/utils/documentIcons'
245 +
246 +// 优先使用 extension 字段
247 +if (isPDF({ extension: file.extension })) {
248 + // 是 PDF
249 +}
250 +
251 +// 兼容字符串格式
252 +if (isPDF(file.fileName)) {
253 + // 是 PDF
254 +}
255 +
256 +// 从 URL 解析
257 +if (isImage({ src: file.url })) {
258 + // 是图片
259 +}
260 +```
261 +
262 +---
263 +
264 +## 相关文档
265 +
266 +- **[认证流程](../../docs/guides/api-integration.md#身份认证)** - openid.js 和 request.js 的集成
267 +- **[计划书配置](../../docs/guides/plan-templates.md)** - plan-templates.js 配置说明
268 +- **[最佳实践](../../docs/best-practices.md)** - 工具函数使用规范
269 +
270 +---
271 +
272 +*最后更新: 2026-02-25*