|
|
- <template>
- <view class="promo-modal-page">
- <!-- 顶部导航栏 -->
- <!-- <view class="nav-bar">
- <view class="back" @tap="navigateBack">
- <uni-icons type="left" size="20" />
- </view>
- <text class="title">推广链接</text>
- </view> -->
- <navbar title="推广链接" leftClick
- @leftClick="$utils.navigateBack" />
-
- <!-- 页面内容 -->
- <view class="content">
- <!-- 用户信息 -->
- <!-- <view class="user-info-modal">
- <view class="avatar-frame">
- <image class="avatar-img" :src="userInfo.headImage || '/static/avatar.png'" mode="aspectFill" />
- </view>
- <view class="nickname">{{ userInfo.nickName || '用户' }}</view>
- </view> -->
- <!-- 二维码区 -->
- <view class="qrcode-modal-section">
- <!-- 加载骨架屏 -->
- <view v-if="isLoading" class="qrcode-skeleton">
- <view class="skeleton-img"></view>
- <view class="skeleton-text"></view>
- </view>
- <!-- 二维码图片 -->
- <image
- v-else
- class="qrcode-img"
- :src="qrcodeUrl"
- mode="widthFix"
- :show-menu-by-longpress="true"
- @error="onImageError"
- @load="onImageLoad"
- />
- <view class="invite-code">邀请码:{{inviteCode}}</view>
- </view>
- <!-- 底部按钮 -->
- <view class="bottom-btns-modal">
- <button class="btn gray" open-type="share">分享给好友</button>
- <button class="btn green" @tap="saveToAlbum">保存到本地</button>
- </view>
- </view>
- </view>
- </template>
-
- <script>
- import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
- import config from '@/config.js'
- import navbar from '@/compoent/base/navbar.vue'
- export default {
- components : {
- navbar
- },
- mixins: [pullRefreshMixin],
- data() {
- return {
- userInfo: {},
- qrcodeUrl: '/static/qrcode.png', // 二维码图片URL
- inviteCode: '888888',
- isLoading: true, // 加载状态
- }
- },
- onLoad() {
- // 获取用户信息和二维码
- this.fetchUserInfo()
- this.getQrcode()
- },
- // 微信小程序分享配置
- // #ifdef MP-WEIXIN
- onShareAppMessage() {
- return {
- title: `${this.userInfo.nickName || '用户'}邀请您一起参与旧衣回收`,
- path: `/pages/component/home?shareId=${this.inviteCode}`,
- imageUrl: this.qrcodeUrl || '/static/share-default.png'
- }
- },
- onShareTimeline() {
- return {
- title: `${this.userInfo.nickName || '用户'}邀请您一起参与旧衣回收,环保从我做起!`,
- query: `shareId=${this.inviteCode}`,
- imageUrl: this.qrcodeUrl || '/static/share-default.png'
- }
- },
- // #endif
- methods: {
- async onRefresh() {
- // 模拟刷新数据
- await new Promise(resolve => setTimeout(resolve, 1000))
- uni.stopPullRefresh()
- },
- navigateBack() {
- uni.navigateBack()
- },
- // 获取用户信息
- fetchUserInfo() {
- if (uni.getStorageSync('token')) {
- this.$api("getUserByToken", {}, (res) => {
- if (res.code == 200) {
- this.userInfo = res.result
- // 更新邀请码
- if (res.result.intentioCode) {
- this.inviteCode = res.result.intentioCode
- }
- }
- })
- }
- },
-
- getQrcode() {
- console.log('调用后端API生成二维码')
- uni.showLoading({
- title: '生成二维码中...'
- })
- this.generateQrcode()
- },
-
- // 生成二维码
- generateQrcode() {
- const token = uni.getStorageSync('token')
- const qrcodeUrl = `${config.baseUrl}/recycle-admin/applet/promotion/getInviteCode?token=${token}`
- console.log('二维码URL:', qrcodeUrl)
-
- // 直接使用网络图片
- this.qrcodeUrl = qrcodeUrl
- uni.hideLoading()
- this.onImageLoad();
-
- // 添加调试日志
- console.log('设置二维码URL:', this.qrcodeUrl)
- console.log('当前加载状态:', this.isLoading)
- },
-
- // 保存到手机相册
- saveToAlbum() {
- if (!this.qrcodeUrl || this.qrcodeUrl === '/static/qrcode.png') {
- uni.showToast({
- title: '二维码还未加载完成',
- icon: 'none'
- })
- return
- }
-
- // 先下载图片到本地
- uni.downloadFile({
- url: this.qrcodeUrl,
- success: res => {
- if (res.statusCode === 200) {
- this.saveLocalImage(res.tempFilePath)
- } else {
- uni.showToast({ title: '下载失败', icon: 'none' })
- }
- },
- fail: err => {
- console.log('下载失败:', err)
- uni.showToast({ title: '下载失败', icon: 'none' })
- }
- })
- },
- // 保存本地图片到相册
- saveLocalImage(tempFilePath) {
- // 使用新的权限检查方式
- uni.getSetting({
- success: (res) => {
- if (res.authSetting['scope.writePhotosAlbum'] === false) {
- // 权限被拒绝,引导用户手动开启
- uni.showModal({
- title: '提示',
- content: '需要您授权保存相册权限,请在设置中开启',
- showCancel: false,
- success: () => {
- uni.openSetting()
- }
- })
- } else {
- // 尝试保存,如果没有权限会自动弹出授权框
- uni.saveImageToPhotosAlbum({
- filePath: tempFilePath,
- success: () => {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- })
- },
- fail: (err) => {
- console.log('保存失败', err)
- uni.showToast({
- title: '保存失败',
- icon: 'none'
- })
- }
- })
- }
- },
- fail: () => {
- // 直接尝试保存
- uni.saveImageToPhotosAlbum({
- filePath: tempFilePath,
- success: () => {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- })
- },
- fail: (err) => {
- console.log('保存失败', err)
- uni.showToast({
- title: '保存失败',
- icon: 'none'
- })
- }
- })
- }
- })
- },
-
- // 图片加载成功
- onImageLoad() {
- console.log('二维码图片加载成功')
- this.isLoading = false
- console.log('加载状态已更新为:', this.isLoading)
- },
-
- // 图片加载失败
- onImageError() {
- console.log('二维码图片加载失败,使用默认图片')
- this.qrcodeUrl = '/static/qrcode.png'
- this.isLoading = false
- console.log('错误处理完成,加载状态:', this.isLoading)
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .promo-modal-page {
- min-height: 100vh;
- background: #f8f8f8;
- // padding-bottom: calc(140rpx + env(safe-area-inset-bottom));
- overflow: hidden;
- }
-
- .nav-bar {
- display: flex;
- align-items: center;
- height: calc(150rpx + var(--status-bar-height));
- padding: 0 32rpx;
- padding-top: var(--status-bar-height);
- background: #fff;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- z-index: 999;
- box-sizing: border-box;
-
- .back {
- padding: 20rpx;
- margin-left: -20rpx;
- }
-
- .title {
- flex: 1;
- text-align: center;
- font-size: 34rpx;
- font-weight: 500;
- color: #222;
- }
- }
-
- .content {
- // padding: 30rpx 0 0 0;
- padding: 20rpx;
- // margin-top: calc(150rpx + var(--status-bar-height) + 80rpx);
- height: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- overflow: hidden;
- box-sizing: border-box;
-
- .user-info-modal {
- display: flex;
- flex-direction: column;
- align-items: center;
- margin-bottom: 48rpx;
-
- .avatar-frame {
- width: 104rpx;
- height: 104rpx;
- border-radius: 10rpx;
- overflow: hidden;
- background: #f2f2f2;
- box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.10);
-
- .avatar-img {
- width: 104rpx;
- height: 104rpx;
- object-fit: cover;
- display: block;
- }
- }
-
- .nickname {
- margin-top: 24rpx;
- font-size: 32rpx;
- font-weight: bold;
- color: #222;
- text-align: center;
- }
- }
-
- .qrcode-modal-section {
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- margin-bottom: 48rpx;
-
- .qrcode-img {
- width: 100%;
- height: 100%;
- background: #fff;
- border-radius: 24rpx;
- box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
- }
-
- /* 骨架屏样式 */
- .qrcode-skeleton {
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- }
-
- .skeleton-img {
- width: 300rpx;
- height: 300rpx;
- border-radius: 20rpx;
- background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
- background-size: 200% 100%;
- animation: skeleton-loading 1.5s infinite;
- margin-bottom: 20rpx;
- }
-
- .skeleton-text {
- width: 200rpx;
- height: 32rpx;
- border-radius: 16rpx;
- background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
- background-size: 200% 100%;
- animation: skeleton-loading 1.5s infinite;
- }
-
- @keyframes skeleton-loading {
- 0% {
- background-position: 200% 0;
- }
- 100% {
- background-position: -200% 0;
- }
- }
-
-
-
- .invite-code {
- margin-top: 32rpx;
- font-size: 30rpx;
- color: #222;
- font-weight: bold;
- text-align: center;
- }
- }
-
- .bottom-btns-modal {
- position: fixed;
- left: 0;
- right: 0;
- bottom: 0;
- display: flex;
- justify-content: space-between;
- padding: 24rpx 32rpx calc(env(safe-area-inset-bottom) + 24rpx) 32rpx;
- background: #fff;
- z-index: 100;
-
- .btn {
- flex: 1;
- height: 88rpx;
- border-radius: 44rpx;
- font-size: 32rpx;
- font-weight: bold;
- margin: 0 12rpx;
- border: none;
- display: flex;
- align-items: center;
- justify-content: center;
-
- &.gray {
- background: linear-gradient(90deg, #b2f08d, #39e9d2);
- color: #fff;
- }
-
- &.green {
- background: linear-gradient(90deg, #b2f08d, #39e9d2);
- color: #fff;
- }
- }
- }
- }
- </style>
|