人力资源管理后台 === 角色管理

目录

1.组织架构-编辑部门-弹出层获取数据

2.组织架构-编辑部门-编辑表单校验

3.组织架构-编辑部门-确认取消

4.组织架构-删除部门

5.角色管理-搭建页面结构

6.角色管理-获取数据

7.角色管理-表格自定义结构

8.角色管理-分页功能

9.角色管理-新增功能弹层

10.角色管理-表单数据校验

11.角色管理-新增角色-确定取消


1.组织架构-编辑部门-弹出层获取数据

编辑部门和新增部门会共用一个组件,也就是add-dept组件要支持两种场景-新增场景-编辑场景

image.png

  • 封装获取部门详情的API-代码位置(src/api/department.js)
/*** 获取部门详情** ***/export function getDepartmentDetail(id) {return request({url: `/company/department/${id}`})
}
  • 点击编辑时,弹出层,通过ref获取组件实例,调用获取详情的方法-代码位置(src/views/department/index.vue)
    <add-dept ref="addDept" :current-node-id="currentNodeId" :show-dialog.sync="showDialog" @updateDepartment="getDepartment" />
  • 调用子组件方法-代码位置(src/views/department/index.vue)
 // 操作部门方法operateDept(type, id) {if (type === 'add') {// 添加子部门this.showDialog = true // 显示弹层this.currentNodeId = id} else if (type === 'edit') {// 编辑部门场景this.showDialog = truethis.currentNodeId = id // 记录id 要用它获取数据// 更新props- 异步动作// 直接调用了子组件的方法 同步的方法// 要在子组件获取数据// 父组件调用子组件的方法来获取数据this.$nextTick(() => {this.$refs.addDept.getDepartmentDetail() // this.$refs.addDept等同于子组件的this})} }

这里为什么要用$nextTick,因为弹出层之后紧接着要调用子组件方法,第一次弹出层时,里面的组件还未完成渲染,所以要等到showDialog这个属性设置的数据完成渲染之后才进行调用

  • 子组件提供获取详情的方法-代码位置(src/views/department/components/add-dept.vue)
 // 获取组织的详情async getDepartmentDetail() {this.formData = await getDepartmentDetail(this.currentNodeId)}

2.组织架构-编辑部门-编辑表单校验

image.png

编辑部门表单校验和新增部门表单校验的区别就是编辑的数据已经在数据库存在了,必然是存在重复的

image.png

  • 编辑场景下排出自身-

  • 检查部门编码-代码位置(src/views/department/components/add-dept.vue)

