Bläddra i källkod

fix(selfManage): 代码审查修复 - 票种编辑详情失败回退列表行回填(防空表单盲写覆盖scenicIds/channels), 分销商密码校验补首位不能为数字, 销售日历保存/清空失败回显服务端真实规则, 无可保存内容时禁用保存按钮

LaveyD 3 veckor sedan
förälder
incheckning
e7f1c54bf1

+ 10 - 1
src/views/selfManage/saleCalendar/index.vue

@@ -28,7 +28,7 @@
               @click="openRuleDialog()">新增规则</el-button>
             <el-button
               type="primary"
-              :disabled="!ticketTypeId"
+              :disabled="!ticketTypeId || (!rules.length && !canClear)"
               :loading="saving"
               @click="saveAll">{{ canClear ? '清空全部' : '保存全部' }}</el-button>
           </el-form-item>
@@ -218,6 +218,10 @@ export default {
                 this.$message.success('已清空全部规则')
                 this.loadList()
               })
+              .catch(() => {
+                this.$message.error('清空失败,已刷新为服务端最新规则')
+                this.loadList()
+              })
               .finally(() => {
                 this.saving = false
               })
@@ -240,6 +244,11 @@ export default {
               this.$message.success('保存成功')
               this.loadList()
             })
+            .catch(() => {
+              // 先 delete 后 add 非原子:add 失败时服务端状态已变,回显真实规则并重置本地删除记录
+              this.$message.error('保存失败(可能部分生效),已刷新为服务端最新规则')
+              this.loadList()
+            })
             .finally(() => {
               this.saving = false
             })

+ 4 - 3
src/views/selfManage/thirdParty/FormDialog.vue

@@ -42,7 +42,7 @@
           v-model="form.password"
           type="password"
           show-password
-          :placeholder="dialogType === 'edit' ? '留空 = 不修改' : '至少 8 位,含大小写字母和数字'"
+          :placeholder="dialogType === 'edit' ? '留空 = 不修改' : '至少 8 位,含大小写字母和数字,首位不能为数字'"
           maxlength="50"></el-input>
       </el-form-item>
       <el-form-item
@@ -102,7 +102,8 @@
 import ElDialog from '@/components/Dialog'
 import { addUserThirdParty, updateUserThirdParty } from '@/api/selfManage'
 
-const PWD_RE = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/
+// 与后端规则一致:至少 8 位、含大小写字母和数字、首位不能为数字
+const PWD_RE = /^(?![0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/
 
 export default {
   name: 'SelfThirdPartyFormDialog',
@@ -123,7 +124,7 @@ export default {
             if (this.dialogType === 'add' && !value) {
               callback(new Error('请输入密码'))
             } else if (value && !PWD_RE.test(value)) {
-              callback(new Error('至少 8 位,且包含大写字母、小写字母和数字'))
+              callback(new Error('至少 8 位,包含大写字母、小写字母和数字,且首位不能为数字'))
             } else {
               callback()
             }

+ 10 - 5
src/views/selfManage/ticketType/FormDialog.vue

@@ -517,12 +517,11 @@ export default {
       if (row && row.id) {
         this.form = this.emptyForm()
         this.form.id = row.id
-        getSelfTicketTypeDetail(row.id).then(res => {
-          const d = res.data || {}
-          // 详情返回 scenicList[].selfScenicId(接口文档 §3.2),表单景点多选绑定 scenicIds,需映射
+        const applyDetail = d => {
+          // 详情/列表行均返回 scenicList[].selfScenicId(接口文档 §3.2),表单景点多选绑定 scenicIds,需映射
           const scenicIds = (d.scenicList || []).map(s => s.selfScenicId)
           this.form = { ...this.form, ...d, scenicIds }
-          // 详情里的展示用数组不进提交 payload,删掉避免 update 带脏字段
+          // 展示用数组不进提交 payload,删掉避免 update 带脏字段
           delete this.form.scenicList
           delete this.form.batchConfigList
           this.saleDateRange = d.saleDateStart && d.saleDateEnd ? [d.saleDateStart, d.saleDateEnd] : []
@@ -531,7 +530,13 @@ export default {
           this.$nextTick(() => {
             this.$refs.form && this.$refs.form.clearValidate()
           })
-        }).catch(() => {})
+        }
+        // 详情为准;失败(如详情端点未实现)回退列表行数据兜底,避免打开空表单后对 scenicIds/channels 做盲写全量覆盖
+        getSelfTicketTypeDetail(row.id).then(res => {
+          applyDetail(res.data || {})
+        }).catch(() => {
+          applyDetail(row)
+        })
       } else {
         this.form = this.emptyForm()
         this.saleDateRange = []