|
|
- <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">
- <image class="qrcode-img" :src="qrcodeUrl" mode="widthFix" />
- <!-- <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',
- inviteCode: '888888',
- }
- },
- 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() {
- // 获取全局二维码路径
- if (getApp().globalData.qr_path) {
- console.log('获取到二维码路径', getApp().globalData.qr_path)
- this.qrcodeUrl = getApp().globalData.qr_path
- } else {
- console.log('全局二维码路径不存在')
-
- uni.showLoading({
- title: '拼命绘画中...'
- })
-
- uni.getImageInfo({
- src: `${config.baseUrl}/recycle-admin/applet/promotion/getInviteCode?token=${uni.getStorageSync('token')}`,
- success: res => {
- console.log(res);
- getApp().globalData.qr_path = res.path
- console.log(getApp().globalData.qr_path, 'qr_path')
- this.qrcodeUrl = res.path
- },
- fail: err => {
- console.log('QR code load failed:', err)
- },
- complete() {
- uni.hideLoading()
- }
- })
- }
- },
-
- // 保存到手机相册
- saveToAlbum() {
- if (!this.qrcodeUrl) {
- uni.showToast({
- title: '二维码还未加载完成',
- icon: 'none'
- })
- return
- }
-
- // 先授权相册权限
- uni.getSetting({
- success: (res) => {
- if (!res.authSetting['scope.writePhotosAlbum']) {
- // 没有权限,申请权限
- uni.authorize({
- scope: 'scope.writePhotosAlbum',
- success: () => {
- this.doSaveImage()
- },
- fail: () => {
- // 权限被拒绝,引导用户手动开启
- uni.showModal({
- title: '提示',
- content: '需要您授权保存相册权限',
- showCancel: false,
- success: () => {
- uni.openSetting()
- }
- })
- }
- })
- } else {
- // 已有权限,直接保存
- this.doSaveImage()
- }
- }
- })
- },
- // 执行保存图片
- doSaveImage() {
- uni.saveImageToPhotosAlbum({
- filePath: this.qrcodeUrl,
- success: () => {
- uni.showToast({
- title: '保存成功',
- icon: 'success'
- })
- },
- fail: (err) => {
- console.log('保存失败', err)
- uni.showToast({
- title: '保存失败',
- icon: 'none'
- })
- }
- })
- }
- }
- }
- </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);
- }
-
- .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>
|