Files
hzdyjs/docs/开发文档/ImagePreview组件使用说明.md
2025-11-28 21:46:23 +08:00

162 lines
4.0 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.
# ImagePreview 组件使用说明
## 概述
ImagePreview 是一个图片预览组件,支持两种模式:
1. **普通模式**:直接使用URL字符串
2. **OSS模式**:通过ossid调用接口获取真实URL
## 功能特性
- ✅ 支持单张和多张图片预览
- ✅ 支持OSS ID模式,自动获取真实URL
- ✅ 内置缓存机制,避免重复请求
- ✅ 加载状态显示
- ✅ 错误状态处理
- ✅ 响应式尺寸设置
- ✅ 图片预览功能
## 组件属性
| 属性名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| src | String | '' | 图片源,可以是URL或OSS ID |
| width | Number/String | '' | 图片宽度 |
| height | Number/String | '' | 图片高度 |
| isOssId | Boolean | false | 是否为OSS ID模式 |
## 使用示例
### 1. 普通模式(直接使用URL)
```vue
<template>
<ImagePreview
src="https://example.com/image1.jpg,https://example.com/image2.jpg"
:width="200"
:height="150"
/>
</template>
```
### 2. OSS模式(通过ossid获取URL)
```vue
<template>
<ImagePreview
src="123,456,789"
:width="200"
:height="150"
:is-oss-id="true"
/>
</template>
```
### 3. 单张图片
```vue
<template>
<ImagePreview
src="123"
:width="100"
:height="100"
:is-oss-id="true"
/>
</template>
```
### 4. 顶部个人头像(自动识别OSS ID)
```vue
<script setup lang="ts">
import { computed } from 'vue';
import ImagePreview from '@/components/ImagePreview/index.vue';
import { useUserStore } from '@/store/modules/user';
const userStore = useUserStore();
const avatarIsOssId = computed(() => {
const avatar = userStore.avatar;
if (!avatar) return false;
return !/^https?:\/\//i.test(avatar) && !avatar.startsWith('/');
});
</script>
<template>
<ImagePreview
v-if="userStore.avatar"
class="user-avatar"
:src="userStore.avatar"
:width="24"
:height="24"
:is-oss-id="avatarIsOssId"
/>
</template>
```
> ✅ 用于首页 `Navbar` 头像区域时,`avatarIsOssId` 会自动识别当前值是否为 OSS ID,从而在带 Token 的 `/resource/oss/download/{ossId}` 接口与传统 URL 之间无缝切换,保证头像始终通过认证通道加载。
## 技术实现
### 核心功能
1. **OSS ID解析**:支持逗号分隔的多个OSS ID
2. **URL缓存**:使用Map缓存已获取的URL,避免重复请求
3. **异步加载**:通过watch监听src变化,异步获取真实URL
4. **错误处理**:完善的错误处理和日志记录
### API调用
组件内部使用 `listByIds` API获取OSS文件信息:
```typescript
// 通过ossid获取真实URL
const getUrlByOssId = async (ossId: string): Promise<string> => {
// 检查缓存
if (urlCache.value.has(ossId)) {
return urlCache.value.get(ossId)!;
}
try {
loading.value = true;
const response = await listByIds(ossId);
const ossList: OssVO[] = response.data;
if (ossList && ossList.length > 0) {
const url = ossList[0].url;
// 缓存结果
urlCache.value.set(ossId, url);
return url;
}
return '';
} catch (error) {
console.error('获取OSS URL失败:', error);
return '';
} finally {
loading.value = false;
}
};
```
### 缓存机制
```typescript
const urlCache = ref<Map<string, string>>(new Map());
```
- 使用Map结构缓存ossid到url的映射
- 避免重复的API调用
- 提升用户体验和性能
## 注意事项
1. **网络请求**:OSS模式下会发起网络请求,确保网络连接正常
2. **权限控制**:确保用户有访问OSS文件的权限
3. **错误处理**:组件内置错误处理,但建议在业务层面也做相应处理
4. **性能优化**:缓存机制已内置,无需额外优化
## 更新记录
- **2025-11-28**:补充顶部栏个人头像场景示例,强调 OSS ID 自动识别策略,确保 `Navbar` 等公共区域也复用统一的图片安全加载方案。
- **2025-08-02**:修复组件,支持OSS ID模式,添加缓存机制和加载状态
- 修复了导入错误和computed未定义的问题
- 添加了完整的错误处理和日志记录