【JavaWeb学习Day27】

Tlias前端

员工管理

条件分页查询:

页面布局

搜索栏:

  
<!-- 搜索栏 --><div class="container"><el-form :inline="true" :model="searchEmp" class="demo-form-inline"><el-form-item label="姓名"><el-input  v-model="searchEmp.name" placeholder="请输入员工姓名" /></el-form-item><el-form-item label="性别"><el-select v-model="searchEmp.gender" placeholder="请选择"><el-option label="男" value="1" /><el-option label="女" value="2" /></el-select></el-form-item><el-form-item label="入职时间"><el-date-picker v-model="searchEmp.date" type="daterange" range-separator="到" start-placeholder="开始日期"end-placeholder="结束日期" :size="size" value-format="YYYY-MM-DD"/></el-form-item><el-form-item><el-button type="primary" @click="search">查询</el-button><el-button type="info" @click="clear">清空</el-button></el-form-item></el-form></div>

Watch:

作用:侦听一个或多个响应式数据源,并在数据源变化时调用传入的回调函数。

用法:1.导入Watch函数2.执行watch函数,传入要侦听的响应式数据源(ref对象)和回调函数

单个响应式变量:

侦听对象的全部属性:

第三个可选参数,常见两个选项:

deep(boolean)是否深度侦听,默认浅层侦听。

immediate(boolean)是否在侦听时创建立即触发的回调函数。

侦听对象的单个属性;

import { ref ,watch} from 'vue'
const searchEmp = ref({name: '',gender: '',date: [],begin: '',end: ''})
//侦听searchEmp的date
watch(() => searchEmp.value.date,(newval,oldval) => {if(searchEmp.value.date.length == 2 ){searchEmp.value.begin = newval[0]searchEmp.value.end = newval[1] }else{searchEmp.value.begin = ''searchEmp.value.end = ''}
})

按钮:

<!-- 按钮 --><div class="container"><el-button type="primary" @click="">+新增员工</el-button><el-button type="danger" @click="">-批量删除</el-button></div>

数据展示表格:

<div class="container"><el-table :data="empList" style="width: 100%"><el-table-column type="selection" width="55" /><el-table-column prop="name" label="姓名" width="120" align="center" /><el-table-column label="性别" width="120" align="center"><template #default="scope">{{ scope.row.gender == 1 ? '男' : '女' }}</template></el-table-column><el-table-column label="头像" align="center" width="180"><template #default="scope"><el-image :src="scope.row.image" style="width:40px" /></template></el-table-column><el-table-column prop="deptName" label="所属部门" width="120" align="center" /><el-table-column prop="job" label="职位" width="120" align="center"><template #default="scope"><span v-if="scope.row.job == 1">班主任</span><span v-else-if="scope.row.job == 2">讲师</span><span v-else-if="scope.row.job == 3">学工主管</span><span v-else-if="scope.row.job == 4">教研主管</span><span v-else-if="scope.row.job == 5">咨询师</span><span v-else>其他</span></template></el-table-column><el-table-column prop="entryDate" label="入职日期" width="180" align="center" /><el-table-column prop="updateTime" label="最后操作时间" width="180" align="center" /><!-- 操作 --><el-table-column label="操作" width="180" align="center"><template #default="scope"><el-button type="primary" size="small" @click=""><el-icon><EditPen /></el-icon>编辑</el-button><el-button type="danger" size="small" @click=""><el-icon><Delete /></el-icon>删除</el-button></template></el-table-column></el-table></div>

分页条:

//定义员工列表
const empList = ref([])
//分页
const currentPage = ref(1)//当前页
const pageSize = ref(10)//每页显示多少条
const background = ref(true)
const total = ref(0)
// 查询
const search = async () => {const res = await queryPageApi(searchEmp.value.name, searchEmp.value.gender,searchEmp.value.begin, searchEmp.value.end, currentPage.value, pageSize.value)if(res.code){empList.value = res.data.rowstotal.value = res.data.total }
​
}
//每页展示记录数变化时
const handleSizeChange = (val) => {search()
}
//当前页变化时
const handleCurrentChange = (val) => {search()
}
<!-- 分页条 --><div class="container"><el-paginationv-model:current-page="currentPage"v-model:page-size="pageSize":page-sizes="[5, 10, 15, 20, 25, 30, 35, 40]":background="background"layout="total, sizes, prev, pager, next, jumper":total="total"@size-change="handleSizeChange"@current-change="handleCurrentChange"/></div>

