From 7ba080d35812e6db7bd5aa8f88161c02653eb6c1 Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期三, 24 九月 2025 22:42:35 +0800
Subject: [PATCH] feat: 优化员工和评委编辑功能的密码重置逻辑
---
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