操作员管理 微人事 项目 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网关是一款针对公网访…

vscode python 无法引入上层目录解决

在vscode 中.vscode 配置如下 { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid830387 “version”: “0.2.0”, “configurati…

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

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

Java通过PowerMockito和Mokito进行单元测试

PowerMockito和Mokito的概念 PowerMockito和Mockito都是Java语言中的测试框架&#xff0c;用于进行单元测试和集成测试。它们中的每一个都有不同的功能和应用。 Mockito是一个基于模拟的测试框架。它允许你模拟对象&#xff0c;在测试中隔离被测代码的依赖项。使用Mockito&am…

【业务功能篇79】Springboot获取多环境工具类

SpringBeanUtils 工具类 package com.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component;imp…

如何在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;录制一段视频&…

软考高级系统架构设计师系列论文八十八:财务数据仓库系统的设计与实现

软考高级系统架构设计师系列论文八十八:财务数据仓库系统的设计与实现 一、摘要二、正文三、总结一、摘要 近年来,数据仓库技术在信息系统的建设中得到了广泛应用,有效地为决策提供了支持。2020年6月,本人所在单位组织开发了财务管理决策系统,该系统主要是使高层领导掌握企…

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

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

大模型从入门到应用——LangChain:链(Chains)-[链与索引:图问答(Graph QA)和带来源的问答(QA with Sources)]

分类目录&#xff1a;《大模型从入门到应用》总目录 图问答&#xff08;Graph QA&#xff09; 创建图 在本节中&#xff0c;我们构建一个示例图。目前&#xff0c;这对于较小的文本片段效果最好&#xff0c;下面的示例中我们只使用一个小片段&#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; # 不使用缓存

AI 插件:未来的浏览器、前端与交互

想象一下&#xff0c;你在浏览器中粘贴一个 URL&#xff0c;这个 URL 不仅仅是一个网址&#xff0c;而是一个功能强大、能执行多种任务的 AI 插件。这听起来像是未来的事情&#xff0c;但实际上&#xff0c;这种变革已经悄悄进行中。 1. 插件的魅力与局限性 当我第一次接触到…

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 为开发人员提供了全方位的支持和解决方案。无论您是刚刚接触微服务还…

C++学习笔记总结练习:内存对齐

概述 概念 编译器为程序中的每个“数据单元”安排在适当的位置上。 原因 平台原因(移植原因)&#xff1a;不是所有的硬件平台都能访问任意地址上的任意数据的&#xff1b;某些硬件平台只能在某些地址处取某些特定类型的数据&#xff0c;否则抛出硬件异常。性能原因&#xf…

Python --数据库操作

目录 1&#xff0c; mysql 1-1&#xff0c; mysql驱动 1-2&#xff0c; 连接mysql 1-3&#xff0c; 执行sql语句 1-3-1&#xff0c; 创建表 1-3-2&#xff0c; 插入数据 1-3-3&#xff0c; 查询数据 1-3-4&#xff0c; 获取结果集 1-4&#xff0c; 断开mysql连接 1&am…