fix: 输入校验统一字符串防御(数字输入不再引发 trim 类型崩溃)

This commit is contained in:
root
2026-10-16 15:06:21 +08:00
parent dba22765a6
commit aaf8ea602c
8 changed files with 43 additions and 39 deletions
@@ -57,8 +57,9 @@ function computedCategory() {
}
function save() {
const v = Number(fAmount.value)
if (!fAmount.value.trim() || !isFinite(v) || v <= 0) {
const amountText = String(fAmount.value ?? '').trim()
const v = Number(amountText)
if (!amountText || !isFinite(v) || v <= 0) {
fError.value = '请填写大于 0 的金额'
return
}
@@ -72,7 +73,7 @@ function save() {
category: computedCategory(),
amount: Math.round(v * 100),
date: fDate.value,
note: fNote.value.trim(),
note: String(fNote.value ?? '').trim(),
reimbursable,
reimbursed: reimbursable && fReimbursed.value ? 1 : 0
})
+7 -4
View File
@@ -120,8 +120,9 @@ watch(fAmount, () => {
})
async function submit() {
const v = Number(fAmount.value)
if (!fAmount.value.trim() || !isFinite(v) || v <= 0) {
const amountText = String(fAmount.value ?? '').trim()
const v = Number(amountText)
if (!amountText || !isFinite(v) || v <= 0) {
fError.value = '请填写大于 0 的金额'
return
}
@@ -137,7 +138,7 @@ async function submit() {
category: fCategory.value,
amount: Math.round(v * 100),
date: fDate.value,
note: fNote.value.trim(),
note: String(fNote.value ?? '').trim(),
reimbursable: fType.value === 'expense' && fReimb.value ? 1 : 0,
reimbursed: 0
})
@@ -154,6 +155,8 @@ async function submit() {
showToast('记账已添加')
submitting.value = false
}
const formDirty = computed(() => String(fAmount.value ?? '').trim() !== '' || String(fNote.value ?? '').trim() !== '')
function resetForm() {
fAmount.value = ''
fNote.value = ''
@@ -262,7 +265,7 @@ async function confirmDelete() {
</div>
<div v-if="fError" class="form-error">{{ fError }}</div>
<div class="form-footer">
<button class="btn btn-sm" :disabled="!(fAmount.trim() || fNote.trim())" @click="resetForm">重置</button>
<button class="btn btn-sm" :disabled="!formDirty" @click="resetForm">重置</button>
<button class="btn btn-primary btn-sm" :disabled="submitting" @click="submit">添加记录</button>
</div>
</div>