<template> <su-popup :show="show" class="add-bank-wrap" @close="hideModal"> <view class="ss-modal-box bg-white ss-flex-col"> <view class="modal-header ss-flex-col ss-col-left"> <text v-if="props.modelValue.type === 'bank'" class="modal-title ss-m-b-20"> 绑定银行卡 </text> <text v-if="props.modelValue.type === 'wechat'" class="modal-title ss-m-b-20"> 绑定微信 </text> <text v-if="props.modelValue.type === 'alipay'" class="modal-title ss-m-b-20"> 绑定支付宝 </text> </view> <view class="modal-content ss-flex-1 ss-p-b-100"> <block v-if="props.modelValue.type === 'bank'"> <uni-forms ref="form" :model="state.bank.model" :rules="state.bank.rules" validateTrigger="bind" labelWidth="160" labelAlign="center" border :labelStyle="{ fontWeight: 'bold' }" > <uni-forms-item name="account_name" label="持卡人"> <uni-easyinput :inputBorder="false" placeholder="请输入持卡人" v-model="state.bank.model.account_name" /> </uni-forms-item> <uni-forms-item name="account_header" label="开户行"> <uni-easyinput :inputBorder="false" placeholder="请输入开户行" v-model="state.bank.model.account_header" /> </uni-forms-item> <uni-forms-item name="account_no" label="银行卡号"> <uni-easyinput type="number" :inputBorder="false" placeholder="请输入银行卡号" v-model="state.bank.model.account_no" /> </uni-forms-item> </uni-forms> </block> <block v-if="props.modelValue.type === 'wechat'"> <uni-forms ref="form" :model="state.wechat.model" :rules="state.wechat.rules" validateTrigger="bind" labelWidth="160" labelAlign="center" border :labelStyle="{ fontWeight: 'bold' }" > <uni-forms-item name="account_name" label="真实姓名"> <uni-easyinput :inputBorder="false" placeholder="请输入您的真实姓名" v-model="state.wechat.model.account_name" /> </uni-forms-item> </uni-forms> </block> <block v-if="props.modelValue.type === 'alipay'"> <uni-forms ref="form" :model="state.alipay.model" :rules="state.alipay.rules" validateTrigger="bind" labelWidth="160" labelAlign="center" border :labelStyle="{ fontWeight: 'bold' }" > <uni-forms-item name="account_name" label="真实姓名"> <uni-easyinput :inputBorder="false" placeholder="请输入您的真实姓名" v-model="state.alipay.model.account_name" /> </uni-forms-item> <uni-forms-item name="account_no" label="支付宝"> <uni-easyinput :inputBorder="false" placeholder="请输入支付宝 邮箱/手机号" v-model="state.alipay.model.account_no" /> </uni-forms-item> </uni-forms> </block> </view> <view class="modal-footer ss-flex ss-row-center ss-col-center"> <button class="ss-reset-button save-btn" @tap="onSave">保存</button> </view> </view> </su-popup> </template> <script setup> import { ref, reactive, unref, watchPostEffect, watch } from 'vue'; import sheep from '@/sheep'; import { realName, bankName, bankCode, alipayAccount } from '@/sheep/validate/form'; const form = ref(null); const props = defineProps({ modelValue: { type: Object, default() {}, }, show: { type: Boolean, default: false, }, }); watch( () => props.modelValue, (newValue, oldValue) => { setModelValue(newValue); }, ); function setModelValue(modelValue) { Object.keys(state[modelValue.type].model).forEach((key) => { state[modelValue.type].model[key] = modelValue[key]; }); } const emits = defineEmits(['update:modelValue', 'close']); // 数据 const state = reactive({ bank: { model: { account_name: '', account_header: '', account_no: '', }, rules: { account_name: realName, account_header: bankName, account_no: bankCode, }, }, alipay: { model: { account_name: '', account_no: '', }, rules: { account_name: realName, account_no: alipayAccount, }, }, wechat: { model: { account_name: '', }, rules: { account_name: realName, }, }, }); setModelValue(props.modelValue); const hideModal = () => { emits('close'); }; const onSave = async () => { const validate = await unref(form) .validate() .catch((error) => { 'error: ', error; }); if (!validate) return; let data = { type: props.modelValue.type, account_header: state[props.modelValue.type].model.account_header, account_name: state[props.modelValue.type].model.account_name, account_no: state[props.modelValue.type].model.account_no, }; let res = await sheep.$api.user.account.save(data); if (res.error === 0) { emits('update:modelValue', res.data); hideModal(); } }; </script> <style lang="scss" scoped> .ss-modal-box { border-radius: 30rpx 30rpx 0 0; max-height: 1000rpx; .modal-header { position: relative; padding: 60rpx 40rpx 40rpx; .modal-title { font-size: 32rpx; font-weight: bold; } .close-icon { position: absolute; top: 10rpx; right: 20rpx; font-size: 46rpx; opacity: 0.2; } } .modal-content { overflow-y: auto; } .modal-footer { height: 120rpx; .save-btn { width: 710rpx; height: 80rpx; border-radius: 40rpx; background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient)); color: $white; } } } </style>