|
@@ -1,39 +1,136 @@
|
|
|
<template>
|
|
|
<div class="share-box">
|
|
|
<div class="left hui-detail">
|
|
|
- <div class="hui-detail-box">
|
|
|
- <div class="hui-detail-content">
|
|
|
- <div class="hui-detail-item">
|
|
|
- <div class="hui-detail-label">已邀请人数</div>
|
|
|
- <div class="hui-detail-value">1</div>
|
|
|
- </div>
|
|
|
- <div class="hui-detail-item">
|
|
|
- <div class="hui-detail-label">邀请码</div>
|
|
|
- <div class="hui-detail-value">2</div>
|
|
|
- </div>
|
|
|
- <div class="hui-detail-item">
|
|
|
- <div class="hui-detail-label">分享链接</div>
|
|
|
- <div class="hui-detail-value color-danger">3</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div class="hui-detail-box">
|
|
|
+ <div class="hui-detail-content">
|
|
|
+ <div class="hui-detail-item">
|
|
|
+ <div class="hui-detail-label">
|
|
|
+ <span class="label">邀请码</span>
|
|
|
+ <el-tooltip class="item" effect="dark" content="复制邀请码" placement="top">
|
|
|
+ <i class="el-icon-copy-document" @click="copyText(inviteData.content)"></i>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ <div class="hui-detail-value">{{inviteData.content}}</div>
|
|
|
+ </div>
|
|
|
+ <div class="hui-detail-item">
|
|
|
+ <div class="hui-detail-label">
|
|
|
+ <span class="label">分享链接</span>
|
|
|
+ <el-tooltip class="item" effect="dark" content="复制分享链接" placement="top">
|
|
|
+ <i class="el-icon-copy-document" @click="copyText(inviteData.url)"></i>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ <div class="hui-detail-value">{{inviteData.url}}</div>
|
|
|
+ </div>
|
|
|
+ <div class="hui-detail-item">
|
|
|
+ <div class="hui-detail-label">已邀请人数</div>
|
|
|
+ <div class="hui-detail-value">{{inviteData.inviteNumber}}</div>
|
|
|
+ </div>
|
|
|
+ <div class="hui-detail-item">
|
|
|
+ <div class="hui-detail-label">已邀请人</div>
|
|
|
+ <div class="hui-detail-value" style="display: flex;flex-wrap: wrap;">
|
|
|
+ <div class="cc-user-item" v-for="(item,index) in inviteUserList" :key="index">
|
|
|
+ <div class="cc-user-avatar">
|
|
|
+ <avatar :user="item" :size="10"></avatar>
|
|
|
+ </div>
|
|
|
+ <div class="cc-user-name">{{item.userName}}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="right">
|
|
|
<div class="qr-code-image">
|
|
|
- <img src="/assets/ma.png" />
|
|
|
+ <img v-if="inviteData.qrCodeBase64" :src="inviteData.qrCodeBase64" />
|
|
|
</div>
|
|
|
- <el-button type="primary" size="small">下载二维码</el-button>
|
|
|
+ <el-button type="primary" size="small" @click="download">下载二维码</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+ import {
|
|
|
+ getInviteQr,
|
|
|
+ getInviteUserListByPage
|
|
|
+ } from '@/api/loginRegister'
|
|
|
export default {
|
|
|
data() {
|
|
|
- return {};
|
|
|
+ return {
|
|
|
+ inviteData: {},
|
|
|
+ inviteUserList: []
|
|
|
+ };
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.init();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ getInviteQr().then(res => {
|
|
|
+ if (res.state) {
|
|
|
+ this.inviteData = res.data;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ getInviteUserListByPage(1, 100).then(res => {
|
|
|
+ if (res.state) {
|
|
|
+ this.inviteUserList = res.data.dataList;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ async copyText(code) {
|
|
|
+ try {
|
|
|
+ await navigator.clipboard.writeText(code);
|
|
|
+ this.$message.success('复制成功');
|
|
|
+ } catch (error) {
|
|
|
+ this.$message.warning('复制失败');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ download() {
|
|
|
+ this.downloadBase64Image(this.inviteData.qrCodeBase64, '邀请二维码');
|
|
|
+ },
|
|
|
+ downloadBase64Image(base64Data, filename = 'image', mimeType) {
|
|
|
+ try {
|
|
|
+ // 分离Base64元数据和编码数据
|
|
|
+ const metaAndData = base64Data.split(';base64,');
|
|
|
+ // 自动提取MIME类型(如果未手动指定)
|
|
|
+ const mime = mimeType || metaAndData[0].split(':')[1];
|
|
|
+ // 获取纯Base64编码字符串
|
|
|
+ const data = metaAndData[1] || base64Data; // 处理无前缀的情况
|
|
|
+ // 解码Base64字符串
|
|
|
+ const byteCharacters = atob(data);
|
|
|
+ // 将解码后的数据转换为Uint8Array
|
|
|
+ const byteArrays = [];
|
|
|
+ for (let offset = 0; offset < byteCharacters.length; offset += 512) {
|
|
|
+ const slice = byteCharacters.slice(offset, offset + 512);
|
|
|
+ const byteNumbers = new Array(slice.length);
|
|
|
+ for (let i = 0; i < slice.length; i++) {
|
|
|
+ byteNumbers[i] = slice.charCodeAt(i);
|
|
|
+ }
|
|
|
+ byteArrays.push(new Uint8Array(byteNumbers));
|
|
|
+ }
|
|
|
+ // 创建Blob对象
|
|
|
+ const blob = new Blob(byteArrays, {
|
|
|
+ type: mime
|
|
|
+ });
|
|
|
+ // 生成临时下载链接
|
|
|
+ const url = URL.createObjectURL(blob);
|
|
|
+ // 创建虚拟链接元素
|
|
|
+ const link = document.createElement('a');
|
|
|
+ link.style.display = 'none';
|
|
|
+ link.href = url;
|
|
|
+ // 处理文件扩展名
|
|
|
+ const extension = mime.split('/')[1] || 'png';
|
|
|
+ link.download = `${filename}.${extension}`;
|
|
|
+ // 添加到DOM并模拟点击
|
|
|
+ document.body.appendChild(link);
|
|
|
+ link.click();
|
|
|
+ // 清理资源
|
|
|
+ document.body.removeChild(link);
|
|
|
+ URL.revokeObjectURL(url);
|
|
|
+ } catch (error) {
|
|
|
+ this.$message.warning('下载失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
- onLoad() {},
|
|
|
- methods: {},
|
|
|
}
|
|
|
</script>
|
|
|
|
|
@@ -49,6 +146,40 @@
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
padding: 20px;
|
|
|
+
|
|
|
+ .el-icon-copy-document {
|
|
|
+ color: $--color-primary;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .hui-detail-label {
|
|
|
+ .label {
|
|
|
+ margin-right: 5px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .cc-user-item {
|
|
|
+ display: flex;
|
|
|
+ height: 28px;
|
|
|
+ align-items: center;
|
|
|
+ margin-right: 15px;
|
|
|
+ background: rgba(31, 35, 41, .1);
|
|
|
+ border-radius: 15px;
|
|
|
+ padding: 0 8px 0 4px;
|
|
|
+
|
|
|
+ .cc-user-avatar {
|
|
|
+ width: 20px;
|
|
|
+ height: 20px;
|
|
|
+ border-radius: 50%;
|
|
|
+ overflow: hidden;
|
|
|
+ margin-right: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .cc-user-name {
|
|
|
+ overflow: hidden;
|
|
|
+ font-size: $--font-size-small;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.right {
|