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