mrr.sj.front/pages/user/qualifications.vue

336 lines
8.9 KiB
Vue
Raw Normal View History

2026-03-24 11:45:13 +08:00
<template>
<view class="container" :class="{isActive:isCode}">
<custom-navbar title="资质认证" :showBack="true" backgroundColor="#fff"></custom-navbar>
<view class="nocode" v-if="!isCode">
<view class="node-title"> 输入验证码查看证件信息 </view>
<view class="container-code">
<view class="code-input">
<input class="uni-input" v-model="value" maxlength="4" placeholder="请输入验证码"
placeholder-class="code-input-placeholder" />
</view>
<jp-verification-literalness ref="literalness" :contentWidth="115"
:contentHeight="35"></jp-verification-literalness>
</view>
<view class="node-btn" :class="{ active: value.length == 4 }" @click="submit">
查询
</view>
</view>
<view class="isCode" v-if="isCode">
<view class="isCode-title">资质认证</view>
<view class="isCode-card" v-if="syrdetail.health_card">
<view class="isCode-card-title">
<image class="isCode-card-title__img" src="/static/images/syr/card.png" mode="aspectFit" />
健康证
</view>
<view class="isCode-card-card">
<image class="isCode-card-card__img" :src="syrdetail.health_card" mode="widthFix" >
</image>
<wmWatermark text="美融融专用">
</wmWatermark>
</view>
</view>
<view class="isCode-card" v-if="syrdetail.qualifications[0]">
<view class="isCode-card-title">
<image class="isCode-card-title__img" src="/static/images/syr/card.png" mode="aspectFit" />
资质证书
</view>
<view class="isCode-card-card">
<image class="isCode-card-card__img" :src="syrdetail.qualifications[0]" mode="widthFix">
</image>
<wmWatermark text="美融融专用">
</wmWatermark>
</view>
</view>
<view class="isCode-card" v-if="syrdetail.uscc_photo">
<view class="isCode-card-title">
<image class="isCode-card-title__img" src="/static/images/syr/card.png" mode="aspectFit" />
营业执照
</view>
<view class="isCode-card-card">
<image class="isCode-card-card__img" :src="syrdetail.uscc_photo" mode="widthFix">
</image>
<wmWatermark text="美融融专用">
</wmWatermark>
</view>
</view>
<view class="isCode-card" v-if="syrdetail.shop_photo">
<view class="isCode-card-title">
<image class="isCode-card-title__img" src="/static/images/syr/card.png" mode="aspectFit" />
门头照片
</view>
<view class="isCode-card-card">
<image class="isCode-card-card__img" :src="syrdetail.shop_photo" mode="aspectFill">
</image>
</view>
</view>
</view>
<!-- 隐藏的canvas用于绘制水印 -->
<canvas
canvas-id="watermark-canvas"
style="width: 1px; height: 1px; position: absolute; left: -9999rpx; top: -9999rpx;"
></canvas>
</view>
</template>
<script>
import wmWatermark from "@/components/wm-watermark/wm-watermark.vue";
import request from "../../utils/request";
export default {
components: {
wmWatermark
},
data() {
return {
value: "",
syrdetail: {},
id: null,
isCode: false, //验证是否通过
};
},
props: {
tabsPopList: {
type: Array,
default: () => [],
},
},
onLoad(options) {
console.log(options);
this.id = options.id;
this.getShopDetail(options.id);
},
methods: {
// 在页面的 methods 中定义方法
previewWithWatermark(imgUrl) {
uni.downloadFile({
url: imgUrl,
success: (downloadRes) => {
if (downloadRes.statusCode === 200 && downloadRes.tempFilePath) {
// 确认临时路径存在
this.addWatermark(downloadRes.tempFilePath);
} else {
console.error('图片下载失败,状态码:', downloadRes.statusCode);
}
},
fail: (err) => {
console.error('下载失败', err);
}
});
},
// 添加水印并预览
addWatermark(originalImgPath) {
// 获取图片信息(宽高)
uni.getImageInfo({
src: originalImgPath,
success: (imgInfo) => {
const { width, height } = imgInfo; // 原图宽高
// 步骤2创建canvas大小与原图一致
const canvasId = 'watermark-canvas'; // canvas 标识需在页面中定义对应canvas
const ctx = uni.createCanvasContext(canvasId, this);
// 步骤3绘制原图到canvas
ctx.drawImage(originalImgPath, 0, 0, width, height);
// 步骤4绘制文字水印可自定义样式
const watermarkText = '我的水印'; // 水印文字
ctx.setFontSize(20); // 字体大小
ctx.setFillStyle('rgba(255, 255, 255, 0.5)'); // 文字颜色(半透明)
ctx.setTextAlign('center'); // 文字对齐方式
ctx.setTextBaseline('middle'); // 文字基线
// 旋转水印(可选,-30度倾斜
const rotateAngle = -30 * Math.PI / 180; // 角度转弧度
const gap = 100; // 水印间距
// 重复绘制水印(铺满图片)
for (let y = 0; y < height; y += gap) {
for (let x = 0; x < width; x += gap) {
ctx.save(); // 保存当前状态
ctx.translate(x, y); // 移动到指定位置
ctx.rotate(rotateAngle); // 旋转
ctx.fillText(watermarkText, 0, 0); // 绘制文字
ctx.restore(); // 恢复状态
}
}
// 绘制完成后导出图片
ctx.draw(false, () => {
// 步骤5将canvas转为临时图片路径
uni.canvasToTempFilePath({
canvasId: canvasId,
width: width,
height: height,
destWidth: width, // 输出图片宽度(与原图一致)
destHeight: height, // 输出图片高度(与原图一致)
success: (res) => {
const watermarkImgPath = res.tempFilePath; // 带水印的图片路径
// 步骤6预览带水印的图片
uni.previewImage({
urls: [watermarkImgPath], // 预览的图片数组
current: 0 // 初始显示第几张
});
},
fail: (err) => {
console.error('canvas转图片失败', err);
}
}, this);
});
},
fail: (err) => {
console.error('获取图片信息失败', err);
}
});
},
// 获取手艺人详情
getShopDetail(id) {
request
.post("/user/syrdetail", {
id,
})
.then((res) => {
this.syrdetail = res.data;
})
.catch((err) => {
console.log(err);
});
},
submit() {
if (this.value.length == 4) {
this.isCode = this.$refs.literalness.verification(this.value);
if(!this.isCode){
uni.showToast({
title: "验证码错误",
icon: 'none',
duration: 2000
});
}
console.log(this.isCode);
}
},
},
};
</script>
<style lang="less">
.container {
background-color: #fff;
min-height: 100vh;
.nocode {
padding: 0 48rpx;
.node-title {
font-weight: 500;
font-size: 32rpx;
color: #333333;
line-height: 45rpx;
text-align: center;
font-style: normal;
margin-top: 53rpx;
}
.container-code {
display: flex;
align-items: center;
padding-bottom: 14rpx;
border-bottom: 2rpx solid rgba(247, 249, 252, 1);
.code-input {
flex: 1;
.code-input-placeholder {
font-weight: 400;
font-size: 28rpx;
color: #c5c5c7;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
}
margin-top: 90rpx;
display: flex;
flex-wrap: nowrap;
}
.node-btn {
width: 644rpx;
height: 96rpx;
background: #f7f9fc;
border-radius: 48rpx;
font-weight: 500;
font-size: 28rpx;
color: #8e929f;
line-height: 40rpx;
text-align: left;
font-style: normal;
margin-top: 60rpx;
display: flex;
align-items: center;
justify-content: center;
}
.node-btn.active {
color: #fff;
background: #ff3344;
}
}
.isCode {
.isCode-title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
line-height: 45rpx;
text-align: left;
font-style: normal;
}
}
}
.isActive {
background-color: transparent;
padding: 25rpx 20rpx;
.isCode-card{
padding: 30rpx;
background: #fff;
border-radius: 20rpx;
margin-top: 20rpx;
.isCode-card-title{
font-weight: 400;
font-size: 30rpx;
color: #333333;
line-height: 42rpx;
text-align: left;
font-style: normal;
display: flex;
align-items: center;
&__img{
width: 36rpx;
height: 30rpx;
margin-right: 13rpx;
}
}
.isCode-card-card{
margin-top: 20rpx;
width: 650rpx;
// height: 300rpx;
border-radius: 20rpx;
position: relative;
&__img{
width: 650rpx;
// height: 300rpx;
border-radius: 20rpx;
}
}
}
}
</style>