页面交互:

1.页面加载完毕后,查询员工信息列表

2.点击查询按钮,查询员工信息列表

3.当页码、每页展示记录数发生变化时,查询员工信息列表

新增员工:

新增员工信息的表单包含两个部分:

员工的基本信息

员工的工作经历信息

新增/修改员工的对话框:

1.表单项数据动态展示:

性别(男/女) 职位(班主任/讲师/学工主管/教研主管/) 所属部门(动态查询)

2.工作经历:

添加工作经历:下方就会增加一个工作经历信息

删除工作经历:删除当前这一个工作经历信息

(Vue是基于数据驱动视图展示的)

  
  <!-- 新增/修改员工的对话框 -->
​<el-dialog v-model="dialogVisible" :title="dialogTitle">{{ employee }}<el-form ref="employeeFormRef" :model="employee" label-width="80px"><!-- 基本信息 --><!-- 第一行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="用户名"><el-input v-model="employee.username" placeholder="请输入员工用户名,2-20个字"></el-input></el-form-item></el-col>
​<el-col :span="12"><el-form-item label="姓名"><el-input v-model="employee.name" placeholder="请输入员工姓名,2-10个字"></el-input></el-form-item></el-col></el-row><!-- 第二行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="性别"><el-select v-model="employee.gender" placeholder="请选择性别" style="width: 100%;"><el-option v-for="g in genders" :label="g.name" :value="g.value"></el-option></el-select></el-form-item></el-col>
​<el-col :span="12"><el-form-item label="手机号"><el-input v-model="employee.phone" placeholder="请输入员工手机号"></el-input></el-form-item></el-col></el-row><!-- 第三行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="职位"><el-select v-model="employee.job" placeholder="请选择职位" style="width: 100%;"><el-option v-for="j in jobs" :label="j.name" :value="j.value"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="薪资"><el-input v-model="employee.salary" placeholder="请输入员工薪资"></el-input></el-form-item></el-col></el-row><!-- 第四行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="所属部门"><el-select v-model="employee.deptId" placeholder="请选择部门" style="width: 100%;"><el-option v-for="d in deptList" :label="d.name" :key="d.id" :value="d.id"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="入职日期"><el-date-picker v-model="employee.entryDate" type="date" style="width: 100%;" placeholder="选择日期"format="YYYY-MM-DD" value-format="YYYY-MM-DD"></el-date-picker></el-form-item></el-col></el-row><!-- 第五行 --><el-row :gutter="20"><el-col :span="24"><el-form-item label="头像"><el-upload class="avatar-uploader" action="/api/upload" :show-file-list="false":on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload"><img v-if="employee.image" :src="employee.image" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload></el-form-item></el-col></el-row><!-- 工作经历 --><!-- 第六行 --><el-row :gutter="10"><el-col :span="24"><el-form-item label="工作经历"><el-button type="success" size="small" @click="addExpr">+ 添加工作经历</el-button></el-form-item></el-col></el-row><!-- 第七行 ...  工作经历 --><el-row :gutter="3" v-for="(expr, index) in employee.exprList"><el-col :span="10"><el-form-item size="small" v-model="expr.value.exprDate" label="时间" label-width="80px"><el-date-picker type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"format="YYYY-MM-DD" value-format="YYYY-MM-DD"></el-date-picker></el-form-item></el-col>
​<el-col :span="6"><el-form-item size="small" v-model="expr.company" label="公司" label-width="60px"><el-input placeholder="请输入公司名称"></el-input></el-form-item></el-col>
​<el-col :span="6"><el-form-item size="small" v-model="expr.job" label="职位" label-width="60px"><el-input placeholder="请输入职位"></el-input></el-form-item></el-col>
​<el-col :span="2"><el-form-item size="small" label-width="0px"><el-button type="danger" @click="deleteExpr(index)">- 删除</el-button></el-form-item></el-col></el-row></el-form><!-- 底部按钮 --><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" @click="">保存</el-button></span></template>
​</el-dialog>

保存:

1.点击保存之后,发送异步请求到服务器,提交数据。

2.保存完毕后,如果成功,关闭对话框,重新加载列表数据。

3.保存完毕后,如果失败,提示错误信息。

