【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.pswp.cn/pingmian/72989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72989.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 系統運行 Android 應用的幾種方案

這幾年&#xff0c;國產操作系統替代正在有條不紊地進行中。但生態是繞不過去的一道坎&#xff0c;指望應用廠商一下子完成國產系統適配也不現實。之前介紹過使用 Wine 運行 Windows 應用的方案&#xff0c;減少了國產系統應用偏少的難題。比如我在辦公室使用最多的企業微信&am…

Python進階教程丨lambda函數

1. lambda函數是什么&#xff1f; 在 Python 里&#xff0c;lambda 函數是一種特殊類型的函數&#xff0c;也被叫做匿名函數。匿名”意味著它不需要像常規函數那樣使用 def 來進行命名。lambda lambda 函數本質上是簡潔的臨時函數 &#xff0c;它適用于只需要簡單邏輯的場景&a…

TK矩陣系統:高效管理與智能化操作平臺

隨著TikTok等社交媒體平臺的快速發展&#xff0c;短視頻創作和內容運營逐漸成為互聯網行業的重要組成部分。為了幫助內容創作者、品牌運營商以及數據分析人員更高效地管理多個TikTok賬號并優化運營策略&#xff0c;TK矩陣系統提供了一種全新的解決方案&#xff0c;結合了先進的…

Spring Boot整合Apache BookKeeper教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot整合Apache BookKeeper教程 1. 簡介 Apache BookKeeper 是一個高性能、持久化的分布式日志存儲系統&#xff0c;適用于需要強一致性和高吞吐量的…

蘋果HFS+56TB存儲MOV文件出錯的恢復方法

HFS文件系統是Apple電腦中默認的最常見的文件系統。HFS來源于UNIX&#xff0c;優勢就是穩定性&#xff0c;另外HFS是支持日志功能的&#xff0c;所以很多存儲設備也采用了HFS文件系統。再穩定的文件系統也有“馬失前蹄”的時候&#xff0c;下面就來聊下HFS出現文件出錯、丟失時…

電源電路篇

電源電路篇 一、LDO-Low Dropout Regulator(低壓差線性穩壓器)1.1 AMS1117-3.3V芯片 二、DCDC-Direct Current to Direct Current(開關穩壓器)2.1 降壓(Buck)電路2.1.1 TPS5450-5V芯片 一、LDO-Low Dropout Regulator(低壓差線性穩壓器) LDO是一種線性穩壓器&#xff0c;用于提…

java項目之在線購物系統(源碼+文檔)

項目簡介 在線購物系統實現了以下功能&#xff1a; 使用在線購物系統的用戶分管理員和用戶兩個角色的權限子模塊。 管理員所能使用的功能主要有&#xff1a;主頁、個人中心、用戶管理、商品分類管理、商品信息管理、系統管理、訂單管理等。 用戶可以實現主頁、個人中心、我的…

go語言中空結構體

空結構體(struct{}) 普通理解 在結構體中&#xff0c;可以包裹一系列與對象相關的屬性&#xff0c;但若該對象沒有屬性呢&#xff1f;那它就是一個空結構體。 空結構體&#xff0c;和正常的結構體一樣&#xff0c;可以接收方法函數。 type Lamp struct{}func (l Lamp) On()…

Unity實現連連看連線效果

1.一個比較簡單的向量計算&#xff0c;用的LineRenderer實現&#xff1b; 已知起始A點和終點C點&#xff0c;求B點&#xff1b; 先計算A點到C點的向量取歸一化當做方向&#xff0c;再給定一個“模長”&#xff08;B點到A點的模長&#xff09;乘以該方向&#xff0c;最后加上L…

【MySQL】觸發器與存儲引擎

目錄 觸發器基本概念觸發器操作創建觸發器NEW 與 OLD查看觸發器刪除觸發器 注意事項 存儲引擎基本概念基本操作查詢當前數據庫支持的存儲引擎查看當前的默認存儲引擎查看某個表用的存儲引擎創建表時指定存儲引擎修改表的存儲引擎 觸發器 基本概念 概述&#xff1a; 觸發器&a…

