mirror of
https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
synced 2026-08-06 19:07:23 +08:00
- 将多个组件转换为 `<script setup>` 语法,提升可读性和性能 - 优化状态管理和事件处理逻辑,简化代码结构 - 更新样式和布局以适应新组件结构 - 添加新功能和修复已知问题,提升用户体验
201 lines
4.2 KiB
Vue
201 lines
4.2 KiB
Vue
<template>
|
|
|
|
<div class="index">
|
|
<u-modal v-model:show="show" :show-title="false" :show-confirm-button="false" mask-close-able>
|
|
<view class="slot-content">
|
|
<image @click="downLoad()" class="img" :src="imgUrl" />
|
|
<div class="canvas-hide">
|
|
<!-- #ifdef MP-WEIXIN -->
|
|
<canvas id="canvas" type="2d" style="width: 600px; height: 960px" />
|
|
<!-- #endif -->
|
|
<!-- #ifndef MP-WEIXIN -->
|
|
<canvas canvas-id="canvas" id="canvas" style="width: 600px; height: 960px" />
|
|
<!-- #endif -->
|
|
</div>
|
|
</view>
|
|
</u-modal>
|
|
|
|
</div>
|
|
</template>
|
|
<script setup lang="ts">
|
|
import { ref, onMounted, getCurrentInstance } from 'vue'
|
|
// 引入绘制插件
|
|
import DrawPoster from "@/js_sdk/u-draw-poster"
|
|
import logoImg from "@/pages/passport/static/logo-title.png"
|
|
|
|
const instance = getCurrentInstance()
|
|
|
|
const props = defineProps<{
|
|
res?: any
|
|
}>()
|
|
|
|
const imgUrl = ref("")
|
|
const show = ref(false)
|
|
const dp = ref<any>({})
|
|
const logo = logoImg
|
|
|
|
/**
|
|
* 解决微信小程序中图片模糊问题
|
|
*/
|
|
// #ifdef MP-WEIXIN
|
|
const st2 = (size: number) => size * 2
|
|
// #endif
|
|
|
|
// #ifndef MP-WEIXIN
|
|
const st2 = (size: number) => size
|
|
// #endif
|
|
|
|
/**
|
|
* 保存图片
|
|
*/
|
|
const downLoad = () => {
|
|
uni.saveImageToPhotosAlbum({
|
|
filePath: imgUrl.value,
|
|
success: function () {
|
|
uni.showToast({
|
|
title: "保存成功!",
|
|
icon: "none",
|
|
})
|
|
},
|
|
fail: function () {
|
|
uni.showToast({
|
|
title: "保存失败,请稍后重试!",
|
|
icon: "none",
|
|
})
|
|
},
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 创建canvas
|
|
*/
|
|
const init = async () => {
|
|
show.value = true
|
|
dp.value = await DrawPoster.build({
|
|
selector: "canvas",
|
|
componentThis: instance?.proxy,
|
|
loading: true,
|
|
debugging: true,
|
|
})
|
|
let dpVal = dp.value
|
|
// #ifdef MP-WEIXIN
|
|
// 用于微信小程序中画布错乱问题
|
|
dpVal.canvas.width = st2(600)
|
|
dpVal.canvas.height = st2(960)
|
|
// #endif
|
|
await draw(dpVal)
|
|
}
|
|
|
|
const draw = async (dp: any) => {
|
|
const { width, height, background, title } = props.res.container
|
|
const { code, img, price } = props.res.bottom
|
|
|
|
// /** 绘制背景 */
|
|
await dp.draw((ctx: any) => {
|
|
ctx.fillStyle = background
|
|
ctx.fillRoundRect(
|
|
st2(0),
|
|
st2(0),
|
|
st2(width),
|
|
st2(height),
|
|
st2(12)
|
|
)
|
|
ctx.clip()
|
|
})
|
|
/** 绘制图片 */
|
|
dp.draw(async (ctx: any) => {
|
|
await Promise.all([
|
|
// 绘制Logo
|
|
ctx.drawImage(
|
|
logo,
|
|
st2(175),
|
|
st2(0),
|
|
st2(256),
|
|
st2(144)
|
|
),
|
|
// 中间图片
|
|
ctx.drawImage(
|
|
img,
|
|
st2(100),
|
|
st2(150),
|
|
st2(400),
|
|
st2(400)
|
|
),
|
|
// 二维码
|
|
ctx.drawImage(
|
|
code,
|
|
st2(39),
|
|
st2(750),
|
|
st2(150),
|
|
st2(150)
|
|
),
|
|
])
|
|
})
|
|
|
|
/** 绘制中间文字*/
|
|
await dp.draw((ctx: any) => {
|
|
ctx.fillStyle = "#333"
|
|
ctx.font = `bold ${st2(24)}px PingFang SC`
|
|
ctx.textAlign = "center"
|
|
ctx.fillWarpText({
|
|
text: title,
|
|
maxWidth: st2(500),
|
|
x: st2(300),
|
|
y: st2(600),
|
|
layer: 1,
|
|
})
|
|
|
|
ctx.fillStyle = "#ff3c2a"
|
|
ctx.font = `${st2(38)}px PingFang SC`
|
|
ctx.textAlign = "center"
|
|
ctx.fillText(price, st2(300), st2(680))
|
|
})
|
|
|
|
// /** 绘制底部文字 */
|
|
await dp.draw((ctx: any) => {
|
|
ctx.fillStyle = "#666"
|
|
ctx.font = `${st2(24)}px PingFang SC`
|
|
ctx.fillText("长按图片,识别二维码", st2(200), st2(866))
|
|
ctx.fillStyle = "#666"
|
|
ctx.font = `${st2(24)}px PingFang SC`
|
|
ctx.fillText("查看商品详情", st2(200), st2(900))
|
|
})
|
|
|
|
imgUrl.value = await dp.createImagePath()
|
|
}
|
|
|
|
onMounted(() => {
|
|
init()
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
page,
|
|
.index {
|
|
height: 100%;
|
|
}
|
|
.canvas-hide {
|
|
/* 1 */
|
|
position: fixed;
|
|
right: 100vw;
|
|
bottom: 100vh;
|
|
/* 2 */
|
|
z-index: -9999;
|
|
/* 3 */
|
|
opacity: 0;
|
|
}
|
|
.index {
|
|
position: relative;
|
|
text-align: center;
|
|
background: rgba($color: grey, $alpha: 0.2);
|
|
}
|
|
|
|
image {
|
|
display: block;
|
|
}
|
|
.img {
|
|
width: 600rpx;
|
|
height: 960rpx;
|
|
}
|
|
</style>
|