361 lines
9.7 KiB
Vue
Raw Permalink Normal View History

2025-06-06 03:08:19 +08:00
<template>
<view>
2025-06-10 17:10:40 +08:00
<uni-nav-bar @clickLeft="goto(1, 1)" left-icon="back" :border="false" :shadow="false" :fixed="true"
2025-06-15 22:12:30 +08:00
:title="$t('promotion.text1')" backgroundColor="#fff" :statusBar="true"></uni-nav-bar>
2025-06-06 03:08:19 +08:00
<canvas canvas-id="poster" class="poster_canvas"></canvas>
<view class="minebg">
<view class="v1">
CODE: {{invite_code}}
<image src="/static/images/copy1.png" class="i" @click="copy(invite_code)" mode="cover"></image>
</view>
<view style="text-align: center; width: 260rpx; margin: 20rpx auto;">
<tki-qrcode
ref="qrcode"
:val="qrcode"
:size="size"
:unit="unit"
:onval="onval"
:load-make="load_make"
:show-loading="show_loading"
:lv="lv"
:background="background"
:foreground="foreground"
:pdground="pdground"
:icon='icon'
@result="qrResult"
style="margin: 10rpx auto; text-align: center;"/>
</view>
2025-06-10 00:51:49 +08:00
<view style="padding: 0rpx 10%;">
2025-06-06 03:08:19 +08:00
<button type="primary" class="b1" @click="onSaveImg">
<uni-icons type="download" size="20" color="#fff"></uni-icons>
2025-06-07 23:12:35 +08:00
<text style="margin-left: 10rpx;">{{$t('invite.text1')}}</text>
2025-06-06 03:08:19 +08:00
</button>
2025-06-15 22:12:30 +08:00
<button type="primary" class="b2" @click="copy('https://web.dxmt.io/#/pages/promotion/invitesignup')">
2025-06-06 03:08:19 +08:00
<uni-icons type="undo" size="20" color="#000"></uni-icons>
2025-06-07 23:12:35 +08:00
<text style="margin-left: 10rpx;">{{$t('invite.text2')}}</text>
2025-06-06 03:08:19 +08:00
</button>
</view>
</view>
<!-- #ifdef H5 -->
<view class="h5_press_save" v-if="h5SaveImg" @click="h5SaveImg = ''">
<image :src="h5SaveImg" mode="widthFix"></image>
<button class="download"><uni-icons type="download" size="20" color="#fff"></uni-icons>
2025-06-07 23:12:35 +08:00
{{$t('invite.text3')}}</button>
2025-06-06 03:08:19 +08:00
</view>
<!-- #endif -->
</view>
</template>
<script>
import tkiQrcode from "tki-qrcode"
import {
mapState,
mapMutations
} from 'vuex';
let settingWritePhotosAlbum = false;
export default {
components: {
tkiQrcode
},
data() {
return {
invite_code: '',
init: {},
nickName: '',
2025-06-09 00:34:46 +08:00
promoteBgImgs: ["/static/images/13.png"],
2025-06-06 03:08:19 +08:00
promoteCodeImg: "https://qn.kemean.cn/upload/202007/03/1593744239803mgajzyjk.png",
swiperIndex: 0,
posterImgs: [],
shareInfo: {
2025-06-07 23:12:35 +08:00
shareContent: "",
2025-06-06 03:08:19 +08:00
shareImg: "http://qn.kemean.cn/upload/202004/08/15863540965488mlv1qgj.png",
2025-06-07 23:12:35 +08:00
shareTitle: "",
shareUrl: ""
2025-06-06 03:08:19 +08:00
},
h5SaveImg: "",
qrcode: '', //二维码的内容链接
size: 260, //二维码的大小
unit: 'upx', //大小单位 !!! rpx单位有误
load_make: true, //组件加载完成后自动生成二维码
show_loading: false, //是否添加loading
onval: true, //val值变化时自动重新生成二维码
background: '#ffffff', //背景色
foreground: '#000',//点色
pdground: '#000', //角标色
icon: '', //二维码图标
iconsize: 30, //二维码图标大小
lv: 3, //二维码容错级别
2025-06-07 23:12:35 +08:00
loadingText: 'Loading', //loading内容,
2025-06-06 03:08:19 +08:00
result: ''
}
},
computed: {
...mapState(['userInfo'])
},
onLoad(e){
this.$http.get('/api/common/init?lang='+this.$i18n.locale).then(res => {
this.qrcode = res.data.client_download_url;
});
},
//第一次加载
onShow(e) {
this.$http.get('/api/team/index?lang='+this.$i18n.locale).then(res => {
if(res.code == 0){
this.invite_code = res.data.user.invite_code;
}
});
},
methods: {
2025-06-15 22:12:30 +08:00
copy(val) {
// #ifdef APP-PLUS
uni.setClipboardData({
data: val, // e是你要保存的内容
success: function () {
uni.showToast({
title:this.$t('copySuccess'),
icon:'none'
})
}
})
// #endif
// #ifdef H5
this.$copyText(val).then(res => {
2025-06-07 23:12:35 +08:00
uni.showToast({title: this.$t('copySuccess'), icon: 'none'});
2025-06-06 03:08:19 +08:00
});
2025-06-15 22:12:30 +08:00
// #endif
2025-06-06 03:08:19 +08:00
},
2025-06-10 00:51:49 +08:00
goto(url, type) {
if (type == 2) {
return uni.switchTab({ url: url })
}
if (type == 1) {
return uni.navigateBack({ delta: url });
}
uni.navigateTo({
url: url
})
},
2025-06-06 03:08:19 +08:00
qrResult(e) {
this.result = e;
},
// 创建海报
createPoster() {
return new Promise((resolve, reject) => {
if (this.posterImgs[this.swiperIndex]) {
resolve(this.posterImgs[this.swiperIndex]);
} else {
uni.showLoading({
title: 'Poster generation in progress'
});
const ctx = uni.createCanvasContext('poster');
ctx.setFillStyle('#2651ef');
2025-06-15 22:12:30 +08:00
ctx.fillRect(0, 0, 375, 700);
ctx.drawImage(this.promoteBgImgs[this.swiperIndex], 0, 0, 375, 700);
2025-06-06 03:08:19 +08:00
ctx.drawImage(this.result, 108, 440, 160, 160);
// 绘制圆角矩形的参数
var x = 80; // 矩形左上角的x坐标
var y = 370; // 矩形左上角的y坐标
var width = 220; // 矩形的宽度
var height = 50; // 矩形的高度
var radius = 25; // 圆角半径
var fillColor = '#000'; // 填充颜色
var strokeColor = '#000'; // 边框颜色
// 开始绘制路径
ctx.beginPath();
ctx.moveTo(x + radius, y); // 起始点
ctx.arcTo(x + width, y, x + width, y + height, radius); // 右上圆角
ctx.lineTo(x + width, y + height - radius);
ctx.arcTo(x + width, y + height, x, y + height, radius); // 右下圆角
ctx.lineTo(x + radius, y + height);
ctx.arcTo(x, y + height, x, y, radius); // 左下圆角
ctx.lineTo(x, y + radius);
ctx.arcTo(x, y, x + width, y, radius); // 左上圆角
ctx.closePath();
// 设置填充颜色并填充
ctx.setFillStyle(fillColor);
ctx.fill();
// 设置边框颜色并描边
ctx.setStrokeStyle(strokeColor);
ctx.stroke();
ctx.setFontSize(18);
ctx.setFillStyle('#fff');
ctx.fillText("CODE" + this.invite_code, 100, 402);
ctx.draw(true, () => {
uni.canvasToTempFilePath({
canvasId: 'poster',
width: 375,
height: 667,
success: res => {
if(this.posterImgs[this.swiperIndex]){
this.posterImgs[this.swiperIndex].temporary = res.tempFilePath;
}else{
this.posterImgs[this.swiperIndex] = {};
this.posterImgs[this.swiperIndex].temporary = res.tempFilePath;
}
resolve(res.tempFilePath);
},
fail: () => {
uni.hideLoading();
reject();
}
});
});
}
});
},
// 保存图片
async onSaveImg() {
let imgUrl = "";
if(this.posterImgs[this.swiperIndex] && this.posterImgs[this.swiperIndex].temporary){
imgUrl = await this.posterImgs[this.swiperIndex].temporary;
}else{
imgUrl = await this.createPoster();
}
// #ifdef H5
this.h5SaveImg = imgUrl;
uni.hideLoading();
// #endif
// #ifdef MP-WEIXIN
uni.showLoading({
title: 'Poster download in progress'
});
if (settingWritePhotosAlbum) {
uni.getSetting({
success: res => {
if (res.authSetting['scope.writePhotosAlbum']) {
uni.saveImageToPhotosAlbum({
filePath: imgUrl,
success: () => {
uni.hideLoading();
uni.showToast({
title: 'Successfully saved'
});
}
});
} else {
uni.showModal({
title: 'prompt',
content: 'Please first open the “Save Album” permission on the settings page',
confirmText: 'Go set it up',
cancelText: 'cancel',
success: data => {
if (data.confirm) {
uni.hideLoading();
uni.openSetting();
}
}
});
}
}
});
} else {
settingWritePhotosAlbum = true;
uni.authorize({
scope: 'scope.writePhotosAlbum',
success: () => {
uni.saveImageToPhotosAlbum({
filePath: imgUrl,
success: () => {
uni.hideLoading();
uni.showToast({
2025-06-07 23:12:35 +08:00
title: 'Successfully'
2025-06-06 03:08:19 +08:00
});
}
});
}
});
}
// #endif
// #ifdef APP-PLUS
uni.showLoading({
2025-06-07 23:12:35 +08:00
title: this.$t('invite.text4')
2025-06-06 03:08:19 +08:00
});
uni.saveImageToPhotosAlbum({
filePath: imgUrl,
success: () => {
uni.hideLoading();
uni.showToast({
title: 'Successfully saved'
});
}
});
// #endif
},
}
}
</script>
<style scoped>
.poster_canvas {
width: 100vw;
height: 100vh;
position: fixed;
top: -100vh;
left: 0rpx;
}
.page{min-height: 100vh;position: relative; background-color: #2A54FF;}
.minebg{
width: 100vw;
min-height: 100vh;
2025-06-09 00:34:46 +08:00
background: url('/static/images/13.png') #2651ef;
2025-06-06 03:08:19 +08:00
background-size: 100%;
background-repeat: repeat-x;
font-family: Poppins, Poppins;
2025-06-10 00:51:49 +08:00
padding: 94% 0rpx 0rpx 0rpx;
2025-06-06 03:08:19 +08:00
}
.minebg .v1{
2025-06-10 00:51:49 +08:00
margin: auto; width: 60%; border-radius: 40rpx;
2025-06-06 03:08:19 +08:00
background-color: #000; font-size: 36rpx;
2025-06-10 00:51:49 +08:00
height: 100rpx; color: #fff;
text-align: center; line-height: 100rpx;
2025-06-06 03:08:19 +08:00
}
.minebg .v1 .i{
width: 40rpx; height: 40rpx; margin-right: 30rpx; float: right; margin-top: 30rpx;
}
.minebg .b1{
2025-06-10 00:51:49 +08:00
background-color: #000; color: #fff; float: left; border-radius: 40rpx;
2025-06-06 03:08:19 +08:00
width: 47%;
}
.minebg .b2{
background-color: #fff; color: #000; float: left;
2025-06-10 00:51:49 +08:00
border-radius: 40rpx; margin-left: 6%; width: 47%;
2025-06-06 03:08:19 +08:00
}
.h5_press_save {
background-color: #000;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
z-index: 100;
image {
width: 100%;
}
.download {
font-size: 24rpx;
color: #ffffff;
background-color: rgba(0,0,0,0.5);
display: flex;
align-items: center;
flex-direction: row;
justify-content: center;
position: absolute;
padding: 0rpx 30rpx;
border-radius: 40rpx;
bottom: 20rpx;
left: 50%;
transform: translateX(-50%);
&:before {
content: '';
@include bis('@/static/demo/icon_download.png');
width: 24rpx;
height: 24rpx;
margin-right: 15rpx;
}
}
}
</style>