修改员工:

查询回显:

为编辑按钮绑定事件,发送异步请求,根据ID查询员工详细信息,页面回显

 

​
//编辑员工信息
const editEmp = async (id) => {const result = await queryEmpByIdApi(id)if (result.code) {dialogVisible.value = truedialogTitle.value = '修改员工'employee.value = result.data} else {ElMessage.error(result.msg)}//对工作经历数据进行处理let exprList = employee.value.exprList//判断exprList是否有值和长度大于0if (exprList && exprList.length > 0) {exprList.forEach((expr) => {expr.exprDate = [expr.begin, expr.end]})}
}​

保存数据:

点击保存按钮,执行修改数据操作,备注:添加员工和修改员工使用的是同一个表单,需要根据id判断到底是执行新增还是修改。

//保存员工信息
const save = async () => {if (!employeeFormRef.value) {return}employeeFormRef.value.validate(async valid => {if (valid) { // 校验通过let result;if (employee.value.id) {result = await editEmpApi(employee.value)} else {result = await addEmpApi(employee.value)}if (result.code) {ElMessage.success('保存成功')dialogVisible.value = falsesearch()
​} else {ElMessage.error(result.msg)}} else {ElMessage.error('表单校验失败')}})
}

删除员工:

在删除员工信息时,有两个操作路口:

1.点击每条记录之后的“删除”按钮,删除当前这条记录

为“删除”按钮添加绑定事件,触发事件,调用函数,发送异步请求到服务端,根据id删除员工信息

//删除员工信息
const deleteById = async (id) => {ElMessageBox.confirm('你确定要删除该员工吗?', '提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(async () => {const result = await deleteEmpApi(id)
​if (result.code) {ElMessage.success('删除成功');search();} else {ElMessage.error(result.msg);}
​}).catch(() => {ElMessage.info('已取消删除')})
}

2.选择前面的复选框,选中要删除的员工,点击“批量删除”之后,会批量删除员工信息

为表格的复选框绑定事件,点击复选框之后,获取到目前选中的条件的id(多个id可以封装到数组中),为“批量删除”按钮绑定事件,发送异步请求到服务端,根据id批量删除员工信息。

//批量删除勾选的员工信息
const selectedIds = ref([])
//多选框选中时触发
const handleSelectionChange = (selection) => {selectedIds.value = selection.map(item => item.id)
}
//批量删除员工信息
const deleteBatch = () => {ElMessageBox.confirm('你确定要批量删除这些员工吗?', '提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(async () => {if (selectedIds.value && selectedIds.value.length > 0) {const result = await deleteEmpApi(selectedIds.value)
​if (result.code) {ElMessage.success('删除成功');search();} else {ElMessage.error(result.msg);}
​} else {ElMessage.error('您没有选择要删除的员工')}
​
​}).catch(() => {ElMessage.info('已取消删除')})
​
}

完整Vue代码:

