| 
						 | 
						- <template>
 - 	<view class="qrcode-container">
 - 		<navbar title="店铺二维码" leftClick @leftClick="$utils.navigateBack"/>
 - 		
 - 		<!-- 加载状态 -->
 - 		<view class="loading-container" v-if="loading">
 - 			<view class="loading-spinner"></view>
 - 			<text class="loading-text">加载中...</text>
 - 		</view>
 - 		
 - 		<!-- 二维码图片 -->
 - 
 - 
 - 		<view class="qrcode-wrapper" v-if="qrCodeUrl">
 - 			<image 
 - 				class="qrcode-image" 
 - 				:src="qrCodeUrl" 
 - 				mode="widthFix"
 - 				@load="imageLoaded"
 - 				@error="imageError"
 - 				show-menu-by-longpress
 - 			></image>
 - 			<text class="qrcode-tip" v-if="!loading && qrCodeUrl">扫描二维码查看店铺详情</text>
 - 			<text class="save-tip" v-if="!loading && qrCodeUrl">长按图片可保存到相册</text>
 - 		</view>
 - 		
 - 		<!-- 错误状态 -->
 - 		<view class="error-container" v-if="!loading && !qrCodeUrl && hasError">
 - 			<text class="error-text">二维码加载失败,请重试</text>
 - 			<button class="retry-button" @click="loadQrCode">重新加载</button>
 - 		</view>
 - 	</view>
 - </template>
 - 
 - <script>
 - 	export default {
 - 		data() {
 - 			return {
 - 				shopId: '',
 - 				qrCodeUrl: '',
 - 				loading: true,
 - 				hasError: false,
 - 			}
 - 		},
 - 		onLoad(options) {
 - 			if (options.id) {
 - 				this.shopId = options.id;
 - 				this.loadQrCode();
 - 			} else {
 - 				this.loading = false;
 - 				this.hasError = true;
 - 				uni.showToast({
 - 					title: '缺少店铺ID参数',
 - 					icon: 'none'
 - 				});
 - 			}
 - 		},
 - 		methods: {
 - 			// 加载二维码
 - 			loadQrCode() {
 - 				if (!this.shopId) return;
 - 				
 - 				this.loading = true;
 - 				this.hasError = false;
 - 				
 - 				// 直接使用图片链接请求二维码
 - 				this.qrCodeUrl = `${this.$config.baseUrl}/city/shop/shopQrCode?id=${this.shopId}`;
 - 				
 - 				// 由于image标签会自动处理加载状态,我们在imageLoaded和imageError中处理状态变化
 - 			},
 - 			
 - 			// 图片加载成功
 - 			imageLoaded() {
 - 				this.loading = false;
 - 			},
 - 			
 - 			// 图片加载失败
 - 			imageError() {
 - 				this.loading = false;
 - 				this.hasError = true;
 - 				this.qrCodeUrl = '';
 - 				
 - 				uni.showToast({
 - 					title: '二维码加载失败',
 - 					icon: 'none'
 - 				});
 - 			},
 - 			
 - 			// 保存图片到相册
 - 			saveImage() {
 - 				if (!this.qrCodeUrl) return;
 - 				
 - 				uni.showLoading({
 - 					title: '保存中...'
 - 				});
 - 				
 - 				// 下载图片
 - 				uni.downloadFile({
 - 					url: this.qrCodeUrl,
 - 					success: (res) => {
 - 						if (res.statusCode === 200) {
 - 							// 保存图片到相册
 - 							uni.saveImageToPhotosAlbum({
 - 								filePath: res.tempFilePath,
 - 								success: () => {
 - 									uni.hideLoading();
 - 									uni.showToast({
 - 										title: '保存成功',
 - 										icon: 'success'
 - 									});
 - 								},
 - 								fail: (err) => {
 - 									uni.hideLoading();
 - 									console.error('保存图片失败:', err);
 - 									// 如果是用户拒绝授权导致的失败
 - 									if (err.errMsg.indexOf('auth deny') >= 0 || err.errMsg.indexOf('authorize') >= 0) {
 - 										this.showAuthModal();
 - 									} else {
 - 										uni.showToast({
 - 											title: '保存失败',
 - 											icon: 'none'
 - 										});
 - 									}
 - 								}
 - 							});
 - 						} else {
 - 							uni.hideLoading();
 - 							uni.showToast({
 - 								title: '图片下载失败',
 - 								icon: 'none'
 - 							});
 - 						}
 - 					},
 - 					fail: () => {
 - 						uni.hideLoading();
 - 						uni.showToast({
 - 							title: '图片下载失败',
 - 							icon: 'none'
 - 						});
 - 					}
 - 				});
 - 			},
 - 			
 - 			// 显示授权提示弹窗
 - 			showAuthModal() {
 - 				uni.showModal({
 - 					title: '提示',
 - 					content: '保存图片需要您授权访问相册权限',
 - 					confirmText: '去授权',
 - 					cancelText: '取消',
 - 					success: (res) => {
 - 						if (res.confirm) {
 - 							// 打开设置页面
 - 							uni.openSetting({
 - 								success: (settingRes) => {
 - 									console.log('设置页面成功打开:', settingRes);
 - 								}
 - 							});
 - 						}
 - 					}
 - 				});
 - 			}
 - 		}
 - 	}
 - </script>
 - 
 - <style lang="scss" scoped>
 - .qrcode-container {
 - 	display: flex;
 - 	flex-direction: column;
 - 	align-items: center;
 - 	min-height: 100vh;
 - 	background-color: #f5f5f5;
 - 	padding: 30rpx;
 - }
 - 
 - .loading-container {
 - 	display: flex;
 - 	flex-direction: column;
 - 	justify-content: center;
 - 	align-items: center;
 - 	margin-top: 200rpx;
 - 	
 - 	.loading-spinner {
 - 		width: 80rpx;
 - 		height: 80rpx;
 - 		border: 6rpx solid #f3f3f3;
 - 		border-top: 6rpx solid #3B5CF0;
 - 		border-radius: 50%;
 - 		animation: spin 1s linear infinite;
 - 		margin-bottom: 20rpx;
 - 	}
 - 	
 - 	.loading-text {
 - 		font-size: 28rpx;
 - 		color: #666;
 - 	}
 - 	
 - 	@keyframes spin {
 - 		0% { transform: rotate(0deg); }
 - 		100% { transform: rotate(360deg); }
 - 	}
 - }
 - 
 - .qrcode-wrapper {
 - 	display: flex;
 - 	flex-direction: column;
 - 	align-items: center;
 - 	// background-color: #fff;
 - 	// border-radius: 16rpx;
 - 	// box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.1);
 - 	
 - 	.qrcode-image {
 - 		width: 700rpx;
 - 		margin-bottom: 30rpx;
 - 	}
 - 	
 - 	.qrcode-tip {
 - 		font-size: 28rpx;
 - 		color: #666;
 - 		margin-top: 20rpx;
 - 	}
 - 	
 - 	.save-tip {
 - 		font-size: 24rpx;
 - 		color: $uni-color-primary;
 - 		margin-top: 10rpx;
 - 	}
 - }
 - 
 - .error-container {
 - 	display: flex;
 - 	flex-direction: column;
 - 	align-items: center;
 - 	margin-top: 200rpx;
 - 	
 - 	.error-text {
 - 		font-size: 28rpx;
 - 		color: #999;
 - 		margin-bottom: 30rpx;
 - 	}
 - 	
 - 	.retry-button {
 - 		background-color: #3B5CF0;
 - 		color: #fff;
 - 		font-size: 28rpx;
 - 		padding: 16rpx 40rpx;
 - 		border-radius: 40rpx;
 - 		border: none;
 - 	}
 - }
 - </style>
 
 
  |