ch-tgr/src/views/Merchant/Merchant.vue
2026-05-14 16:14:04 +08:00

329 lines
9.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<BasePage>
<div class="merchant">
<div class="shopinfo">
<img class="tx" :src="$file(data.MerchantAvatar)">
<div class="info">
<b>{{ data.MerchantName }}</b>
<p>账号{{ data.MerchantPhone }}</p>
</div>
<div class="service-box" @click="$showManagerPopup()">
管理中心
<van-icon name="arrow"></van-icon>
</div>
</div>
<div class="wallet">
<div class="tit">
<span @click="$navigate('MerchantIncome')"> 营业收入() <van-icon name="arrow"></van-icon>
</span>
<div class="line">
<b @click="$navigate('MerchantIncome')">
1020.00
</b>
<div>
<span>提现中金额
</span>
<p>1000.00</p>
</div>
</div>
</div>
<div class="cc">
<div class="ll" @click="$navigate('Balance')">
<span>
可用余额<van-icon name="arrow"></van-icon>
</span>
<b>{{ data.Income?.toFixed(2) }}</b>
</div>
<div class="ll" @click="$navigate('CV')">
<span>
会员卡额度<van-icon name="arrow"></van-icon>
</span>
<b>{{ data.Point?.toFixed(2) }}</b>
</div>
</div>
</div>
<!-- <div class="block">
<div class="d1" @click="$navigate('MerchantTrade')">
<b>订单记录</b>
<p>查看订单记录</p>
<van-badge :content="expiring ? expiring : ''" :offset="[60, -40]">
<button>立即查看</button>
</van-badge>
<img src="/img/bbb1.png">
</div>
<div class="_r">
<div class="d2" @click="$navigate('MerchantTrade')">
<b>订单记录</b>
<p>查看订单记录</p>
<button>立即查看</button>
<img src="/img/bbb2.png">
</div>
<div class="d3" @click="$navigate('MerchantProduct')">
<b>产品列表</b>
<p>查看我的产品</p>
<button>立即查看</button>
<img src="/img/bbb3.png">
</div>
</div>
</div> -->
<div class="fastTo">
<div class="ft1" @click="showBottom = true">
<span>收款码</span>
<img src="/img/ft_i1.png" alt="">
</div>
<div class="ft2" @click="$navigate('MerchantTrade')">
<span>订单记录</span>
<img src="/img/ft_i2.png" alt="">
</div>
<div class="ft3">
<span>商家资料</span>
<img src="/img/ft_i3.png" alt="">
</div>
</div>
<div class="countbox">
<div class="title">
<b>经营数据</b>
</div>
<div class="box line">
<span>截止{{ data.endTimes }}</span>
<p class="refresh" @click="init">刷新</p>
<p class="cou r" @click="$navigate('Statistics')">统计<van-icon name="arrow"></van-icon></p>
</div>
<div class="list">
<div class="item">
<span>
今日营业额
</span>
<b>{{ data.TodayAmount?.toFixed(2) }}</b>
<p>昨日<span>{{ data.YesterdayAmount?.toFixed(2) }}</span></p>
</div>
<div class="item">
<span>
今日应收
</span>
<b>{{ data.TodayDeduct?.toFixed(2) }}</b>
<p>昨日<span>{{ data.YesterdayDeduct?.toFixed(2) }}</span></p>
</div>
<div class="item">
<span>
今日订单数
</span>
<b>{{ data.TodayQty }}</b>
<p>昨日<span>{{ data.YesterdayQty }}</span></p>
</div>
<div class="item">
<span>
今日惠利金额
</span>
<b>{{ data.MonthIncome?.toFixed(2) }}</b>
<p>昨日<span>{{ data.PrevMonthIncome?.toFixed(2) }}</span></p>
</div>
</div>
</div>
</div>
<van-action-sheet v-model:show="showBottom" title="收款码" @click-overlay="onCloseBottom" @opened="onOpenBottom">
<div class="paycode-wrap">
<div class="paycode-original" ref="paycodeOriginal" v-show="!paycodeImg">
<img src="/img/paycode.jpg" alt="" style="width: 100%; display: block;">
<div class="info">
<img :src="$file(data.MerchantAvatar)" alt="" style="border-radius: 50%;">
</div>
<div class="name">
<span>{{ data.MerchantName }}</span>
</div>
<div class="code">
<vue-qr v-if="!loading" :margin="0" :text="link" backgroundColor="rgb(255,255,255)"
colorLight="rgb(255,255,255)"></vue-qr>
</div>
</div>
<div class="paycode-result" v-if="paycodeImg">
<img :src="paycodeImg" style="width: 100%;" alt="收款码">
</div>
</div>
</van-action-sheet>
</BasePage>
</template>
<script>
import { htmlToDataURL } from '@/utils/html2image'
export default {
name: 'Merchant',
mounted() {
},
data() {
return {
showInfo: false,
showBottom: false,
paycodeImg: '',
isCapturing: false,
link: '',
data: {
id: 'merchant_001',
MerchantAvatar: '',
MerchantName: '泰古润直营店',
MerchantPhone: '13800138000',
Income: 12868.50,
Point: 5680.00,
TodayAmount: 5680.00,
YesterdayAmount: 4200.00,
TodayDeduct: 1280.00,
YesterdayDeduct: 980.00,
TodayQty: 45,
YesterdayQty: 38,
MonthIncome: 45600.00,
PrevMonthIncome: 38500.00,
endTimes: '2024-04-18 10:30'
},
States: 0,
expiring: 3,
loading: false,
}
},
methods: {
onOpenBottom() {
this.paycodeImg = ''
this.$nextTick(() => {
const el = this.$refs.paycodeOriginal
if (!el) return
const scale = 2
const rect = el.getBoundingClientRect()
const w = rect.width * scale
const h = rect.height * scale
const elRect = el.getBoundingClientRect()
const canvas = document.createElement('canvas')
canvas.width = w
canvas.height = h
const ctx = canvas.getContext('2d')
// 画背景
const bg = new Image()
bg.src = el.querySelector('img').src
bg.onload = () => {
ctx.drawImage(bg, 0, 0, w, h)
const infoEl = el.querySelector('.info')
const codeEl = el.querySelector('.code')
// 截取头像
const avatarEl = infoEl.querySelector('img')
htmlToDataURL(avatarEl, { scale: 2, useCORS: true, backgroundColor: 'transparent' }).then(avaCanvas => {
const avaImg = new Image()
avaImg.src = avaCanvas
avaImg.onload = () => {
const infoRect = infoEl.getBoundingClientRect()
const avaSize = infoRect.height * scale * 0.8
const avaX = (infoRect.left - elRect.left) * scale + avaSize * 0.1
const avaY = (infoRect.top - elRect.top) * scale + (infoRect.height * scale - avaSize) / 2
// 画头像(圆形)
ctx.save()
ctx.beginPath()
ctx.arc(avaX + avaSize / 2, avaY + avaSize / 2, avaSize / 2, 0, Math.PI * 2)
ctx.clip()
ctx.drawImage(avaImg, avaX, avaY, avaSize, avaSize)
ctx.restore()
// 画文字
ctx.font = `${avaSize * 0.6}px 'PingFang SC'`
ctx.fillStyle = '#333'
ctx.textBaseline = 'middle'
ctx.fillText(this.data.MerchantName, avaX + avaSize + avaSize * 0.3, avaY + avaSize / 2)
// 截取二维码
htmlToDataURL(codeEl, { scale: 2, useCORS: true, backgroundColor: '#ffffff' }).then(codeCanvas => {
const qrImg = new Image()
qrImg.src = codeCanvas
qrImg.onload = () => {
const codeRect = codeEl.getBoundingClientRect()
ctx.drawImage(
qrImg,
(codeRect.left - elRect.left) * scale,
(codeRect.top - elRect.top) * scale,
codeRect.width * scale,
codeRect.height * scale
)
this.paycodeImg = canvas.toDataURL('image/png')
}
})
}
})
}
})
},
onCloseBottom() {
this.showBottom = false
this.paycodeImg = ''
},
},
}
</script>
<style lang="less">
.paycode-original {
position: relative;
width: 100%;
font-family: 'PingFang SC';
>img {
width: 100%;
display: block;
}
.info {
display: flex;
align-items: center;
position: absolute;
left: 30.67vw;
top: 32.27vw;
img {
width: 6.4vw;
height: 6.4vw;
border-radius: 50%;
}
}
.name {
position: absolute;
left: 39.33vw;
top: 33.47vw;
span {
font-size: 4vw;
color: #333;
}
}
.code {
position: absolute;
top: 42.4vw;
left: 23.33vw;
canvas,
img {
width: 53.33vw;
height: 53.33vw;
}
}
}
</style>