<script setup>
import { Delete } from '@element-plus/icons-vue'
import { ref, watch, onMounted } from 'vue'
import { queryPageApi, addEmpApi, editEmpApi, queryEmpByIdApi, deleteEmpApi } from '@/api/emp'
import { ElMessage, ElMessageBox } from 'element-plus'
import { queryAllApi as queryAllDeptApi } from '@/api/dept'
​
//职位列表数据
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 }])
//部门列表数据
const deptList = ref([])
​
//定义钩子
onMounted(() => {search()//查询员工列表queryAllDept()//查询部门列表
})
//查询部门列表
const queryAllDept = async () => {const res = await queryAllDeptApi()if (res.code) {deptList.value = res.data}
}
//定义搜索条件
const searchEmp = ref({ name: '', gender: '', date: [], begin: '', end: '' })
​
​
​
//侦听searchEmp的date
watch(() => searchEmp.value.date, (newval, oldval) => {if (searchEmp.value.date.length == 2) {searchEmp.value.begin = newval[0]searchEmp.value.end = newval[1]} else {searchEmp.value.begin = ''searchEmp.value.end = ''}
})
// 清空
const clear = () => {searchEmp.value = { name: '', gender: '', date: [] }search()
​
​
}
​
//定义员工列表
const empList = ref([])
//分页
const currentPage = ref(1)//当前页
const pageSize = ref(10)//每页显示多少条
const background = ref(true)
const total = ref(0)
// 查询
const search = async () => {const res = await queryPageApi(searchEmp.value.name, searchEmp.value.gender,searchEmp.value.begin, searchEmp.value.end, currentPage.value, pageSize.value)if (res.code) {empList.value = res.data.rowstotal.value = res.data.total}
​
}
//每页展示记录数变化时
const handleSizeChange = (val) => {search()
}
//当前页变化时
const handleCurrentChange = (val) => {search()
}
//新增员工
const addEmp = () => {dialogVisible.value = truedialogTitle.value = '新增员工'employee.value = {username: '',name: '',gender: '',phone: '',job: '',salary: '',deptId: '',entryDate: '',image: '',exprList: []}//清空表单校验if (employeeFormRef.value) {employeeFormRef.value.resetFields()}
}
​
​
//新增/修改表单
const employeeFormRef = ref(null)
const employee = ref({username: '',name: '',gender: '',phone: '',job: '',salary: '',deptId: '',entryDate: '',image: '',exprList: []
})
​
// 控制弹窗
const dialogVisible = ref(false)
const dialogTitle = ref('新增员工')
​
//文件上传
// 图片上传成功后触发
const handleAvatarSuccess = (response, uploadFile) => {employee.value.image = response.data
}
// 文件上传之前触发
const beforeAvatarUpload = (rawFile) => {if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') {ElMessage.error('只支持上传图片')return false} else if (rawFile.size / 1024 / 1024 > 10) {ElMessage.error('只能上传10M以内图片')return false}return true
}
//添加工作经历
const addExpr = () => {employee.value.exprList.push({company: '',job: '',begin: '',end: '',exprDate: []})
}
//删除工作经历
const deleteExpr = (index) => {employee.value.exprList.splice(index, 1)
}
//侦听exprList
watch(() => employee.value.exprList, (newValue, oldValue) => {if (employee.value.exprList && employee.value.exprList.length > 0) {employee.value.exprList.forEach(expr => {expr.begin = expr.exprDate[0]expr.end = expr.exprDate[1]})}
}, { deep: true });
​
//保存
//保存员工信息
const save = async () => {if (!employeeFormRef.value) {return}employeeFormRef.value.validate(async valid => {if (valid) { // 校验通过let result;if (employee.value.id) {result = await editEmpApi(employee.value)} else {result = await addEmpApi(employee.value)}if (result.code) {ElMessage.success('保存成功')dialogVisible.value = falsesearch()
​} else {ElMessage.error(result.msg)}} else {ElMessage.error('表单校验失败')}})
}
// 验证规则
const rules = ref({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\d{10}$/g, message: '请输入有效的手机号', trigger: 'blur' }]
});
​
//编辑员工信息
const editEmp = async (id) => {const result = await queryEmpByIdApi(id)if (result.code) {dialogVisible.value = truedialogTitle.value = '修改员工'employee.value = result.data} else {ElMessage.error(result.msg)}//对工作经历数据进行处理let exprList = employee.value.exprList//判断exprList是否有值和长度大于0if (exprList && exprList.length > 0) {exprList.forEach((expr) => {expr.exprDate = [expr.begin, expr.end]})}
}
//删除员工信息
const deleteById = async (id) => {ElMessageBox.confirm('你确定要删除该员工吗?', '提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(async () => {const result = await deleteEmpApi(id)
​if (result.code) {ElMessage.success('删除成功');search();} else {ElMessage.error(result.msg);}
​}).catch(() => {ElMessage.info('已取消删除')})
}
//批量删除勾选的员工信息
const selectedIds = ref([])
//多选框选中时触发
const handleSelectionChange = (selection) => {selectedIds.value = selection.map(item => item.id)
}
//批量删除员工信息
const deleteBatch = () => {ElMessageBox.confirm('你确定要批量删除这些员工吗?', '提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(async () => {if (selectedIds.value && selectedIds.value.length > 0) {const result = await deleteEmpApi(selectedIds.value)
​if (result.code) {ElMessage.success('删除成功');search();} else {ElMessage.error(result.msg);}
​} else {ElMessage.error('您没有选择要删除的员工')}
​
​}).catch(() => {ElMessage.info('已取消删除')})
​
}
​
​
​
</script>
​
<template><h1>员工管理</h1><!-- 搜索栏 --><div class="container"><el-form :inline="true" :model="searchEmp" class="demo-form-inline"><el-form-item label="姓名"><el-input v-model="searchEmp.name" placeholder="请输入员工姓名" /></el-form-item><el-form-item label="性别"><el-select v-model="searchEmp.gender" placeholder="请选择"><el-option label="男" value="1" /><el-option label="女" value="2" /></el-select></el-form-item><el-form-item label="入职时间"><el-date-picker v-model="searchEmp.date" type="daterange" range-separator="到" start-placeholder="开始日期"end-placeholder="结束日期" :size="size" value-format="YYYY-MM-DD" /></el-form-item><el-form-item><el-button type="primary" @click="search">查询</el-button><el-button type="info" @click="clear">清空</el-button></el-form-item></el-form></div>
​<!-- 按钮 --><div class="container"><el-button type="primary" @click="addEmp">+新增员工</el-button><el-button type="danger" @click="deleteBatch">-批量删除</el-button></div><!-- 表格 --><div class="container"><el-table :data="empList" style="width: 100%" @selection-change="handleSelectionChange"><el-table-column type="selection" width="55" /><el-table-column prop="name" label="姓名" width="120" align="center" /><el-table-column label="性别" width="120" align="center"><template #default="scope">{{ scope.row.gender == 1 ? '男' : '女' }}</template></el-table-column><el-table-column label="头像" align="center" width="180"><template #default="scope"><el-image :src="scope.row.image" style="width:40px" /></template></el-table-column><el-table-column prop="deptName" label="所属部门" width="120" align="center" /><el-table-column prop="job" label="职位" width="120" align="center"><template #default="scope"><span v-if="scope.row.job == 1">班主任</span><span v-else-if="scope.row.job == 2">讲师</span><span v-else-if="scope.row.job == 3">学工主管</span><span v-else-if="scope.row.job == 4">教研主管</span><span v-else-if="scope.row.job == 5">咨询师</span><span v-else>其他</span></template></el-table-column><el-table-column prop="entryDate" label="入职日期" width="180" align="center" /><el-table-column prop="updateTime" label="最后操作时间" width="180" align="center" /><!-- 操作 --><el-table-column label="操作" width="180" align="center"><template #default="scope"><el-button type="primary" size="small" @click="editEmp(scope.row.id)"><el-icon><EditPen /></el-icon>编辑</el-button><el-button type="danger" size="small" @click="deleteById(scope.row.id)"><el-icon><Delete /></el-icon>删除</el-button></template></el-table-column></el-table></div><!-- 分页条 --><div class="container"><el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize":page-sizes="[5, 10, 15, 20, 25, 30, 35, 40]" :background="background"layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"@current-change="handleCurrentChange" /></div><!-- 新增/修改员工的对话框 -->
​<el-dialog v-model="dialogVisible" :title="dialogTitle"><el-form ref="employeeFormRef" :model="employee" label-width="80px" :rules="rules"><!-- 基本信息 --><!-- 第一行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="用户名" prop="username"><el-input v-model="employee.username" placeholder="请输入员工用户名,2-20个字"></el-input></el-form-item></el-col>
​<el-col :span="12"><el-form-item label="姓名" prop="name"><el-input v-model="employee.name" placeholder="请输入员工姓名,2-10个字"></el-input></el-form-item></el-col></el-row><!-- 第二行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="性别" prop="gender"><el-select v-model="employee.gender" placeholder="请选择性别" style="width: 100%;"><el-option v-for="g in genders" :label="g.name" :value="g.value"></el-option></el-select></el-form-item></el-col>
​<el-col :span="12"><el-form-item label="手机号" prop="phone"><el-input v-model="employee.phone" placeholder="请输入员工手机号"></el-input></el-form-item></el-col></el-row><!-- 第三行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="职位"><el-select v-model="employee.job" placeholder="请选择职位" style="width: 100%;"><el-option v-for="j in jobs" :label="j.name" :value="j.value"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="薪资"><el-input v-model="employee.salary" placeholder="请输入员工薪资"></el-input></el-form-item></el-col></el-row><!-- 第四行 --><el-row :gutter="20"><el-col :span="12"><el-form-item label="所属部门"><el-select v-model="employee.deptId" placeholder="请选择部门" style="width: 100%;"><el-option v-for="d in deptList" :label="d.name" :key="d.id" :value="d.id"></el-option></el-select></el-form-item></el-col><el-col :span="12"><el-form-item label="入职日期"><el-date-picker v-model="employee.entryDate" type="date" style="width: 100%;" placeholder="选择日期"format="YYYY-MM-DD" value-format="YYYY-MM-DD"></el-date-picker></el-form-item></el-col></el-row><!-- 第五行 --><el-row :gutter="20"><el-col :span="24"><el-form-item label="头像"><el-upload class="avatar-uploader" action="/api/upload" :show-file-list="false":on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload"><img v-if="employee.image" :src="employee.image" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload></el-form-item></el-col></el-row><!-- 工作经历 --><!-- 第六行 --><el-row :gutter="10"><el-col :span="24"><el-form-item label="工作经历"><el-button type="success" size="small" @click="addExpr">+ 添加工作经历</el-button></el-form-item></el-col></el-row><!-- 第七行 ...  工作经历 --><el-row :gutter="3" v-for="(expr, index) in employee.exprList"><el-col :span="10"><el-form-item size="small" label="时间" label-width="80px"><el-date-picker v-model="expr.exprDate" type="daterange" range-separator="至" start-placeholder="开始日期"end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD"></el-date-picker></el-form-item></el-col>
​<el-col :span="6"><el-form-item size="small" label="公司" label-width="60px"><el-input v-model="expr.company" placeholder="请输入公司名称"></el-input></el-form-item></el-col>
​<el-col :span="6"><el-form-item size="small" label="职位" label-width="60px"><el-input v-model="expr.job" placeholder="请输入职位"></el-input></el-form-item></el-col>
​<el-col :span="2"><el-form-item size="small" label-width="0px"><el-button type="danger" @click="deleteExpr(index)">- 删除</el-button></el-form-item></el-col></el-row></el-form><!-- 底部按钮 --><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" @click="save">保存</el-button></span></template>
​</el-dialog>
​
</template>
​
<style scoped>
.container {margin: 15px 0px;width: 100%;
}
​
.avatar {height: 40px;
}
​
.avatar-uploader .avatar {width: 78px;height: 78px;display: block;
}
​
.avatar-uploader .el-upload {border: 1px dashed var(--el-border-color);border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;transition: var(--el-transition-duration-fast);
}
​
.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 var(--el-border-color);
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37769.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…

