<template>
<el-container style="height: 100vh">
<el-aside width="200px">
<el-menu default-active="1" class="el-menu-vertical-demo">
<el-menu-item index="1">员工管理</el-menu-item>
</el-menu>
</el-aside>
<el-container>
<el-header>
<h2>员工管理系统</h2>
</el-header>
<el-main>
<!-- 查询条件 -->
<el-row :gutter="20" style="margin-bottom: 20px;">
<el-col :span="4">
<el-input v-model="queryParams.name" placeholder="请输入姓名" />
</el-col>
<el-col :span="4">
<el-select v-model="queryParams.gender" placeholder="请选择性别">
<el-option label="男" :value="0"></el-option>
<el-option label="女" :value="1"></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-select v-model="queryParams.job" placeholder="请选择职位">
<el-option label="班主任" :value="1"></el-option>
<el-option label="讲师" :value="2"></el-option>
<el-option label="学工主管" :value="3"></el-option>
<el-option label="教研主管" :value="4"></el-option>
<el-option label="咨询师" :value="5"></el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-date-picker v-model="queryParams.dateRange" type="daterange" start-placeholder="开始日期"
end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
</el-col>
<el-col :span="4">
<el-button type="primary" @click="fetchData">搜索</el-button>
<el-button type="success" @click="showAddDialog">新增</el-button>
<el-button type="danger" @click="batchDelete">批量删除</el-button>
</el-col>
</el-row>
<!-- 数据表格 -->
<el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="gender" label="性别" width="80">
<template #default="scope">
{{ scope.row.gender === 0 ? '男' : '女' }}
</template>
</el-table-column>
<el-table-column prop="job" label="职位" width="120">
<template #default="scope">
{{ jobMap[scope.row.job] || '未知' }}
</template>
</el-table-column>
<el-table-column prop="entrydate" label="入职时间" width="120" />
<el-table-column label="头像" width="100">
<template #default="scope">
<el-image v-if="scope.row.image" :src="scope.row.image"
style="width: 50px; height: 50px; border-radius: 50%;" :preview-src-list="[scope.row.image]" />
<span v-else>暂无图片</span>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="150" />
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<el-pagination layout="prev, pager, next" :total="total" :page-size="queryParams.pageSize"
v-model:current-page="queryParams.pageNum" @current-change="fetchData" />
</el-main>
</el-container>
</el-container>
<!-- 新增/编辑对话框 -->
<el-dialog v-model="dialogVisible" :title="dialogTitle">
<el-form :model="form" label-width="100px">
<el-form-item label="姓名">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="用户名">
<el-input v-model="form.username" />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" show-password />
</el-form-item>
<el-form-item label="性别">
<el-select v-model="form.gender" placeholder="请选择性别">
<el-option label="男" :value="0"></el-option>
<el-option label="女" :value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="职位">
<el-select v-model="form.job" placeholder="请选择职位">
<el-option label="班主任" :value="1"></el-option>
<el-option label="讲师" :value="2"></el-option>
<el-option label="学工主管" :value="3"></el-option>
<el-option label="教研主管" :value="4"></el-option>
<el-option label="咨询师" :value="5"></el-option>
</el-select>
</el-form-item>
<el-form-item label="头像链接">
<el-input v-model="form.image" />
</el-form-item>
<el-form-item label="入职时间">
<el-date-picker v-model="form.entrydate" type="date" placeholder="选择日期" format="YYYY-MM-DD"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="dialogVisible = false">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';
// 设置 axios 实例
const apiClient = axios.create({
baseURL: 'http://localhost:8080/emps',
timeout: 5000,
});
// 表格数据
const tableData = ref([]);
const total = ref(0);
const selectedRows = ref([]);
// 查询参数
const queryParams = ref({
pageNum: 1,
pageSize: 5,
name: '',
gender: null,
job: null,
dateRange: []
});
// 表单数据
const form = ref({
id: null,
username: '',
password: '',
name: '',
gender: null,
job: null,
image: '',
entrydate: ''
});
// 对话框控制
const dialogVisible = ref(false);
const dialogTitle = ref('新增员工');
const isEdit = ref(false);
// 职位映射表
const jobMap = {
1: '班主任',
2: '讲师',
3: '学工主管',
4: '教研主管',
5: '咨询师'
};
// 获取数据
const fetchData = async () => {
const params = {
page: queryParams.value.pageNum,
pageSize: queryParams.value.pageSize,
name: queryParams.value.name,
gender: queryParams.value.gender,
job: queryParams.value.job,
begin: queryParams.value.dateRange[0] || '',
end: queryParams.value.dateRange[1] || ''
};
try {
const res = await apiClient.get('', { params });
if (res.data.code === 1) {
tableData.value = res.data.data.rows;
total.value = res.data.data.total;
} else {
alert('获取数据失败:' + res.data.msg);
}
} catch (error) {
console.error('请求出错:', error);
alert('网络请求失败,请检查后端是否运行正常');
}
};
// 显示新增对话框
const showAddDialog = () => {
dialogTitle.value = '新增员工';
isEdit.value = false;
form.value = {
id: null,
username: '',
password: '',
name: '',
gender: null,
job: null,
image: '',
entrydate: ''
};
dialogVisible.value = true;
};
// 显示编辑对话框
const handleEdit = (row) => {
dialogTitle.value = '编辑员工';
isEdit.value = true;
form.value = { ...row };
dialogVisible.value = true;
};
// 提交表单
const submitForm = async () => {
try {
if (isEdit.value) {
await apiClient.put('', form.value);
} else {
await apiClient.post('', form.value);
}
dialogVisible.value = false;
fetchData();
} catch (error) {
console.error('保存失败:', error);
alert('操作失败,请查看控制台日志');
}
};
// 删除员工
const handleDelete = async (id) => {
if (!confirm(`确认删除ID为 ${id} 的员工吗?`)) return;
try {
await apiClient.delete(`/${[id]}`);
fetchData();
} catch (error) {
console.error('删除失败:', error);
alert('删除失败,请查看控制台日志');
}
};
// 批量删除
const batchDelete = () => {
if (selectedRows.value.length === 0) {
alert('请至少选择一条记录');
return;
}
const ids = selectedRows.value.map(item => item.id);
if (!confirm(`确认删除选中的 ${ids.length} 条员工吗?`)) return;
try {
apiClient.delete(`/${ids}`);
fetchData();
} catch (error) {
console.error('批量删除失败:', error);
alert('删除失败,请查看控制台日志');
}
};
// 表格选择监听
const handleSelectionChange = (rows) => {
selectedRows.value = rows;
};
// 初始化加载数据
onMounted(() => {
fetchData();
});
</script>
<style scoped>
.el-header {
background-color: #f5f7fa;
display: flex;
align-items: center;
}
</style>
帮我优化一下代码,使代码更简洁,美化一下页面,把头像列放到名字列后面