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. **组件内部和外部都会收到图片生成事件**,可根据需要在父组件中添加额外逻辑 |