From 4fa9591629721797386fc11836e3a9deb69cd58c Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期三, 24 九月 2025 17:00:37 +0800
Subject: [PATCH] 修改评分逻辑,支持多个评委

---
 web/src/views/employee/index.vue |  179 ++++++++++++++++++++++++++---------------------------------
 1 files changed, 80 insertions(+), 99 deletions(-)

diff --git a/web/src/views/employee/index.vue b/web/src/views/employee/index.vue
index d6f18f1..9c5663a 100644
--- a/web/src/views/employee/index.vue
+++ b/web/src/views/employee/index.vue
@@ -16,16 +16,6 @@
             <el-icon><Search /></el-icon>
           </template>
         </el-input>
-        <el-select
-          v-model="searchForm.role"
-          placeholder="閫夋嫨瑙掕壊"
-          style="width: 150px"
-          clearable
-        >
-          <el-option label="绠$悊鍛�" value="admin" />
-          <el-option label="宸ヤ綔浜哄憳" value="staff" />
-          <el-option label="瀹℃牳鍛�" value="reviewer" />
-        </el-select>
         <el-button type="primary" @click="handleSearch">
           <el-icon><Search /></el-icon>
           鎼滅储
@@ -38,21 +28,18 @@
 
       <!-- 鍛樺伐鍒楄〃 -->
       <el-table :data="tableData" style="width: 100%" v-loading="loading">
-        <el-table-column label="澶村儚" width="80" align="center">
-          <template #default="{ row }">
-            <el-avatar :src="row.avatar" :size="40">
-              <el-icon><User /></el-icon>
-            </el-avatar>
-          </template>
-        </el-table-column>
         <el-table-column prop="name" label="鍛樺伐鍚嶇О" min-width="120" />
         <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="140" />
-        <el-table-column prop="role" label="瑙掕壊" width="120" align="center">
+        <el-table-column prop="roleId" label="瑙掕壊" width="120" align="center">
           <template #default="{ row }">
