• eyb:操作员页面设计到高级搜索功能实现(四)



    目录:

    (1)操作员页面设计

    (2)操作员功能实现

    (3)操作员角色更新功能实现

    (4)员工资料工具栏页面

    (5)员工展示

    (6)分页展示员工

    (7)添加员工页面绘制

    (8)添加员工页面绘制2

    (9)添加员工下拉框数据处理、最大工号

    (10)员工添加数据检验

    (11)员工删除及更新

    (12)封装文件的下载请求

    (13)高级搜索页面设计

    (14)高级搜索动画特效

    (15)高级搜索功能实现


    (1)操作员页面设计

     

    (2)操作员功能实现

     搜索框搜索:还是在初始化列表里面添加一个关键字keywords:

     删除操作员方法:

     

    状态开关事件:

     在次登录:

     (3)操作员角色更新功能实现

     

     

    SysAdmin.vue详细代码:

    1. <template>
    2. <div>
    3. <div style="margin-top: 10px;display: flex;justify-content: center">
    4. <el-input placeholder="通过用户名搜索用户..." prefix-icon="el-icon-search" v-model="keywords"
    5. style="width: 400px;margin-right: 10px" @keydown.enter.native="doSearch">el-input>
    6. <el-button type="primary" icon="wl-icon-search" @click="doSearch">搜索el-button>
    7. div>
    8. <div class="admin-container">
    9. <el-card class="admin-card" v-for="(admin,index) in admins" :key="index">
    10. <div slot="header" class="clearfix">
    11. <span>{{admin.name}}span>
    12. <el-button style="float: right;padding: 3px 0;color: #ff0000" type="text" icon="el-icon-delete"
    13. @click="deleteAdmin(admin)">el-button>
    14. div>
    15. <div>
    16. <div class="img-container">
    17. <img :src="admin.userFace" :alt="admin.name" :title="admin.name" class="userface-img">
    18. div>
    19. div>
    20. <div class="userinfo-container">
    21. <div>用户名:{{admin.name}}div>
    22. <div>手机号码:{{admin.phone}}div>
    23. <div>电话号码:{{admin.telephone}}div>
    24. <div>地址:{{admin.address}}div>
    25. <div>用户状态:
    26. <el-switch
    27. v-model="admin.enabled"
    28. active-color="#13ce66"
    29. inactive-color="#ff4949"
    30. @change="enabledChange(admin)"
    31. active-text="启用"
    32. inactive-text="禁用">
    33. el-switch>
    34. div>
    35. <div>用户角色:
    36. <el-tag type="success" style="margin-right: 4px" v-for="(role,indexj) in admin.roles" :key="indexj">
    37. {{role.nameZh}}
    38. el-tag>
    39. <el-popover
    40. placement="right"
    41. title="角色列表"
    42. @show="showPop(admin)"
    43. @hide="hidePop(admin)"
    44. width="200"
    45. trigger="click">
    46. <el-select v-model="selectedRoles" multiple placeholder="请选择...">
    47. <el-option
    48. v-for="(r,indexk) in allRoles"
    49. :key="indexk"
    50. :label="r.nameZh"
    51. :value="r.id">el-option>
    52. el-select>
    53. <el-button slot="reference" icon="el-icon-more" type="text">el-button>
    54. el-popover>
    55. div>
    56. <div>备注:{{admin.remark}}div>
    57. div>
    58. el-card>
    59. div>
    60. div>
    61. template>
    62. <script>
    63. export default {
    64. name: "SysAdmin",
    65. data() {
    66. return {
    67. keywords: '',
    68. //操作员数组
    69. admins: [],
    70. allRoles: [],
    71. //选中的角色
    72. selectedRoles: []
    73. }
    74. },
    75. //当页面刚加载的时候调用initAdmins方法调用后端接口,获取所有操作员列表
    76. mounted() {
    77. this.initAdmins();
    78. },
    79. methods: {
    80. //获取所有操作员列表方法
    81. initAdmins() {
    82. this.getRequest('/system/admin/?keywords=' + this.keywords).then(resp => {
    83. if (resp) {
    84. //把返回的数据赋值给数组
    85. this.admins = resp;
    86. }
    87. })
    88. },
    89. //搜索框搜索
    90. doSearch() {
    91. this.initAdmins();
    92. },
    93. //删除操作员方法
    94. deleteAdmin(admin) {
    95. this.$confirm('此操作将永久删除该【' + admin.name + '】用户, 是否继续?', '提示', {
    96. confirmButtonText: '确定',
    97. cancelButtonText: '取消',
    98. type: 'warning'
    99. }).then(() => {
    100. //调用后端接口:/system/admin
    101. this.deleteRequest('/system/admin/' + admin.id).then(resp => {
    102. //删除成功之后重新调用获取操作员列表的方法
    103. this.initAdmins();
    104. })
    105. }).catch(() => {
    106. this.$message({
    107. type: 'info',
    108. message: '已取消删除'
    109. });
    110. });
    111. },
    112. //更新操作员状态
    113. enabledChange(admin) {
    114. //调用后端接口/system/admin
    115. this.putRequest('/system/admin/', admin).then(resp => {
    116. if (resp) {
    117. //成功之后重新调用获取操作员列表的方法,更新一下
    118. this.initAdmins();
    119. }
    120. })
    121. },
    122. //弹出框隐藏时触发的事件
    123. hidePop(admin) {
    124. let roles = [];
    125. Object.assign(roles, admin.roles);
    126. let flag = false;
    127. if (roles.length != this.selectedRoles.length) {
    128. flag = true;
    129. } else {
    130. for (let i = 0; i < roles.length; i++) {
    131. let role = roles[i];
    132. for (let j = 0; j < this.selectedRoles.length; j++) {
    133. let sr = this.selectedRoles[j];
    134. if (role.id == sr) {
    135. roles.splice(i, 1);
    136. i--;
    137. break;
    138. }
    139. }
    140. }
    141. if (roles.length != 0) {
    142. flag = true;
    143. }
    144. }
    145. if (flag) {
    146. let url = '/system/admin/role?adminId=' + admin.id;
    147. this.selectedRoles.forEach(sr => {
    148. url += '&rids=' + sr;
    149. })
    150. this.putRequest(url).then(resp => {
    151. if (resp) {
    152. this.initAdmins();
    153. }
    154. })
    155. }
    156. },
    157. //弹出框显示事件
    158. showPop(admin) {
    159. //拿到所有角色列表
    160. this.initAllRoles();
    161. //选中的角色
    162. let roles = admin.roles;
    163. this.selectedRoles = [];
    164. roles.forEach(r => {
    165. this.selectedRoles.push(r.id);
    166. })
    167. },
    168. //获取所有角色方法
    169. initAllRoles() {
    170. this.getRequest('/system/admin/roles').then(resp => {
    171. if (resp) {
    172. this.allRoles = resp;
    173. }
    174. })
    175. }
    176. }
    177. }
    178. script>
    179. <style>
    180. .userinfo-container div {
    181. font-size: 12px;
    182. color: #409eff;
    183. }
    184. .userinfo-container {
    185. margin-top: 20px;
    186. }
    187. .img-container {
    188. width: 100%;
    189. display: flex;
    190. justify-content: center;
    191. }
    192. .userface-img {
    193. width: 72px;
    194. height: 72px;
    195. border-radius: 72px;
    196. }
    197. .admin-container {
    198. margin-top: 10px;
    199. display: flex;
    200. justify-content: space-around;
    201. flex-wrap: wrap;
    202. }
    203. .admin-card {
    204. width: 300px;
    205. margin-bottom: 20px;
    206. }
    207. style>

     

     (4)员工资料工具栏页面

     

     (5)员工展示

     ... 

     

    (6)分页展示员工

     点2:

     换成每页20条:

     

     

    搜索性王的:

     当点击清空按钮时:

     

    (7)添加员工页面绘制

     

    (8)添加员工页面绘制2

     

    ...

    (9)添加员工下拉框数据处理、最大工号

    政治面貌、职称、职位、下拉框内容展示

     

     

     

     

     (10)员工添加数据检验

     先做一个数据校验,校验是否输入了内容:

     

     

     

    (11)员工删除及更新

     

     

     

     

     

      

    点击编辑:

     修改学校为北京大学

     

     在次打开:

     删掉这向记录:

     

     

     (12)封装文件的下载请求

    实现导入数据导出数据

    axios并不提供下载的功能,我们提供一个插件:先安装:

    封装一下做文件下载请求的 

    download.js:

    1. import axios from 'axios'
    2. const service = axios.create({
    3. //默认类型
    4. responseType: 'arraybuffer'
    5. })
    6. //请求拦截器
    7. service.interceptors.request.use(config => {
    8. //判断是否登录,有token
    9. config.headers['Authorization'] = window.sessionStorage.getItem('tokenStr');
    10. return config
    11. }, error => {
    12. console.log(error)
    13. });
    14. //响应拦截器
    15. service.interceptors.response.use(
    16. resp => {
    17. const headers = resp.headers;//拿头部信息
    18. let reg = RegExp(/application\/json/);//定义正则表达式
    19. if (headers['content-type'].match(reg)) {//判断head是否跟正则表达式相匹配
    20. //调用方法转换为json字符串
    21. resp.data = uintToString(resp.data);
    22. } else {
    23. //不匹配的话返回stream流
    24. let fileDownload = require('js-file-download');//获取download插件
    25. let fileName = headers["content-disposition"].split(";")
    26. [1].split("filename=")[1];//获取名字
    27. let contentType = headers["content-type"];//获取contentType
    28. fileName = decodeURIComponent(fileName);//转换文件名,防止中文乱码
    29. fileDownload(resp.data, fileName, contentType)
    30. }
    31. },error => {
    32. console.log(error);
    33. }
    34. );
    35. //定义请求
    36. let base = '';
    37. export const downloadRequest = (url, params) => {
    38. return service({
    39. method: 'get',
    40. url: `${base}${url}`,
    41. data: params
    42. })
    43. }
    44. function uintToString(uintArray) {
    45. //编码
    46. let encodedString = String.fromCharCode.apply(null, new
    47. Uint8Array(uintArray)),
    48. //解码
    49. decodedString = decodeURIComponent(escape(encodedString));
    50. return JSON.parse(decodedString);
    51. }
    52. //暴露service
    53. export default service

     

    在main.js引入:

     

     (13)员工数据的导入导出

     

    使用elementUI 的上传文件的组件:

     

     

     

     

     

     

     (13)高级搜索页面设计

    ...

     

     

    (14)高级搜索动画特效

     

     

     点击高级搜索:

     

    (15)高级搜索功能实现

     

     

     

     EmpBasic.vue:详细代码:

    1. <template>
    2. <div>
    3. <div>
    4. <div style="display: flex;justify-content: space-between">
    5. <div>
    6. <el-input prefix-icon="el-icon-search"
    7. placeholder="请输入员工名进行搜索..."
    8. v-model="empName"
    9. @keydown.enter.native="initEmps"
    10. clearable
    11. @clear="initEmps"
    12. :disabled="showAdvanceSearchVisible"
    13. style="width: 300px;margin-right: 10px">el-input>
    14. <el-button type="primary"
    15. icon="el-icon-search"
    16. @click="initEmps"
    17. :disabled="showAdvanceSearchVisible">搜索
    18. el-button>
    19. <el-button type="primary"
    20. @click="showAdvanceSearchView">
    21. <i :class="showAdvanceSearchVisible?'fa fa-angle-doubleup':'fa fa-angle-double-down'"
    22. aria-hidden="true">i>
    23. 高级搜索
    24. el-button>
    25. div>
    26. <div>
    27. <el-upload
    28. action="/employee/basic/import"
    29. :before-upload="beforeUpload"
    30. :headers="headers"
    31. :on-success="onSuccess"
    32. :on-error="onError"
    33. :disabled="importDataDisabled"
    34. style="display: inline-flex;margin-right: 8px"
    35. :show-file-list="false">
    36. <el-button :disabled="importDataDisabled" type="success"
    37. :icon="importDataBtnIcon">
    38. {{importDataBtnText}}
    39. el-button>
    40. el-upload>
    41. <el-button type="success" @click="exportData" icon="el-icondownload">
    42. 导出数据
    43. el-button>
    44. <el-button type="primary" icon="el-icon-plus" @click="showAddEmpView">
    45. 添加用户
    46. el-button>
    47. div>
    48. div>
    49. <transition name="slide-fade">
    50. <div v-show="showAdvanceSearchVisible"
    51. style="border: 1px solid #409eff;border-radius: 5px;box-sizing:border-box;padding: 5px;margin: 10px 0px">
    52. <el-row>
    53. <el-col :span="5">
    54. 政治面貌:
    55. <el-select v-model="searchValue.politicId"
    56. placeholder="政治面貌" size="mini"
    57. style="width: 130px">
    58. <el-option
    59. v-for="item in politicsstatus"
    60. :key="item.id"
    61. :label="item.name"
    62. :value="item.id">
    63. el-option>
    64. el-select>
    65. el-col>
    66. <el-col :span="4">
    67. 民族:
    68. <el-select v-model="searchValue.nationId"
    69. placeholder="民族" size="mini" style="width: 130px">
    70. <el-option
    71. v-for="item in nations"
    72. :key="item.id"
    73. :label="item.name"
    74. :value="item.id">
    75. el-option>
    76. el-select>
    77. el-col>
    78. <el-col :span="4">
    79. 职位:
    80. <el-select v-model="searchValue.posId"
    81. placeholder="职位" size="mini" style="width: 130px">
    82. <el-option
    83. v-for="item in positions"
    84. :key="item.id"
    85. :label="item.name"
    86. :value="item.id">
    87. el-option>
    88. el-select>
    89. el-col>
    90. <el-col :span="4">
    91. 职称:
    92. <el-select v-model="searchValue.jobLevelId"
    93. placeholder="职称" size="mini"
    94. style="width: 130px">
    95. <el-option
    96. v-for="item in joblevels"
    97. :key="item.id"
    98. :label="item.name"
    99. :value="item.id">
    100. el-option>
    101. el-select>
    102. el-col>
    103. <el-col :span="7">
    104. 聘用形式:
    105. <el-radio-group v-model="searchValue.engageForm">
    106. <el-radio label="劳动合同">劳动合同el-radio>
    107. <el-radio label="劳务合同">劳务合同el-radio>
    108. el-radio-group>
    109. el-col>
    110. el-row>
    111. <el-row style="margin-top: 10px">
    112. <el-col :span="5">
    113. 所属部门:
    114. <el-popover
    115. placement="right"
    116. title="请选择部门"
    117. width="200"
    118. trigger="manual"
    119. v-model="visable2">
    120. <el-tree :data="allDeps" :props="defaultProps"
    121. default-expand-all
    122. @node-click="searchHandleNodeClick">
    123. el-tree>
    124. <div slot="reference"
    125. style="width: 130px;display: inline-flex;
    126. font-size: 13px;border: 1px solid #dedede;height: 24px;border-radius:
    127. 5px;cursor: pointer;align-items: center;padding-left: 8px;box-sizing: border-box;
    128. margin-left: 3px"
    129. @click="showDepView2">
    130. {{inputDepName}}
    131. div>
    132. el-popover>
    133. el-col>
    134. <el-col :span="10">
    135. 入职日期:
    136. <el-date-picker
    137. v-model="searchValue.beginDateScope"
    138. size="mini"
    139. type="daterange"
    140. value-format="yyyy-MM-dd"
    141. unlink-panels
    142. range-separator="至"
    143. start-placeholder="开始日期"
    144. end-placeholder="结束日期">
    145. el-date-picker>
    146. el-col>
    147. <el-col :span="5" :offset="4">
    148. <el-button>取消el-button>
    149. <el-button type="primary"
    150. @click="initEmps('advanced')">搜索
    151. el-button>
    152. el-col>
    153. el-row>
    154. div>
    155. transition>
    156. div>
    157. <div style="margin-top: 10px">
    158. <el-table
    159. :data="emps"
    160. stripe
    161. border
    162. v-loading="loading"
    163. element-loading-text="正在加载..."
    164. element-loading-spinner="el-icon-loading"
    165. element-loading-background="rgba(0, 0, 0, 0.8)"
    166. style="width: 100%">
    167. <el-table-column
    168. type="selection"
    169. width="55">
    170. el-table-column>
    171. <el-table-column
    172. prop="name"
    173. label="姓名"
    174. fixed
    175. align="left"
    176. width="90">
    177. el-table-column>
    178. <el-table-column
    179. prop="workID"
    180. label="工号"
    181. align="left"
    182. width="85">
    183. el-table-column>
    184. <el-table-column
    185. prop="gender"
    186. label="性别"
    187. width="85">
    188. el-table-column>
    189. <el-table-column
    190. prop="birthday"
    191. align="left"
    192. width="95"
    193. label="出生日期">
    194. el-table-column>
    195. <el-table-column
    196. prop="idCard"
    197. align="left"
    198. width="150"
    199. label="身份证号码">
    200. el-table-column>
    201. <el-table-column
    202. prop="wedlock"
    203. width="70"
    204. label="婚姻状况">
    205. el-table-column>
    206. <el-table-column
    207. prop="nation.name"
    208. width="50"
    209. label="民族">
    210. el-table-column>
    211. <el-table-column
    212. prop="nativePlace"
    213. width="80"
    214. label="籍贯">
    215. el-table-column>
    216. <el-table-column
    217. prop="politicsStatus.name"
    218. label="政治面貌">
    219. el-table-column>
    220. <el-table-column
    221. prop="email"
    222. align="left"
    223. width="180"
    224. label="电子邮件">
    225. el-table-column>
    226. <el-table-column
    227. prop="phone"
    228. align="left"
    229. width="100"
    230. label="电话号码">
    231. el-table-column>
    232. <el-table-column
    233. prop="address"
    234. align="left"
    235. width="220"
    236. label="联系地址">
    237. el-table-column>
    238. <el-table-column
    239. prop="department.name"
    240. align="left"
    241. width="100"
    242. label="所属部门">
    243. el-table-column>
    244. <el-table-column
    245. prop="position.name"
    246. width="100"
    247. label="职位">
    248. el-table-column>
    249. <el-table-column
    250. prop="joblevel.name"
    251. width="100"
    252. label="职称">
    253. el-table-column>
    254. <el-table-column
    255. prop="engageForm"
    256. align="left"
    257. width="100"
    258. label="聘用形式">
    259. el-table-column>
    260. <el-table-column
    261. prop="tiptopDegree"
    262. label="最高学历">
    263. el-table-column>
    264. <el-table-column
    265. prop="school"
    266. align="left"
    267. width="150"
    268. label="毕业院校">
    269. el-table-column>
    270. <el-table-column
    271. prop="specialty"
    272. align="left"
    273. width="150"
    274. label="专业">
    275. el-table-column>
    276. <el-table-column
    277. prop="workState"
    278. align="left"
    279. width="70"
    280. label="在职状态">
    281. el-table-column>
    282. <el-table-column
    283. prop="beginDate"
    284. align="left"
    285. width="95"
    286. label="入职日期">
    287. el-table-column>
    288. <el-table-column
    289. prop="conversionTime"
    290. align="left"
    291. width="95"
    292. label="转正日期">
    293. el-table-column>
    294. <el-table-column
    295. prop="beginContract"
    296. align="left"
    297. width="95"
    298. label="合同起始日期">
    299. el-table-column>
    300. <el-table-column
    301. prop="endContract"
    302. align="left"
    303. width="95"
    304. label="合同截止日期">
    305. el-table-column>
    306. <el-table-column
    307. align="left"
    308. width="100"
    309. label="合同期限">
    310. <template slot-scope="scope">
    311. <el-tag>{{scope.row.contractTerm}}el-tag>
    312. template>
    313. el-table-column>
    314. <el-table-column
    315. fixed="right"
    316. width="200"
    317. label="操作">
    318. <template slot-scope="scope">
    319. <el-button style="padding: 3px" size="mini"
    320. @click="showEditEmpView(scope.row)">编辑
    321. el-button>
    322. <el-button style="padding: 3px" size="mini"
    323. type="primary">查看高级资料
    324. el-button>
    325. <el-button style="padding: 3px" size="mini"
    326. type="danger" @click="deleteEmp(scope.row)">删除
    327. el-button>
    328. template>
    329. el-table-column>
    330. el-table>
    331. <div style="display: flex;justify-content: flex-end">
    332. <el-pagination
    333. background
    334. @current-change="currentChange"
    335. @size-change="sizeChange"
    336. layout="sizes,prev,pager,next,jumper,->,total,slot" :total="total">
    337. el-pagination>
    338. div>
    339. div>
    340. <el-dialog
    341. :title="title"
    342. :visible.sync="dialogVisible"
    343. width="80%">
    344. <div>
    345. <el-form :model="emp" :rules="rules" ref="empForm">
    346. <el-row>
    347. <el-col :span="6">
    348. <el-form-item label="姓名:" prop="name">
    349. <el-input size="mini" style="width: 150px" v-model="emp.name" placeholder="请输入员工姓名"
    350. prefix-icon="el-icon-edit">el-input>
    351. el-form-item>
    352. el-col>
    353. <el-col :span="5">
    354. <el-form-item label="性别:" prop="gender">
    355. <el-radio-group v-model="emp.gender" style="margin-top:8px">
    356. <el-radio label="男">el-radio>
    357. <el-radio label="女">el-radio>
    358. el-radio-group>
    359. el-form-item>
    360. el-col>
    361. <el-col :span="6">
    362. <el-form-item label="出生日期:" prop="birthday">
    363. <el-date-picker
    364. v-model="emp.birthday"
    365. size="mini"
    366. type="date"
    367. value-format="yyyy-MM-dd"
    368. style="width: 150px"
    369. placeholder="出生日期">
    370. el-date-picker>
    371. el-form-item>
    372. el-col>
    373. <el-col :span="7">
    374. <el-form-item label="政治面貌:" prop="politicId">
    375. <el-select v-model="emp.politicId"
    376. placeholder="政治面貌" size="mini" style="width: 200px">
    377. <el-option
    378. v-for="item in politicsstatus"
    379. :key="item.id"
    380. :label="item.name"
    381. :value="item.id">
    382. el-option>
    383. el-select>
    384. el-form-item>
    385. el-col>
    386. el-row>
    387. <el-row>
    388. <el-col :span="6">
    389. <el-form-item label="民族:" prop="nationId">
    390. <el-select v-model="emp.nationId"
    391. placeholder="民族" size="mini" style="width: 150px">
    392. <el-option
    393. v-for="item in nations"
    394. :key="item.id"
    395. :label="item.name"
    396. :value="item.id">
    397. el-option>
    398. el-select>
    399. el-form-item>
    400. el-col>
    401. <el-col :span="5">
    402. <el-form-item label="籍贯:" prop="nativePlace">
    403. <el-input size="mini" style="width: 120px" v-model="emp.nativePlace" placeholder="请输入籍贯"
    404. prefix-icon="el-icon-edit">el-input>
    405. el-form-item>
    406. el-col>
    407. <el-col :span="6">
    408. <el-form-item label="电子邮箱:" prop="email">
    409. <el-input size="mini" style="width: 150px" v-model="emp.email" placeholder="请输入电子邮箱"
    410. prefix-icon="el-icon-message">el-input>
    411. el-form-item>
    412. el-col>
    413. <el-col :span="7">
    414. <el-form-item label="联系地址:" prop="address">
    415. <el-input size="mini" style="width: 200px" v-model="emp.address" placeholder="请输入联系地址"
    416. prefix-icon="el-icon-edit">el-input>
    417. el-form-item>
    418. el-col>
    419. el-row>
    420. <el-row>
    421. <el-col :span="6">
    422. <el-form-item label="职位:" prop="posId">
    423. <el-select v-model="emp.posId" placeholder="职位"
    424. size="mini" style="width: 150px">
    425. <el-option
    426. v-for="item in positions"
    427. :key="item.id"
    428. :label="item.name"
    429. :value="item.id">
    430. el-option>
    431. el-select>
    432. el-form-item>
    433. el-col>
    434. <el-col :span="5">
    435. <el-form-item label="职称:" prop="jobLevelId">
    436. <el-select v-model="emp.jobLevelId"
    437. placeholder="职称" size="mini" style="width: 150px">
    438. <el-option
    439. v-for="item in joblevels"
    440. :key="item.id"
    441. :label="item.name"
    442. :value="item.id">
    443. el-option>
    444. el-select>
    445. el-form-item>
    446. el-col>
    447. <el-col :span="6">
    448. <el-form-item label="所属部门:" prop="departmentId">
    449. <el-popover
    450. placement="right"
    451. title="请选择部门"
    452. width="200"
    453. trigger="manual"
    454. v-model="visable">
    455. <el-tree :data="allDeps"
    456. :props="defaultProps" default-expand-all
    457. @node-click="handleNodeClick">
    458. el-tree>
    459. <div slot="reference"
    460. style="width: 150px;display: inline-flex;
    461. font-size: 13px;border: 1px solid #dedede;height: 24px;border-radius:
    462. 5px;cursor: pointer;align-items: center;padding-left: 8px;box-sizing: border-box"
    463. @click="showDepView">
    464. {{inputDepName}}
    465. div>
    466. el-popover>
    467. el-form-item>
    468. el-col>
    469. <el-col :span="7">
    470. <el-form-item label="电话号码:" prop="phone">
    471. <el-input size="mini" style="width: 200px" v-model="emp.phone" placeholder="请输入电话号码"
    472. prefix-icon="el-icon-phone">el-input>
    473. el-form-item>
    474. el-col>
    475. el-row>
    476. <el-row>
    477. <el-col :span="6">
    478. <el-form-item label="工号:" prop="workID">
    479. <el-input size="mini" style="width: 150px" v-model="emp.workID" placeholder="请输入工号"
    480. prefix-icon="el-icon-edit" disabled>
    481. el-input>
    482. el-form-item>
    483. el-col>
    484. <el-col :span="5">
    485. <el-form-item label="学历:" prop="tiptopDegree">
    486. <el-select v-model="emp.tiptopDegree"
    487. placeholder="学历" size="mini" style="width: 150px">
    488. <el-option
    489. v-for="item in tiptopDegrees"
    490. :key="item"
    491. :label="item"
    492. :value="item">
    493. el-option>
    494. el-select>
    495. el-form-item>
    496. el-col>
    497. <el-col :span="6">
    498. <el-form-item label="毕业院校:" prop="school">
    499. <el-input size="mini" style="width: 150px" v-model="emp.school" placeholder="请输入毕业院校"
    500. prefix-icon="el-icon-edit">el-input>
    501. el-form-item>
    502. el-col>
    503. <el-col :span="7">
    504. <el-form-item label="专业名称:" prop="specialty">
    505. <el-input size="mini" style="width: 200px" v-model="emp.specialty" placeholder="请输入专业名称"
    506. prefix-icon="el-icon-edit">el-input>
    507. el-form-item>
    508. el-col>
    509. el-row>
    510. <el-row>
    511. <el-col :span="6">
    512. <el-form-item label="入职日期:" prop="beginDate">
    513. <el-date-picker
    514. v-model="emp.beginDate"
    515. size="mini"
    516. type="date"
    517. value-format="yyyy-MM-dd"
    518. style="width: 130px"
    519. placeholder="入职日期">
    520. el-date-picker>
    521. el-form-item>
    522. el-col>
    523. <el-col :span="6">
    524. <el-form-item label="转正日期:"
    525. prop="conversionTime">
    526. <el-date-picker
    527. v-model="emp.conversionTime"
    528. size="mini"
    529. type="date"
    530. value-format="yyyy-MM-dd"
    531. style="width: 130px"
    532. placeholder="转正日期">
    533. el-date-picker>
    534. el-form-item>
    535. el-col>
    536. <el-col :span="6">
    537. <el-form-item label="合同起始日期:"
    538. prop="beginContract">
    539. <el-date-picker
    540. v-model="emp.beginContract"
    541. size="mini"
    542. type="date"
    543. value-format="yyyy-MM-dd"
    544. style="width: 130px"
    545. placeholder="合同起始日期">
    546. el-date-picker>
    547. el-form-item>
    548. el-col>
    549. <el-col :span="6">
    550. <el-form-item label="合同截止日期:"
    551. prop="endContract">
    552. <el-date-picker
    553. v-model="emp.endContract"
    554. size="mini"
    555. type="date"
    556. value-format="yyyy-MM-dd"
    557. style="width: 130px"
    558. placeholder="合同截止日期">
    559. el-date-picker>
    560. el-form-item>
    561. el-col>
    562. el-row>
    563. <el-row>
    564. <el-col :span="8">
    565. <el-form-item label="身份证号码:" prop="idCard">
    566. <el-input size="mini" style="width: 180px" v-model="emp.idCard" placeholder="请输入身份证号码"
    567. prefix-icon="el-icon-edit">el-input>
    568. el-form-item>
    569. el-col>
    570. <el-col :span="8">
    571. <el-form-item label="聘用形式:" prop="engageForm">
    572. <el-radio-group v-model="emp.engageForm" style="margin-top:8px">
    573. <el-radio label="劳动合同">劳动合同el-radio>
    574. <el-radio label="劳务合同">劳务合同el-radio>
    575. el-radio-group>
    576. el-form-item>
    577. el-col>
    578. <el-col :span="8">
    579. <el-form-item label="婚姻状况:" prop="wedlock">
    580. <el-radio-group v-model="emp.wedlock" style="margin-top:8px">
    581. <el-radio label="已婚">已婚el-radio>
    582. <el-radio label="未婚">未婚el-radio>
    583. <el-radio label="离异">离异el-radio>
    584. el-radio-group>
    585. el-form-item>
    586. el-col>
    587. el-row>
    588. el-form>
    589. div>
    590. <span slot="footer" class="dialog-footer">
    591. <el-button @click="dialogVisible = false">取 消el-button>
    592. <el-button type="primary" @click="doAddEmp">确 定el-button>
    593. span>
    594. el-dialog>
    595. div>
    596. template>
    597. <script>
    598. export default {
    599. name: "EmpBasic",
    600. data(){
    601. return{
    602. searchValue: {
    603. politicId: null,
    604. nationId: null,
    605. jobLevelId: null,
    606. posId: null,
    607. engageForm: '',
    608. departmentId: null,
    609. beginDateScope: null
    610. },
    611. //员工数组
    612. emps:[],
    613. loading:false,
    614. //总条数
    615. total:0,
    616. //当前页
    617. currentPage:1,
    618. size:10,
    619. //员工名
    620. empName:'',
    621. //弹出框是否弹出默认是false
    622. dialogVisible:false,
    623. //民族
    624. nations:[],
    625. //职称
    626. joblevels:[],
    627. //政治面貌
    628. politicsstatus:[],
    629. //职位
    630. positions:[],
    631. //固定学历的下拉列表
    632. tiptopDegrees: ['本科', '大专', '硕士', '博士', '高中', '初中', '小学', '其他'],
    633. //树形列表默认为不可见
    634. visable:false,
    635. visable2:false,
    636. //树形列表的对应属性
    637. defaultProps:{
    638. children:'children',
    639. label:'name'
    640. },
    641. //部门数据
    642. allDeps:[],
    643. //回显数据
    644. inputDepName:'',
    645. //弹出框标题
    646. title:'',
    647. importDataBtnText:'导入数据',
    648. importDataBtnIcon:'el-icon-upload2',
    649. //正在导入时的属性
    650. importDataDisabled:false,
    651. headers:{
    652. Authorization:window.sessionStorage.getItem('tokenStr')
    653. },
    654. //高级搜索属性显示
    655. showAdvanceSearchVisible:false,
    656. //添加员工对象
    657. emp: {
    658. id:null,
    659. name: '',
    660. gender: '',
    661. birthday: '',
    662. idCard: '',
    663. wedlock: '',
    664. nationId: null,
    665. nativePlace: '',
    666. politicId: null,
    667. email: '',
    668. phone: '',
    669. address: '',
    670. departmentId: null,
    671. jobLevelId: null,
    672. posId: null,
    673. engageForm: '',
    674. tiptopDegree: '',
    675. specialty: '',
    676. school: '',
    677. beginDate: '',
    678. workID: '',
    679. contractTerm: null,
    680. conversionTime: '',
    681. notWorkDate: '',
    682. beginContract: '',
    683. endContract: '',
    684. workAge: null
    685. },
    686. rules: {
    687. name: [{
    688. required: true, message: '请输入员工姓名', trigger:
    689. 'blur'
    690. }],
    691. gender: [{
    692. required: true, message: '请输入性别', trigger:
    693. 'blur'
    694. }],
    695. birthday: [{
    696. required: true, message: '请输入出生日期',
    697. trigger: 'blur'
    698. }],
    699. idCard: [{
    700. required: true, message: '请输入身份证号码', trigger:
    701. 'blur'
    702. }, {
    703. pattern: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
    704. message: '身份证号码格式不正确',
    705. trigger: 'blur'
    706. }],
    707. wedlock: [{
    708. required: true, message: '请输入婚姻状况', trigger:
    709. 'blur'
    710. }],
    711. nationId: [{
    712. required: true, message: '请输入民族', trigger:
    713. 'blur'
    714. }],
    715. nativePlace: [{
    716. required: true, message: '请输入籍贯', trigger:
    717. 'blur'
    718. }],
    719. politicId: [{
    720. required: true, message: '请输入政治面貌',
    721. trigger: 'blur'
    722. }],
    723. email: [{
    724. required: true, message: '请输入邮箱地址', trigger:
    725. 'blur'
    726. }, {
    727. type: 'email',
    728. message: '邮箱格式不正确',
    729. trigger: 'blur'
    730. }],
    731. phone: [{
    732. required: true, message: '请输入电话号码', trigger:
    733. 'blur'
    734. }],
    735. address: [{
    736. required: true, message: '请输入员工地址', trigger:
    737. 'blur'
    738. }],
    739. departmentId: [{
    740. required: true, message: '请输入部门名称',
    741. trigger: 'blur'
    742. }],
    743. jobLevelId: [{
    744. required: true, message: '请输入职称', trigger:
    745. 'blur'
    746. }],
    747. posId: [{
    748. required: true, message: '请输入职位', trigger:
    749. 'blur'
    750. }],
    751. engageForm: [{
    752. required: true, message: '请输入聘用形式',
    753. trigger: 'blur'
    754. }],
    755. tiptopDegree: [{
    756. required: true, message: '请输入学历',
    757. trigger: 'blur'
    758. }],
    759. specialty: [{
    760. required: true, message: '请输入专业', trigger:
    761. 'blur'
    762. }],
    763. school: [{
    764. required: true, message: '请输入毕业院校', trigger:
    765. 'blur'
    766. }],
    767. beginDate: [{
    768. required: true, message: '请输入入职日期',
    769. trigger: 'blur'
    770. }],
    771. workState: [{
    772. required: true, message: '请输入工作状态',
    773. trigger: 'blur'
    774. }],
    775. workID: [{
    776. required: true, message: '请输入工号', trigger:
    777. 'blur'
    778. }],
    779. contractTerm: [{
    780. required: true, message: '请输入合同期限',
    781. trigger: 'blur'
    782. }],
    783. conversionTime: [{
    784. required: true, message: '请输入转正日期',
    785. trigger: 'blur'
    786. }],
    787. notWorkDate: [{
    788. required: true, message: '请输入离职日期',
    789. trigger: 'blur'
    790. }],
    791. beginContract: [{
    792. required: true, message: '请输入合同起始日期',
    793. trigger: 'blur'
    794. }],
    795. endContract: [{
    796. required: true, message: '请输入合同结束日期',
    797. trigger: 'blur'
    798. }],
    799. workAge: [{
    800. required: true, message: '请输入工龄', trigger:
    801. 'blur'
    802. }],
    803. }
    804. }
    805. },
    806. //当页面刚加载的时候调用initEmps方法调用后端接口,获取所有员工列表列表
    807. mounted(){
    808. this.initEmps();//获取员工列表
    809. this.initData();//获取职位、民族等列表
    810. this.initPositions();//获取职位
    811. },
    812. methods:{
    813. //获取员工列表方法
    814. initEmps(type) {
    815. this.loading = true;
    816. let url = '/employee/basic/?currentPage=' + this.currentPage + '&size=' + this.size;
    817. if (type && type == 'advanced') {
    818. if (this.searchValue.politicId) {
    819. url += '&politicId=' + this.searchValue.politicId;
    820. }
    821. if (this.searchValue.nationId) {
    822. url += '&nationId=' + this.searchValue.nationId;
    823. }
    824. if (this.searchValue.jobLevelId) {
    825. url += '&jobLevelId=' + this.searchValue.jobLevelId;
    826. }
    827. if (this.searchValue.posId) {
    828. url += '&posId=' + this.searchValue.posId
    829. }
    830. if (this.searchValue.engageForm) {
    831. url += '&engageForm=' + this.searchValue.engageForm;
    832. }
    833. if (this.searchValue.departmentId) {
    834. url += '&departmentId=' + this.searchValue.departmentId;
    835. }
    836. if (this.searchValue.beginDateScope) {
    837. url += '&beginDateScope=' + this.searchValue.beginDateScope;
    838. }
    839. } else {
    840. url += '&name=' + this.empName;
    841. }
    842. this.getRequest(url).then(resp => {
    843. this.loading = false;
    844. if (resp) {
    845. this.emps = resp.data;
    846. this.total = resp.total;
    847. }
    848. })
    849. },
    850. //每页条数改变时触发
    851. sizeChange(currentSize) {
    852. this.size = currentSize;
    853. this.initEmps();
    854. },
    855. //当前页改变方法
    856. currentChange(currentPage) {
    857. this.currentPage = currentPage;
    858. //当前也改变,之后调用列表方法
    859. this.initEmps();
    860. },
    861. //显示弹出框方法
    862. showAddEmpView() {
    863. this.title = '添加员工';
    864. //清空员工数据
    865. this.emp = {
    866. id: null,
    867. name: '',
    868. gender: '',
    869. birthday: '',
    870. idCard: '',
    871. wedlock: '',
    872. nationId: null,
    873. nativePlace: '',
    874. politicId: null,
    875. email: '',
    876. phone: '',
    877. address: '',
    878. departmentId: null,
    879. jobLevelId: null,
    880. posId: null,
    881. engageForm: '',
    882. tiptopDegree: '',
    883. specialty: '',
    884. school: '',
    885. beginDate: '',
    886. workID: '',
    887. contractTerm: null,
    888. conversionTime: '',
    889. notWorkDate: '',
    890. beginContract: '',
    891. endContract: '',
    892. workAge: null
    893. }
    894. //清空所处部门
    895. this.inputDepName = '';
    896. //显示弹出框
    897. this.dialogVisible = true;
    898. this.getMaxWorkID();
    899. this.initPositions();
    900. },
    901. //获取去下拉框中的内容 获取职位、民族、职称等列表
    902. initData() {
    903. //首先判断sessionStorage里面有没有民族
    904. if (!window.sessionStorage.getItem("nations")) {
    905. this.getRequest('/employee/basic/nation').then(resp => {
    906. if (resp) {
    907. this.nations = resp;
    908. //存入sessionStorage里面
    909. window.sessionStorage.setItem("nations", JSON.stringify(resp));
    910. }
    911. })
    912. } else {
    913. //存在直接获取
    914. this.nations = JSON.parse(window.sessionStorage.getItem("nations"))
    915. }
    916. //首先判断sessionStorage里面有没有职称
    917. if (!window.sessionStorage.getItem("joblevels")) {
    918. this.getRequest('/employee/basic/joblevel').then(resp => {
    919. if (resp) {
    920. this.joblevels = resp;
    921. window.sessionStorage.setItem("joblevels", JSON.stringify(resp));
    922. }
    923. })
    924. } else {
    925. this.joblevels = JSON.parse(window.sessionStorage.getItem("joblevels"))
    926. }
    927. //首先判断sessionStorage里面有没有政治面貌
    928. if (!window.sessionStorage.getItem("politicsstatus")) {
    929. this.getRequest('/employee/basic/politicsStatus').then(resp => {
    930. if (resp) {
    931. this.politicsstatus = resp;
    932. window.sessionStorage.setItem("politicsstatus", JSON.stringify(resp));
    933. }
    934. })
    935. } else {
    936. this.politicsstatus = JSON.parse(window.sessionStorage.getItem("politicsstatus"))
    937. }
    938. //首先判断sessionStorage里面有没有部门
    939. if (!window.sessionStorage.getItem("allDeps")) {
    940. this.getRequest('/employee/basic/deps').then(resp => {
    941. if (resp) {
    942. this.allDeps = resp;
    943. window.sessionStorage.setItem("allDeps", JSON.stringify(resp));
    944. }
    945. })
    946. } else {
    947. this.allDeps =
    948. JSON.parse(window.sessionStorage.getItem("allDeps"))
    949. }
    950. },
    951. //获取职位
    952. initPositions() {
    953. this.getRequest('/employee/basic/position').then(resp => {
    954. if (resp) {
    955. this.positions = resp;
    956. }
    957. })
    958. },
    959. //获取最大工号
    960. getMaxWorkID() {
    961. this.getRequest('/employee/basic/maxWorkID').then(resp => {
    962. if (resp) {
    963. this.emp.workID = resp.obj;
    964. }
    965. })
    966. },
    967. //显示部门按钮
    968. showDepView() {
    969. this.visable = !this.visable;
    970. },
    971. //关闭部门按钮
    972. handleNodeClick(data) {
    973. this.inputDepName = data.name;
    974. this.emp.departmentId = data.id;
    975. this.visable = !this.visable;
    976. },
    977. //添加员工方法
    978. doAddEmp() {
    979. //判断是否有id,有id是更新
    980. if (this.emp.id) {
    981. //进行验证验证通过进行更新操作
    982. this.$refs['empForm'].validate(valid => {
    983. if (valid) {
    984. this.putRequest('/employee/basic/', this.emp).then(resp => {
    985. if (resp) {
    986. //将弹出框隐藏
    987. this.dialogVisible = false;
    988. this.initEmps();
    989. }
    990. })
    991. }
    992. })
    993. } else {
    994. //进行验证验证通过进行添加操作
    995. this.$refs['empForm'].validate(valid => {
    996. if (valid) {
    997. this.postRequest('/employee/basic/', this.emp).then(resp => {
    998. if (resp) {
    999. this.dialogVisible = false;
    1000. this.initEmps();
    1001. }
    1002. })
    1003. }
    1004. })
    1005. }
    1006. },
    1007. //删除员工事件
    1008. deleteEmp(data) {
    1009. this.$confirm('此操作将永久删除该【' + data.name + '】, 是否继续?', '提示', {
    1010. confirmButtonText: '确定',
    1011. cancelButtonText: '取消',
    1012. type: 'warning'
    1013. }).then(() => {
    1014. this.deleteRequest('/employee/basic/' + data.id).then(resp => {
    1015. if (resp) {
    1016. //删除完初始化数据
    1017. this.initEmps();
    1018. }
    1019. });
    1020. }).catch(() => {
    1021. this.$message({
    1022. type: 'info',
    1023. message: '已取消删除'
    1024. });
    1025. });
    1026. },
    1027. //修改员工方法
    1028. showEditEmpView(data) {
    1029. this.title = '编辑员工';
    1030. this.emp = data;//展示数据
    1031. this.inputDepName = data.department.name;//展示所处部门
    1032. this.initPositions();
    1033. this.dialogVisible = true;//弹出框显示
    1034. },
    1035. //导出数据
    1036. exportData() {
    1037. this.downloadRequest('/employee/basic/export')
    1038. },
    1039. //导入数据的时的显示方法
    1040. beforeUpload() {
    1041. this.importDataBtnText = '正在导入';
    1042. this.importDataBtnIcon = 'el-icon-loading';
    1043. this.importDataDisabled = true;//正在导入时为true,禁用状态
    1044. },
    1045. //文件上传失败的钩子函数
    1046. onError() {
    1047. this.importDataBtnText = '导入数据';
    1048. this.importDataBtnIcon = 'el-icon-upload2';
    1049. this.importDataDisabled = false;//导入成功开启状态false
    1050. },
    1051. //文件上传成功的钩子函数
    1052. onSuccess() {
    1053. this.importDataBtnText = '导入数据';
    1054. this.importDataBtnIcon = 'el-icon-upload2';
    1055. this.importDataDisabled = false;
    1056. this.initEmps();
    1057. },
    1058. //高级搜索框显示的方法
    1059. showAdvanceSearchView() {
    1060. this.showAdvanceSearchVisible = !this.showAdvanceSearchVisible;
    1061. this.searchValue = {
    1062. politicId: null,
    1063. nationId: null,
    1064. jobLevelId: null,
    1065. posId: null,
    1066. engageForm: '',
    1067. departmentId: null,
    1068. beginDateScope: null
    1069. }
    1070. },
    1071. //高级搜索中的部门列表
    1072. searchHandleNodeClick(data) {
    1073. this.inputDepName = data.name;
    1074. this.searchValue.departmentId = data.id;
    1075. this.visable2 = !this.visable2;
    1076. },
    1077. //显示部门按钮2
    1078. showDepView2() {
    1079. this.visable2 = !this.visable2;
    1080. },
    1081. }
    1082. }
    1083. script>
    1084. <style scoped>
    1085. style>

     

     

  • 相关阅读:
    Selenium上传文件有多少种方式?不信你有我全
    LeetBook 刷题笔记:链表(三)
    电脑游戏录屏哪个好用免费?这2款录屏软件,用过都说好!
    程序员敲诈老板,或面临37年监禁
    AcWing 835. Trie字符串统计
    科目三:超车
    MySQL数据库:2、MySQL的下载与安装、基本使用、系统服务制作
    Mybatis的mapper.xml批量插入、修改sql
    git基础命令
    Docker 问题记录
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/126568597