From b3f4499793fa7b21f6c5d1e099d6ed170ecbe47a Mon Sep 17 00:00:00 2001
From: 董国庆 <364620639@qq.com>
Date: 星期四, 15 五月 2025 16:38:45 +0800
Subject: [PATCH] 实验方案管理

---
 laboratory/src/components/DynamicComponent/index.vue |  112 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 102 insertions(+), 10 deletions(-)

diff --git a/laboratory/src/components/DynamicComponent/index.vue b/laboratory/src/components/DynamicComponent/index.vue
index cd198b6..8faa19a 100644
--- a/laboratory/src/components/DynamicComponent/index.vue
+++ b/laboratory/src/components/DynamicComponent/index.vue
@@ -25,9 +25,27 @@
             <el-button size="mini"  @click="showTableHeaderDialog(idx)">添加表头</el-button>
             <el-button size="mini" type="primary" @click="showAddRowDialog(idx, item.data.headers)">添加数据</el-button>
           </div>
-          <Table :data="item.data.rows" :total="null" :height="null" class="groupTable">
+          <Table :data="item.data.rows" :total="null" :height="null" class="groupTable" :key="item.id + '_' + JSON.stringify(item.data.rows).length">
             <el-table-column v-for="(header, hidx) in item.data.headers" :key="hidx" :label="header.name"
-              :prop="header.name" />
+              :prop="header.name">
+              <template slot-scope="scope">
+                <!-- 用户类型显示 -->
+                <template v-if="header.type === 'user'">
+                  {{ getUserDisplayText(header.name, scope.row) }}
+                </template>
+                <!-- 图片类型显示 -->
+                <template v-else-if="header.type === 'image'">
+                  <img v-if="scope.row[header.name]" 
+                       :src="scope.row[header.name]" 
+                       alt="头像" 
+                       class="table-image" />
+                </template>
+                <!-- 其他类型 -->
+                <template v-else>
+                  {{ scope.row[header.name] }}
+                </template>
+              </template>
+            </el-table-column>
             <el-table-column label="更新时间" prop="updateTime" min-width="180"></el-table-column>
             <el-table-column  label="操作" min-width="200" v-if="dialogCanEdit">
               <template slot-scope="scope">
@@ -136,6 +154,7 @@
         form: {},
       },
       headerList: [],
+      defaultImageUrl: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 默认图片地址
     };
   },
   watch: {
@@ -176,6 +195,49 @@
     }
   },
   methods: {
+    getUserDisplayText(fieldName, rowData) {
+      // 检查是否有对应的userInfo数据
+      const userInfoKey = `${fieldName}_userInfo`;
+      
+      // 如果没有rowData或fieldName,直接返回空字符串
+      if (!rowData || !fieldName) {
+        return '';
+      }
+      
+      // 情况1: 有_userInfo数据
+      if (rowData[userInfoKey] && Array.isArray(rowData[userInfoKey])) {
+        return rowData[userInfoKey].map(user => user.label || '').join(', ');
+      }
+      
+      // 情况2: 只有用户ID数组
+      if (Array.isArray(rowData[fieldName])) {
+        // 使用participants查找用户信息
+        return rowData[fieldName].map(userId => {
+          const user = this.participants.find(p => p.userId === userId);
+          return user ? (user.nickName || user.userName || userId) : userId;
+        }).join(', ');
+      }
+      
+      // 情况3: 已经是字符串(可能是之前格式化过的)
+      if (typeof rowData[fieldName] === 'string') {
+        return rowData[fieldName];
+      }
+      
+      // 默认返回空字符串
+      return '';
+    },
+    formatUserNames(userArray) {
+      if (!userArray || !Array.isArray(userArray) || userArray.length === 0) {
+        return '';
+      }
+      
+      // 查找参与者列表中的用户,获取昵称并用逗号拼接
+      const userNames = userArray.map(userId => {
+        const user = this.participants.find(p => p.userId === userId);
+        return user ? user.nickName : userId;
+      });
+      return userNames.join(', ');
+    },
     addComponent(type) {
       if (!this.editable) return;
 
@@ -232,23 +294,44 @@
       this.$emit('submit', data);
     },
     confirmAddRow(formData) {
-      if (!this.editable) return;
+      // if (!this.editable) return;
 
       const { idx, rowIndex, isEdit } = this.rowDialog;
+      
+      // 处理formData中的数据,保证用户信息的完整性
+      const processedData = { ...formData };
+      
+      // 调试输出
+      console.log('添加/编辑行数据:', processedData,'isEdit',isEdit);
+      
       if (isEdit) {
-        this.components[idx].data.rows[rowIndex] = {
-          ...formData,
-          updateTime: new Date().toLocaleString()
-        };
+        // Vue无法检测到对象或数组深层属性的变化,使用Vue.set来确保响应式
+        this.$set(
+          this.components[idx].data.rows, 
+          rowIndex, 
+          {
+            ...processedData,
+            updateTime: new Date().toLocaleString()
+          }
+        );
       } else {
+        // 使用数组方法push会被Vue检测到
         this.components[idx].data.rows.push({
-          ...formData,
+          ...processedData,
           updateTime: new Date().toLocaleString()
         });
       }
+      console.log('this.components',this.components);
+      
+      // 手动触发组件更新
+      this.$forceUpdate();
+      // 延迟发送事件,确保数据已更新
+      this.$nextTick(() => {
+        this.emitUpdate();
+      });
+      
       this.rowDialog.visible = false;
       this.rowDialog.form = {};
-      this.emitUpdate();
     },
     removeComponent(idx) {
       if (!this.editable) return;
@@ -387,7 +470,9 @@
       return true;
     },
     emitUpdate() {
-      this.$emit('update:dataSource', this.components);
+      // 先创建新对象,这有助于触发更新
+      const updatedComponents = JSON.parse(JSON.stringify(this.components));
+      this.$emit('update:dataSource', updatedComponents);
     },
   },
 };
@@ -519,4 +604,11 @@
   object-fit: cover;
   border-radius: 8px;
 }
+
+.table-image {
+  width: 50px;
+  height: 50px;
+  object-fit: cover;
+  border-radius: 4px;
+}
 </style>

--
Gitblit v1.7.1