{trigger: 'blur',// 自定义校验模式validator: async(rule, value, callback) => {// value就是输入的编码let result = await getDepartment()// 判断是否是编辑模式if (this.formData.id) {// 编辑场景result = result.filter(item => item.id !== this.formData.id)}// result数组中是否存在 value值if (result.some(item => item.code === value)) {callback(new Error('部门中已经有该编码了'))} else {callback()}}
  • 检查部门名称-代码位置(src/views/department/components/add-dept.vue)
{trigger: 'blur',// 自定义校验模式validator: async(rule, value, callback) => {// value就是输入的名称let result = await getDepartment()if (this.formData.id) {// 编辑场景 排除自身result = result.filter(item => item.id !== this.formData.id)}// result数组中是否存在 value值if (result.some(item => item.name === value)) {callback(new Error('部门中已经有该名称了'))} else {callback()}}

3.组织架构-编辑部门-确认取消

image.png

image.png

  • 封装更新部门的API-代码位置(src/api/department.js)
/** ** 更新部门* ***/
export function updateDepartment(data) {return request({method: 'put',url: `/company/department/${data.id}`,data})
}
  • 确认时区分当前时编辑还是新增场景-代码位置(src/views/department/components/add-dept.vue)
 // 点击确定时调用btnOK() {this.$refs.addDept.validate(async isOK => {if (isOK) {let msg = '新增'// 通过formData中idif (this.formData.id) {// 编辑场景msg = '更新'await updateDepartment(this.formData)} else {// 新增场景await addDepartment({ ...this.formData, pid: this.currentNodeId })}// 通知父组件更新this.$emit('updateDepartment')// 提示消息this.$message.success(`${msg}部门成功`)this.close()}})},
  • 取消时重置数据-代码位置(src/views/department/components/add-dept.vue)
 close() {// 修改父组件的值 子传父// resetFields 只能重置在模板中绑定的数据this.formData = {code: '', // 部门编码introduce: '', // 部门介绍managerId: '', // 部门负责人idname: '', // 部门名称pid: '' // 父级部门的id}this.$refs.addDept.resetFields() // 重置表单this.$emit('update:showDialog', false)},
  • 使用计算属性生成当前显示的弹层标题-代码位置(src/views/department/components/add-dept.vue)
  computed: {showTitle() {return this.formData.id ? '编辑部门' : '新增部门'}}
  • 弹层标题使用计算属性-代码位置(src/views/department/components/add-dept.vue)
<el-dialog :title="showTitle" :visible="showDialog" @close="close">

4.组织架构-删除部门

image.png

  • 封装删除部门的API-代码位置(src/api/department.js)
/*** 删除部门*
*/export function delDepartment(id) {return request({method: 'delete',url: `/company/department/${id}`})
}
  • 在删除场景下调用API删除-代码位置(src/views/department/index.vue)
  // 操作部门方法operateDept(type, id) {if (type === 'add') {// 添加子部门this.showDialog = true // 显示弹层this.currentNodeId = id} else if (type === 'edit') {// 编辑部门场景this.showDialog = truethis.currentNodeId = id // 记录id 要用它获取数据// 更新props- 异步动作// 直接调用了子组件的方法 同步的方法// 要在子组件获取数据// 父组件调用子组件的方法来获取数据this.$nextTick(() => {this.$refs.addDept.getDepartmentDetail() // this.$refs.addDept等同于子组件的this})} else {// 删除部门this.$confirm('您确认要删除该部门吗').then(async() => {await delDepartment(id)// 提示消息this.$message.success('删除部门成功')this.getDepartment()})}}

5.角色管理-搭建页面结构

image.png

  • 搭建角色管理的页面结构-代码位置(src/views/role/index.vue)
<template><div class="container"><div class="app-container"><!-- 角色管理内容 --><div class="role-operate"><el-button size="mini" type="primary">添加角色</el-button></div><!-- 放置table组件 --><el-table><!-- 放置列 --><el-table-column align="center" width="200" label="角色" /><el-table-column align="center" width="200" label="启用" /><el-table-column align="center" label="描述" /><el-table-column align="center" label="操作" /></el-table><!-- 放置分页组件 --><el-row type="flex" style="height:60px" align="middle" justify="end"><!-- 放置分页组件 --><el-pagination layout="prev, pager, next" /></el-row></div></div>
</template>
  • 样式-代码位置(src/views/role/index.vue)
<style scoped>
.role-operate {padding: 10px;
}
</style>

6.角色管理-获取数据

image.png

  • 封装获取角色API-代码位置(src/api/role.js)
import request from '@/utils/request'/** ** 获取角色列表* **/
export function getRoleList(params) {return request({url: '/sys/role',params // 查询参数})
}
  • 在初始化时调用API-赋值给数据-代码位置(src/views/role/index.vue)
import { getRoleList } from '@/api/role'
export default {name: 'Role'name: 'Role',data() {return {list: []}},created() {this.getRoleList()},methods: {async getRoleList() {const { rows } = await getRoleList()this.list = rows // 赋值数据}}
}
  • 绑定表格属性-代码位置(src/views/role/index.vue)
<el-table :data="list"><!-- 放置列 --><el-table-column prop="name" align="center" width="200" label="角色" /><el-table-column prop="state" align="center" width="200" label="启用" /><el-table-column prop="description" align="center" label="描述" /><el-table-column align="center" label="操作" />
</el-table>

7.角色管理-表格自定义结构

image.png

  • 自定义启用列和操作列的结构-代码位置(src/views/role/index.vue)
<el-table-column prop="state" align="center" width="200" label="启用"><!-- 自定义列结构 --><template v-slot="{ row }"><span>  {{ row.state === 1 ? "已启用" : row.state === 0 ? "未启用" : "无" }} </span></template>
</el-table-column>
  • 自定义操作列结构-代码位置(src/views/role/index.vue)
<el-table-column align="center" label="操作"><!-- 放置操作按钮 --><template><el-button size="mini" type="text">分配权限</el-button><el-button size="mini" type="text">编辑</el-button><el-button size="mini" type="text">删除</el-button></template>
</el-table-column>

8.角色管理-分页功能

image.png


分页功能

  • 展示页码
  • 切换分页获取数据

分页组件属性

  • 当前页码
  • 每页条数
  • 总数

image.png

  • 定义分页信息-代码位置(src/views/role/index.vue)
export default {data () {return  {pageParams: {page: 1, // 第几页pagesize: 5, // 每页多少条total: 0}}}
}
  • 绑定分页信息-代码位置(src/views/role/index.vue)
 <el-pagination:page-size="pageParams.pagesize":current-page="pageParams.page":total="pageParams.total"layout="prev, pager, next"@current-change="changePage"
/>
  • 初始化时将总数赋值-代码位置(src/views/role/index.vue)
async getRoleList() {const { rows, total } = await getRoleList(this.pageParams)this.list = rows // 赋值数据this.pageParams.total = total
},
  • 切换分页时,获取对应页码的数据-代码位置(src/views/role/index.vue)
    // 切换分页时 请求新的数据changePage(newPage) {this.pageParams.page = newPage // 赋值当前页码this.getRoleList()}

9.角色管理-新增功能弹层

image.png

image.png

  • 放置弹层组件-代码位置(src/views/role/index.vue)
<el-dialog width="500px" title="新增角色" :visible.sync="showDialog"><!-- 表单内容 --><el-form label-width="120px"><el-form-item label="角色名称"><el-input style="width:300px" size="mini" /></el-form-item><el-form-item label="启用"><el-switch size="mini" /></el-form-item><el-form-item label="角色描述"><el-input type="textarea" :rows="3" style="width:300px" size="mini" /></el-form-item><el-form-item><el-row type="flex" justify="center"><el-col :span="12"><el-button type="primary" size="mini">确定</el-button><el-button size="mini">取消</el-button></el-col></el-row></el-form-item></el-form></el-dialog>
  • 声明变量控制弹层显示-代码位置(src/views/role/index.vue)
export default {data () {return  {showDialog: false}}
}
  • 点击按钮弹出层-代码位置(src/views/role/index.vue)
<el-button size="mini" type="primary" @click="showDialog = true">添加角色</el-button>

有同学可能会问,为啥组织架构要新增和编辑要单独封装一个组件,而角色管理不用呢?这里面有什么原因和讲究吗? 其实在企业开发过程中,封装组件并不是必须的,当一个业务或者需求明确,并且会有复用的场景下,封装组件会更佳规范一些,而有的企业为了提升开发效率,速度优先, 不封装组件的情况也是很常见的。

10.角色管理-表单数据校验

image.png

  • 声明数据和规则-代码位置(src/views/role/index.vue)
export default  {data () {return {roleForm: {name: '',description: '',state: 0 // 默认未1启用 关闭 0 打开1},rules: {name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],description: [{ required: true, message: '角色描述不能为空', trigger: 'blur' }]}}}
}
  • 绑定表单校验和数据-代码位置(src/views/role/index.vue)
<el-form ref="roleForm" :model="roleForm" :rules="rules" label-width="120px"><el-form-item prop="name" label="角色名称"><el-input v-model="roleForm.name" style="width:300px" size="mini" /></el-form-item><el-form-item label="启用"><!-- 如果不需要校验 就不需要写 prop属性 --><el-switch v-model="roleForm.state" :active-value="1" :inactive-value="0" size="mini" /></el-form-item><el-form-item prop="description" label="角色描述"><el-input v-model="roleForm.description" type="textarea" :rows="3" style="width:300px" size="mini" /></el-form-item>

11.角色管理-新增角色-确定取消

image.png

  • 封装新增角色的API-代码位置(src/api/role.js)
/** *** 新增角色* ***/export function addRole(data) {return request({url: '/sys/role',method: 'post',data})
}
  • 确定和取消方法
btnOK() {this.$refs.roleForm.validate(async isOK => {if (isOK) {await addRole(this.roleForm)this.$message.success('新增角色成功')this.getRoleList()this.btnCancel()}})},
btnCancel() {this.$refs.roleForm.resetFields() // 重置表单数据this.showDialog = false // 关闭弹层
},
  • 弹层绑定关闭方法
  <el-dialog width="500px" title="新增角色" :visible.sync="showDialog" @close="btnCancel">

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

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

相关文章

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

Ansible的重用(include和import)

环境 管理节点&#xff1a;Ubuntu 22.04控制节点&#xff1a;CentOS 8Ansible&#xff1a;2.15.6 重用 Ansible提供四种可重用的工件&#xff1a; variable文件&#xff1a;只包含变量的文件task文件&#xff1a;只包含task的文件playbook&#xff1a;可包含play、变量、ta…

MVVM 模式与 MVC 模式:构建高效应用的选择

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 84.柱状图中最大的矩形 class Solution:def largestRectangleArea(self, heights: List[int]) -> int:heights.insert(0, 0)heights.append(0)st…

java操作windows系统功能案例(二)

1、打印指定文件 可以使用Java提供的Runtime类和Process类来打印指定文件。以下是一个示例代码&#xff1a; import java.io.File; import java.io.IOException;public class PrintFile {public static void main(String[] args) {if (args.length ! 1) {System.out.println(…

NFT Insider115:The Sandbox开设元宇宙Diorama快闪店,​YGG Web3 游戏峰会已开幕

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

时间序列预测实战(二十一)PyTorch实现TCN卷积进行时间序列预测(专为新手编写的自研架构)

一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行TCN时间序列卷积进行时间序列建模&#xff08;专门为了时间序列领域新人编写的架构&#xff0c;简单不同于市面上大家用GPT写的代码&#xff09;&#xff0c;包括结果可视化、支持单元预测、多元预测、模型拟合效…

【深度学习】因果推断与机器学习

2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以OpenAI研发的GPT为代表的大模型大行其道&#xff0c;NLP领域的ChatGPT模型火爆一时&#xff0c;引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升&#xff0c;它能够同时接受图像和文本的输入…

通过navicat工具将excel文件导入数据库的表中

文章目录 1.navicat可视化工具2. 导入文件 1.navicat可视化工具 这里使用的是navicat数据库可视化工具&#xff0c;不是直接通过数据库指令导入的 前提是连接好数据库&#xff0c;建立好表&#xff0c;如下图&#xff0c;test为连接名&#xff0c;随便起&#xff0c;data为数据…

windows系统玩游戏找不到d3dx9_35.dll缺失的解决方法

分享一个我们在打开游戏或许软件过程中遇到的问题——“由于找不到d3dx9_35.dll,无法继续执行代码”的五个修复方案。这个问题可能会影响到我们的工作和娱乐效率&#xff0c;甚至可能导致工作的延期。因此&#xff0c;我希望通过今天的文章&#xff0c;能够帮助大家更好地解决这…

STL: 容器适配器stack 与 queue

目录 1.容器适配器 1.1 STL标准库中stack和queue的底层结构 1.2 deque的简单介绍(了解) 1.2.1 deque的原理介绍 1.2.2 deque的缺陷 1.2.3 为什么选择deque作为stack和queue的底层默认容器 2. stack的介绍和使用 2.1 stack的介绍 2.2 stack的使用 2.3 利用deque模拟实现…

c++基本常见错误总结

我们无论是在学习中还是在工作当中&#xff0c;总是会遇到各种各样的c编译错误问题&#xff0c;经常会有一种情况就是上一次好像遇到过这种问题&#xff0c;但是就是想不起来了&#xff08;我就是这样&#xff09;所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果

DiscuzQ论坛小程序上架发布后的展示效果&#xff1a; 1、需要用到的环境&#xff1a; php7.2 mysql5.7或者MariaDB 10.2(我安装用的mysql8.0) php除了必要的一些扩展外&#xff0c;还需要启用readlink、symlink函数等&#xff0c;具体看官方说明&#xff0c;安装的时候也会提醒…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(上)

目录 概述 云数据库开发 一、创建云数据库的对象类型。 二、预置数据&#xff08;为对象类型添加数据条目&#xff09;。 三、部署云数据库 云函数实现业务逻辑 一、创建云函数 二、云函数目录讲解 三、创建resources目录 四、获取云端凭据 五、导出之前创建的元数据…

【Vue】@keyup.enter @v-model.trim的用法

目录 keyup.enter v-model.trim 情景一&#xff1a; 情景二&#xff1a; keyup.enter 作用&#xff1a;监听键盘回车事件 上一篇内容&#xff1a; 记事本 https://blog.csdn.net/m0_67930426/article/details/134630834?spm1001.2014.3001.5502 这里有个添加任务的功能&…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一&#xff0c;其旨在有选择地提取图像的某些特征&#xff0c;可以用于在给定应用程序的上下文中传达重要信息&#xff0c;例如&#xff0c;去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

C语言——写一个简单函数,找两个数中最大者

#include <stdio.h>int max( int a, int b ) { return a>b ? a:b; }int main() { int a, b;printf("输入两个数:\n");scanf("%d %d", &a, &b);printf("max %d\n", max(a, b));return 0; }输出结果&#xff1a;

C#文件基本操作(判断文件是否存在、创建文件、复制或移动文件、删除文件以及获取文件基本信息)

目录 一、判断文件是否存在 1.File类的Exists()方法 2.FileInfo类的Exists属性 二、创建文件 1.File类的Create()方法 2.FileInfo类的Create()方法 三、复制或移动文件 1.File类的Copy()方法 2.File类的Move()方法 3.FileInfo类的CopyTo()方法 四、删除文件 1.File…

大数据基础设施搭建 - Hive

文章目录 一、上传压缩包二、解压压缩包三、配置环境变量四、初始化元数据库4.1 配置MySQL地址4.2 拷贝MySQL驱动4.3 初始化元数据库4.3.1 创建数据库4.3.2 初始化元数据库 五、启动元数据服务metastore5.1 修改配置文件5.2 启动/关闭metastore服务 六、启动hiveserver2服务6.1…