1 changed files with 283 additions and 0 deletions
@ -0,0 +1,283 @@ |
|||||
|
# 字典工具类使用说明 |
||||
|
|
||||
|
## 概述 |
||||
|
|
||||
|
`dictUtil.js` 是一个专门用于批量获取和缓存字典数据的工具类,解决了原有单个接口调用次数过多、用户体验不佳的问题。 |
||||
|
|
||||
|
## 主要功能 |
||||
|
|
||||
|
1. **批量获取字典数据** - 一次性获取多个字典,减少接口调用 |
||||
|
2. **智能缓存机制** - 自动缓存数据,避免重复请求 |
||||
|
3. **业务场景支持** - 根据业务场景批量获取相关字典 |
||||
|
4. **兼容性保障** - 保持与原有代码的兼容性 |
||||
|
|
||||
|
## API 接口 |
||||
|
|
||||
|
### 后端接口 |
||||
|
|
||||
|
```php |
||||
|
// 批量获取字典数据 |
||||
|
GET /api/dict/batch?keys=key1,key2,key3 |
||||
|
|
||||
|
// 根据业务场景获取字典 |
||||
|
GET /api/dict/scene/{scene} |
||||
|
|
||||
|
// 获取单个字典 |
||||
|
GET /api/dict/single/{key} |
||||
|
|
||||
|
// 获取字典映射关系 |
||||
|
GET /api/dict/mapping |
||||
|
|
||||
|
// 清除字典缓存 |
||||
|
POST /api/dict/clear_cache |
||||
|
``` |
||||
|
|
||||
|
## 前端使用方法 |
||||
|
|
||||
|
### 1. 导入工具类 |
||||
|
|
||||
|
```javascript |
||||
|
import dictUtil from '@/common/dictUtil.js' |
||||
|
``` |
||||
|
|
||||
|
### 2. 批量获取字典数据 |
||||
|
|
||||
|
```javascript |
||||
|
// 方法一:直接批量获取 |
||||
|
const dictKeys = ['SourceChannel', 'source', 'customer_purchasing_power'] |
||||
|
const dictData = await dictUtil.getBatchDict(dictKeys) |
||||
|
|
||||
|
// 结果格式: |
||||
|
// { |
||||
|
// 'SourceChannel': [ |
||||
|
// {name: '抖音', value: '1', sort: 0, memo: ''}, |
||||
|
// {name: '微信', value: '2', sort: 1, memo: ''} |
||||
|
// ], |
||||
|
// 'source': [...], |
||||
|
// 'customer_purchasing_power': [...] |
||||
|
// } |
||||
|
``` |
||||
|
|
||||
|
### 3. 根据业务场景获取 |
||||
|
|
||||
|
```javascript |
||||
|
// 获取客户添加场景的所有字典 |
||||
|
const dictData = await dictUtil.getDictByScene('customer_add') |
||||
|
|
||||
|
// 或者使用便捷方法 |
||||
|
const dictData = await dictUtil.getCustomerAddDict() |
||||
|
``` |
||||
|
|
||||
|
### 4. 单个字典获取 |
||||
|
|
||||
|
```javascript |
||||
|
// 获取单个字典(与原有 util.getDict 兼容) |
||||
|
const sourceData = await dictUtil.getDict('source') |
||||
|
``` |
||||
|
|
||||
|
### 5. 预加载字典数据 |
||||
|
|
||||
|
```javascript |
||||
|
onLoad() { |
||||
|
// 在页面加载时预加载,提升用户体验 |
||||
|
const dictKeys = ['SourceChannel', 'source', 'customer_purchasing_power'] |
||||
|
dictUtil.preloadDict(dictKeys) |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### 6. 缓存管理 |
||||
|
|
||||
|
```javascript |
||||
|
// 清除指定字典缓存 |
||||
|
dictUtil.clearCache(['SourceChannel', 'source']) |
||||
|
|
||||
|
// 清除所有字典缓存 |
||||
|
dictUtil.clearCache() |
||||
|
``` |
||||
|
|
||||
|
## 在页面中的完整使用示例 |
||||
|
|
||||
|
### 原有方式(多次接口调用) |
||||
|
|
||||
|
```javascript |
||||
|
// 原有方式 - 问题:多次接口调用,用户体验差 |
||||
|
async init() { |
||||
|
await this.getDict('source_channel') |
||||
|
await this.getDict('source') |
||||
|
await this.getDict('purchasing_power') |
||||
|
await this.getDict('initial_intent') |
||||
|
await this.getDict('cognitive_idea') |
||||
|
await this.getDict('status') |
||||
|
await this.getDict('decision_maker') |
||||
|
await this.getDict('distance') |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### 优化后的方式(批量获取) |
||||
|
|
||||
|
```javascript |
||||
|
// 优化方式 - 一次接口调用获取所有数据 |
||||
|
import dictUtil from '@/common/dictUtil.js' |
||||
|
|
||||
|
export default { |
||||
|
onLoad() { |
||||
|
// 预加载字典数据 |
||||
|
this.preloadDictData() |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
// 预加载字典数据 |
||||
|
async preloadDictData() { |
||||
|
const dictKeys = [ |
||||
|
'SourceChannel', 'source', 'customer_purchasing_power', |
||||
|
'preliminarycustomerintention', 'cognitive_concept', |
||||
|
'kh_status', 'decision_maker', 'distance' |
||||
|
] |
||||
|
|
||||
|
// 静默预加载,不阻塞页面显示 |
||||
|
dictUtil.preloadDict(dictKeys).catch(error => { |
||||
|
console.warn('字典预加载失败:', error) |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
// 批量获取字典数据 |
||||
|
async getBatchDictData() { |
||||
|
try { |
||||
|
uni.showLoading({ title: '加载字典数据...', mask: true }) |
||||
|
|
||||
|
const dictKeys = [ |
||||
|
'SourceChannel', // 来源渠道 |
||||
|
'source', // 来源 |
||||
|
'customer_purchasing_power', // 购买力 |
||||
|
'preliminarycustomerintention', // 客户初步意向度 |
||||
|
'cognitive_concept', // 认知理念 |
||||
|
'kh_status', // 客户状态 |
||||
|
'decision_maker', // 决策人 |
||||
|
'distance' // 距离 |
||||
|
] |
||||
|
|
||||
|
// 批量获取字典数据 |
||||
|
const dictData = await dictUtil.getBatchDict(dictKeys) |
||||
|
|
||||
|
// 处理字典数据 |
||||
|
this.processDictData(dictData) |
||||
|
|
||||
|
} catch (error) { |
||||
|
console.error('批量获取字典数据失败:', error) |
||||
|
// 如果批量获取失败,回退到单个获取 |
||||
|
await this.fallbackGetDict() |
||||
|
} finally { |
||||
|
uni.hideLoading() |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 处理批量获取的字典数据 |
||||
|
processDictData(dictData) { |
||||
|
const keyMapping = { |
||||
|
'SourceChannel': 'source_channel', |
||||
|
'source': 'source', |
||||
|
'customer_purchasing_power': 'purchasing_power', |
||||
|
'preliminarycustomerintention': 'initial_intent', |
||||
|
'cognitive_concept': 'cognitive_idea', |
||||
|
'kh_status': 'status', |
||||
|
'decision_maker': 'decision_maker', |
||||
|
'distance': 'distance' |
||||
|
} |
||||
|
|
||||
|
Object.keys(keyMapping).forEach(dictKey => { |
||||
|
const localKey = keyMapping[dictKey] |
||||
|
const dictItems = dictData[dictKey] || [] |
||||
|
|
||||
|
if (Array.isArray(dictItems) && dictItems.length > 0) { |
||||
|
const formattedOptions = dictItems.map(item => ({ |
||||
|
text: item.name || '', |
||||
|
value: item.value || '' |
||||
|
})) |
||||
|
|
||||
|
if (this.picker_config[localKey]) { |
||||
|
this.picker_config[localKey].options = formattedOptions |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## 性能优化特性 |
||||
|
|
||||
|
### 1. 缓存机制 |
||||
|
- 自动缓存字典数据到本地存储 |
||||
|
- 缓存有效期 30 分钟 |
||||
|
- 避免重复请求相同数据 |
||||
|
|
||||
|
### 2. 批量请求 |
||||
|
- 一次接口调用获取多个字典 |
||||
|
- 减少网络请求次数 |
||||
|
- 提升页面加载速度 |
||||
|
|
||||
|
### 3. 预加载策略 |
||||
|
- 页面 onLoad 时预加载数据 |
||||
|
- 不阻塞页面显示 |
||||
|
- 用户操作时数据已就绪 |
||||
|
|
||||
|
### 4. 错误处理 |
||||
|
- 批量获取失败时自动回退到单个获取 |
||||
|
- 缓存获取失败时直接请求接口 |
||||
|
- 保证功能的健壮性 |
||||
|
|
||||
|
## 兼容性说明 |
||||
|
|
||||
|
### 向后兼容 |
||||
|
工具类保持与原有 `util.getDict()` 方法的完全兼容: |
||||
|
|
||||
|
```javascript |
||||
|
// 原有代码无需修改,自动使用新的缓存和批量获取机制 |
||||
|
const sourceData = await util.getDict('source') |
||||
|
|
||||
|
// 新增的批量获取方法 |
||||
|
const batchData = await util.getBatchDict(['source', 'status']) |
||||
|
``` |
||||
|
|
||||
|
### 渐进式升级 |
||||
|
可以逐步将页面迁移到新的批量获取方式: |
||||
|
|
||||
|
1. 先导入 `dictUtil` |
||||
|
2. 在 `onLoad` 中添加预加载 |
||||
|
3. 将 `init` 方法中的多个 `getDict` 调用替换为一次 `getBatchDict` 调用 |
||||
|
|
||||
|
## 注意事项 |
||||
|
|
||||
|
1. **字典 Key 映射**:确保后端字典 key 与前端使用的 key 一致 |
||||
|
2. **缓存清理**:如果字典数据有更新,记得清理对应缓存 |
||||
|
3. **错误处理**:在批量获取失败时,有回退机制保证功能正常 |
||||
|
4. **性能限制**:单次最多获取 20 个字典,防止接口性能问题 |
||||
|
|
||||
|
## 扩展功能 |
||||
|
|
||||
|
### 自定义业务场景 |
||||
|
|
||||
|
```javascript |
||||
|
// 在 DictService.php 中添加新的业务场景 |
||||
|
public function getDictKeysByScene(string $scene): array |
||||
|
{ |
||||
|
$sceneMapping = [ |
||||
|
'customer_add' => ['SourceChannel', 'source', '...'], |
||||
|
'personnel_add' => ['gender', 'education', '...'], |
||||
|
'your_scene' => ['key1', 'key2', '...'] // 添加自定义场景 |
||||
|
]; |
||||
|
|
||||
|
return $sceneMapping[$scene] ?? []; |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### 添加新的工具方法 |
||||
|
|
||||
|
```javascript |
||||
|
// 在 dictUtil.js 中扩展 |
||||
|
dictUtil.getYourSceneDict = async function() { |
||||
|
return await this.getDictByScene('your_scene') |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
通过这种方式,你可以大幅提升字典数据获取的性能和用户体验。 |
||||
Loading…
Reference in new issue