操作员管理 微人事 项目 SpringBooot + Vue 前后端分离

操作员管理接口设计

HrController

@RestController
@RequestMapping("/system/hr")
public class HrController {@AutowiredHrService hrService;@GetMapping("/")public List<Hr> getAllHr(){return hrService.getAllHr();}}

HrService

在这里插入图片描述

 public List<Hr> getAllHr() {Hr principal = (Hr) SecurityContextHolder.getContext().getAuthentication().getPrincipal();//获取存储在Security当前用户信息return hrMapper.getAllHr(principal.getId());}

HrMapper

    List<Hr> getAllHr(Integer id);
  <resultMap id="BaseResultMap2" type="com.xyg.pojo.Hr" extends="BaseResultMap"><collection property="roles" ofType="com.xyg.pojo.Role" ><result column="id" property="id"></result><result column="name" property="name"></result><result column="namezh" property="namezh"></result></collection></resultMap><select id="getAllHr" resultMap="BaseResultMap2">select * from hr  LEFT JOIN hr_role as hrr  on hr.id=hrr.hrid LEFT JOIN role on role.id = hrr.rid where hr.id!=#{id}</select>

mysql逻辑: 查询Hr 和 角色之间的信息 每个Hr有哪些角色,除了当前用户不查

操作员管理页面展示

SysHr.vue

<template><div><div style="display: flex ; justify-content: center;margin-top: 20px"><el-input type="text" placeholder="请输入用户名" style="width: 500px"></el-input><el-button type="primary" icon="el-icon-search">搜索</el-button></div><div style="display: flex; flex-wrap: wrap; justify-content: space-around ;"><el-card style="width: 400px; margin-top: 20px"  v-for="(hr,index) in Hrs" :key="index"><div slot="header" class="clearfix" ><span>{{hr.name}}</span><el-button style="float: right; padding: 3px 0;color: red" type="text" icon="el-icon-delete"></el-button></div><div><img  style="width: 120px;height: 120px; border-radius: 60px; margin-left: 120px" :src="hr.userface" :alt="hr.name" :title="hr.name"/></div><div style="font-family: 幼圆;color:orange;margin-top: 5px;line-height: 30px "><div>用户名: {{hr.name}}</div><div>手机号码: {{hr.phone}}</div><div>地址: {{hr.telephone}}</div><div>用户状态: <el-switchv-model="hr.enabled"active-text="启用"inactive-text="禁用"></el-switch></div><div>用户角色:<el-tag type="success" style="margin-left: 8px" v-for="(role,index) in hr.roles" :key="index">{{role.namezh}}</el-tag><el-button size="small" style="" icon="el-icon-more"></el-button></div><div>备注:{{hr.remark}}</div></div></el-card></div></div>
</template><script>export default {name: "SysHr",data(){return{Hrs:[]}},mounted(){this.initHr()},methods:{initHr(){this.getRequest("/system/hr/").then(resp=>{if (resp){this.Hrs=resp}})}}}
</script><style scoped></style>

展示效果
在这里插入图片描述

问题Bug解决

在这里插入图片描述
还有一个BUG

因:org.apache.ibatis.reflection.ReflectionException:非法重载getter方法,在类class
com.chb.vhr.bean.Hr中启用属性类型不明确。这违反了JavaBeans规范,并可能导致不可预测的结果

解决方式
SpringSecurity 实现UserDetails 重写isEnabled 不能有重复的可能重复生成,或者加了个@Data也重复生成了去掉它就好了

用户状态更新

HrController

    @PutMapping("/")public RespBean updateHr(@RequestBody Hr hr){if(hrService.updateHr(hr)==1){return RespBean.ok("更新成功");}return RespBean.err("更新失败");}

HrService

    public int updateHr(Hr hr) {return hrMapper.updateByPrimaryKey(hr);}

HrMapper

    int updateByPrimaryKey(Hr record);
  <update id="updateByPrimaryKey" parameterType="com.xyg.pojo.Hr" >update hrset name = #{name,jdbcType=VARCHAR},phone = #{phone,jdbcType=CHAR},telephone = #{telephone,jdbcType=VARCHAR},address = #{address,jdbcType=VARCHAR},enabled = #{enabled,jdbcType=BIT},username = #{username,jdbcType=VARCHAR},password = #{password,jdbcType=VARCHAR},userface = #{userface,jdbcType=VARCHAR},remark = #{remark,jdbcType=VARCHAR}where id = #{id,jdbcType=INTEGER}</update>

前端对接

在这里插入图片描述

eanbledChange(hr){console.log(hr)this.putRequest("/system/hr/",hr).then(resp=>{if(resp){this.initHr()}})},

操作员角色更新

具体思路是前端传递用户id和需要更新多个角色id,后端接收用户id和数组角色id
先删除原来的角色和用户关联,在重新新增角色和用户关联

HrController在这里插入图片描述

    @PostMapping("/")public RespBean updateHrRole(Integer hrid,Integer[] rid){System.out.println(rid);if(hrService.updateHrRole(hrid,rid)==rid.length){return RespBean.ok("更新成功");}return RespBean.err("更新失败");}

在这里插入图片描述

HrService

    @Transactionalpublic Integer updateHrRole(Integer hrid, Integer[] rid) {hrRoleMapper.deleteByHrId(hrid);return  hrRoleMapper.updateHrRole(hrid,rid);}

HrRoleMapper

    void deleteByHrId(Integer hrid);Integer updateHrRole(@Param("hrid") Integer hrid,@Param("rids") Integer[] rids);
 <delete id="deleteByHrId">deletefrom hr_rolewhere  hrid=#{hrid};</delete><insert id="updateHrRole">insert into hr_role  (hrid, rid) values<foreach collection="rids" item="rid" separator=",">(#{hrid},#{rid})</foreach></insert>

前端布局对接后端

加一个弹出框
在这里插入图片描述
在这里插入图片描述

 </el-tag><el-popover@hide="hidePop(hr)"@show="showPop(hr)"placement="bottom"title="角色列表"width="100"trigger="click"><el-button slot="reference" size="mini" style="color: red" icon="el-icon-more"></el-button><div><el-select  v-model="selectrole"  multiple  placeholder=""><el-optionv-for="(r,indexk) in allRoles":key="indexk":label="r.namezh":value="r.id"></el-option></el-select></div></el-popover>

在这里插入图片描述

          hidePop(hr){let url ='/system/hr/?hrid='+hr.idthis.selectrole.forEach(r=>{   //selectrole[]数组存储了角色idurl+= '&rid='+r})this.postRequest(url).then(resp=>{if(resp){this.initHr()}})},showPop(role){console.log(role)let roles=role.roles;this.selectrole=[]roles.forEach(r=>{this.selectrole.push(r.id)})

弹出的时候进行修改角色,关闭框的时候就更新成功

问题解决

发现并没有选择修改角色,隐藏弹出框会进行网络请求。
具体思路
对比两个数组是否一样长
进行遍历对比两个数组的数据角色id是否一样

两个条件符合那就是用户并没有修改数据

  hidePop(hr){let roles = []Object.assign(roles,hr.roles);//拷贝hr.roles数据到roleslet fla = false;if(roles.length != this.selectrole.length){//如果数组长度不相等说明修改了角色fla=true;}else {for(let i=0;i<roles.length;i++){//let role=roles[i]for (let j=0;j<this.selectrole.length;j++){let sr=this.selectrole[j]//和selectrole每个数据进行比较if(role.id == sr){//如果有相等的roles.splice(i,1);//数组中剔除掉i--;//并且数组roles减少长度break//退出当前循环,进入外层循环,进行遍历判断}}}if(roles.length != 0){//遍历完后就判断,roles数组为0说明数组数据都相等的就不放行,程序结束fla=true}}if(fla){let url ='/system/hr/?hrid='+hr.idthis.selectrole.forEach(r=>{   //selectrole[]数组存储了角色idurl+= '&rid='+r})this.postRequest(url).then(resp=>{if(resp){this.initHr()}})}},

操作员搜索

HrController

在查询用户中加个用户名参数

在这里插入图片描述

HrService

    public List<Hr> getAllHr(String keyW) {Hr principal = (Hr) SecurityContextHolder.getContext().getAuthentication().getPrincipal();return hrMapper.getAllHr(principal.getId(),keyW);}

HrMapper

    List<Hr> getAllHr(@Param("id") Integer id, @Param("keywords") String keywords);

在这里插入图片描述

前端接口对接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

操作员删除

HrController

    @DeleteMapping("/{hid}")public RespBean deleteHr(@PathVariable Integer hid){if(hrService.deleteHr(hid)==1){return RespBean.ok("删除成功");}return RespBean.err("用户状态开启,请先禁用");}

HrService

    public int deleteHr(Integer hid) {Hr hr = hrMapper.selectByPrimaryKey(hid);if(!hr.isEnabled()){return hrMapper.deleteByPrimaryKey(hid);}return 0;}

HrMapper

    Hr selectByPrimaryKey(Integer id);
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >select <include refid="Base_Column_List" />from hrwhere id = #{id,jdbcType=INTEGER}</select>

删除接口对接前端

在这里插入图片描述
在这里插入图片描述

 deleteHr(hr){this.deleteRequest("/system/hr/"+hr.id).then(resp=>{if(resp){this.initHr()}})},

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

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

相关文章

NAT网关

NAT网关 NAT网关(NAT Gateway)是一种网络地址转换服务&#xff0c;提供NAT代理(SNAT和DNAT)能力。阿里云NAT网关分为公网NAT网关和VPC NAT网关&#xff1a; ■ 公网NAT网关提供公网地址转换服务 ■ VPC NAT网关提供私网地址转换服务 公网NAT网关 公网NAT网关是一款针对公网访…

Zebec Protocol:模块化 L3 链 Nautilus Chain,深度拓展流支付体系

过去三十年间&#xff0c;全球金融科技领域已经成熟并迅速增长&#xff0c;主要归功于不同的数字支付媒介的出现。然而&#xff0c;由于交易延迟、高额转账费用等问题愈发突出&#xff0c;更高效、更安全、更易访问的支付系统成为新的刚需。 此前&#xff0c;咨询巨头麦肯锡的一…

如何在windows电脑上安装多个node,并可以进行随意切换

一、进入官网http://nvm.uihtm.com/ 下载 二、启动解压后的程序 1.开始安装nvm 选择要安装的目录 一直下一步–下一步–最后点击完成 3.最后点击完成即可 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3656568c7e9946e8a04219811fc4c4d3.png 三、在cmd控制台进行操作…

论文笔记:从不平衡数据流中学习的综述: 分类、挑战、实证研究和可重复的实验框架

0 摘要 论文&#xff1a;A survey on learning from imbalanced data streams: taxonomy, challenges, empirical study, and reproducible experimental framework 发表&#xff1a;2023年发表在Machine Learning上。 源代码&#xff1a;https://github.com/canoalberto/imba…

关于 Camera 预览和录像画质不一样的问题分析

1、问题背景 基于之前安卓平台的一个项目&#xff0c;客户有反馈过一个 Camera app 预览的效果&#xff0c;和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果&#xff1b;录像的效果则是指打开 Camera app 开启录像功能&#xff0c;录制一段视频&…

聚观早报|闻泰科技上半年净利润12.58亿;馥逸医疗完成A轮融资

【聚观365】8月27日消息 闻泰科技2023上半年净利润12.58亿 馥逸医疗完成A轮融资 东方甄选转型直播电商成功 AI牙齿美白公司白里挑一完成千万元天使轮融资 特斯拉新款Model 3全面升级 闻泰科技上半年净利润12.58亿 闻泰科技发布2023年半年报。报告期内&#xff0c;闻泰科技…

【LeetCode-中等题】54. 螺旋矩阵

文章目录 题目方法一&#xff1a;按层模拟 题目 方法一&#xff1a;按层模拟 思路就是定义四个指针边界&#xff0c;按顺序扫完一遍&#xff0c;再缩小区域再扫描 public List<Integer> spiralOrder(int[][] matrix) {List<Integer> order new ArrayList<Int…

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址&#xff1a;某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求头是否加密&#xff1f; 无响应是否加…

mysql sql 执行流程

监控查询缓存的命中率 show status like ‘%qcache%’; mysql 缓存机制&#xff0c;以及 8.0 为啥取消 select sql_NO_Cache * from 表 where xxx; # 不使用缓存

node.js 简单实验 创建一个简单的web服务

概要&#xff1a;用一个最简单是例子感受一下node.js 的能力 1.代码 var http require("http") http.createServer(function (request, response) { response.writeHead(200, {Content-Type: text/plain}); response.end(Hello World\n); }).listen(8081); cons…

使用Python爬虫采集网络热点

在当今信息爆炸的时代&#xff0c;了解网络热搜词和热点事件对于我们保持时事敏感性和把握舆论动向非常重要。在本文中&#xff0c;我将与你分享使用Python爬虫采集网络热搜词和热点事件的方法&#xff0c;帮助你及时获取热门话题和热点新闻。 1. 网络热搜词采集 网络热搜词是人…

微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力

作者&#xff1a;草谷 前言 微服务引擎 MSE 全新发布&#xff01;新版本带来了一系列令人振奋的特性和改进&#xff0c;让您更轻松、高效地构建和管理微服务应用程序。从快速入门到迁移优化&#xff0c;MSE 为开发人员提供了全方位的支持和解决方案。无论您是刚刚接触微服务还…

java练习8.100m小球落地

题目: 如一个小球从100米高度自由落下&#xff0c;每次落地后就反跳回原高度的一半。 那么求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; public static void main(String[] args) {/*假如一个小球从100米高度自由落下&#xff0c;每次落…

保姆级教程:从0到1使用Stable Diffusion XL训练LoRA模型 |【人人都是算法专家】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中对业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 Rocky在知乎上持续撰写Stable Diffusion XL全方位的解析文章…

不系安全带抓拍自动识别

不系安全带抓拍自动识别系统通过yolo系列算法框架模型利用高清摄像头&#xff0c;不系安全带抓拍自动识别算法对高空作业场景进行监控&#xff0c;当检测到人员未佩戴安全带时会自动抓拍并进行告警记录。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用ancho…

计算机安全学习笔记(I):访问控制安全原理

访问控制原理 从广义上来讲&#xff0c;所有的计算机安全都与访问控制有关。 RFC 4949: Internet Security Glossary, Version 2 (rfc-editor.org) RFC 4949 定义的计算机安全&#xff1a;用来实现和保证计算机系统的安全服务的措施&#xff0c;特别是保证访问控制服务的措施…

c++11 标准模板(STL)(std::basic_istringstream)(二)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

成集云 | 旺店通多包裹数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着品牌电商兴起&#xff0c;线上线下开始逐渐融为一体&#xff0c;成集云以旺店通ERP系统为例&#xff0c;通过成集云-旺店通连接器&#xff0c;将旺店通ERP系统多包裹数据同步至钉钉实现数据互通&#xff0c;帮助企业解决了电商发货存在的错…

华为数通方向HCIP-DataCom H12-821题库(单选题:61-80)

第61题 关于 BGP 的Keepalive报文消息的描述,错误的是 A、Keepalive周期性的在两个BGP邻居之间发送 B、Keepalive报文主要用于对等路由器间的运行状态和链路的可用性确认 C、Keepalive 报文只包含一个BGP数据报头 D、缺省情况下,Keepalive 的时间间隔是180s 答案&#xff…

Nuxt 菜鸟入门学习笔记三:视图

文章目录 入口文件组件 Components页面 Pages布局 Layouts Nuxt 官网地址&#xff1a; https://nuxt.com/ Nuxt 提供多个组件层来实现应用程序的用户界面。 入口文件 App.vue组件 Components页面 Pages布局 Layouts 下面逐一进行介绍。 入口文件 默认情况下&#xff0c;Nu…