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>
# Utils 工具函数库
> 工具函数和核心配置模块
---
## 📖 目录
- [核心模块](#核心模块)
- [工具函数](#工具函数)
- [文档处理](#文档处理)
- [解析器](#解析器)
- [使用指南](#使用指南)
---
## 核心模块
### `config.js` - 环境配置
**描述**:服务器环境配置和公共参数管理
**导出**
- `BASE_URL` - API 基础域名
- `REQUEST_DEFAULT_PARAMS` - 默认请求参数 `{ f: 'manulife' }`
**修改方式**
```javascript
// 修改开发/生产环境域名
const BASE_URL = process.env.NODE_ENV === 'production'
? 'https://manulife.onwall.cn' // 生产
: 'https://manulife.onwall.cn' // 开发
```
---
### `request.js` - HTTP 请求封装
**描述**:基于 axios-miniprogram 的 HTTP 客户端,包含:
- 默认参数合并
- 401 自动跳转登录页
- 弱网/超时错误处理
- sessionid 自动管理
**导出**
```javascript
import service from '@/utils/request'
// GET 请求
service.get('/srv/', { params: { a: 'action' } })
// POST 请求
service.post('/srv/', { key: 'value' })
```
**工具函数**
- `getSessionId()` - 获取 sessionid
- `setSessionId(sessionid)` - 设置 sessionid
- `clearSessionId()` - 清空 sessionid
---
### `openid.js` - 微信授权管理
**描述**:处理小程序静默认证和会话管理
**导出**
```javascript
import { miniProgramAuth, ensureOpenidAuthorized } from '@/utils/openid'
// 小程序授权(静默获取 sessionid)
const user = await miniProgramAuth()
// 确保已授权
await ensureOpenidAuthorized()
```
---
## 工具函数
### `tools.js` - 通用工具函数
**描述**:常用工具函数集合
| 函数 | 说明 |
|------|------|
| `formatDate(date)` | 格式化时间(YYYY-MM-DD HH:mm) |
| `wxInfo()` | 获取设备信息(isAndroid, isiOS) |
| `parseQueryString(url)` | 解析 URL 参数 |
| `formatDatetime(data)` | 格式化日期时间范围 |
| `mask_id_number(id, options)` | 证件号脱敏 |
| `buildApiUrl(action, params)` | 构建 API 请求 URL |
| `isVideoFile(file)` | 判断是否为视频文件 |
| `optimizeImageUrl(url, options)` | CDN 图片优化 |
---
### `debounce.js` - 防抖函数
**描述**:创建防抖函数,延迟执行
```javascript
import { debounce, debounceFn } from '@/utils/debounce'
// 基本使用
const debouncedSearch = debounce(() => {
console.log('搜索')
}, 500)
// Hook 方式
const handler = debounceFn(async () => {
await fetchData()
}, 500)
```
---
### `eventBus.js` - 事件总线
**描述**:跨页面/组件通信
```javascript
import eventBus, { Events } from '@/utils/eventBus'
// 监听事件
const off = eventBus.on(Events.FEEDBACK_SUBMIT, (data) => {
console.log('收到事件:', data)
})
// 发送事件
eventBus.emit(Events.FEEDBACK_SUBMIT, { id: 123 })
// 取消监听
off()
```
**事件常量**
- `Events.FEEDBACK_SUBMIT` - 反馈提交成功
- `Events.FAVORITES_UPDATE` - 收藏列表更新
- `Events.USER_UPDATE` - 用户信息更新
---
## 文档处理
### `documentIcons.js` - 文档图标工具
**描述**:文件类型判断和图标获取
**核心函数**
```javascript
import {
getDocumentIcon, // 获取文档图标
getDocumentLabel, // 获取文件类型标签
extractExtensionFromFile, // 提取文件扩展名
isPDF, // 判断是否为 PDF
isImage, // 判断是否为图片
isVideo // 判断是否为视频
} from '@/utils/documentIcons'
// 使用示例
getDocumentIcon('报告.pdf') // 返回 PDF 图标路径
getDocumentIcon({ extension: 'pdf' }) // 优先使用 extension 字段
isPDF('document.pdf') // true
isImage('photo.jpg') // true
```
**支持的文件类型**
- 文档:PDF, Word, Excel, PPT
- 图片:JPG, PNG, GIF, WebP, SVG
- 视频:MP4, MOV, AVI, MKV
- 其他:TXT, MD, ZIP, RAR
---
## 解析器
### `parsers/config-generator.js` - 配置生成器
**描述**:将产品配置转换为 `plan-templates.js` 代码
```javascript
import { generateConfigCode, previewConfig } from '@/utils/parsers/config-generator'
// 生成配置代码
const result = generateConfigCode({
product_name: '宏挚传承保障计划',
product_type: 'savings',
currency: 'USD',
...
})
// 返回: { formSn, configCode, insertPosition, validation }
// 预览配置
const preview = previewConfig(config)
```
### `parsers/ai-extractor.js` - AI 提取器
**描述**:从文档中提取产品配置(配合 AI 使用)
---
## 使用指南
### 1. 添加新的工具函数
`tools.js` 或创建新文件:
```javascript
/**
* @description 函数描述
* @param {Type} param - 参数说明
* @returns {Type} 返回值说明
*/
export const myUtility = (param) => {
// 实现
}
```
### 2. API 请求最佳实践
```javascript
import service from '@/utils/request'
import { buildApiUrl } from '@/utils/tools'
// 方式 1:使用 service
const res = await service.get('/srv/', { params: { a: 'action' } })
if (res.data.code === 1) {
// 成功
}
// 方式 2:使用 buildApiUrl
const url = buildApiUrl('action', { id: 123 })
const res = await service.get(url)
```
### 3. 文件类型判断
```javascript
import { isPDF, isImage, isVideo } from '@/utils/documentIcons'
// 优先使用 extension 字段
if (isPDF({ extension: file.extension })) {
// 是 PDF
}
// 兼容字符串格式
if (isPDF(file.fileName)) {
// 是 PDF
}
// 从 URL 解析
if (isImage({ src: file.url })) {
// 是图片
}
```
---
## 相关文档
- **[认证流程](../../docs/guides/api-integration.md#身份认证)** - openid.js 和 request.js 的集成
- **[计划书配置](../../docs/guides/plan-templates.md)** - plan-templates.js 配置说明
- **[最佳实践](../../docs/best-practices.md)** - 工具函数使用规范
---
*最后更新: 2026-02-25*