做黑枸杞的公司网站,景区微网站 建设方案,厦门seo结算,台州企业网站搭建厂家这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 员工管理
1. 条件分页查询
1.1 概述
在页面原型中#xff0c;我们可以看到在查询员工信息列表时#xff0c;既需要根据条件动态查询#xff0c;还需要对查询的结果进行分页处理。 那要完成这个页面… 这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 员工管理
1. 条件分页查询
1.1 概述
在页面原型中我们可以看到在查询员工信息列表时既需要根据条件动态查询还需要对查询的结果进行分页处理。 那要完成这个页面布局我们就需要用到ElementPlus中提供的组件包括 Form表单、Button按钮、Table表格、Pagination分页组件。 1.2 接口文档 1.3 页面布局
1.3.1 搜索栏
搜索栏制作主要用到ElementPlus中的组件包括Button 组件 Form 组件 。 具体的布局代码如下
script setup langts
import type { SearchEmpModel } from /api/model/model;
import {ref, onMounted} from vue
//搜索栏对象声明
const searchEmp refSearchEmpModel({name: ,gender: ,begin: ,end: ,date: []
})
/script
templateh1员工管理/h1 br!-- 搜索栏 --el-form :inlinetrue :modelsearchEmp classdemo-form-inlineel-form-item label姓名el-input v-modelsearchEmp.name placeholder请输入员工姓名 clearable //el-form-itemel-form-item label性别el-select v-modelsearchEmp.gender placeholder请选择 clearableel-option label男 value1 /el-option label女 value2 //el-select/el-form-item
el-form-item label入职时间el-date-picker v-modelsearchEmp.date typedaterange range-separator到 start-placeholder开始时间 end-placeholder结束时间//el-form-item
el-form-itemel-button typeprimary click查询/el-buttonel-button typedefault click重置/el-button/el-form-item/el-form
!-- 按钮 --el-button typeprimary click 新增员工/el-buttonel-button typedanger click- 批量删除/el-button
!-- 表格 --
!-- 分页栏 --
/template
style scoped
/style 浏览器打开页面具体效果如下 我们可以在表单中输入搜索条件看看表单绑定的数据值。 我们可以看到日期时间组件中选择的开始时间和结束时间数据绑定到了 date 属性中是一个数组里面两个值一个开始时间、一个结束时间。 而在执行查询时从接口文档中我们可以看出需要的是开始时间 begin 和 结束时间 end。
而当我们选择的入职时间范围发生变化应该实时计算出 开始时间 begin 和 结束时间 end那这里可以通过Vue框架中的 watch侦听 来解决。 1.3.2 watch侦听对象
作用侦听一个或多个响应式数据源并在数据源变化时调用所给的 回调函数。
语法
1). 导入 watch 函数
2). 执行 watch 函数传入要侦听的响应式数据源ref对象和回调函数 A. 侦听一个响应式对象
//演示watch侦听
const myname refstring()
watch(myname, (newVal, oldVal){console.log(name的值, newVal: ${newVal}, oldVal: ${oldVal});
}) B. 侦听对象的单个属性
//侦听searchEmp对象中的name的变化
watch(() searchEmp.value.name, (newVal , oldVal) {console.log(name的值, newVal: ${newVal}, oldVal: ${oldVal});
}) C. 侦听对象的全部属性深度侦听
watch(searchEmp, (newVal, oldVal) {console.log(name的值, newVal: ${newVal.name}, oldVal: ${oldVal.name});
}, {deep: true}) watch函数的第三个参数是可选的常见两个选项 deep(boolean)是否深度侦听默认浅层侦听。 immediate(boolean)是否在侦听创建时立即触发回调函数 案例中入职日期的侦听如下代码如下
//侦听searchEmp的date属性
watch(() searchEmp.value.date, (newVal, oldVal) {if(newVal.length0) {searchEmp.value.begin newVal[0]searchEmp.value.end newVal[1]}else {searchEmp.value.begin searchEmp.value.end }
}) 1.3.3 数据表格
1). 在 src/views/emp/index.vue 中的 template /template 部分增加如下内容
!-- 表格 --!-- 列表展示 --el-table :datatableData border stylewidth: 100% fit selection-changehandleSelectionChangeel-table-column typeselection width55 /el-table-column propname label姓名 aligncenter width130px /el-table-column label性别 aligncenter width100pxtemplate #defaultscope{{ scope.row.gender 1 ? 男 : 女 }}/template/el-table-columnel-table-column propimage label头像 aligncentertemplate #defaultscopeimg :srcscope.row.image height40/template/el-table-columnel-table-column propdeptName label所属部门 aligncenter /el-table-column propjob label职位 aligncenter width100pxtemplate #defaultscopespan v-ifscope.row.job 1班主任/spanspan v-else-ifscope.row.job 2讲师/spanspan v-else-ifscope.row.job 3学工主管/spanspan v-else-ifscope.row.job 4教研主管/spanspan v-else-ifscope.row.job 5咨询师/spanspan v-else其他/span/template/el-table-columnel-table-column propentryDate label入职时间 aligncenter width130px /el-table-column propupdateTime label最后修改时间 aligncenter /el-table-column label操作 aligncentertemplate #defaultscopeel-button typeprimary sizesmall click编辑/el-buttonel-button typedanger sizesmall click删除/el-button/template/el-table-column/el-tablebr
!-- 分页组件Pagination --el-paginationv-model:current-pagepagination.currentPagev-model:page-sizepagination.pageSize:page-sizes[5, 10, 20, 50, 100]layouttotal, sizes, prev, pager, next, jumper:totalpagination.totalsize-changehandleSizeChangecurrent-changehandleCurrentChange/ 2). 在 src/views/emp/index.vue 中的 script /script 部分增加如下内容
//列表展示数据
const tableData refEmpModelArray([])
//复选框
let selectIds refnumber[]([])
const handleSelectionChange (selection: any[]) {selectIds.value selection.map(item item.id)
}
//分页组件
const pagination refPaginationParam({currentPage: 1, pageSize: 5, total: 0})
//每页展示记录数发生变化时触发
const handleSizeChange (pageSize: number) {pagination.value.pageSize pageSizequeryPage()
}
//当前页码发生变化时触发
const handleCurrentChange (page: number) {pagination.value.currentPage pagequeryPage()
}
//分页条件查询
const queryPage async () {} 1.4 页面交互
1). 为 查询 按钮绑定事件点击查询按钮调用queryPage函数. //分页条件查询
const queryPage async () {const result await queryPageApi(searchEmp.value.begin,searchEmp.value.end,searchEmp.value.gender,searchEmp.value.name,pagination.value.currentPage,pagination.value.pageSize)
if(result.code) {tableData.value result.data.rowspagination.value.total result.data.total}
}
//钩子函数
onMounted(() {queryPage()
}) 2). 为 重置 按钮绑定事件 , 点击重置按钮, 清空搜索表单, 并重新查询. //重置
const reset () {searchEmp.value {name:, begin:, end:, date: [], gender: }queryPage()
} 到此员工列表的动态条件分页查询就已经完成了。 目前 src/views/emp/index.vue 中的完整代码如下
script setup langts
import type { EmpModelArray, PaginationParam, SearchEmpModel } from /api/model/model
import {ref, onMounted, watch} from vue
import { queryPageApi} from /api/emp
//搜索栏对象声明
const searchEmp refSearchEmpModel({ name: , gender: , begin: , end: , date: []})
//列表展示数据
const tableData refEmpModelArray([])
//复选框
let selectIds refnumber[]([])
const handleSelectionChange (selection: any[]) {selectIds.value selection.map(item item.id)
}
//分页组件
const pagination refPaginationParam({currentPage: 1, pageSize: 5, total: 0})
//每页展示记录数发生变化时触发
const handleSizeChange (pageSize: number) {pagination.value.pageSize pageSizequeryPage()
}
//当前页码发生变化时触发
const handleCurrentChange (page: number) {pagination.value.currentPage pagequeryPage()
}
//分页条件查询
const queryPage async () {const result await queryPageApi(searchEmp.value.begin,searchEmp.value.end,searchEmp.value.gender,searchEmp.value.name,pagination.value.currentPage,pagination.value.pageSize)
if(result.code) {tableData.value result.data.rowspagination.value.total result.data.total}
}
//钩子函数
onMounted(() {queryPage()
})
//重置
const reset () {searchEmp.value {name:, begin:, end:, date: [], gender: }queryPage()
}
//侦听searchEmp的date属性
watch(() searchEmp.value.date, (newVal, oldVal) {if(newVal.length0) {searchEmp.value.begin newVal[0]searchEmp.value.end newVal[1]}else {searchEmp.value.begin searchEmp.value.end }
})
/script
templateh1员工管理/h1 br!-- 搜索栏 --el-form :inlinetrue :modelsearchEmp classdemo-form-inlineel-form-item label姓名el-input v-modelsearchEmp.name placeholder请输入员工姓名 clearable //el-form-itemel-form-item label性别el-select v-modelsearchEmp.gender placeholder请选择 clearableel-option label男 value1 /el-option label女 value2 //el-select/el-form-item
el-form-item label入职时间el-date-picker v-modelsearchEmp.date typedaterange value-formatYYYY-MM-DD range-separator到 start-placeholder开始时间 end-placeholder结束时间//el-form-item
el-form-itemel-button typeprimary clickqueryPage()查询/el-buttonel-button typedefault clickreset()重置/el-button/el-form-item/el-form
!-- 按钮 --el-button typeprimary click 新增员工/el-buttonel-button typedanger click- 批量删除/el-buttonbrbr!-- 表格 --!-- 列表展示 --el-table :datatableData border stylewidth: 100% fit selection-changehandleSelectionChangeel-table-column typeselection width55 /el-table-column propname label姓名 aligncenter width130px /el-table-column label性别 aligncenter width100pxtemplate #defaultscope{{ scope.row.gender 1 ? 男 : 女 }}/template/el-table-columnel-table-column propimage label头像 aligncentertemplate #defaultscopeimg :srcscope.row.image height40/template/el-table-columnel-table-column propdeptName label所属部门 aligncenter /el-table-column propjob label职位 aligncenter width100pxtemplate #defaultscopespan v-ifscope.row.job 1班主任/spanspan v-else-ifscope.row.job 2讲师/spanspan v-else-ifscope.row.job 3学工主管/spanspan v-else-ifscope.row.job 4教研主管/spanspan v-else-ifscope.row.job 5咨询师/spanspan v-else其他/span/template/el-table-columnel-table-column propentryDate label入职时间 aligncenter width130px /el-table-column propupdateTime label最后修改时间 aligncenter /el-table-column label操作 aligncentertemplate #defaultscopeel-button typeprimary sizesmall click编辑/el-buttonel-button typedanger sizesmall click删除/el-button/template/el-table-column/el-tablebr
!-- 分页组件Pagination --el-paginationv-model:current-pagepagination.currentPagev-model:page-sizepagination.pageSize:page-sizes[5, 10, 20, 50, 100]layouttotal, sizes, prev, pager, next, jumper:totalpagination.totalsize-changehandleSizeChangecurrent-changehandleCurrentChange//template
style scoped
/style 最终打开浏览器效果如下 2. 新增员工
2.1 需求分析
通过页面原型我们可以看到新增员工的表单提交的数据包括员工的基本数据员工的工作经历数据。 2.2 页面布局
2.2.1 介绍
我们看到这个表单每一行放了两个表单项。 而头像这一行是一个表单项这里呢我们可以使用 ElementPlus 提供的 layout 布局来实现。通过基础的 24 分栏迅速简便地创建布局。 2.2.2 基本信息
先来完成员工基本信息表单的制作。 具体的代码如下
1). template /template 中的布局代码如下
!-- 新增员工/修改员工-Dialog --!-- 新增/修改员工对话框 --el-dialog v-modeldialogFormVisible :titleformTitleel-form :modelemp !-- 第一行 --el-rowel-col :span12el-form-item label用户名 :label-widthlabelWidth propusernameel-input v-modelemp.username //el-form-item/el-colel-col :span12el-form-item label姓名 :label-widthlabelWidth propnameel-input v-modelemp.name //el-form-item/el-col/el-row!-- 第二行 --el-rowel-col :span12el-form-item label性别 :label-widthlabelWidth propgenderel-select v-modelemp.gender placeholder请选择 stylewidth: 100%;el-option v-forgender in genders :labelgender.name :valuegender.value //el-select/el-form-item/el-colel-col :span12el-form-item label手机号 :label-widthlabelWidth propphoneel-input v-modelemp.phone //el-form-item/el-col/el-row
!-- 第三行 --el-rowel-col :span12el-form-item label薪资 :label-widthlabelWidth propsalaryel-input v-modelemp.salary //el-form-item/el-colel-col :span12el-form-item label入职日期 :label-widthlabelWidthel-date-picker v-modelemp.entryDate typedate placeholder请选择入职日期 value-formatYYYY-MM-DD stylewidth: 100%;//el-form-item/el-col/el-row
!-- 第四行 --el-rowel-col :span12el-form-item label所属部门 :label-widthlabelWidthel-select v-modelemp.deptId placeholder请选择 stylewidth: 100%;el-option v-fordept in depts :labeldept.name :valuedept.id //el-select/el-form-item/el-colel-col :span12el-form-item label职位 :label-widthlabelWidthel-select v-modelemp.job placeholder请选择 stylewidth: 100%;el-option v-forjob in jobs :labeljob.name :valuejob.value //el-select/el-form-item/el-col/el-row
!-- 第五行 --el-row :gutter10el-col :span24el-form-item label头像 label-width80pxel-upload classavatar-uploader action/api/upload :show-file-listfalse:on-successhandleAvatarSuccess :before-uploadbeforeAvatarUploadimg v-ifemp.image :srcemp.image classavatar /el-icon v-else classavatar-uploader-iconPlus //el-icon/el-upload/el-form-item/el-col/el-row/el-form
template #footerspan classdialog-footerel-button clickdialogFormVisible false; 取消/el-buttonel-button typeprimary click保存/el-button/span/template
/el-dialog 2). script /script 中的代码如下
//钩子函数 - 添加调用queryAllDept() 代码
onMounted(() {queryPage()queryAllDept()
})
//查询所有部门
const depts refDeptModelArray([])
const queryAllDept async () {const result await queryAllApi()if(result.code) {depts.value result.data}
}
//----------- 新增 / 修改 ---------------------------
//职位列表数据
const jobs ref([{ name: 班主任, value: 1 },{ name: 讲师, value: 2 },{ name: 学工主管, value: 3 },{ name: 教研主管, value: 4 },{ name: 咨询师, value: 5 },{ name: 其他, value: 6 }])
//性别列表数据
const genders ref([{ name: 男, value: 1 }, { name: 女, value: 2 }])
let dialogFormVisible refboolean(false) //控制新增/修改的对话框的显示与隐藏
let labelWidth refnumber(80) //form表单label的宽度
let formTitle refstring() //表单的标题
let emp refEmpModel({ //员工对象-表单数据绑定username: ,password: ,name: ,gender: ,phone: ,job: ,salary: ,image: ,entryDate: ,deptId: ,exprList: []
})
//文件上传
// let imageUrl refstring()
const handleAvatarSuccess: UploadProps[onSuccess] (response, uploadFile) {emp.value.image response.data;
}
const beforeAvatarUpload: UploadProps[beforeUpload] (rawFile) {if (rawFile.type ! image/jpeg rawFile.type ! image/png) {ElMessage.error(图片格式不支持!)return false} else if (rawFile.size / 1024 / 1024 10) {ElMessage.error(图片大小不能超过 10 MB!)return false}return true
}
//新增员工-打开对话框
const add () {dialogFormVisible.value trueformTitle.value 新增员工
}
//清空表单
const clearEmp () {emp.value {username: ,password: ,name: ,gender: ,phone: ,job: ,salary: ,image: ,entryDate: ,deptId: ,exprList: new ArrayEmpExprModel()}
} 3). style /style 的css样式代码如下: .avatar-uploader .avatar {width: 78px;height: 78px;display: block;}.avatar-uploader .el-upload:hover {border-color: var(--el-color-primary);}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 78px;height: 78px;text-align: center;border: 1px dashed #ccc;border-radius: 5px;} 打开浏览器看到新增员工的表单呈现出来了 2.2.3 工作经历
2.2.3.1 思路 新增员工的基本信息表单已经制作完成了那接下来要制作的是员工的工作经历。 员工的过往工作经历可能是多条点击 添加员工工作经历 按钮如何增加一个条目 点击每一条后面的删除按钮需要删除当前条件 Vue是基于数据驱动视图展示的。 添加 时我们可以往数组中添加数据。 删除 时可以删除数组中的元素。 一旦数据发生变化视图中的展示就会发生变化。
2.2.3.2 实现
1). 在 template /template 中定义的表单中增加如下代码 !-- 第六行 --!-- 第六行 --el-row :gutter10el-col :span24el-form-item label工作经历 :label-widthlabelWidthel-button typesuccess sizesmall clickaddWorkItem 添加工作经历/el-button/el-form-item/el-col/el-row
!-- 第七...行 --el-row :gutter5 v-forexpr in emp.exprListel-col :span10el-form-item label时间 sizesmall :label-widthlabelWidthel-date-picker v-modelexpr.exprDate typedaterange range-separator至 start-placeholder开始时间 end-placeholder结束时间 value-formatYYYY-MM-DD//el-form-item/el-colel-col :span6el-form-item label公司 sizesmallel-input v-modelexpr.company placeholder公司名称//el-form-item/el-col
el-col :span6el-form-item label职位 sizesmallel-input v-modelexpr.job placeholder职位名称//el-form-item/el-col
el-col :span2el-form-item sizesmallel-button typedanger clickdelWorkItem(expr)- 删除/el-button/el-form-item/el-col/el-row 2). 在 script /script 中增加如下代码
//动态添加工作经历 .
const addWorkItem () {emp.value.exprList.push({exprDate: [],begin: ,end: ,company: ,job: })
}
//动态删除工作经历 .
const delWorkItem (expr: EmpExprModel) {if(emp.value.exprList) {const index emp.value.exprList.indexOf(expr)if(index ! -1){emp.value.exprList.splice(index,1)}}
}
//监听-emp员工对象中的工作经历数据
watch(emp, (newVal, oldVal) {if(emp.value.exprList) {emp.value.exprList.forEach(expr {expr.begin expr.exprDate[0]expr.end expr.exprDate[1]})}
}, {deep: true}) 打开浏览器点击 新增员工点击 “添加员工工作经历” 测试 2.3 页面交互
基本的页面布局我们完成之后接下来就需要完成页面的交互操作。 当点击 “保存” 按钮需要执行如下操作 点击保存之后发送异步请求到服务端提交数据。 保存完毕之后如果成功关闭对话框重新加载列表数据。 保存完毕之后如果失败提示错误信息。
具体操作如下
1). 为 保存按钮 绑定事件
//-------------保存员工信息
const save async () {//表单校验let result await addApi(emp.value)if(result.code) {ElMessage.success(操作成功)dialogFormVisible.value falsequeryPage()}else {ElMessage.error(result.msg)}
}
2). 在 script/script 中定义函数 2.4 表单校验
结合页面原型及接口文档梳理校验规则
字段是否必填其他限制用户名是长度2-20姓名是2-10性别是手机号是符合手机号规则正则薪资否全为数字第一位不为0正则
1). 参照 Element Plus 中的Form表单组件定义校验规则
//表单校验规则
const empFormRef refFormInstance()
const rules refFormRulesEmpModel({username: [{ required: true, message: 用户名为必填项, trigger: blur },{ min: 2, max: 20, message: 用户名长度为2-20个字, trigger: blur }],name: [{ required: true, message: 姓名为必填项, trigger: blur },{ min: 2, max: 10, message: 姓名长度为2-10个字, trigger: blur }],gender: [{ required: true, message: 性别为必填项, trigger: change }],phone: [{ required: true, message: 手机号为必填项, trigger: blur },{ pattern: /^1[3-9]\d{9}$/g, message: 请输入合法的手机号, trigger: blur }],salary: [{ pattern: /^[1-9]\d*$/g, message: 请输入合法的数字, trigger: blur }]
}) 2). 将校验规则与Form表单组件进行属性绑定 3). 在保存员工时进行表单校验校验通过再提交数据 完善 save 函数完善后的代码如下
const save async (form: FormInstance|undefined) {if(!form) return;//表单校验form.validate(async (valid) {if(valid) {let result await addApi(emp.value)if(result.code) {ElMessage.success(操作成功)dialogFormVisible.value falsequeryPage()}else {ElMessage.error(result.msg)} }})
} 4). 点击取消、新增、修改时重置表单校验规则
//重置表单
const resetForm (empForm: FormInstance | undefined) {if (!empForm) returnempForm.resetFields()
}
新增员工时重置表单校验规则 点击取消时重置表单校验规则 打开浏览器访问测试 到此呢关于员工列表的动态条件分页查询。 新增员工的功能我们都已经实现了目前 src/views/emp/index.vue 文件的代码如下:
script setup langts
import type { DeptModelArray, EmpExprModel, EmpModel, EmpModelArray, PaginationParam, SearchEmpModel } from /api/model/model
import { ref, onMounted, watch } from vue
import { addApi, queryPageApi } from /api/emp
import { queryAllApi } from /api/dept
import { ElMessage, type FormInstance, type FormRules, type UploadProps } from element-plus;
//搜索栏对象声明
const searchEmp refSearchEmpModel({ name: , gender: , begin: , end: , date: []})
//列表展示数据
const tableData refEmpModelArray([])
//复选框
let selectIds refnumber[]([])
const handleSelectionChange (selection: any[]) {selectIds.value selection.map(item item.id)
}
//分页组件
const pagination refPaginationParam({currentPage: 1, pageSize: 5, total: 0})
//每页展示记录数发生变化时触发
const handleSizeChange (pageSize: number) {pagination.value.pageSize pageSizequeryPage()
}
//当前页码发生变化时触发
const handleCurrentChange (page: number) {pagination.value.currentPage pagequeryPage()
}
//分页条件查询
const queryPage async () {const result await queryPageApi(searchEmp.value.begin,searchEmp.value.end,searchEmp.value.gender,searchEmp.value.name,pagination.value.currentPage,pagination.value.pageSize)
if(result.code) {tableData.value result.data.rowspagination.value.total result.data.total}
}
//钩子函数
onMounted(() {queryPage()queryAllDept()
})
//查询所有部门
const depts refDeptModelArray([])
const queryAllDept async () {const result await queryAllApi()if(result.code) {depts.value result.data}
}
//重置
const reset () {searchEmp.value {name:, begin:, end:, date: [], gender: }queryPage()
}
//侦听searchEmp的date属性
watch(() searchEmp.value.date, (newVal, oldVal) {if(newVal.length0) {searchEmp.value.begin newVal[0]searchEmp.value.end newVal[1]}else {searchEmp.value.begin searchEmp.value.end }
})
//----------- 新增 / 修改 ---------------------------
//职位列表数据
const jobs ref([{ name: 班主任, value: 1 },{ name: 讲师, value: 2 },{ name: 学工主管, value: 3 },{ name: 教研主管, value: 4 },{ name: 咨询师, value: 5 },{ name: 其他, value: 6 }])
//性别列表数据
const genders ref([{ name: 男, value: 1 }, { name: 女, value: 2 }])
let dialogFormVisible refboolean(false) //控制新增/修改的对话框的显示与隐藏
let labelWidth refnumber(80) //form表单label的宽度
let formTitle refstring() //表单的标题
let emp refEmpModel({ //员工对象-表单数据绑定username: ,password: ,name: ,gender: ,phone: ,job: ,salary: ,image: ,entryDate: ,deptId: ,exprList: []
})
//文件上传
// let imageUrl refstring()
const handleAvatarSuccess: UploadProps[onSuccess] (response, uploadFile) {emp.value.image response.data;
}
const beforeAvatarUpload: UploadProps[beforeUpload] (rawFile) {if (rawFile.type ! image/jpeg rawFile.type ! image/png) {ElMessage.error(图片格式不支持!)return false} else if (rawFile.size / 1024 / 1024 10) {ElMessage.error(图片大小不能超过 10 MB!)return false}return true
}
//新增员工-打开对话框
const add () {dialogFormVisible.value trueformTitle.value 新增员工
}
//动态添加工作经历 .
const addWorkItem () {emp.value.exprList.push({exprDate: [],begin: ,end: ,company: ,job: })
}
//动态删除工作经历 .
const delWorkItem (expr: EmpExprModel) {if(emp.value.exprList) {const index emp.value.exprList.indexOf(expr)if(index ! -1){emp.value.exprList.splice(index,1)}}
}
//-------------保存员工信息
const save async (form: FormInstance|undefined) {if(!form) return;//表单校验form.validate(async (valid) {if(valid) {let result await addApi(emp.value)if(result.code) {ElMessage.success(操作成功)dialogFormVisible.value falsequeryPage()}else {ElMessage.error(result.msg)} }})
}
//表单校验规则
const empFormRef refFormInstance()
const rules refFormRulesEmpModel({username: [{ required: true, message: 用户名为必填项, trigger: blur },{ min: 2, max: 20, message: 用户名长度为2-20个字, trigger: blur }],name: [{ required: true, message: 姓名为必填项, trigger: blur },{ min: 2, max: 10, message: 姓名长度为2-10个字, trigger: blur }],gender: [{ required: true, message: 性别为必填项, trigger: change }],phone: [{ required: true, message: 手机号为必填项, trigger: blur },{ pattern: /^1[3-9]\d{9}$/g, message: 请输入合法的手机号, trigger: blur }],salary: [{ pattern: /^[1-9]\d*$/g, message: 请输入合法的数字, trigger: blur }]
})
//重置表单
const resetForm (empForm: FormInstance | undefined) {if (!empForm) returnempForm.resetFields()
}
//清空表单
const clearEmp () {emp.value {username: ,password: ,name: ,gender: ,phone: ,job: ,salary: ,image: ,entryDate: ,deptId: ,exprList: new ArrayEmpExprModel()}
}
/script
templateh1员工管理/h1 br!-- 搜索栏 --el-form :inlinetrue :modelsearchEmp classdemo-form-inlineel-form-item label姓名el-input v-modelsearchEmp.name placeholder请输入员工姓名 clearable //el-form-itemel-form-item label性别el-select v-modelsearchEmp.gender placeholder请选择 clearableel-option label男 value1 /el-option label女 value2 //el-select/el-form-item
el-form-item label入职时间el-date-picker v-modelsearchEmp.date typedaterange value-formatYYYY-MM-DD range-separator到 start-placeholder开始时间 end-placeholder结束时间//el-form-item
el-form-itemel-button typeprimary clickqueryPage()查询/el-buttonel-button typedefault clickreset()重置/el-button/el-form-item/el-form
!-- 按钮 --el-button typeprimary clickadd(); resetForm(empFormRef); clearEmp() 新增员工/el-buttonel-button typedanger click- 批量删除/el-buttonbrbr
!-- 表格 --!-- 列表展示 --el-table :datatableData border stylewidth: 100% fit selection-changehandleSelectionChangeel-table-column typeselection width55 /el-table-column propname label姓名 aligncenter width130px /el-table-column label性别 aligncenter width100pxtemplate #defaultscope{{ scope.row.gender 1 ? 男 : 女 }}/template/el-table-columnel-table-column propimage label头像 aligncentertemplate #defaultscopeimg :srcscope.row.image height40/template/el-table-columnel-table-column propdeptName label所属部门 aligncenter /el-table-column propjob label职位 aligncenter width100pxtemplate #defaultscopespan v-ifscope.row.job 1班主任/spanspan v-else-ifscope.row.job 2讲师/spanspan v-else-ifscope.row.job 3学工主管/spanspan v-else-ifscope.row.job 4教研主管/spanspan v-else-ifscope.row.job 5咨询师/spanspan v-else其他/span/template/el-table-columnel-table-column propentryDate label入职时间 aligncenter width130px /el-table-column propupdateTime label最后修改时间 aligncenter /el-table-column label操作 aligncentertemplate #defaultscopeel-button typeprimary sizesmall click编辑/el-buttonel-button typedanger sizesmall click删除/el-button/template/el-table-column/el-tablebr
!-- 分页组件Pagination --el-paginationv-model:current-pagepagination.currentPagev-model:page-sizepagination.pageSize:page-sizes[5, 10, 20, 50, 100]layouttotal, sizes, prev, pager, next, jumper:totalpagination.totalsize-changehandleSizeChangecurrent-changehandleCurrentChange/!-- 新增员工/修改员工-Dialog --!-- 新增/修改员工对话框 --el-dialog v-modeldialogFormVisible :titleformTitleel-form :modelemp refempFormRef :rulesrules!-- 第一行 --el-rowel-col :span12el-form-item label用户名 :label-widthlabelWidth propusernameel-input v-modelemp.username //el-form-item/el-colel-col :span12el-form-item label姓名 :label-widthlabelWidth propnameel-input v-modelemp.name //el-form-item/el-col/el-row!-- 第二行 --el-rowel-col :span12el-form-item label性别 :label-widthlabelWidth propgenderel-select v-modelemp.gender placeholder请选择 stylewidth: 100%;el-option v-forgender in genders :labelgender.name :valuegender.value //el-select/el-form-item/el-colel-col :span12el-form-item label手机号 :label-widthlabelWidth propphoneel-input v-modelemp.phone //el-form-item/el-col/el-row
!-- 第三行 --el-rowel-col :span12el-form-item label薪资 :label-widthlabelWidth propsalaryel-input v-modelemp.salary //el-form-item/el-colel-col :span12el-form-item label入职日期 :label-widthlabelWidthel-date-picker v-modelemp.entryDate typedate placeholder请选择入职日期 value-formatYYYY-MM-DD stylewidth: 100%;//el-form-item/el-col/el-row
!-- 第四行 --el-rowel-col :span12el-form-item label所属部门 :label-widthlabelWidthel-select v-modelemp.deptId placeholder请选择 stylewidth: 100%;el-option v-fordept in depts :labeldept.name :valuedept.id //el-select/el-form-item/el-colel-col :span12el-form-item label职位 :label-widthlabelWidthel-select v-modelemp.job placeholder请选择 stylewidth: 100%;el-option v-forjob in jobs :labeljob.name :valuejob.value //el-select/el-form-item/el-col/el-row
!-- 第五行 --el-row :gutter10el-col :span24el-form-item label头像 label-width80pxel-upload classavatar-uploader action/api/upload :show-file-listfalse:on-successhandleAvatarSuccess :before-uploadbeforeAvatarUploadimg v-ifemp.image :srcemp.image classavatar /el-icon v-else classavatar-uploader-iconPlus //el-icon/el-upload/el-form-item/el-col/el-row
!-- 第六行 --!-- 第六行 --el-row :gutter10el-col :span24el-form-item label工作经历 :label-widthlabelWidthel-button typesuccess sizesmall clickaddWorkItem 添加工作经历/el-button/el-form-item/el-col/el-row
!-- 第七...行 --el-row :gutter5 v-forexpr in emp.exprListel-col :span10el-form-item label时间 sizesmall :label-widthlabelWidthel-date-picker v-modelexpr.exprDate typedaterange range-separator至 start-placeholder开始时间 end-placeholder结束时间 value-formatYYYY-MM-DD//el-form-item/el-colel-col :span6el-form-item label公司 sizesmallel-input v-modelexpr.company placeholder公司名称//el-form-item/el-col
el-col :span6el-form-item label职位 sizesmallel-input v-modelexpr.job placeholder职位名称//el-form-item/el-col
el-col :span2el-form-item sizesmallel-button typedanger clickdelWorkItem(expr)- 删除/el-button/el-form-item/el-col/el-row
/el-form
template #footerspan classdialog-footerel-button clickdialogFormVisible false; resetForm(empFormRef)取消/el-buttonel-button typeprimary clicksave(empFormRef)保存/el-button/span/template
/el-dialog
/template
style scoped.avatar-uploader .avatar {width: 78px;height: 78px;display: block;}.avatar-uploader .el-upload:hover {border-color: var(--el-color-primary);}.el-icon.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 78px;height: 78px;text-align: center;border: 1px dashed #ccc;border-radius: 5px;}
/style 文章转载自: http://www.morning.jkszt.cn.gov.cn.jkszt.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn http://www.morning.zqkms.cn.gov.cn.zqkms.cn http://www.morning.tclqf.cn.gov.cn.tclqf.cn http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.ztmkg.cn.gov.cn.ztmkg.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn http://www.morning.mztyh.cn.gov.cn.mztyh.cn http://www.morning.ltspm.cn.gov.cn.ltspm.cn http://www.morning.yrdkl.cn.gov.cn.yrdkl.cn http://www.morning.qxltp.cn.gov.cn.qxltp.cn http://www.morning.ygztf.cn.gov.cn.ygztf.cn http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn http://www.morning.rqdx.cn.gov.cn.rqdx.cn http://www.morning.mlyq.cn.gov.cn.mlyq.cn http://www.morning.nnykz.cn.gov.cn.nnykz.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn http://www.morning.hmnhp.cn.gov.cn.hmnhp.cn http://www.morning.wmrgp.cn.gov.cn.wmrgp.cn http://www.morning.qlrtd.cn.gov.cn.qlrtd.cn http://www.morning.fnzbx.cn.gov.cn.fnzbx.cn http://www.morning.kpbn.cn.gov.cn.kpbn.cn http://www.morning.cwnqd.cn.gov.cn.cwnqd.cn http://www.morning.ykmg.cn.gov.cn.ykmg.cn http://www.morning.mgbsp.cn.gov.cn.mgbsp.cn http://www.morning.ngcbd.cn.gov.cn.ngcbd.cn http://www.morning.ltksw.cn.gov.cn.ltksw.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.tsnq.cn.gov.cn.tsnq.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.gnbfj.cn.gov.cn.gnbfj.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn http://www.morning.xykst.cn.gov.cn.xykst.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.wjplm.cn.gov.cn.wjplm.cn http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn http://www.morning.smry.cn.gov.cn.smry.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn http://www.morning.kwcnf.cn.gov.cn.kwcnf.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.fqqlq.cn.gov.cn.fqqlq.cn http://www.morning.ppbqz.cn.gov.cn.ppbqz.cn http://www.morning.bxczt.cn.gov.cn.bxczt.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.qyjqj.cn.gov.cn.qyjqj.cn http://www.morning.bpmns.cn.gov.cn.bpmns.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.pcgjj.cn.gov.cn.pcgjj.cn http://www.morning.klwxh.cn.gov.cn.klwxh.cn http://www.morning.sdkaiyu.com.gov.cn.sdkaiyu.com http://www.morning.jqrp.cn.gov.cn.jqrp.cn http://www.morning.ptzf.cn.gov.cn.ptzf.cn http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn http://www.morning.gxcym.cn.gov.cn.gxcym.cn http://www.morning.fgxr.cn.gov.cn.fgxr.cn http://www.morning.gczqt.cn.gov.cn.gczqt.cn http://www.morning.dbcw.cn.gov.cn.dbcw.cn http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn http://www.morning.jpdbj.cn.gov.cn.jpdbj.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.zfgh.cn.gov.cn.zfgh.cn http://www.morning.dwmtk.cn.gov.cn.dwmtk.cn http://www.morning.qgcfb.cn.gov.cn.qgcfb.cn http://www.morning.mfct.cn.gov.cn.mfct.cn http://www.morning.jbfzx.cn.gov.cn.jbfzx.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn http://www.morning.stbhn.cn.gov.cn.stbhn.cn http://www.morning.btns.cn.gov.cn.btns.cn