能“嘎嘎提升”提升用戶居住體驗的智能家居物聯網框架推薦!

智能家居在日常生活中給我們的帶來了更多的便利&#xff0c;更讓有些用戶切實地體會到了科技的魅力&#xff0c;對于想要打造屬于自己的智能家居氛圍感的用戶們&#xff0c;以下是一些能夠幫助提升居住體驗的智能家居物聯網框架及應用&#xff1a; 1. 涂鴉智能&#xff08;Tuy…

DevEco Studio的使用

目錄 1.創建ArkTS工程 2.ArkTS工程目錄結構&#xff08;Stage模型&#xff09; 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 1.創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇…

性能監控——vmstat

性能監控——vmstat ? 性能監控是對 IT 系統運行效率和有效性的系統觀察和測量。它涉及收集、分析和報告各種組件&#xff08;包括應用程序、網絡、服務器和數據庫&#xff09;的關鍵性能指標 (KPI)。此過程使用專門的工具來跟蹤響應時間、吞吐量、資源利用率和錯誤率等指標。…

搭建Python量化開發環境:從零開始的完整指南

搭建Python量化開發環境&#xff1a;從零開始的完整指南 在量化投資領域&#xff0c;一個穩定且高效的開發環境是成功的關鍵。本文將引導你一步步搭建起自己的Python量化開發環境&#xff0c;確保你能夠順利開始編寫和運行量化策略。 &#x1f680;量化軟件開通 &#x1f68…

圖像分割的mask有空洞怎么修補

分享一個對實例分割mask修補的方法&#xff0c;希望對大家有所幫助。 1. 這是我準備分割的圖片 2 分割結果 可以看到衣服部分有一些沒分割出來&#xff0c;二值化圖片能清晰看到衣服部分有些黑色未分出的地方。 3 補全mask區域 import cv2 import numpy as npdef fill_mask_h…

Qt 控件概述 QLabel

目錄 QLabel顯示類控件 label如何做到與窗口同步變化 邊框 Frame QLabel顯示類控件 ?? ?? textFormat &#xff1a;設置文件格式 ? Pixmap &#xff1a;標簽圖片 label如何做到與窗口同步變化 Qt中對應用戶的操作 &#xff1a; 事件和信號 拖拽窗口大小就會觸發…

詞頻統計 ccf-csp 2024-2-1

在學習了文本處理后&#xff0c;小 P 對英語書中的 n篇文章進行了初步整理。 具體來說&#xff0c;小 P將所有的英文單詞都轉化為了整數編號。 假設這 n 篇文章中共出現了 m個不同的單詞&#xff0c;則把它們從 1到 m進行編號。 這樣&#xff0c;每篇文章就簡化為了一個整數…

用爬蟲解鎖 Shopee 店鋪商品數據,開啟電商新洞察

在電商競爭白熱化的當下&#xff0c;Shopee 作為全球知名的電商平臺&#xff0c;匯聚了海量的商品與商機。對于電商從業者、數據分析師、創業者來說&#xff0c;精準掌握 Shopee 店鋪的商品信息&#xff0c;就如同手握一把開啟財富大門的鑰匙。而爬蟲技術&#xff0c;無疑是幫助…

k8s中的service解析

k8s中的service解析 在k8s中&#xff0c;我們可以通過pod來創建服務。 然而&#xff0c;當我們創建多個 Pod 來提供同一項服務時&#xff0c;直接通過 Pod IP 進行訪問會變得復雜且不可維護。因此&#xff0c;Kubernetes 提供了 Service 這一抽象概念&#xff0c;用于對外暴露…

git 命令回退版本

1、查看提交記錄 git log --oneline # 簡化的提交歷史&#xff08;推薦&#xff09; # 或 git log # 完整提交歷史2、版本回退 git reset --hard <commit-hash>3、如果已推送過代碼到遠程倉庫&#xff0c;需強制推送更新 git push -f