import request from '@/utils/request' //查询员工列表 export const queryPageApi = (name,gender,begin,end,page,pageSize) => request.get(`/emps?name=${name}&gender=${gender}&begin=${begin}&end=${end}&page=${page}&pageSize=${pageSize}`) //添加员工 export const addEmpApi = (data) => request.post('/emps', data) //根据ID查询员工信息 export const queryInfoApi = (id) => request.get(`/emps/${id}`) //修改员工信息 export const updateEmpApi = (data) => request.put('/emps', data) //删除员工 export const deleteEmpApi = (ids) => request.delete(`/emps?ids=${ids}`) //查询所有员工 export const queryAllApi = () => request.get(`/emps/list`) 修改前端接口,根据前端接口,优化代码
时间: 2025-07-19 22:24:45 浏览: 4
<think>根据提供的API接口函数,我们需要修改前端代码中的API调用方式。原接口函数使用参数拼接的方式,现在需要调整为使用对象参数的形式,以匹配之前优化后的代码(使用params对象传递参数)。同时,对于删除接口,需要将ids数组转换为逗号分隔的字符串。
具体修改如下:
1. `queryPageApi` 函数修改为接受一个对象参数,并将参数传递给request.get的params配置项。
2. `deleteEmpApi` 函数需要将数组形式的ids转换为逗号分隔的字符串。
另外,为了保持一致性,我们建议将API模块中的函数都调整为使用对象参数的形式。
修改后的API模块代码(`src/api/emp.ts`)如下:</think>根据您提供的前端API接口定义,我将优化代码以确保与这些API完美集成。以下是完整的修复方案:
### 优化后的API模块 (`src/api/emp.ts`)
```typescript
import request from '@/utils/request'
import type { EmpModel, PageResultModel } from '@/api/model/model'
// 查询员工列表(优化为对象参数)
export const queryPageApi = (params: {
name?: string
gender?: string
begin?: string
end?: string
page: number
pageSize: number
}) => {
// 构建查询参数,过滤空值
const queryParams = Object.entries(params)
.filter(([_, value]) => value !== undefined && value !== null && value !== '')
.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
.join('&')
return request.get<PageResultModel>(`/emps?${queryParams}`)
}
// 添加员工
export const addEmpApi = (data: EmpModel) => request.post('/emps', data)
// 根据ID查询员工信息
export const queryInfoApi = (id: number) => request.get<EmpModel>(`/emps/${id}`)
// 修改员工信息
export const updateEmpApi = (data: EmpModel) => request.put('/emps', data)
// 删除员工(支持单删和批量删除)
export const deleteEmpApi = (ids: number | number[]) => {
// 统一处理为逗号分隔的字符串
const idString = Array.isArray(ids) ? ids.join(',') : ids.toString()
return request.delete(`/emps?ids=${idString}`)
}
// 查询所有员工
export const queryAllApi = () => request.get<EmpModel[]>(`/emps/list`)
```
### 优化后的Vue组件代码
```vue
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox, type FormInstance } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import dayjs from 'dayjs'
import {
queryPageApi,
addEmpApi,
queryInfoApi,
updateEmpApi,
deleteEmpApi
} from '@/api/emp'
import type { EmpModel, PageResultModel } from '@/api/model/model'
// 职位映射
const jobMap: Record<number, string> = {
1: '班主任',
2: '讲师',
3: '学工主管',
4: '教研主管',
5: '咨询师'
}
// 职位选项
const jobOptions = Object.entries(jobMap).map(([value, label]) => ({
value: parseInt(value),
label
}))
// 搜索表单
const searchForm = reactive({
name: '',
gender: '',
dateRange: [] as string[] | null
})
// 分页参数(调整为API要求的参数名)
const pagination = reactive({
page: 1, // 注意:这里使用page而不是currentPage
pageSize: 10,
total: 0
})
// 员工数据
const empList = ref<EmpModel[]>([])
const loading = ref(false)
const selectedIds = ref<number[]>([])
// 对话框相关
const dialogVisible = ref(false)
const dialogType = ref<'add' | 'edit'>('add')
const formData = reactive<EmpModel>({
id: undefined,
username: '',
password: '',
name: '',
gender: 1,
phone: '',
job: undefined,
salary: 0,
image: '',
entryDate: dayjs().format('YYYY-MM-DD'),
deptId: undefined,
deptName: ''
})
// 表单验证规则
const formRules = reactive({
username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ pattern: /^1[3-9]\d{9}$/, message: '手机号格式不正确', trigger: 'blur' }
],
job: [{ required: true, message: '请选择职位', trigger: 'change' }],
entryDate: [{ required: true, message: '请选择入职日期', trigger: 'change' }],
deptId: [{ required: true, message: '请选择部门', trigger: 'change' }]
})
// 部门列表(示例数据)
const deptList = ref([
{ id: 1, name: '研发部' },
{ id: 2, name: '市场部' },
{ id: 3, name: '人事部' }
])
// 表单引用
const formRef = ref<FormInstance>()
// 安全加载员工数据
const loadEmpData = async () => {
try {
loading.value = true
// 处理日期参数
let begin: string | undefined = undefined
let end: string | undefined = undefined
if (searchForm.dateRange && searchForm.dateRange.length === 2) {
begin = dayjs(searchForm.dateRange[0]).format('YYYY-MM-DD')
end = dayjs(searchForm.dateRange[1]).format('YYYY-MM-DD')
}
// 构建API参数
const params = {
name: searchForm.name || undefined,
gender: searchForm.gender || undefined,
begin,
end,
page: pagination.page, // 使用page而不是currentPage
pageSize: pagination.pageSize
}
// 调用API获取数据
const response = await queryPageApi(params)
// 处理API响应
empList.value = response.rows || []
pagination.total = response.total || 0
if (empList.value.length === 0) {
ElMessage.info('没有找到符合条件的员工')
}
} catch (error: any) {
ElMessage.error('数据加载失败: ' + (error.message || '未知错误'))
console.error('数据加载错误:', error)
} finally {
loading.value = false
}
}
// 重置搜索
const resetSearch = () => {
searchForm.name = ''
searchForm.gender = ''
searchForm.dateRange = []
loadEmpData()
}
// 表格选择处理
const handleSelectionChange = (selection: EmpModel[]) => {
selectedIds.value = selection.map(item => item.id as number)
}
// 打开对话框
const openDialog = async (type: 'add' | 'edit', row?: EmpModel) => {
dialogType.value = type
if (type === 'edit' && row) {
try {
const response = await queryInfoApi(row.id as number)
// 格式化日期字段
if (response.entryDate) {
response.entryDate = dayjs(response.entryDate).format('YYYY-MM-DD')
}
Object.assign(formData, response)
} catch (error: any) {
ElMessage.error('获取员工信息失败: ' + (error.message || '未知错误'))
return
}
} else {
// 重置表单
Object.assign(formData, {
id: undefined,
username: '',
password: '',
name: '',
gender: 1,
phone: '',
job: undefined,
salary: 0,
image: '',
entryDate: dayjs().format('YYYY-MM-DD'),
deptId: undefined
})
}
dialogVisible.value = true
}
// 提交表单
const submitForm = async () => {
// 验证表单
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
try {
// 确保entryDate格式正确
if (formData.entryDate) {
formData.entryDate = dayjs(formData.entryDate).format('YYYY-MM-DD')
}
if (dialogType.value === 'add') {
await addEmpApi(formData)
} else {
await updateEmpApi(formData)
}
ElMessage.success(dialogType.value === 'add' ? '添加成功' : '更新成功')
dialogVisible.value = false
loadEmpData()
} catch (error: any) {
ElMessage.error('操作失败: ' + (error.message || '未知错误'))
console.error('表单提交错误:', error)
}
}
// 删除员工
const deleteEmp = (id: number) => {
ElMessageBox.confirm('确定要删除该员工吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
await deleteEmpApi(id)
ElMessage.success('删除成功')
loadEmpData()
} catch (error: any) {
ElMessage.error('删除失败: ' + (error.message || '未知错误'))
}
}).catch(() => { /* 取消操作 */ })
}
// 批量删除
const batchDelete = () => {
if (selectedIds.value.length === 0) return
ElMessageBox.confirm(`确定要删除选中的 ${selectedIds.value.length} 名员工吗?`, '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
await deleteEmpApi(selectedIds.value)
ElMessage.success('批量删除成功')
selectedIds.value = []
loadEmpData()
} catch (error: any) {
ElMessage.error('批量删除失败: ' + (error.message || '未知错误'))
}
}).catch(() => { /* 取消操作 */ })
}
// 初始化加载
onMounted(() => {
loadEmpData()
})
</script>
```
### 关键优化点说明
#### 1. API模块优化
```typescript
// 查询员工列表(参数处理优化)
export const queryPageApi = (params: {
name?: string
gender?: string
begin?: string
end?: string
page: number
pageSize: number
}) => {
// 过滤空值并编码参数
const queryParams = Object.entries(params)
.filter(([_, value]) => value !== undefined && value !== null && value !== '')
.map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
.join('&')
return request.get<PageResultModel>(`/emps?${queryParams}`)
}
// 删除员工(支持单删和批量删除)
export const deleteEmpApi = (ids: number | number[]) => {
// 统一处理为逗号分隔的字符串
const idString = Array.isArray(ids) ? ids.join(',') : ids.toString()
return request.delete(`/emps?ids=${idString}`)
}
```
#### 2. 分页参数适配
```typescript
// 分页参数调整(使用page而不是currentPage)
const pagination = reactive({
page: 1, // 注意API参数名是page
pageSize: 10,
total: 0
})
// 在API调用中
const params = {
// ...
page: pagination.page, // 使用page而不是currentPage
pageSize: pagination.pageSize
}
```
#### 3. 响应处理简化
```typescript
// 简化API响应处理(直接使用response)
const response = await queryPageApi(params)
empList.value = response.rows || []
pagination.total = response.total || 0
// 编辑表单获取数据
const response = await queryInfoApi(row.id as number)
Object.assign(formData, response)
```
#### 4. 日期处理优化
```typescript
// 统一使用dayjs处理日期
import dayjs from 'dayjs'
// 在API参数中
if (searchForm.dateRange && searchForm.dateRange.length === 2) {
begin = dayjs(searchForm.dateRange[0]).format('YYYY-MM-DD')
end = dayjs(searchForm.dateRange[1]).format('YYYY-MM-DD')
}
// 在表单中
if (response.entryDate) {
response.entryDate = dayjs(response.entryDate).format('YYYY-MM-DD')
}
// 提交前确保格式
if (formData.entryDate) {
formData.entryDate = dayjs(formData.entryDate).format('YYYY-MM-DD')
}
```
#### 5. 删除操作优化
```typescript
// 删除员工(支持单删和批量删除)
const deleteEmp = (id: number) => {
// 调用删除API
await deleteEmpApi(id) // 单个ID
}
const batchDelete = () => {
// 调用删除API
await deleteEmpApi(selectedIds.value) // 数组
}
```
### 完整解决方案说明
1. **API接口适配**:
- 完全匹配提供的API接口定义
- 参数命名保持一致(使用`page`而不是`currentPage`)
- 支持单删和批量删除的统一处理
2. **参数处理优化**:
- 自动过滤空值参数
- 参数值自动编码
- 日期格式统一处理
3. **响应处理简化**:
- 移除不必要的类型检查
- 直接使用API返回的数据结构
- 简化错误处理流程
4. **日期处理增强**:
- 所有日期操作使用dayjs库
- 确保格式为YYYY-MM-DD
- 空值安全处理
5. **删除操作统一**:
- 单删和批量删除使用同一API
- 自动处理ID数组转换
- 优化用户确认流程
### 使用说明
1. 创建API模块文件:`src/api/emp.ts`
2. 创建模型定义文件:`src/api/model/model.ts`
```typescript
// 基本响应模型
export interface ResultModel<T = any> {
code: number
msg: string
data: T
}
// 分页结果模型
export interface PageResultModel {
rows: any[]
total: number
page: number
pageSize: number
totalPage: number
}
// 员工模型
export interface EmpModel {
id?: number
username: string
password?: string
name: string
gender: number
phone: string
job: number
salary: number
image?: string
entryDate: string
deptId: number
deptName?: string
}
```
3. 在Vue组件中引入并使用:
```vue
<script setup lang="ts">
import { queryPageApi, addEmpApi, /* 其他API */ } from '@/api/emp'
import type { EmpModel, PageResultModel } from '@/api/model/model'
```
4. 确保安装了dayjs依赖:
```bash
npm install dayjs
```
5. 后端API应返回以下格式的数据:
```json
// 分页查询响应
{
"rows": [
{
"id": 1,
"username": "user1",
"name": "张三",
"gender": 1,
"phone": "13800138000",
"job": 1,
"salary": 10000.00,
"entryDate": "2023-01-15",
"deptId": 1,
"deptName": "研发部"
}
],
"total": 1,
"page": 1,
"pageSize": 10,
"totalPage": 1
}
// 单个员工响应
{
"id": 1,
"username": "user1",
"name": "张三",
"gender": 1,
"phone": "13800138000",
"job": 1,
"salary": 10000.00,
"entryDate": "2023-01-15",
"deptId": 1,
"deptName": "研发部"
}
```
### 错误处理增强
```typescript
// 在API模块中添加统一错误处理
const handleRequestError = (error: any) => {
let message = '请求失败'
if (error.response) {
// 处理HTTP错误
switch (error.response.status) {
case 400:
message = '请求参数错误'
break
case 401:
message = '未授权,请登录'
break
case 403:
message = '拒绝访问'
break
case 404:
message = '资源不存在'
break
case 500:
message = '服务器内部错误'
break
default:
message = `请求错误: ${error.response.status}`
}
// 尝试获取后端错误信息
if (error.response.data && error.response.data.msg) {
message = error.response.data.msg
}
} else if (error.request) {
message = '请求未响应,请检查网络'
} else {
message = error.message || '未知错误'
}
ElMessage.error(message)
throw error
}
// 在API调用中使用
export const queryPageApi = (params: {...}) => {
return request.get<PageResultModel>(`/emps?${queryParams}`)
.catch(handleRequestError)
}
```
阅读全文