-            <el-tag :type="getRoleType(row.role)">{{ getRoleText(row.role) }}</el-tag>
+            <el-tag :type="getRoleType(row.roleId)">{{ getRoleText(row.roleId) }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
+        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180">
+          <template #default="{ row }">
+            {{ formatDateTime(row.createTime) }}
+          </template>
+        </el-table-column>
         <el-table-column label="鎿嶄綔" width="150" fixed="right">
           <template #default="{ row }">
             <div class="table-actions">
@@ -67,107 +54,92 @@
         </el-table-column>
       </el-table>
 
-      <!-- 鍒嗛〉 -->
-      <div class="pagination">
-        <el-pagination
-          v-model:current-page="pagination.page"
-          v-model:page-size="pagination.size"
-          :page-sizes="[10, 20, 50, 100]"
-          :total="pagination.total"
-          layout="total, sizes, prev, pager, next, jumper"
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-        />
+      <!-- 绌虹姸鎬� -->
+      <div v-if="!loading && tableData.length === 0" class="empty-state">
+        <el-empty description="鏆傛棤鍛樺伐鏁版嵁" />
       </div>
     </div>
+
+    <!-- 鍛樺伐璇︽儏瀵硅瘽妗� -->
+    <EmployeeForm
+      v-model:visible="formVisible"
+      :employee="currentEmployee"
+      @success="handleFormSuccess"
+    />
   </div>
 </template>
 
 <script setup lang="ts">
 import { reactive, ref, onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { employeeApi, type Employee } from '@/api/employee'
+import EmployeeForm from './EmployeeForm.vue'
 
 const loading = ref(false)
+const formVisible = ref(false)
+const currentEmployee = ref<Employee | null>(null)
 
 // 鎼滅储琛ㄥ崟
 const searchForm = reactive({
-  name: '',
-  role: ''
-})
-
-// 鍒嗛〉淇℃伅
-const pagination = reactive({
-  page: 1,
-  size: 10,
-  total: 0
+  name: ''
 })
 
 // 琛ㄦ牸鏁版嵁
-const tableData = ref([
-  {
-    id: 1,
-    name: '绠$悊鍛�',
-    avatar: '',
-    phone: '13800138000',
-    role: 'admin',
-    createTime: '2024-01-01 09:00:00'
-  },
-  {
-    id: 2,
-    name: '宸ヤ綔浜哄憳A',
-    avatar: '',
-    phone: '13800138001',
-    role: 'staff',
-    createTime: '2024-01-02 10:30:00'
-  },
-  {
-    id: 3,
-    name: '瀹℃牳鍛楤',
-    avatar: '',
-    phone: '13800138002',
-    role: 'reviewer',
-    createTime: '2024-01-03 14:15:00'
-  }
-])
+const tableData = ref<Employee[]>([])
 
 // 鑾峰彇瑙掕壊鏍囩绫诲瀷
-const getRoleType = (role: string) => {
+const getRoleType = (roleId: string) => {
   const typeMap: Record<string, string> = {
-    'admin': 'danger',
-    'staff': 'primary',
-    'reviewer': 'success'
+    'ADMIN': 'danger',
+    'MANAGER': 'warning',
+    'STAFF': 'primary',
+    'REVIEWER': 'success'
   }
-  return typeMap[role] || 'info'
+  return typeMap[roleId] || 'info'
 }
 
 // 鑾峰彇瑙掕壊鏂囨湰
-const getRoleText = (role: string) => {
+const getRoleText = (roleId: string) => {
   const textMap: Record<string, string> = {
-    'admin': '绠$悊鍛�',
-    'staff': '宸ヤ綔浜哄憳',
-    'reviewer': '瀹℃牳鍛�'
+    'ADMIN': '绠$悊鍛�',
+    'MANAGER': '缁忕悊',
+    'STAFF': '宸ヤ綔浜哄憳',
+    'REVIEWER': '瀹℃牳鍛�'
   }
-  return textMap[role] || '鏈煡'
+  return textMap[roleId] || roleId
+}
+
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (dateTime: string | undefined) => {
+  if (!dateTime) return '-'
+  return new Date(dateTime).toLocaleString('zh-CN', {
+    year: 'numeric',
+    month: '2-digit',
+    day: '2-digit',
+    hour: '2-digit',
+    minute: '2-digit'
+  })
 }
 
 // 鎼滅储
 const handleSearch = () => {
-  pagination.page = 1
   loadData()
 }
 
 // 鏂板鍛樺伐
 const handleAdd = () => {
-  ElMessage.info('鏂板鍛樺伐鍔熻兘寰呭紑鍙�')
+  currentEmployee.value = null
+  formVisible.value = true
 }
 
 // 缂栬緫鍛樺伐
-const handleEdit = (row: any) => {
-  ElMessage.info(`缂栬緫鍛樺伐锛�${row.name}`)
+const handleEdit = (row: Employee) => {
+  currentEmployee.value = row
+  formVisible.value = true
 }
 
 // 鍒犻櫎鍛樺伐
-const handleDelete = async (row: any) => {
+const handleDelete = async (row: Employee) => {
   try {
     await ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ憳宸�"${row.name}"鍚楋紵`, '鎻愮ず', {
       confirmButtonText: '纭畾',
@@ -175,33 +147,42 @@
       type: 'warning'
     })
     
+    loading.value = true
+    await employeeApi.deleteEmployee(row.id)
     ElMessage.success('鍒犻櫎鎴愬姛')
-    loadData()
-  } catch {
-    // 鐢ㄦ埛鍙栨秷
+    await loadData()
+  } catch (error: any) {
+    if (error !== 'cancel') {
+      ElMessage.error(error.message || '鍒犻櫎澶辫触')
+    }
+  } finally {
+    loading.value = false
   }
 }
 
-// 鍒嗛〉澶у皬鏀瑰彉
-const handleSizeChange = (size: number) => {
-  pagination.size = size
-  loadData()
-}
-
-// 褰撳墠椤垫敼鍙�
-const handleCurrentChange = (page: number) => {
-  pagination.page = page
+// 琛ㄥ崟鎻愪氦鎴愬姛
+const handleFormSuccess = () => {
+  formVisible.value = false
   loadData()
 }
 
 // 鍔犺浇鏁版嵁
-const loadData = () => {
-  loading.value = true
-  // TODO: 璋冪敤API鍔犺浇鏁版嵁
-  setTimeout(() => {
-    pagination.total = 3
+const loadData = async () => {
+  try {
+    loading.value = true
+    const name = searchForm.name.trim()
+    
+    if (name) {
+      tableData.value = await employeeApi.searchEmployees(name)
+    } else {
+      tableData.value = await employeeApi.getEmployees()
+    }
+  } catch (error: any) {
+    ElMessage.error(error.message || '鍔犺浇鏁版嵁澶辫触')
+    tableData.value = []
+  } finally {
     loading.value = false
-  }, 500)
+  }
 }
 
 onMounted(() => {

--
Gitblit v1.8.0