From c7b4b9a2f4c0f05aeb60a9e3f5fba5d9a3676f3f Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期一, 18 八月 2025 16:22:42 +0800 Subject: [PATCH] 中强恒兴设备管理页面添加 --- src/views/salesManagement/salespersonManagement/index.vue | 392 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 392 insertions(+), 0 deletions(-) diff --git a/src/views/salesManagement/salespersonManagement/index.vue b/src/views/salesManagement/salespersonManagement/index.vue new file mode 100644 index 0000000..894d631 --- /dev/null +++ b/src/views/salesManagement/salespersonManagement/index.vue @@ -0,0 +1,392 @@ +<template> + <div class="app-container"> + <el-card class="box-card"> + <!-- 鎼滅储鍖哄煙 --> + <el-row :gutter="20" class="search-row"> + <el-col :span="6"> + <el-input + v-model="searchForm.name" + placeholder="璇疯緭鍏ヤ笟鍔″憳濮撳悕" + clearable + @keyup.enter="handleSearch" + > + <template #prefix> + <el-icon><Search /></el-icon> + </template> + </el-input> + </el-col> + <el-col :span="6"> + <el-select v-model="searchForm.department" placeholder="璇烽�夋嫨閮ㄩ棬" clearable> + <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option> + <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option> + <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option> + </el-select> + </el-col> + <el-col :span="6"> + <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" clearable> + <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option> + <el-option label="绂昏亴" value="绂昏亴"></el-option> + <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option> + </el-select> + </el-col> + <el-col :span="6"> + <el-button type="primary" @click="handleSearch">鎼滅储</el-button> + <el-button @click="resetSearch">閲嶇疆</el-button> + <el-button type="primary" style="float: right;" @click="handleAdd">鏂板涓氬姟鍛�</el-button> + </el-col> + </el-row> + + <!-- 涓氬姟鍛樺垪琛� --> + <el-table + :data="filteredList" + style="width: 100%" + v-loading="loading" + border + stripe + height="calc(100vh - 22em)" + > + <el-table-column prop="id" label="ID" width="80" align="center"/> + <el-table-column prop="name" label="濮撳悕" width="120" /> + <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" width="140" /> + <el-table-column prop="email" label="閭" width="200" /> + <el-table-column prop="department" label="閮ㄩ棬" width="100" /> + <el-table-column prop="position" label="鑱屼綅" width="100" /> + <el-table-column prop="hireDate" label="鍏ヨ亴鏃ユ湡" width="120" /> + <el-table-column prop="status" label="鐘舵��" width="80"> + <template #default="scope"> + <el-tag :type="getStatusType(scope.row.status)"> + {{ scope.row.status }} + </el-tag> + </template> + </el-table-column> + <el-table-column prop="permissions" label="鏉冮檺"> + <template #default="scope"> + <el-tag v-for="perm in scope.row.permissions" :key="perm" size="small" style="margin-right: 5px;"> + {{ perm }} + </el-tag> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center"> + <template #default="scope"> + <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button> + <el-button link type="primary" @click="handlePermissions(scope.row)">鏉冮檺</el-button> + <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + + <!-- 鍒嗛〉 --> + <pagination + :total="pagination.total" + layout="total, sizes, prev, pager, next, jumper" + :page="pagination.currentPage" + :limit="pagination.pageSize" + @pagination="handleCurrentChange" + /> + </el-card> + + <!-- 鏂板/缂栬緫瀵硅瘽妗� --> + <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px"> + <el-form :model="form" :rules="rules" ref="formRef" label-width="100px"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="濮撳悕" prop="name"> + <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鑱旂郴鐢佃瘽" prop="phone"> + <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="閭" prop="email"> + <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閮ㄩ棬" prop="department"> + <el-select v-model="form.department" placeholder="璇烽�夋嫨閮ㄩ棬" style="width: 100%"> + <el-option label="閿�鍞儴" value="閿�鍞儴"></el-option> + <el-option label="甯傚満閮�" value="甯傚満閮�"></el-option> + <el-option label="瀹㈡湇閮�" value="瀹㈡湇閮�"></el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鑱屼綅" prop="position"> + <el-input v-model="form.position" placeholder="璇疯緭鍏ヨ亴浣�"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍏ヨ亴鏃ユ湡" prop="hireDate"> + <el-date-picker + v-model="form.hireDate" + type="date" + placeholder="閫夋嫨鍏ヨ亴鏃ユ湡" + style="width: 100%" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD" + /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%"> + <el-option label="鍦ㄨ亴" value="鍦ㄨ亴"></el-option> + <el-option label="绂昏亴" value="绂昏亴"></el-option> + <el-option label="璇曠敤鏈�" value="璇曠敤鏈�"></el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button @click="dialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button> + </div> + </template> + </el-dialog> + + <!-- 鏉冮檺璁剧疆瀵硅瘽妗� --> + <el-dialog v-model="permissionDialogVisible" title="鏉冮檺璁剧疆" width="500px"> + <el-form label-width="100px"> + <el-form-item label="涓氬姟鍛樺鍚�"> + <span>{{ currentSalesperson.name }}</span> + </el-form-item> + <el-form-item label="鏉冮檺璁剧疆"> + <el-checkbox-group v-model="currentPermissions"> + <el-checkbox label="璁㈠崟绠$悊">璁㈠崟绠$悊</el-checkbox> + <el-checkbox label="瀹㈡埛绠$悊">瀹㈡埛绠$悊</el-checkbox> + <el-checkbox label="璐㈠姟绠$悊">璐㈠姟绠$悊</el-checkbox> + <el-checkbox label="鍙戣揣绠$悊">鍙戣揣绠$悊</el-checkbox> + <el-checkbox label="鎶ヨ〃鏌ョ湅">鎶ヨ〃鏌ョ湅</el-checkbox> + <el-checkbox label="绯荤粺璁剧疆">绯荤粺璁剧疆</el-checkbox> + </el-checkbox-group> + </el-form-item> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button @click="permissionDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="savePermissions">纭� 瀹�</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import { ref, reactive, computed, nextTick } from 'vue' +import { ElMessage, ElMessageBox } from 'element-plus' +import { Plus, Search } from '@element-plus/icons-vue' +import Pagination from '@/components/PIMTable/Pagination.vue' + +// 鍝嶅簲寮忔暟鎹� +const loading = ref(false) +const searchForm = reactive({ + name: '', + department: '', + status: '' +}) + +const salespersonList = ref([ + { + id: 1, + name: '寮犱笁', + phone: '13800138001', + email: 'zhangsan@company.com', + department: '閿�鍞儴', + position: '閿�鍞粡鐞�', + hireDate: '2023-01-15', + status: '鍦ㄨ亴', + permissions: ['璁㈠崟绠$悊', '瀹㈡埛绠$悊', '璐㈠姟绠$悊'] + }, + { + id: 2, + name: '鏉庡洓', + phone: '13800138002', + email: 'lisi@company.com', + department: '甯傚満閮�', + position: '甯傚満涓撳憳', + hireDate: '2023-03-20', + status: '鍦ㄨ亴', + permissions: ['瀹㈡埛绠$悊', '鎶ヨ〃鏌ョ湅'] + }, + { + id: 3, + name: '鐜嬩簲', + phone: '13800138003', + email: 'wangwu@company.com', + department: '瀹㈡湇閮�', + position: '瀹㈡湇涓荤', + hireDate: '2022-11-10', + status: '鍦ㄨ亴', + permissions: ['瀹㈡埛绠$悊', '鍙戣揣绠$悊'] + } +]) + +const pagination = ref({ + total: 3, + currentPage: 1, + pageSize: 10 +}) + +const dialogVisible = ref(false) +const dialogTitle = ref('鏂板涓氬姟鍛�') +const form = reactive({ + name: '', + phone: '', + email: '', + department: '', + position: '', + hireDate: '', + status: '鍦ㄨ亴' +}) + +const rules = { + name: [{ required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }], + phone: [{ required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' }], + email: [{ required: true, message: '璇疯緭鍏ラ偖绠�', trigger: 'blur' }], + department: [{ required: true, message: '璇烽�夋嫨閮ㄩ棬', trigger: 'change' }], + position: [{ required: true, message: '璇疯緭鍏ヨ亴浣�', trigger: 'blur' }], + hireDate: [{ required: true, message: '璇烽�夋嫨鍏ヨ亴鏃ユ湡', trigger: 'change' }], + status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }] +} + +const isEdit = ref(false) +const editId = ref(null) +const permissionDialogVisible = ref(false) +const currentSalesperson = ref({}) +const currentPermissions = ref([]) +const formRef = ref() + +// 璁$畻灞炴�� +const filteredList = computed(() => { + let list = salespersonList.value + if (searchForm.name) { + list = list.filter(item => item.name.includes(searchForm.name)) + } + if (searchForm.department) { + list = list.filter(item => item.department === searchForm.department) + } + if (searchForm.status) { + list = list.filter(item => item.status === searchForm.status) + } + return list +}) + +// 鏂规硶 +const getStatusType = (status) => { + const statusMap = { + '鍦ㄨ亴': 'success', + '绂昏亴': 'danger', + '璇曠敤鏈�': 'warning' + } + return statusMap[status] || 'info' +} + +const handleSearch = () => { + // 鎼滅储閫昏緫宸插湪computed涓鐞� +} + +const resetSearch = () => { + searchForm.name = '' + searchForm.department = '' + searchForm.status = '' +} + +const handleAdd = () => { + dialogTitle.value = '鏂板涓氬姟鍛�' + isEdit.value = false + form.name = '' + form.phone = '' + form.email = '' + form.department = '' + form.position = '' + form.hireDate = '' + form.status = '鍦ㄨ亴' + dialogVisible.value = true +} + +const handleEdit = (row) => { + dialogTitle.value = '缂栬緫涓氬姟鍛�' + isEdit.value = true + editId.value = row.id + Object.assign(form, row) + dialogVisible.value = true +} + +const handleDelete = (row) => { + ElMessageBox.confirm('纭鍒犻櫎璇ヤ笟鍔″憳鍚楋紵', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + const index = salespersonList.value.findIndex(item => item.id === row.id) + if (index > -1) { + salespersonList.value.splice(index, 1) + pagination.value.total-- + ElMessage.success('鍒犻櫎鎴愬姛') + } + }) +} + +const handlePermissions = (row) => { + currentSalesperson.value = row + currentPermissions.value = [...row.permissions] + permissionDialogVisible.value = true +} + +const savePermissions = () => { + const index = salespersonList.value.findIndex(item => item.id === currentSalesperson.value.id) + if (index > -1) { + salespersonList.value[index].permissions = [...currentPermissions.value] + ElMessage.success('鏉冮檺璁剧疆鎴愬姛') + permissionDialogVisible.value = false + } +} + +const handleSubmit = () => { + formRef.value.validate((valid) => { + if (valid) { + if (isEdit.value) { + // 缂栬緫 + const index = salespersonList.value.findIndex(item => item.id === editId.value) + if (index > -1) { + salespersonList.value[index] = { ...form, id: editId.value } + ElMessage.success('缂栬緫鎴愬姛') + } + } else { + // 鏂板 + const newId = Math.max(...salespersonList.value.map(item => item.id)) + 1 + salespersonList.value.push({ + ...form, + id: newId, + permissions: [] + }) + pagination.value.total++ + ElMessage.success('鏂板鎴愬姛') + } + dialogVisible.value = false + } + }) +} + +const handleCurrentChange = (val) => { + pagination.value.currentPage = val.page + pagination.value.pageSize = val.limit +} +</script> + +<style scoped> +.search-row { + margin-bottom: 20px; +} +</style> -- Gitblit v1.9.3