fix(payment): 充值商品选项旧字符串值导致假条目且不可删除
- SchemaProvider 读取时 group/repeater 字段忽略非数组旧值(textarea 时代的 字符串),回退默认数组,避免前端按字符渲染出 20+ 条假条目 - AksField group/repeater 渲染改为数组安全视图(非数组一律按空列表) - 充值商品选项默认条数调整为 3 条(PHP 与前端 schema 同步)
This commit is contained in:
@@ -507,7 +507,7 @@
|
||||
<!-- Repeater (array of objects) — inline expand (default) -->
|
||||
<div v-else-if="(schema.type === 'repeater' || schema.type === 'group') && schema.ui !== 'list-modal'" class="aksrt-field__repeater">
|
||||
<div
|
||||
v-for="(item, index) in (modelValue || [])"
|
||||
v-for="(item, index) in repeaterItems"
|
||||
:key="item._id || index"
|
||||
class="aksrt-field__repeater-item"
|
||||
>
|
||||
@@ -548,9 +548,9 @@
|
||||
|
||||
<!-- Repeater list-modal: compact list + modal editor -->
|
||||
<div v-else-if="(schema.type === 'repeater' || schema.type === 'group') && schema.ui === 'list-modal'" class="aksrt-field__repeater aksrt-field__repeater--list-modal">
|
||||
<div v-if="(modelValue || []).length" class="aksrt-field__repeater-list">
|
||||
<div v-if="repeaterItems.length" class="aksrt-field__repeater-list">
|
||||
<div
|
||||
v-for="(item, index) in (modelValue || [])"
|
||||
v-for="(item, index) in repeaterItems"
|
||||
:key="item._id || index"
|
||||
class="aksrt-field__repeater-list-item"
|
||||
>
|
||||
@@ -565,7 +565,7 @@
|
||||
<FaIcon icon="fa fas fa-arrow-up" :size="12" />
|
||||
</n-button>
|
||||
<n-button
|
||||
v-if="index < (modelValue || []).length - 1"
|
||||
v-if="index < repeaterItems.length - 1"
|
||||
size="tiny"
|
||||
quaternary
|
||||
:disabled="schema.disabled"
|
||||
@@ -708,6 +708,8 @@ function toggleSecretClear() {
|
||||
}
|
||||
|
||||
const repeaterLength = computed(() => Array.isArray(props.modelValue) ? props.modelValue.length : 0)
|
||||
/** 数组安全视图:非数组(如旧版字符串值)一律按空列表渲染,避免逐字符假条目。 */
|
||||
const repeaterItems = computed(() => Array.isArray(props.modelValue) ? props.modelValue : [])
|
||||
const reachedRepeaterMinimum = computed(() => repeaterLength.value <= Number(props.schema.min || 0))
|
||||
const reachedRepeaterMaximum = computed(() => Number(props.schema.max || 0) > 0 && repeaterLength.value >= Number(props.schema.max))
|
||||
|
||||
@@ -1083,7 +1085,7 @@ function openRepeaterModal(index) {
|
||||
if (index < 0 && reachedRepeaterMaximum.value) return
|
||||
if (props.schema.disabled) return
|
||||
if (index >= 0) {
|
||||
const item = (props.modelValue || [])[index] || {}
|
||||
const item = (Array.isArray(props.modelValue) ? props.modelValue : [])[index] || {}
|
||||
repeaterDraft.value = { ...createRepeaterItem(), ...item }
|
||||
repeaterEditingIndex.value = index
|
||||
} else {
|
||||
|
||||
@@ -18,7 +18,6 @@ export const rechargeSchema = {
|
||||
{ price: 50, pay_price: 0, tag: '', tag_class: '' },
|
||||
{ price: 100, pay_price: 98, tag: '', tag_class: '' },
|
||||
{ price: 200, pay_price: 188, tag: '推荐', tag_class: 'jb-cyan' },
|
||||
{ price: 500, pay_price: 468, tag: '特惠', tag_class: 'jb-pink' },
|
||||
],
|
||||
pay_balance_product_custom_s: true,
|
||||
pay_balance_product_custom_limit: 9999,
|
||||
@@ -94,7 +93,6 @@ export const rechargeSchema = {
|
||||
{ price: 50, pay_price: 0, tag: '', tag_class: '' },
|
||||
{ price: 100, pay_price: 98, tag: '', tag_class: '' },
|
||||
{ price: 200, pay_price: 188, tag: '推荐', tag_class: 'jb-cyan' },
|
||||
{ price: 500, pay_price: 468, tag: '特惠', tag_class: 'jb-pink' },
|
||||
],
|
||||
help: '用户充值时候,可快速选择的充值金额,同时支持设置折扣',
|
||||
fields: [
|
||||
|
||||
Reference in New Issue
Block a user