PLY格式文件如何转换成3DTiles格式——使用GISBox软件实现高效转换

一、概述 在三维GIS和数字孪生领域&#xff0c;3DTiles格式已成为主流的数据格式之一。它由Cesium团队提出&#xff0c;专为大规模3D数据可视化设计&#xff0c;能够高效地加载和展示海量模型数据。而PLY格式则是一种常见的三维模型文件格式&#xff0c;主要用于存储点云数据或…

Junit在测试过程中的使用方式,具体使用在项目测试中的重点说明

JUnit 是一个广泛使用的 Java 单元测试框架,主要用于编写和运行可重复的测试。以下是 JUnit 在项目测试中的使用方式和重点说明: 1. 基本使用 场景:测试一个简单的 Java 类。 示例: import org.junit.Test; import static org.junit.Assert.*;public class CalculatorTe…

《C++11 基于CAS无锁操作的atomic原子类型》

count; count--; 我们知道&#xff0c;/--操作并不是原子性的&#xff0c;其实对应三条汇编指令来完成的。 读取&#xff1a;从内存中把变量的值读取到寄存器修改&#xff1a;在寄存器里将变量的值1/-1写入&#xff1a;把修改后的值写入到内存 在单线程环境下&#xff0c;这…

网络编程之客户端聊天(服务器加客户端共三种方式)

