179 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| 
								 | 
							
								# 分享组件说明
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## SpecialSharePage 组件
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								特殊场景分享页面组件,通过接口获取base64格式的背景图片。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 主要特性
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								- 📱 **响应式**:适配各种屏幕尺寸
							 | 
						|||
| 
								 | 
							
								- 🎨 **可定制**:支持样式自定义
							 | 
						|||
| 
								 | 
							
								- 🔄 **重试机制**:支持接口调用失败时的重试
							 | 
						|||
| 
								 | 
							
								- 🌐 **接口获取**:自动通过接口获取背景图片
							 | 
						|||
| 
								 | 
							
								- 🖼️ **Base64支持**:接口返回base64格式的背景图片
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 使用方法
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```vue
							 | 
						|||
| 
								 | 
							
								<template>
							 | 
						|||
| 
								 | 
							
								  <SpecialSharePage
							 | 
						|||
| 
								 | 
							
								    :qrCodeImage="base64QrCodeImage"
							 | 
						|||
| 
								 | 
							
								    :userInfo="userInfo"
							 | 
						|||
| 
								 | 
							
								    :isLoaded="true"
							 | 
						|||
| 
								 | 
							
								    @share-generated="handleShareGenerated"
							 | 
						|||
| 
								 | 
							
								    @background-image-error="handleError"
							 | 
						|||
| 
								 | 
							
								    @background-image-retry="handleRetry"
							 | 
						|||
| 
								 | 
							
								  />
							 | 
						|||
| 
								 | 
							
								</template>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<script>
							 | 
						|||
| 
								 | 
							
								import SpecialSharePage from '@/components/share/SpecialSharePage.vue'
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								export default {
							 | 
						|||
| 
								 | 
							
								  components: {
							 | 
						|||
| 
								 | 
							
								    SpecialSharePage,
							 | 
						|||
| 
								 | 
							
								  },
							 | 
						|||
| 
								 | 
							
								  data() {
							 | 
						|||
| 
								 | 
							
								    return {
							 | 
						|||
| 
								 | 
							
								      base64QrCodeImage:
							 | 
						|||
| 
								 | 
							
								        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQAAAADK...',
							 | 
						|||
| 
								 | 
							
								      userInfo: {
							 | 
						|||
| 
								 | 
							
								        memberCode: '12345678',
							 | 
						|||
| 
								 | 
							
								      },
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								  },
							 | 
						|||
| 
								 | 
							
								  methods: {
							 | 
						|||
| 
								 | 
							
								    handleShareGenerated(dataUrl) {
							 | 
						|||
| 
								 | 
							
								      console.log('生成的分享图片:', dataUrl)
							 | 
						|||
| 
								 | 
							
								      // 处理生成的图片
							 | 
						|||
| 
								 | 
							
								    },
							 | 
						|||
| 
								 | 
							
								    handleError(error) {
							 | 
						|||
| 
								 | 
							
								      console.error('背景图片错误:', error)
							 | 
						|||
| 
								 | 
							
								    },
							 | 
						|||
| 
								 | 
							
								    handleRetry(retryCount) {
							 | 
						|||
| 
								 | 
							
								      console.log('背景图片重试:', retryCount)
							 | 
						|||
| 
								 | 
							
								    },
							 | 
						|||
| 
								 | 
							
								  },
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								</script>
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Props
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								| 参数                    | 类型    | 默认值 | 说明                     |
							 | 
						|||
| 
								 | 
							
								| ----------------------- | ------- | ------ | ------------------------ |
							 | 
						|||
| 
								 | 
							
								| `qrCodeImage`           | String  | ''     | 二维码图片(base64格式) |
							 | 
						|||
| 
								 | 
							
								| `userInfo`              | Object  | {}     | 用户信息对象             |
							 | 
						|||
| 
								 | 
							
								| `isWechat`              | Boolean | false  | 是否为微信环境           |
							 | 
						|||
| 
								 | 
							
								| `isLoaded`              | Boolean | false  | 是否加载完成             |
							 | 
						|||
| 
								 | 
							
								| `skipImageVerification` | Boolean | false  | 跳过图片验证(调试用)   |
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Events
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								| 事件名                   | 参数       | 说明             |
							 | 
						|||
| 
								 | 
							
								| ------------------------ | ---------- | ---------------- |
							 | 
						|||
| 
								 | 
							
								| `share-generated`        | dataUrl    | 分享图片生成成功 |
							 | 
						|||
| 
								 | 
							
								| `background-image-error` | error      | 背景图片加载错误 |
							 | 
						|||
| 
								 | 
							
								| `background-image-retry` | retryCount | 背景图片重试     |
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 方法
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								| 方法名                          | 说明                                 |
							 | 
						|||
| 
								 | 
							
								| ------------------------------- | ------------------------------------ |
							 | 
						|||
| 
								 | 
							
								| `generateShareImage()`          | 生成分享图片                         |
							 | 
						|||
| 
								 | 
							
								| `retryGetBackgroundImage()`     | 手动重试获取背景图                   |
							 | 
						|||
| 
								 | 
							
								| `getStatusInfo()`               | 获取当前状态信息(调试用)           |
							 | 
						|||
| 
								 | 
							
								| `handleShareGenerated(dataUrl)` | 处理图片生成成功后的逻辑(内部方法) |
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 接口配置
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								组件使用 `getSharedImg` 接口获取背景图片:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```javascript
							 | 
						|||
