2025-06-06 03:08:19 +08:00
|
|
|
|
<template>
|
|
|
|
|
<view>
|
|
|
|
|
<nav-bar title="Invite" bgColor="#fff"></nav-bar>
|
|
|
|
|
<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>
|
|
|
|
|
<view style="padding: 0px 10%;">
|
|
|
|
|
<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>
|
|
|
|
|
<button type="primary" class="b2" @click="copy()">
|
|
|
|
|
<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: {
|
|
|
|
|
copy() {
|
|
|
|
|
this.$copyText(this.qrcode).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
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
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');
|
|
|
|
|
ctx.fillRect(0, 0, 375, 667);
|
|
|
|
|
ctx.drawImage(this.promoteBgImgs[this.swiperIndex], 0, 0, 375, 360);
|
|
|
|
|
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;
|
|
|
|
|
padding: 94% 0px 0px 0px;
|
|
|
|
|
}
|
|
|
|
|
.minebg .v1{
|
|
|
|
|
margin: auto; width: 60%; border-radius: 20px;
|
|
|
|
|
background-color: #000; font-size: 36rpx;
|
|
|
|
|
height: 50px; color: #fff;
|
|
|
|
|
text-align: center; line-height: 50px;
|
|
|
|
|
}
|
|
|
|
|
.minebg .v1 .i{
|
|
|
|
|
width: 40rpx; height: 40rpx; margin-right: 30rpx; float: right; margin-top: 30rpx;
|
|
|
|
|
}
|
|
|
|
|
.minebg .b1{
|
|
|
|
|
background-color: #000; color: #fff; float: left; border-radius: 20px;
|
|
|
|
|
width: 47%;
|
|
|
|
|
}
|
|
|
|
|
.minebg .b2{
|
|
|
|
|
background-color: #fff; color: #000; float: left;
|
|
|
|
|
border-radius: 20px; margin-left: 6%; width: 47%;
|
|
|
|
|
}
|
|
|
|
|
.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>
|