最终效果&#xff1a; serve.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 只允许两个客户端 #define BUF_SIZE 1024i…

《深度学习》—— 模型部署

文章目录 模型部署模型准备选择部署平台部署配置与服务化测试与验证优化与维护常用工具与框架Flask本地部署模型 模型部署 模型部署是将训练好的机器学习或深度学习模型投入实际生产环境&#xff0c;使其能够处理实时数据并提供预测或推理服务的过程。 模型准备 模型格式转换…

解码小米714亿资本棋局:雷军“押宝”AI新战场

目录 小米的AI战略&#xff1a;70亿投入背后的逻辑 1. ​AI成为核心战略&#xff0c;聚焦三大方向 2. ​资本开支超100亿&#xff0c;投资AI基础层公司 3. ​自研芯片与大模型突破 小米的资本棋局&#xff1a;从智能硬件到AI生态 1. ​714亿投资布局&#xff0c;构建产业…

如何为在线游戏选择合适的游戏盾?

在当今这个互联网高速发展的时代&#xff0c;在线游戏已经成为许多人日常生活中不可或缺的一部分。然而&#xff0c;随着游戏人数的不断增加&#xff0c;网络安全问题也层出不穷。游戏盾的问世便是为了解决这一系列安全隐患&#xff0c;确保玩家在游戏中能够拥有安全、畅快的体…

