feat(transferDialog): 转账弹窗样式调整优化

This commit is contained in:
woody 2025-05-06 11:01:11 +08:00
parent 551a363b57
commit 23a9b42d8b
1 changed files with 242 additions and 101 deletions

View File

@ -1,20 +1,26 @@
<template>
<el-dialog
:title="'转账'"
title="转账"
:visible.sync="dialogVisible"
width="30%"
width="40%"
center
:close-on-click-modal="false"
:before-close="handleBeforeClose"
@close="onClose"
>
<div class="diaBox2">
<el-form :model="zzform" :rules="zzrules" label-width="auto" ref="zzform">
<el-form-item :label="'转出账户'" prop="pkAccount">
<div class="transfer-dialog-content">
<el-form
:model="transferForm"
:rules="transferRules"
label-width="100px"
ref="transferFormRef"
>
<el-form-item label="转出账户" prop="pkAccount">
<el-select
@change="checkYue"
v-model="zzform.pkAccount"
:placeholder="'请选择'"
@change="fetchAccountBalance"
v-model="transferForm.pkAccount"
placeholder="请选择"
style="width: 100%"
>
<el-option
v-for="(item, index) in accountList"
@ -24,49 +30,58 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item :label="'当前余额'" prop="yue">
<el-input v-model="zzform.yue" disabled></el-input>
<el-form-item label="当前余额" prop="yue">
<el-input v-model="transferForm.yue" disabled></el-input>
</el-form-item>
<el-form-item :label="'转出编号'" prop="memberCode">
<el-input v-model="zzform.memberCode" disabled></el-input>
<el-form-item label="转出编号" prop="memberCode">
<el-input v-model="transferForm.memberCode" disabled></el-input>
</el-form-item>
<el-form-item :label="'转出姓名'" prop="memberName">
<el-input v-model="zzform.memberName" disabled></el-input>
<el-form-item label="转出姓名" prop="memberName">
<el-input v-model="transferForm.memberName" disabled></el-input>
</el-form-item>
<el-form-item :label="'接收编号'" prop="toMemberCode">
<el-form-item label="接收编号" prop="toMemberCode">
<el-input
v-model="zzform.toMemberCode"
@blur="checkName"
:placeholder="'请输入'"
v-model="transferForm.toMemberCode"
@blur="fetchRecipientName"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item :label="'接收姓名'" prop="toMemberName">
<el-input v-model="zzform.toMemberName" disabled></el-input>
<el-form-item label="接收姓名" prop="toMemberName">
<el-input v-model="transferForm.toMemberName" disabled></el-input>
</el-form-item>
<el-form-item :label="'转账金额'" prop="transferMoney">
<el-form-item label="转账金额" prop="transferMoney">
<el-input
v-model="zzform.transferMoney"
:placeholder="'请输入'"
v-model="transferForm.transferMoney"
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item :label="'二级密码'" prop="payPwd">
<el-form-item label="二级密码" prop="payPwd">
<el-input
v-model="zzform.payPwd"
v-model="transferForm.payPwd"
type="password"
:placeholder="'请输入'"
show-password
placeholder="请输入"
></el-input>
</el-form-item>
<el-form-item :label="'备注'" prop="remarks">
<el-input v-model="zzform.remarks" :placeholder="'请输入'"></el-input>
<el-form-item label="备注" prop="remarks">
<el-input
v-model="transferForm.remarks"
type="textarea"
:rows="2"
placeholder="请输入"
></el-input>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button class="saveBtn" @click="saveZz">{{ "确认" }}</el-button>
<div class="dialog-footer">
<el-button
@click="handleCancel"
style="width: 117px; font-size: 16px"
>{{ "取消" }}</el-button
type="primary"
class="confirm-button"
@click="submitTransfer"
>{{ "确认" }}</el-button
>
<el-button @click="handleCancel" class="cancel-button">{{
"取消"
}}</el-button>
</div>
</div>
</el-dialog>
@ -93,8 +108,15 @@ export default {
if (!value) {
return callback(new Error("请输入转账金额"));
}
if (!/^[0-9]+(.[0-9]{1,2})?$/.test(value)) {
callback(new Error("请输入有效的金额"));
//
if (!/^(0|[1-9]\d*)(\.\d{1,2})?$/.test(value) || parseFloat(value) <= 0) {
callback(new Error("请输入有效的正数金额"));
} else if (
this.transferForm.yue !== "" &&
this.transferForm.yue !== "获取失败" &&
parseFloat(value) > parseFloat(this.transferForm.yue)
) {
callback(new Error("转账金额不能超过当前余额"));
} else {
callback();
}
@ -104,12 +126,16 @@ export default {
return callback(new Error("请输入二级密码"));
}
// Add more complex password validation if needed
// Example: Minimum length
// if (value.length < 6) {
// return callback(new Error('6'));
// }
callback();
};
return {
dialogVisible: this.visible,
zzform: {
transferForm: {
pkAccount: "",
memberCode: "",
memberName: "",
@ -121,15 +147,18 @@ export default {
yue: "",
},
accountList: [],
zzrules: {
transferRules: {
pkAccount: [
{ required: true, message: "请选择转出账户", trigger: "change" },
],
toMemberCode: [
{ required: true, message: "请输入接收编号", trigger: "blur" },
//
// { pattern: /^\d+$/, message: '', trigger: 'blur' }
],
transferMoney: [
{ required: true, validator: validateAmount, trigger: "blur" },
{ required: true, message: "请输入转账金额", trigger: "blur" }, // validator
{ validator: validateAmount, trigger: "blur" },
],
payPwd: [
{ required: true, validator: validatePassword, trigger: "blur" },
@ -137,6 +166,14 @@ export default {
remarks: [
{ max: 200, message: "备注不能超过200个字符", trigger: "blur" },
],
toMemberName: [
//
// { required: true, message: '', trigger: 'change' } //
],
yue: [
//
// { required: true, message: '', trigger: 'change' }
],
},
};
},
@ -158,28 +195,53 @@ export default {
immediate: true, // Trigger the handler immediately when component mounts
deep: true, // Watch for nested changes in userInfo if necessary
},
//
"transferForm.pkAccount"(newVal, oldVal) {
if (newVal !== oldVal) {
this.transferForm.yue = "";
}
},
//
"transferForm.toMemberCode"(newVal, oldVal) {
if (newVal !== oldVal) {
this.transferForm.toMemberName = "";
}
},
},
methods: {
initializeForm() {
// Initialize form fields based on userInfo
if (this.userInfo) {
this.zzform.memberCode =
this.transferForm.memberCode =
this.userInfo.serviceCode || this.userInfo.memberCode;
if (this.zzform.memberCode) {
this.fetchMemberName(this.zzform.memberCode, "memberName");
if (this.transferForm.memberCode) {
this.fetchMemberName(this.transferForm.memberCode, "memberName");
}
}
},
fetchMemberName(memberCode, targetField) {
if (!memberCode) {
this.transferForm[targetField] = "";
return;
}
//
// this.loading[targetField] = true;
wal
.getTransferChineseName({ memberCode: memberCode })
.then((res) => {
if (res.code == 200) {
this.zzform[targetField] = res.memberName;
if (res.code == 200 && res.memberName) {
this.transferForm[targetField] = res.memberName;
} else {
this.zzform[targetField] = "";
this.transferForm[targetField] = "";
if (targetField === "toMemberName") {
this.$message.error(res.msg || "获取接收方姓名失败");
this.$message.error(
res.msg || "获取接收方姓名失败,请检查编号是否正确"
);
// 便 ()
// this.transferForm.toMemberCode = '';
} else {
//
console.warn("获取转出方姓名失败:", res.msg || "未知错误");
}
}
})
@ -190,13 +252,17 @@ export default {
}姓名失败:`,
err
);
this.zzform[targetField] = "";
this.transferForm[targetField] = "";
if (targetField === "toMemberName") {
this.$message.error(`获取接收方姓名失败`);
this.$message.error(`获取接收方姓名失败,请稍后重试`);
}
});
// .finally(() => {
// this.loading[targetField] = false;
// });
},
fetchTransferAccounts() {
// this.loading.accountList = true; //
wal
.getTransferAccount()
.then((res) => {
@ -207,38 +273,52 @@ export default {
this.$message.error("获取转账账户列表失败");
this.accountList = [];
});
// .finally(() => {
// this.loading.accountList = false;
// });
},
checkYue(val) {
this.zzform.yue = ""; // Reset balance first
if (!val) return;
fetchAccountBalance(pkAccountValue) {
this.transferForm.yue = ""; // Reset balance first
if (!pkAccountValue) return;
// this.loading.yue = true; //
wal
.getTransferMember({ pkAccount: val })
.getTransferMember({ pkAccount: pkAccountValue })
.then((res) => {
if (res.code === 200 && res.data !== null && res.data !== undefined) {
this.zzform.yue = res.data; // Assuming res.data holds the balance
this.transferForm.yue = res.data; // Assuming res.data holds the balance
//
this.$refs.transferFormRef.validateField("transferMoney");
} else {
this.zzform.yue = "获取失败";
this.transferForm.yue = "获取失败";
console.warn("获取余额响应异常:", res);
this.$message.error(res.msg || "获取账户余额失败");
}
})
.catch((err) => {
console.error("检查余额失败:", err);
this.zzform.yue = "获取失败";
this.transferForm.yue = "获取失败";
this.$message.error("获取账户余额失败,请稍后重试");
});
// .finally(() => {
// this.loading.yue = false;
// });
},
checkName() {
if (!this.zzform.toMemberCode) {
this.zzform.toMemberName = "";
fetchRecipientName() {
if (!this.transferForm.toMemberCode) {
this.transferForm.toMemberName = "";
return;
}
this.fetchMemberName(this.zzform.toMemberCode, "toMemberName");
//
this.transferForm.toMemberName = "";
this.fetchMemberName(this.transferForm.toMemberCode, "toMemberName");
},
saveZz() {
this.$refs.zzform.validate((valid) => {
submitTransfer() {
this.$refs.transferFormRef.validate((valid) => {
if (valid) {
// Add loading state if needed
// this.submitting = true;
wal
.addTransfer(this.zzform)
.addTransfer(this.transferForm)
.then((res) => {
if (res.code == 200) {
this.$message({
@ -253,37 +333,79 @@ export default {
})
.catch((err) => {
console.error("转账失败:", err);
this.$message.error("转账失败");
//
const errorMsg =
err.response?.data?.msg ||
err.message ||
"转账请求失败,请检查网络或联系管理员";
this.$message.error(errorMsg);
});
// .finally(() => {
// this.submitting = false;
// });
} else {
console.log("转账表单验证失败");
//
// const firstErrorField = Object.keys(this.transferRules).find(field => {
// const fieldInstance = this.$refs.transferFormRef.fields.find(f => f.prop === field);
// return fieldInstance && fieldInstance.validateState === 'error';
// });
// if (firstErrorField) {
// this.$refs.transferFormRef.fields.find(f => f.prop === firstErrorField).$el.scrollIntoView({ behavior: 'smooth' });
// }
this.$message.warning("请检查表单填写是否正确");
return false;
}
});
},
handleBeforeClose(done) {
// Optional: Add confirmation dialog before closing if needed
done();
// Optional: Add confirmation dialog before closing if form is dirty
// const isDirty = Object.keys(this.initialFormState).some(key => this.initialFormState[key] !== this.transferForm[key]);
// if (isDirty) {
// this.$confirm('?', '', {
// confirmButtonText: '',
// cancelButtonText: '',
// type: 'warning'
// }).then(() => {
// done();
// }).catch(() => {});
// } else {
// done();
// }
done(); // Keep simple for now
},
handleCancel() {
this.$emit("update:visible", false);
this.$emit("close");
this.resetForm();
// this.$emit("close"); // onClose
// resetForm onClose
},
onClose() {
this.$emit("update:visible", false);
this.$emit("close");
this.$emit("update:visible", false); //
this.$emit("close"); //
this.resetForm();
},
resetForm() {
if (this.$refs.zzform) {
this.$refs.zzform.resetFields();
//
if (this.$refs.transferFormRef) {
this.$refs.transferFormRef.clearValidate();
// resetFields input
// this.$refs.transferFormRef.resetFields(); // 使
}
// Manually reset fields not covered by resetFields if necessary
this.zzform.toMemberName = "";
this.zzform.yue = "";
// Re-initialize memberCode and memberName as they might be cleared by resetFields
this.initializeForm();
// Manually reset form data to initial state
this.transferForm = {
pkAccount: "",
memberCode:
this.userInfo?.serviceCode || this.userInfo?.memberCode || "",
memberName: this.transferForm.memberName,
toMemberCode: "",
transferMoney: "",
remarks: "",
payPwd: "",
toMemberName: "",
yue: "",
};
//
// this.initializeForm();
},
},
mounted() {
@ -293,48 +415,67 @@ export default {
this.initializeForm();
this.fetchTransferAccounts();
}
//
// this.initialFormState = { ...this.transferForm };
},
};
</script>
<style lang="scss" scoped>
::v-deep .diaBox2 {
padding: 0 70px;
.transfer-dialog-content {
padding: 20px 40px;
.el-form-item {
line-height: 60px; // Consider if this fixed height is always appropriate
margin-bottom: 22px; // Standard Element UI form item margin
margin-bottom: 18px;
}
.el-form-item__label {
font-size: 18px;
font-weight: 500;
line-height: normal; // Let label determine its own line height
padding-right: 12px; // Standard Element UI label padding
.el-input,
.el-select,
.el-textarea {
width: 100%;
}
.el-input__inner,
.el-textarea__inner {
width: 100%; // Use full width within the form item content
// height: 60px; // Avoid fixed height, let input size itself
padding: 0 15px; // Standard Element UI input padding
font-size: 16px;
line-height: normal; // Let input determine its own line height
}
.el-select {
width: 100%; // Use full width
}
.saveBtn {
width: 117px;
::v-deep .el-form-item__label {
font-size: 16px;
background-color: rgba(214, 24, 32, 1);
color: #ffffff;
border: none;
&:hover {
background-color: rgba(214, 24, 32, 0.9);
color: #606266;
line-height: 40px;
padding-right: 12px;
}
::v-deep .el-input__inner {
height: 40px;
line-height: 40px;
}
::v-deep .el-select .el-input__inner {
height: 40px;
line-height: 40px;
}
.el-input.is-disabled .el-input__inner {
background-color: #f5f7fa;
border-color: #e4e7ed;
color: #c0c4cc;
cursor: not-allowed;
}
}
// Adjust button spacing if needed
.el-button + .el-button {
.dialog-footer {
text-align: center;
padding-top: 10px;
.confirm-button {
width: 100px;
font-size: 16px;
}
.cancel-button {
width: 100px;
font-size: 16px;
margin-left: 15px;
}
}