| 
								 | 
							
								// 在 config/login.js 中配置接口
							 | 
						|||
| 
								 | 
							
								export const getSharedImg = () => {
							 | 
						|||
| 
								 | 
							
								  return http.get('/api/share/background')
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								接口应返回以下格式:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```javascript
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  code: 200,
							 | 
						|||
| 
								 | 
							
								  data: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...',
							 | 
						|||
| 
								 | 
							
								  message: 'success'
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 调试
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```javascript
							 | 
						|||
| 
								 | 
							
								// 生成分享图片
							 | 
						|||
| 
								 | 
							
								this.$refs.specialSharePage.generateShareImage()
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// 手动重试获取背景图
							 | 
						|||
| 
								 | 
							
								this.$refs.specialSharePage.retryGetBackgroundImage()
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// 获取当前状态信息
							 | 
						|||
| 
								 | 
							
								const status = this.$refs.specialSharePage.getStatusInfo()
							 | 
						|||
| 
								 | 
							
								console.log('组件状态:', status)
							 | 
						|||
| 
								 | 
							
								/*
							 | 
						|||
| 
								 | 
							
								输出示例:
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  specialBackgroundImage: '123456 bytes',
							 | 
						|||
| 
								 | 
							
								  qrCodeImage: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEU...',
							 | 
						|||
| 
								 | 
							
								  backgroundImageLoaded: true,
							 | 
						|||
| 
								 | 
							
								  isLoadingBackground: false,
							 | 
						|||
| 
								 | 
							
								  imageLoadRetryCount: 0,
							 | 
						|||
| 
								 | 
							
								  isReady: true
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								*/
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 工作流程
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1. **组件挂载**:自动调用 `getSharedImg` 接口获取背景图
							 | 
						|||
| 
								 | 
							
								2. **显示加载**:显示"正在获取背景图片..."状态
							 | 
						|||
| 
								 | 
							
								3. **接口响应**:处理接口返回的base64背景图数据
							 | 
						|||
| 
								 | 
							
								4. **准备就绪**:背景图和二维码都准备好后可以生成分享图片
							 | 
						|||
| 
								 | 
							
								5. **生成图片**:使用html2canvas截取页面生成分享图片
							 | 
						|||
| 
								 | 
							
								6. **处理结果**:
							 | 
						|||
| 
								 | 
							
								   - 关闭loading状态
							 | 
						|||
| 
								 | 
							
								   - 显示成功提示("图片生成成功,请长按保存")
							 | 
						|||
| 
								 | 
							
								   - 调用内部 `handleShareGenerated` 方法处理
							 | 
						|||
| 
								 | 
							
								   - 通过 `share-generated` 事件通知父组件
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 图片生成流程
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								用户点击生成按钮
							 | 
						|||
| 
								 | 
							
								       ↓
							 | 
						|||
| 
								 | 
							
								检查前置条件(二维码、背景图)
							 | 
						|||
| 
								 | 
							
								       ↓
							 | 
						|||
| 
								 | 
							
								显示 "生成图片中..." loading
							 | 
						|||
| 
								 | 
							
								       ↓
							 | 
						|||
| 
								 | 
							
								使用 html2canvas 截取页面
							 | 
						|||
| 
								 | 
							
								       ↓
							 | 
						|||
| 
								 | 
							
								生成成功 → 关闭loading → 显示成功提示 → 发送事件
							 | 
						|||
| 
								 | 
							
								       ↓
							 | 
						|||
| 
								 | 
							
								生成失败 → 关闭loading → 显示错误提示
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 错误处理
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								- **接口调用失败**:自动重试最多3次
							 | 
						|||
| 
								 | 
							
								- **重试机制**:通过 `background-image-retry` 事件通知重试状态
							 | 
						|||
| 
								 | 
							
								- **最终失败**:通过 `background-image-error` 事件通知错误
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 注意事项
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								1. 确保 `getSharedImg` 接口返回完整的base64格式图片
							 | 
						|||
| 
								 | 
							
								2. 组件会在mounted生命周期自动调用接口
							 | 
						|||
| 
								 | 
							
								3. 支持手动重试机制,适用于网络不稳定的情况
							 | 
						|||
| 
								 | 
							
								4. 生成的图片为JPEG格式,质量为100%
							 | 
						|||
| 
								 | 
							
								5. 组件支持长按保存分享图片
							 | 
						|||
| 
								 | 
							
								6. 接口失败时会显示相应的错误状态
							 | 
						|||
| 
								 | 
							
								7. **图片生成成功后会自动显示提示信息**,无需在父组件中重复处理
							 | 
						|||
| 
								 | 
							
								8. **组件内部和外部都会收到图片生成事件**,可根据需要在父组件中添加额外逻辑
							 |