自适应柔顺性策略:扩散引导控制中学习近似的柔顺

24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用&#xff0c;因为它可以在不确定的情况下平衡位置和力的并发控制。然而&#xff0c;当今的视觉运动策…

w264民族婚纱预定系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

栈/堆/static/虚表

在 C 里&#xff0c;栈空间主要用来存放局部变量、函数调用信息等。下面为你介绍栈空间在 C 里的运用方式。 1. 局部变量的使用 在函数内部定义的变量会被存于栈空间&#xff0c;当函数执行结束&#xff0c;这些变量会自动被销毁。 #include <iostream>void exampleFu…

SpringBoot实现异步调用的方法

在Java中使用Spring Boot实现异步请求和异步调用是一个常见的需求&#xff0c;可以提高应用程序的性能和响应能力。以下是实现这两种异步操作的基本方法&#xff1a; 一、异步请求&#xff08;Asynchronous Request&#xff09; 异步请求允许客户端发送请求后立即返回&#x…

基于 Prompt 的实体关系抽取:原理与优势解析

一、信息抽取的现状与挑战 在当今数字化时代&#xff0c;信息抽取作为自然语言处理&#xff08;NLP&#xff09;领域的核心技术&#xff0c;具有不可替代的重要性。从海量的非结构化文本数据中精准提取出有价值的信息&#xff0c;例如实体&#xff08;如人名、组织名&#xff…

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

spring-tx笔记

编程式事务与声明式事务的理解 补充&#xff1a;什么是事务&#xff1f; 事务是一个重要概念&#xff0c;尤其在数据库管理系统中。事务是指一组操作。&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;确保数据的一致性和完整性 编程式事务 编…

使用excel.EasyExcel实现导出有自定义样式模板的excel数据文件,粘贴即用!!!

客户要求导出的excel文件是有好看格式的&#xff0c;当然本文举例模板文件比较简单&#xff0c;内容丰富的模板可以自行设置&#xff0c;话不多说&#xff0c;第一步设置一个"好看"的excel文件模板 上面要注意的地方是{.变量名} &#xff0c;这里的变量名对应的就是…

AutoGluon快速上手

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲机器学习包 AutoGluon简介&#xff1a; AutoGluon 提供了多种模型来处理不同类型的数据和任务&#xff0c;是由 亚马逊 AWS 团队 开发的一款开源 AutoML 框架&#xff0c;旨在简化机器…

AI风向标《AI与视频制作全攻略:从入门到精通实战课程》

课程信息 AI风向标《AI与视频制作全攻略&#xff1a;从入门到精通实战课程》,夸克网盘和百度网盘课程。 课程介绍 《AI与视频制作全攻略&#xff1a;从入门到精通实战课程》是一套全面融合AI技术与视频制作的实战课程&#xff0c;旨在帮助创作者从基础软件使用到高级视频剪辑…

Docker学习笔记(十)搭建Docker私有仓库

一、环境配置 1、宿主机系统&#xff1a;macOS Sequoia(版本15.2) 2、虚拟机VMware Fusion版本&#xff1a;专业版 13.6.2 (24409261) 3、虚拟机系统&#xff1a;AlmaLinux-9-latest-x86_64-boot.iso 二、安装Harbor开源企业级Docker镜像 Harbor 是一个开源的企业级 Docker…

Linux中基本命令

目录 ls pwd cd touch mkdir rm cp mv cat less head tail find grep ls 其实大部分命令都是可执行的文件&#xff0c;但有一些命令比如Shell内置命令&#xff0c;它没有对应的独立可执行文件&#xff0c;而是由Shell直接解释执行的。 功能&#xff1a;显示当前目…