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