Explorar o código

fix: preserve activity category selection on edit

Developer hai 2 semanas
pai
achega
c087f34dc2
Modificáronse 3 ficheiros con 23 adicións e 5 borrados
  1. BIN=BIN
      dist.zip
  2. 9 5
      src/views/modules/activity/add.vue
  3. 14 0
      tests/activity-edit-category.test.js

BIN=BIN
dist.zip


+ 9 - 5
src/views/modules/activity/add.vue

@@ -22,7 +22,7 @@
                     </el-form-item>
                     </el-form-item>
                     <el-form-item label="活动分类" prop="categoryIdsArr">
                     <el-form-item label="活动分类" prop="categoryIdsArr">
                         <el-select v-model="basicForm.categoryIdsArr" placeholder="请选择活动分类(可多选)" class="select-box" style="width: 440px;" multiple collapse-tags>
                         <el-select v-model="basicForm.categoryIdsArr" placeholder="请选择活动分类(可多选)" class="select-box" style="width: 440px;" multiple collapse-tags>
-                            <el-option v-for="item in categoryOptions" :key="item.id" :label="item.categoryName" :value="item.id"></el-option>
+                            <el-option v-for="item in categoryOptions" :key="item.id" :label="item.categoryName" :value="String(item.id)"></el-option>
                         </el-select>
                         </el-select>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item label="活动名称" prop="activityName">
                     <el-form-item label="活动名称" prop="activityName">
@@ -431,10 +431,14 @@ export default {
         // this.basicForm = { ...this.basicForm, ...res.data }
         // this.basicForm = { ...this.basicForm, ...res.data }
         this.updateObjectFromSource(this.basicForm, res.data)
         this.updateObjectFromSource(this.basicForm, res.data)
         // 解析后端存的 CSV(category_ids)到数组供 el-select multiple 使用
         // 解析后端存的 CSV(category_ids)到数组供 el-select multiple 使用
-        if (res.data.categoryIds) {
-          this.basicForm.categoryIdsArr = res.data.categoryIds.split(',').map(Number).filter(n => !isNaN(n))
-        } else if (res.data.categoryId) {
-          this.basicForm.categoryIdsArr = [res.data.categoryId]
+        const rawCategoryIds = Array.isArray(res.data.categoryIds)
+          ? res.data.categoryIds
+          : String(res.data.categoryIds || '').split(',')
+        const categoryIds = rawCategoryIds.map(id => String(id).trim()).filter(Boolean)
+        if (categoryIds.length > 0) {
+          this.basicForm.categoryIdsArr = categoryIds
+        } else if (res.data.categoryId !== null && res.data.categoryId !== undefined && res.data.categoryId !== '') {
+          this.basicForm.categoryIdsArr = [String(res.data.categoryId)]
         } else {
         } else {
           this.basicForm.categoryIdsArr = []
           this.basicForm.categoryIdsArr = []
         }
         }

+ 14 - 0
tests/activity-edit-category.test.js

@@ -0,0 +1,14 @@
+import test from 'node:test'
+import assert from 'node:assert/strict'
+import fs from 'node:fs'
+import path from 'node:path'
+
+const addFile = path.resolve('src/views/modules/activity/add.vue')
+
+test('活动编辑页使用字符串分类 ID,避免雪花 ID 精度丢失导致下拉无法回显', () => {
+  const source = fs.readFileSync(addFile, 'utf8')
+
+  assert.match(source, /:value="String\(item\.id\)"/)
+  assert.match(source, /map\(id\s*=>\s*String\(id\)\.trim\(\)\)/)
+  assert.doesNotMatch(source, /\.map\(Number\)/)
+})