alipay-emulator/pages/other/bank/gsyh.vue

1183 lines
26 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>
<view class="gsyh">
<view v-if="$isVip() && !selectedImage">
<watermark dark="light" source="uni_alipay_other_bank" />
<liu-drag-button :canDocking="false" @clickBtn="$goRechargePage('watermark', 'uni_alipay_other_bank')">
<c-lottie ref="cLottieRef" :src='$watermark()' width="94px" height='74px' :loop="true"></c-lottie>
</liu-drag-button>
</view>
<view class="group_45764" v-if="!selectedImage" :style="{'padding-top':$systemInfo.statusBarHeight+'px'}">
<view class="rectangle_23284">
<view class="flexcontainer">
<view class="group_8" @click="back">
<image class="frame" src="/static/image/other/bank/gsyh/back.png" />
</view>
<view class="group_7">
<text class="text_1">账户详情</text>
</view>
<view class="group_9">
<image class="group_13980" src="/static/image/other/bank/gsyh/kefu.png" />
<image class="group_13979" src="/static/image/other/bank/gsyh/more.png" />
</view>
</view>
</view>
</view>
<NavBar v-if="selectedImage" title="拼图" bgColor="#EFEFEF" noBack @back="closeImageEdit" isRightButton @right-click="confirmImage">
</NavBar>
<view v-if="!selectedImage" :style="{'height':$systemInfo.statusBarHeight*2+88+'rpx'}">
</view>
<view class="group_48164">
<view class="rectangle_23292">
<image class="group_48163" src="/static/image/other/bank/gsyh/mrzh.png" />
<view class="flexcontainer_1">
<view class="rectangle_23290">
<image class="f0763869907c4a2a56d1061936006358" src="/static/image/other/bank/gsyh/gsyh.png" />
</view>
<view class="flexcontainer_2">
<text class="text_2">{{data.form.cardType}}</text>
<view class="text_3">
{{maskCardNumber(data.form.cardNumber)}}
<view
style="color:#3E82BD;margin-left: 52rpx;text-align: center;font-size: 22rpx; width: 52rpx;height: 32rpx;background: #F3F6FB;border-radius: 2px 2px 2px 2px;"
@click="data.isShow=true">查看</view>
</view>
</view>
</view>
<text class="text_4">柜面注册</text>
</view>
</view>
<view class="group_48161" @click="openEditDialog">
<view class="rectangle_23285">
<text class="text_5">人民币余额</text>
<text class="text_6">{{data.form.balance}}</text>
</view>
</view>
<view v-if="!selectedImage" class="image-box" @touchstart="handleTouchStart" @touchend="handleTouchEnd">
<image class="group_48140_3x" :src="data.bannerImage || '/static/image/other/bank/gsyh/gnimg.png'"
mode="aspectFill" />
</view>
<view v-else class="scroll-image-box flex-1">
<scroll-view class="image-box h100" style="width: 100%;height: 182px;" scroll-y :show-scrollbar="false"
@scroll="onImageScroll">
<image class="crop-image-target" style="width:100%;" :src="selectedImage" mode="widthFix"></image>
</scroll-view>
<view class="dashed-line-box">
<view class="dashed-line-text">我是分割线</view>
</view>
</view>
<canvas canvas-id="crop-canvas"
style="position: fixed; left: -9999px; width: 750rpx; height: 100vh; pointer-events: none;"></canvas>
<!-- 蒙层 -->
<view v-if="showMask" class="mask" @click="closeMask">
<image class="mask-icon" src="/static/image/common/mask-icon.png" mode="widthFix"></image>
</view>
<!-- 卡号信息弹窗 -->
<view class="dask" v-if="data.isShow">
<view class="info">
<view class="title">完整卡号</view>
<view class="dec">{{addSpaceEveryFourChars(data.form.cardNumber)}}</view>
<view class="btnbox">
<view class="btn" @click="data.isShow=false">取消</view>
<view class="btn btns" @click="data.isShow=false">复制卡号</view>
</view>
</view>
</view>
<view class="group_48166">
<view class="flexcontainer_3">
<text class="text_7">限额</text>
<image class="group_48165" src="/static/image/other/bank/gsyh/titleIcon.png" />
</view>
<view class="panel_limits" @click="openEditDialog">
<view class="flexcontainer_4">
<view class="flexcontainer_5">
<text class="text_8">当日剩余额度(元)</text>
<text class="text_9">日累积{{data.form.dayLimit}}</text>
</view>
<text class="text_10">{{data.form.dayRemain}}</text>
<view class="line"></view>
</view>
<view class="flexcontainer_6">
<view class="flexcontainer_7">
<text class="text_11">当月剩余额度(元)</text>
<text class="text_12">日累积{{data.form.monthLimit}}</text>
</view>
<text class="text_13">{{data.form.monthRemain}}</text>
<view class="line"></view>
</view>
<view class="flexcontainer_8">
<view class="flexcontainer_9">
<text class="text_14">当年剩余额度(元)</text>
<text class="text_15">日累积{{data.form.yearLimit}}</text>
</view>
<text class="text_16">{{data.form.yearRemain}}</text>
</view>
</view>
</view>
<view class="panel_limits_1">
<view class="group_13988" @click="openEditDialog">
<view class="rectangle_23294">
<text class="text_17">基本账户</text>
<view class="rightInfo">
<text class="text_18">{{maskCardNumber(data.form.baseAccount)}}</text>
<image class="group_13987" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
</view>
</view>
<view class="group_13989" @click="openEditDialog">
<view class="rectangle_23294_1">
<text class="text_19">启用日期</text>
<text class="text_20">{{data.form.startDate}}</text>
</view>
</view>
<view class="group_13990" @click="openEditDialog">
<view class="rectangle_23294_2">
<view class="rightInfo">
<text class="text_21">到期日期</text>
<image class="group_48165_1" src="/static/image/other/bank/gsyh/titleIcon.png" />
</view>
<text class="text_22">{{data.form.endDate}}</text>
</view>
</view>
<view class="group_13991" @click="openEditDialog">
<view class="rectangle_23294_3">
<text class="text_23">设置别名</text>
<view class="rightInfo">
<text class="text_24">{{data.form.alias||'此卡别名'}}</text>
<image class="group_13987_1" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
</view>
</view>
<view class="group_13992">
<view class="rectangle_23294_4">
<text class="text_25">账户互转</text>
<image class="group_13987_2" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
</view>
<view class="group_13993">
<view class="rectangle_23294_5">
<text class="text_26">当面收款</text>
<image class="group_13987_3" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
</view>
<view class="group_13994">
<view class="rectangle_23294_6">
<text class="text_27">绑手机号</text>
<image class="group_13987_4" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
</view>
</view>
<view class="group_13994_1">
<text class="text_28">其他</text>
<image class="group_13987_5" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
<view class="group_13995">
<text class="text_29">删除账户</text>
<image class="group_13987_6" src="/static/image/other/bank/gsyh/rightIcon.png" />
</view>
<image class="dee351fc65540488ca79ac78c10072f2" src="/static/image/other/bank/gsyh/bottomImg.png" />
<view class="footer"></view>
<!-- 编辑弹窗 -->
<view v-if="editDialog.show" class="editDialog">
<view class="editDialog_bg">
<view class="editDialog_header">
<text class="title">编辑账户信息</text>
</view>
<view class="editDialog_body">
<view class="formItem">
<text>余额</text>
<input
:value="editDialog.data.balance"
@input="(e) => onNumberInputRaw('balance', e.detail.value)"
type="digit"
placeholder="请输入余额"
/>
</view>
<view class="formItem">
<text>卡类型</text>
<input v-model="editDialog.data.cardType" placeholder="如: 重庆 借记卡(I 类)" />
</view>
<view class="formItem">
<text>卡号</text>
<input v-model="editDialog.data.cardNumber" placeholder="请输入完整卡号" />
</view>
<view class="formItem">
<text>当日额度上限</text>
<input
:value="editDialog.data.dayLimit"
@input="(e) => onNumberInputRaw('dayLimit', e.detail.value)"
type="digit"
placeholder="如: 50000"
/>
</view>
<view class="formItem">
<text>当日剩余额度</text>
<input
:value="editDialog.data.dayRemain"
@input="(e) => onNumberInputRaw('dayRemain', e.detail.value)"
type="digit"
placeholder="如: 50000"
/>
</view>
<view class="formItem">
<text>当月额度上限</text>
<input
:value="editDialog.data.monthLimit"
@input="(e) => onNumberInputRaw('monthLimit', e.detail.value)"
type="digit"
placeholder="如: 500000"
/>
</view>
<view class="formItem">
<text>当月剩余额度</text>
<input
:value="editDialog.data.monthRemain"
@input="(e) => onNumberInputRaw('monthRemain', e.detail.value)"
type="digit"
placeholder="如: 500000"
/>
</view>
<view class="formItem">
<text>当年额度上限</text>
<input
:value="editDialog.data.yearLimit"
@input="(e) => onNumberInputRaw('yearLimit', e.detail.value)"
type="digit"
placeholder="如: 2500000"
/>
</view>
<view class="formItem">
<text>当年剩余额度</text>
<input
:value="editDialog.data.yearRemain"
@input="(e) => onNumberInputRaw('yearRemain', e.detail.value)"
type="digit"
placeholder="如: 2500000"
/>
</view>
<view class="formItem">
<text>基本账户</text>
<input v-model="editDialog.data.baseAccount" placeholder="请输入基本账户卡号" />
</view>
<view class="formItem">
<text>启用日期</text>
<input v-model="editDialog.data.startDate" placeholder="如: 2019年10月01日" />
</view>
<view class="formItem">
<text>到期日期</text>
<input v-model="editDialog.data.endDate" placeholder="如: 2029年8月" />
</view>
<view class="formItem">
<text>别名</text>
<input v-model="editDialog.data.alias" placeholder="请输入别名" />
</view>
</view>
<view class="popup-footer">
<view class="btn-cancel" @click="editDialog.show=false">取消</view>
<view class="btn-save" @click="saveEdit">保存</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { reactive, onMounted, ref, getCurrentInstance } from 'vue';
import NavBar from '@/components/nav-bar/nav-bar'
const instance = getCurrentInstance();
const CACHE_KEY = 'gsyh_account_info';
const BANNER_IMAGE_KEY = 'gsyh_banner_image';
const FONT_KEY = 'gsyh_font_path'; // 修复统一字体缓存key
const data = reactive({
form: {
balance: '55.22',
cardType: '重庆 借记卡(I 类)',
cardNumber: '622293049304',
dayLimit: '50,000.00',
dayRemain: '50,000.00',
monthLimit: '500,000.00',
monthRemain: '500,000.00',
yearLimit: '2,500,000.00',
yearRemain: '2,500,000.00',
baseAccount: '31006438',
startDate: '2019年10月01日',
endDate: '2029年8月',
alias: '',
},
bannerImage: '',
showMask: false,
isShow: false
});
const selectedImage = ref('');
const scrollTop = ref(0);
let longPressTimer = null;
const editDialog = reactive({
show: false,
data: {}
});
onMounted(() => {
loadCache();
const savedBanner = uni.getStorageSync(BANNER_IMAGE_KEY);
if (savedBanner) {
data.bannerImage = savedBanner;
}
const config = uni.getStorageSync('config');
const font = config.config['client.uniapp.font'];
const fontUrl = font.bank;
const fontName = 'zsyhFt';
const loadFont = (path) => {
uni.loadFontFace({
family: fontName,
source: `url("${path}")`,
success() {
console.log('字体加载成功');
},
fail(err) {
console.error('字体加载失败', err);
}
});
};
// #ifdef H5
loadFont(fontUrl);
// #endif
// #ifndef H5
// 修复:读取和保存都用同一个 FONT_KEY
const savedFontPath = uni.getStorageSync(FONT_KEY);
if (savedFontPath) {
loadFont(savedFontPath);
} else {
uni.downloadFile({
url: fontUrl,
success: (res) => {
if (res.statusCode === 200) {
uni.saveFile({
tempFilePath: res.tempFilePath,
success: (saveRes) => {
uni.setStorageSync(FONT_KEY, saveRes.savedFilePath); // 修复用统一key保存
loadFont(saveRes.savedFilePath);
},
fail: () => {
loadFont(res.tempFilePath);
}
});
}
},
fail: (err) => {
console.error('下载字体失败', err);
}
});
}
// #endif
});
function back() {
uni.navigateBack();
}
function loadCache() {
const cache = uni.getStorageSync(CACHE_KEY);
if (cache) {
data.form = { ...data.form, ...cache };
}
}
function saveCache() {
uni.setStorageSync(CACHE_KEY, data.form);
}
// 需要格式化显示的数字字段
const NUMBER_FIELDS = ['balance', 'dayLimit', 'dayRemain', 'monthLimit', 'monthRemain', 'yearLimit', 'yearRemain'];
// 格式化值 → 纯数字字符串(用于输入框)
function toRawNumber(val) {
if (!val && val !== 0) return '';
return String(val).replace(/[^\d.]/g, '');
}
function openEditDialog() {
const raw = JSON.parse(JSON.stringify(data.form));
// 打开弹窗时把格式化值还原成纯数字,方便用户直接输入
NUMBER_FIELDS.forEach(field => {
raw[field] = toRawNumber(raw[field]);
});
editDialog.data = raw;
editDialog.show = true;
}
function saveEdit() {
const saved = { ...editDialog.data };
// 保存时格式化数字字段,用于页面显示
NUMBER_FIELDS.forEach(field => {
saved[field] = formatNumber(saved[field]);
});
data.form = { ...data.form, ...saved };
saveCache();
editDialog.show = false;
uni.showToast({
title: '保存成功',
icon: 'success'
});
}
function maskCardNumber(cardNumber) {
if (!cardNumber || cardNumber.length < 8) return cardNumber;
const first4 = cardNumber.substring(0, 4);
const last4 = cardNumber.substring(cardNumber.length - 4);
return first4 + '****' + last4;
}
function addSpaceEveryFourChars(str) {
return str.replace(/(.{4})/g, '$1 ').trim();
}
// 长按事件处理
const handleTouchStart = (e) => {
const systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === 'ios' && systemInfo.safeAreaInsets?.bottom) {
const clientY = e.touches[0].clientY;
const windowHeight = systemInfo.windowHeight;
if (clientY > windowHeight - systemInfo.safeAreaInsets.bottom) {
return;
}
}
longPressTimer = setTimeout(() => {
uni.vibrateShort();
chooseImage();
}, 1200);
};
const handleTouchEnd = () => {
if (longPressTimer) {
clearTimeout(longPressTimer);
longPressTimer = null;
}
};
const chooseImage = () => {
uni.chooseImage({
count: 1,
sourceType: ['album'],
success: (res) => {
selectedImage.value = res.tempFilePaths[0];
data.showMask = true;
}
});
};
const closeMask = () => {
data.showMask = false;
};
const onImageScroll = (e) => {
scrollTop.value = e.detail.scrollTop;
};
const confirmImage = () => {
uni.showLoading({ title: '处理中...' });
const query = uni.createSelectorQuery().in(instance);
query.select('.image-box').boundingClientRect();
query.select('.crop-image-target').boundingClientRect();
query.exec(res => {
if (!res[0] || !res[1]) {
uni.hideLoading();
return;
}
const container = res[0];
const image = res[1];
uni.getImageInfo({
src: selectedImage.value,
success: (imgInfo) => {
const scale = imgInfo.width / image.width;
const sTop = scrollTop.value * scale;
const sHeight = container.height * scale;
const sWidth = imgInfo.width;
const canvasW = container.width;
const canvasH = container.height;
const ctx = uni.createCanvasContext('crop-canvas', instance);
ctx.clearRect(0, 0, canvasW, canvasH);
ctx.drawImage(imgInfo.path, 0, sTop, sWidth, sHeight, 0, 0, canvasW, canvasH);
ctx.draw(false, () => {
uni.canvasToTempFilePath({
canvasId: 'crop-canvas',
width: canvasW,
height: canvasH,
destWidth: sWidth,
destHeight: sHeight,
success: (res) => {
uni.saveFile({
tempFilePath: res.tempFilePath,
success: (saveRes) => {
data.bannerImage = saveRes.savedFilePath;
selectedImage.value = '';
uni.setStorageSync(BANNER_IMAGE_KEY, data.bannerImage);
uni.hideLoading();
},
fail: () => {
uni.hideLoading();
uni.showToast({ title: '保存失败', icon: 'none' });
}
});
},
fail: () => {
uni.hideLoading();
uni.showToast({ title: '裁剪失败', icon: 'none' });
}
}, instance);
});
},
fail: () => {
uni.hideLoading();
uni.showToast({ title: '图片加载失败', icon: 'none' });
}
});
});
};
const closeImageEdit = () => {
selectedImage.value = '';
};
// 格式化数字,保留两位小数并添加千分位逗号
function formatNumber(num) {
if (!num && num !== 0) return '';
let cleanNum = String(num).replace(/[^\d.]/g, '');
const parts = cleanNum.split('.');
if (parts.length > 2) {
cleanNum = parts[0] + '.' + parts.slice(1).join('');
}
let number = parseFloat(cleanNum);
if (isNaN(number)) return '';
number = Math.round(number * 100) / 100;
return number.toLocaleString('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
}
// 输入时只更新原始值,不做任何格式化
function onNumberInputRaw(field, value) {
editDialog.data[field] = value;
}
</script>
<style lang="scss">
page {
background: #F8F8F8;
}
* {
box-sizing: border-box;
}
.gsyh {
position: relative;
width: 750rpx;
overflow: hidden;
background-color: #f8f8f8;
display: flex;
flex-direction: column;
align-items: flex-start;
isolation: isolate;
}
/* ===== header ===== */
.group_45764 {
width: 750rpx;
position: fixed;
z-index: 999;
left: 0;
top: 0;
background-color: #ffffff;
}
.rectangle_23284 {
width: 750rpx;
height: 88rpx;
background-color: #ffffff;
}
.flexcontainer {
display: flex;
width: 750rpx;
height: 88rpx;
flex-direction: row;
align-items: center;
}
.group_8 {
width: 240rpx;
height: 96rpx;
display: flex;
align-items: center;
}
.frame {
width: 48rpx;
height: 48rpx;
margin-left: 22rpx;
}
.group_7 {
width: 240rpx;
height: 88rpx;
display: flex;
align-items: center;
text-align: center;
justify-content: center;
}
.text_1 {
font-size: 36rpx;
color: #617280;
text-align: center;
}
.group_9 {
width: 240rpx;
height: 88rpx;
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
}
.group_13980,
.group_13979 {
width: 48rpx;
height: 48rpx;
margin-left: 28rpx;
}
/* ===== card ===== */
.group_48164 {
width: 692rpx;
height: 232rpx;
margin-top: 28rpx;
margin-left: 30rpx;
}
.rectangle_23292 {
width: 692rpx;
height: 232rpx;
border-radius: 20rpx;
background-color: #ffffff;
box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.1);
padding: 40rpx 40rpx 20rpx 40rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
}
.group_48163 {
width: 152rpx;
height: 38rpx;
position: absolute;
right: 0;
top: 0;
}
.flexcontainer_1 {
display: flex;
flex-direction: row;
margin-top: 10rpx;
}
.flexcontainer_2 {
display: flex;
flex-direction: column;
margin-left: 22rpx;
width: calc(100% - 130rpx);
}
.text_2 {
font-size: 28rpx;
color: #333333;
}
.text_3 {
font-size: 26rpx;
color: #333333;
display: flex;
flex-direction: row;
}
.rectangle_23290 {
width: 108rpx;
height: 78rpx;
}
.f0763869907c4a2a56d1061936006358 {
width: 108rpx;
height: 78rpx;
}
.text_4 {
font-size: 22rpx;
color: #767676;
margin-top: 10rpx;
}
/* ===== balance ===== */
.group_48161 {
position: relative;
width: 750rpx;
height: 88rpx;
margin-top: 28rpx;
margin-bottom: 14rpx;
}
.rectangle_23285 {
width: 750rpx;
height: 88rpx;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: space-between;
}
.text_5 {
top: 38rpx;
margin-left: 60rpx;
font-size: 28rpx;
color: #1a1a1a;
}
.text_6 {
top: 40rpx;
margin-right: 28rpx;
font-size: 34rpx;
font-weight: bold;
}
/* ===== banner ===== */
.group_48140_3x {
width: 750rpx;
height: 364rpx;
overflow: hidden;
}
/* ===== limit ===== */
.group_48166 {
width: 750rpx;
position: relative;
}
.flexcontainer_3 {
display: flex;
flex-direction: row;
align-items: center;
margin: 26rpx 28rpx;
}
.text_7 {
font-size: 28rpx;
}
.group_48165 {
width: 28rpx;
height: 28rpx;
margin-left: 10rpx;
}
.panel_limits {
width: 750rpx;
height: 424rpx;
background-color: #ffffff;
}
.flexcontainer_4,
.flexcontainer_6,
.flexcontainer_8 {
height: 140rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
margin: 0 26rpx 0 26rpx;
position: relative;
.line {
width: calc(100%);
position: absolute;
height: 1rpx;
border-bottom: 1rpx solid #EDEDED;
bottom: 0;
left: 0;
}
}
.flexcontainer_5,
.flexcontainer_7,
.flexcontainer_9 {
display: flex;
flex-direction: column;
justify-content: center;
}
.text_8,
.text_11,
.text_14 {
font-size: 28rpx;
color: #333;
}
.text_9,
.text_12,
.text_15 {
font-size: 24rpx;
color: #aaa;
margin-top: 8rpx;
}
.text_10,
.text_13,
.text_16 {
font-size: 30rpx;
font-weight: bold;
}
/* ===== list ===== */
.panel_limits_1 {
width: 750rpx;
background-color: #ffffff;
margin-top: 12rpx;
}
.rectangle_23294,
.rectangle_23294_1,
.rectangle_23294_2,
.rectangle_23294_3,
.rectangle_23294_4,
.rectangle_23294_5,
.rectangle_23294_6 {
width: 750rpx;
height: 108rpx;
display: flex;
flex-direction: row;
align-items: center;
border-bottom: 1rpx solid #eee;
justify-content: space-between;
.rightInfo {
display: flex;
align-items: center;
}
}
.text_20,
.text_22 {
margin-right: 28rpx;
}
.text_18,
.text_24 {
margin-right: 28rpx;
}
.text_24 {
color: #AAAAAA;
}
.text_17,
.text_19,
.text_21,
.text_23,
.text_25,
.text_26,
.text_27 {
font-size: 28rpx;
margin-left: 28rpx;
}
.group_13987,
.group_48165_1,
.group_13987_1,
.group_13987_2,
.group_13987_3,
.group_13987_4 {
width: 28rpx;
height: 28rpx;
margin-left: auto;
margin-right: 28rpx;
}
/* ===== others ===== */
.group_13994_1,
.group_13995 {
width: 750rpx;
height: 108rpx;
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 12rpx;
}
.text_28,
.text_29 {
font-size: 28rpx;
margin-left: 28rpx;
}
.group_13987_5,
.group_13987_6 {
width: 28rpx;
height: 28rpx;
margin-right: 28rpx;
}
.dee351fc65540488ca79ac78c10072f2 {
width: 750rpx;
height: 200rpx;
margin-top: 12rpx;
}
.footer {
width: 100%;
background-color: #ffffff;
height: 60rpx;
}
/* 图片编辑样式 */
.image-box {
width: 750rpx;
height: 364rpx;
position: relative;
overflow: hidden;
}
.scroll-image-box {
width: 100%;
min-height: 0;
position: relative;
}
.crop-image-target {
width: 100%;
}
.dashed-line-box {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
border: 4rpx dashed red;
pointer-events: none;
.dashed-line-text {
height: 44rpx;
line-height: 44rpx;
width: 180rpx;
padding: 0 20rpx;
border-radius: 8rpx;
color: #1777FF;
font-size: 24rpx;
font-weight: 500;
background-color: #fff;
position: absolute;
top: 0;
left: 50%;
transform: translate(-50%, -50%);
}
}
.mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.8);
z-index: 999;
.mask-icon {
position: absolute;
top: 50%;
right: 52rpx;
transform: translateY(-25%);
width: 360rpx;
height: 360rpx;
}
}
.dask {
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
position: fixed;
left: 0;
top: 0;
z-index: 99999 !important;
display: flex;
align-items: center;
justify-content: center;
.info {
width: calc(100vw - 30px);
background: #FFFFFF;
border-radius: 4px 4px 4px 4px;
display: flex;
flex-direction: column;
.title {
font-weight: 400;
font-size: 16px;
color: #1A1A1A;
margin-left: 20px;
margin-top: 7px;
margin-bottom: 6px;
text-align: center;
}
.dec {
font-weight: 400;
font-size: 17px;
color: #1A1A1A;
margin-left: 20px;
margin-top: 7px;
text-align: center;
}
.btnbox {
margin-top: 26px;
display: flex;
align-items: center;
justify-content: center;
border-top: 1rpx solid #F2F2F2;
.btn {
width: calc(50% - 1rpx);
height: 54px;
line-height: 54px;
font-weight: 400;
font-size: 15px;
color: #5A5A5A;
text-align: center;
}
.btns {
color: #DA1C01;
}
}
}
}
/* 编辑弹窗样式 */
.editDialog {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.editDialog_bg {
width: 680rpx;
max-height: 80vh;
background-color: #ffffff;
border-radius: 20rpx;
overflow: hidden;
display: flex;
flex-direction: column;
}
.editDialog_header {
padding: 30rpx;
border-bottom: 1rpx solid #eee;
text-align: center;
.title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
}
.editDialog_body {
padding: 20rpx 30rpx;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
max-height: 60vh;
flex: 1;
}
.formItem {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 1rpx solid #f5f5f5;
text {
width: 200rpx;
font-size: 28rpx;
color: #666;
flex-shrink: 0;
}
input {
flex: 1;
font-size: 28rpx;
color: #333;
text-align: right;
}
}
.popup-footer {
display: flex;
padding: 20rpx 30rpx;
border-top: 1rpx solid #eee;
gap: 20rpx;
.btn-cancel,
.btn-save {
flex: 1;
height: 80rpx;
line-height: 80rpx;
text-align: center;
border-radius: 10rpx;
font-size: 28rpx;
}
.btn-cancel {
background-color: #f5f5f5;
color: #666;
}
.btn-save {
background-color: #187AFF;
color: #fff;
}
}
.text_6,
.text_10,
.text_13,
.text_16 {
font-family: "zsyhFt";
}
</style>