fix(platform): 站点配置补齐选填字段级表单校验

邮箱、备案链接与长度约束在保存前挂到 Form.Item,避免后端错误拼成 toast。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
DaxPay Dev
2026-07-22 21:03:50 +08:00
parent 7c749d9b89
commit 42aedcd09a
11 changed files with 116 additions and 9 deletions

View File

@@ -79,6 +79,12 @@
"inputIcpPlusLink": "Enter telecom value-added license link",
"inputCopyright": "Enter copyright text",
"confirmSaveContent": "Are you sure to save website configuration?",
"emailInvalid": "Invalid email format",
"linkMustHttp": "Link must start with http:// or https://",
"systemNameMax": "System name cannot exceed 50 characters",
"companyNameMax": "Company name cannot exceed 100 characters",
"companyWechatMax": "WeChat ID cannot exceed 50 characters",
"copyrightMax": "Copyright text cannot exceed 200 characters",
"section": {
"basic": "Basic Info",
"logo": "Logo",

View File

@@ -84,7 +84,13 @@
"logo": "logo",
"filing": "Info Pengarsipan",
"copyright": "Hak cipta"
}
},
"emailInvalid": "Format email tidak valid",
"linkMustHttp": "Tautan harus diawali dengan http:// atau https://",
"systemNameMax": "Nama sistem tidak boleh lebih dari 50 karakter",
"companyNameMax": "Nama perusahaan tidak boleh lebih dari 100 karakter",
"companyWechatMax": "ID WeChat tidak boleh lebih dari 50 karakter",
"copyrightMax": "Teks hak cipta tidak boleh lebih dari 200 karakter"
},
"oss": {
"title": "Konfigurasi OSS",

View File

@@ -84,7 +84,13 @@
"logo": "ロゴ",
"filing": "ファイリング情報",
"copyright": "著作権"
}
},
"emailInvalid": "メール形式が正しくありません",
"linkMustHttp": "リンクは http:// または https:// で始まる必要があります",
"systemNameMax": "システム名は50文字以内にしてください",
"companyNameMax": "会社名は100文字以内にしてください",
"companyWechatMax": "WeChat ID は50文字以内にしてください",
"copyrightMax": "著作権情報は200文字以内にしてください"
},
"oss": {
"title": "OSS 構成",

View File

@@ -84,7 +84,13 @@
"logo": "심벌 마크",
"filing": "제출 정보",
"copyright": "저작권"
}
},
"emailInvalid": "이메일 형식이 올바르지 않습니다",
"linkMustHttp": "링크는 http:// 또는 https://로 시작해야 합니다",
"systemNameMax": "시스템 이름은 50자를 초과할 수 없습니다",
"companyNameMax": "회사명은 100자를 초과할 수 없습니다",
"companyWechatMax": "위챗 ID는 50자를 초과할 수 없습니다",
"copyrightMax": "저작권 정보는 200자를 초과할 수 없습니다"
},
"oss": {
"title": "OSS 구성",

View File

@@ -84,7 +84,13 @@
"logo": "Logo",
"filing": "Maklumat Pemfailan",
"copyright": "Hak Cipta"
}
},
"emailInvalid": "Format e-mel tidak sah",
"linkMustHttp": "Pautan mesti bermula dengan http:// atau https://",
"systemNameMax": "Nama sistem tidak boleh melebihi 50 aksara",
"companyNameMax": "Nama syarikat tidak boleh melebihi 100 aksara",
"companyWechatMax": "ID WeChat tidak boleh melebihi 50 aksara",
"copyrightMax": "Teks hak cipta tidak boleh melebihi 200 aksara"
},
"oss": {
"title": "Konfigurasi OSS",

View File

@@ -84,7 +84,13 @@
"logo": "โลโก้",
"filing": "ข้อมูลการยื่น",
"copyright": "ลิขสิทธิ์"
}
},
"emailInvalid": "รูปแบบอีเมลไม่ถูกต้อง",
"linkMustHttp": "ลิงก์ต้องขึ้นต้นด้วย http:// หรือ https://",
"systemNameMax": "ชื่อระบบต้องไม่เกิน 50 ตัวอักษร",
"companyNameMax": "ชื่อบริษัทต้องไม่เกิน 100 ตัวอักษร",
"companyWechatMax": "WeChat ID ต้องไม่เกิน 50 ตัวอักษร",
"copyrightMax": "ข้อความลิขสิทธิ์ต้องไม่เกิน 200 ตัวอักษร"
},
"oss": {
"title": "การกำหนดค่า OSS",

View File

@@ -84,7 +84,13 @@
"logo": "biểu tượng",
"filing": "Thông tin nộp hồ sơ",
"copyright": "Bản quyền"
}
},
"emailInvalid": "Định dạng email không hợp lệ",
"linkMustHttp": "Liên kết phải bắt đầu bằng http:// hoặc https://",
"systemNameMax": "Tên hệ thống không được vượt quá 50 ký tự",
"companyNameMax": "Tên công ty không được vượt quá 100 ký tự",
"companyWechatMax": "ID WeChat không được vượt quá 50 ký tự",
"copyrightMax": "Thông tin bản quyền không được vượt quá 200 ký tự"
},
"oss": {
"title": "Cấu hình OSS",

View File

@@ -79,6 +79,12 @@
"inputIcpPlusLink": "请输入电信增值业务许可链接地址",
"inputCopyright": "请输入版权信息",
"confirmSaveContent": "确定要保存站点配置吗?",
"emailInvalid": "邮箱格式不正确",
"linkMustHttp": "链接必须以 http:// 或 https:// 开头",
"systemNameMax": "系统名称长度不能超过50个字符",
"companyNameMax": "公司全称长度不能超过100个字符",
"companyWechatMax": "微信号长度不能超过50个字符",
"copyrightMax": "版权信息长度不能超过200个字符",
"section": {
"basic": "基础信息",
"logo": "Logo",

View File

@@ -84,7 +84,13 @@
"logo": "Logo",
"filing": "備案信息",
"copyright": "版權信息"
}
},
"emailInvalid": "郵箱格式不正確",
"linkMustHttp": "連結必須以 http:// 或 https:// 開頭",
"systemNameMax": "系統名稱長度不能超過50個字元",
"companyNameMax": "公司全稱長度不能超過100個字元",
"companyWechatMax": "微訊號長度不能超過50個字元",
"copyrightMax": "版權信息長度不能超過200個字元"
},
"oss": {
"title": "OSS配置",

View File

@@ -84,7 +84,13 @@
"logo": "Logo",
"filing": "備案資訊",
"copyright": "版權資訊"
}
},
"emailInvalid": "郵箱格式不正確",
"linkMustHttp": "連結必須以 http:// 或 https:// 開頭",
"systemNameMax": "系統名稱長度不能超過50個字元",
"companyNameMax": "公司全稱長度不能超過100個字元",
"companyWechatMax": "微訊號長度不能超過50個字元",
"copyrightMax": "版權資訊長度不能超過200個字元"
},
"oss": {
"title": "OSS配置",

View File

@@ -20,6 +20,48 @@
// 表单数据
const formState = ref<WebsiteConfig>({});
// 备案链接: 空可过, 有值须以 http:// 或 https:// 开头
const httpLinkRule = {
validator: (_: unknown, value: string) => {
if (!value) {
return Promise.resolve();
}
if (/^https?:\/\/.+$/.test(value)) {
return Promise.resolve();
}
// 链接必须以 http:// 或 https:// 开头
return Promise.reject($t('system.platform.website.linkMustHttp'));
},
trigger: 'blur',
};
// 选填校验: 空可过; 有值才校邮箱/链接/长度 (对齐后端 Bean Validation)
const formRules = {
// 系统名称最长 50
systemName: [{ max: 50, message: $t('system.platform.website.systemNameMax'), trigger: 'blur' }],
// 公司全称最长 100
companyName: [{ max: 100, message: $t('system.platform.website.companyNameMax'), trigger: 'blur' }],
// 公司邮箱: 空可过, 有值须合法邮箱
companyEmail: [
{
type: 'email',
// 空串转 undefined, 避免 antd type:email 把空值当非法
transform: (value: string) => (value ? value : undefined),
// 邮箱格式不正确
message: $t('system.platform.website.emailInvalid'),
trigger: 'blur',
},
],
// 微信号最长 50
companyWechat: [{ max: 50, message: $t('system.platform.website.companyWechatMax'), trigger: 'blur' }],
icpLink: [httpLinkRule],
mpsLink: [httpLinkRule],
pcacLink: [httpLinkRule],
icpPlusLink: [httpLinkRule],
// 版权信息最长 200
copyright: [{ max: 200, message: $t('system.platform.website.copyrightMax'), trigger: 'blur' }],
};
onMounted(() => {
loadConfig();
});
@@ -116,7 +158,7 @@
<div class="module-overview__desc">{{ $t('system.platform.website.description') }}</div>
</div>
<a-form ref="formRef" :model="formState" layout="vertical" class="module-form">
<a-form ref="formRef" :model="formState" :rules="formRules" layout="vertical" class="module-form">
<!-- 基础信息 -->
<div class="config-section">
<div class="config-section__title">{{ $t('system.platform.website.section.basic') }}</div>
@@ -432,6 +474,11 @@
margin-bottom: 0;
}
/* 校验失败时留出错误文案空间, 避免贴紧下一格 */
.module-form :deep(.ant-form-item-with-help) {
margin-bottom: 12px;
}
.config-section {
display: flex;
flex-direction: column;