纳税服务系统【角色与用户】

用户与角色之间的关系

我们在做用户模块的时候,漏掉了最后一个功能。在新增功能中是可以选择角色的。

这里写图片描述

用户与角色之间的关系也是多对多

  • 一个用户对应多个角色
  • 一个角色可以被多个用户使用。

这里写图片描述

现在呢,我们的用户表已经是写的了。我们最好就不要修改原有的用户表数据。那我们在不修改用户表代码的情况下,又怎么来实现多对多呢??

跟角色与权限是一样的。使用中间表来维护它们的关系就行了。

用户:user用户id,名称...1      用户12      用户2用户角色:user_role用户id,角色id1       11       22       2角色:role角色Id,名称1      管理员2      一般用户

设计中间表


public class UserRole implements Serializable {private UserRoleId userRoleId;public UserRoleId getUserRoleId() {return userRoleId;}public void setUserRoleId(UserRoleId userRoleId) {this.userRoleId = userRoleId;}
}

主键表


public class UserRoleId implements Serializable {private String user_id;//在使用的时候,Role相关的数据会用得特别多。为了方便使用了Role对象。而user就不需要使用User对象了。private Role role;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserRoleId that = (UserRoleId) o;if (user_id != null ? !user_id.equals(that.user_id) : that.user_id != null) return false;return role != null ? role.equals(that.role) : that.role == null;}@Overridepublic int hashCode() {int result = user_id != null ? user_id.hashCode() : 0;result = 31 * result + (role != null ? role.hashCode() : 0);return result;}public String getUser_id() {return user_id;}public void setUser_id(String user_id) {this.user_id = user_id;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
}

映射文件

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="zhongfucheng.user.entity.UserRole" table="user_role"><composite-id  name="userRoleId" class="zhongfucheng.user.entity.UserRoleId"><!--manytoone可以生成外键字段。--><key-many-to-one name="role" class="zhongfucheng.role.entity.Role" column="role_id" lazy="false"/><key-property name="user_id" column="user_id" type="java.lang.String"/></composite-id></class></hibernate-mapping>

增加模块

在跳转到JSP页面的前,把所有的角色找出来。放到request域对象中,让JSP页面显示出来。

public String addUI() {//把所有的角色查询出来,带过去给JSP页面显示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());return "addUI";}
    <%--list是集合对象name是要带给服务器端的字符串数组。listkey 是集合元素对象的idlistValue 是集合元素对象的名字--%><s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"/>

这里写图片描述


编辑模块

编辑回显数据

在编辑模块中,需要将该用户所拥有的角色查询出来。然后把查询出来的id值放到数组中

    public String editUI() {//把所有的角色查询出来,带过去给JSP页面显示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());//外边已经传了id过来了,我们要找到id对应的Userif (user != null &&user.getId() != null  ) {//直接获取出来,后面JSP会根据User有getter就能读取对应的信息!user = userServiceImpl.findObjectById(user.getId());//通过用户的id得到所拥有UserRoleList<UserRole> roles = userServiceImpl.findRoleById(user.getId());//把用户拥有角色的id填充到数组中,数组最后回显到JSP页面int i=0;userRoleIds =  new String[roles.size()];for (UserRole role : roles) {userRoleIds[i++] = role.getUserRoleId().getRole().getRoleId();}}return "editUI";}

JSP通过checkboxlist进行回显,指定了name值就能够自动判定我们的用户拥有的角色是什么了。

<s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"></s:checkboxlist>

这里写图片描述


处理编辑操作

在更新之前,首先删除用户与角色之间的关系【历史遗留问题】,如果不删除,那么用户所拥有的角色就一直保留着。无论你在JSP页面有没有勾选。

public String edit() throws IOException {//Struts2会自动把JSP带过来的数据封装到User对象上if (user.getId() != null && user != null) {if (headImg != null) {//得到要把头像上传到服务器的路径javax.servlet.ServletContext servletContext = ServletActionContext.getServletContext();String realPath = servletContext.getRealPath("upload/user");//由于用户上传的名字可能会相同,如果相同就被覆盖掉,因此我们要修改上传文件的名字【独一无二】headImgFileName = UUID.randomUUID().toString() + headImgFileName.substring(headImgFileName.lastIndexOf("."));FileUtils.copyFile(headImg, new File(realPath, headImgFileName));//设置图片与用户的关系user.setHeadImg(headImgFileName);}if (userRoleIds != null) {//删除用户与角色之间的关系【历史遗留问题】userServiceImpl.deleteUserRoleById(userRoleIds);//保存用户与角色。userServiceImpl.saveUserAndRole(user,userRoleIds);}}return "list";}

调用保存用户与角色的关系。如果id不是为空的,那么就执行更新,如果id为空,就执行保存。

@Overridepublic void saveUserAndRole(User user, String... userRoleIds) {//保存或更新用户if (user.getId() != null) {userDaoImpl.update(user);} else {userDaoImpl.save(user);}//判断有没有把id带过来if (userRoleIds != null) {for (String userRoleId : userRoleIds) {System.out.println(userRoleId);userDaoImpl.saveUserRole(new UserRole(new UserRoleId(user.getId(), new Role(userRoleId))));}}}

转载于:https://www.cnblogs.com/zhong-fucheng/p/7202917.html

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

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

相关文章

flex-grow flex-shrink 解决最后一行个数不足无法对齐

正常情况下&#xff0c;每页大小15个&#xff0c;设置每行3列&#xff0c;刚好5行。 当外部容器宽度不足以放3列时&#xff0c;自动换行&#xff0c;但最后一行元素自动撑满 &#xff0c;会造成元素块大小不一致&#xff0c;不是想要的效果 原始代码示例&#xff1a; <ul …

C# 并行编程避坑指南之-Try Catch系列

自从.NET Framework 4.5(含4.5)提供了Task开启线程后&#xff0c;基本上Thread的使用频率就大幅度降低了&#xff0c;但是一些老项目&#xff0c;或者老程序还是习惯用Thread去做&#xff0c;如果一定要使用Thred&#xff0c;那我们就必须在代码中使用try、catch块去处理异常的…

spring boot 整合mybatis

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</art…

k8s 读书笔记 - CRI(容器运行时接口)详解

k8s Node 节点&#xff08;kubelet&#xff09;的主要功能就是启动和停止容器的组件&#xff0c;这组件我们称之为 容器运行时&#xff08;Container Runtime&#xff09;&#xff0c;这其中最知名的就是 Docker 了。为了更具扩展性&#xff0c;k8s 从 v1.5 版本开始就加入了容…

Win11的这个功能,厉害了!

上周微软正式发布了Windows11的22H2版本&#xff0c;虽说是一周年更新版&#xff0c;但仍然有不少的问题。微软给Win10换了一套皮肤&#xff0c;并做了一些优化升级&#xff0c;摇身一变成了Win11&#xff0c;但是外观方面却做的并不是很协调&#xff0c;有一些界面仍然保留着以…

MAUI + Masa Blazor 开发带自动更新功能的安卓App

自动更新主要下面4个步骤获取最新版本号提示用户发现更新&#xff0c;等待用户确认更新下载最新的apk包安装apk包下面从创建MAUI项目开始1、创建Maui Blazor Server应用2、安装Masa.Blazor&#xff0c;并添加引用dotnet add package Masa.Blazor在 wwwroot/index.html 中引入资…

[deviceone开发]-一个很炫的手势动画示例

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 这是iOS下的效果&#xff0c;android下完全一致。通过do_GestureView组件和do_Animation组件&#xff0c;deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手势控制图片上下动画滑动实现开合…

POJ-3067 Japan---树状数组逆序对变形

题目链接&#xff1a; https://vjudge.net/problem/POJ-3067 题目大意&#xff1a; 日本岛东海岸与西海岸分别有N和M个城市&#xff0c;现在修高速公路连接东西海岸的城市&#xff0c;求交点个数。 解题思路&#xff1a; 记每条告诉公路为(x,y), 即东岸的第x个城市与西岸的第y个…

C# 笔迹擦除8边形

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;唐宋元明清原文地址&#xff1a; https://www.cnblogs.com/kybs0/p/16593146.htmlC# 笔迹擦除8边形擦除区域与橡皮大小不一致测试反馈&#xff0c;擦除区域与真实的橡皮大小不一致&#…

资深私域运营必知的100个专业名词!

来源 | 晏涛三寿 &#xff08;ID&#xff1a;yantao-219&#xff09; 作者 | 晏涛 如今私域相关人才进入了供不应求的状态&#xff0c;不少企业开始设置专门的岗位&#xff0c;私域运营也成为了招聘市场中的“香饽饽”。 但是想要成为一名优秀的私域运营并不容易&#xff0c;…

【错误解决】[Maven] cannot be opened because it does not exist错误[文件无法编译到target目录下的解决方法]...

转载请注明出处&#xff1a;http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 使用IDEA搭建的Maven项目&#xff0c;在写SpringEL和资源调用时出现了如下错误: 相信我&#xff0c;代码没问题的、 Caused by: java.io.FileNotFoundException: class path res…

JQ插件 jquery mobiscroll

参数&#xff1a; theme是指主题 display&#xff1a;bottom 是指弹出框的位置&#xff0c;分别可以使用top,bottom,inline来定义&#xff0c;这里解释一下inline的用法:inline的话就可以实现页面一加载就能看到这个弹出框&#xff0c;如果使用top和bottom,则必须使得输入框获得…

commons-lang3:DateUtils

2019独角兽企业重金招聘Python工程师标准>>> /** * 以秒为标准时间的毫秒数 */ public static final long MILLIS_PER_SECOND 1000 /** *以分钟为标准时间的毫秒数 */ public static final long MILLIS_PER_MINUTE 60 * MILLIS_PER_S…

Blazor University (46)依赖注入 —— Transient 依赖

原文链接&#xff1a;https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/transient-dependencies/Transient 依赖Transient 依赖是最容易理解的。在构建注册为 Transient 的可注入依赖项时&#xff0c;依赖项容器只是充当工厂。一旦实例被创…

AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备

kernel 的配置kernel 3.2.0make menuconfigDevice Drivers --->[*] USB support ---><*> USB Serial Converter support ---><*> USB driver for GSM and CDMA modems kernel 3.2.0make menuconfigDevice Drivers --->[*] Network device supp…

构建LAMP平台及应用系统

LANP架构指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括linux操作系统、apache网站服务器、mysql数据库服务器、PHP&#xff08;或Perl、Python&#xff09;网页编程语言。在构建LAMP平台时…

pyqt2_官网教程

sklearn实战-乳腺癌细胞数据挖掘&#xff08;博主亲自录制视频&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare Articles You can find a collection of P…

Windows10安装WSL2和Ubuntu的过程

因为在Windows10环境中安装了2个相同的包导致冲突&#xff0c;所以想到了通过WSL2Docker的方式进行编程开发。因为Docker Desktop直接安装就行了&#xff0c;不做介绍。本文主要介绍WSL2和Ubuntu的安装过程。一.安装前的环境准备1.升级Windows系统因为低于某个版本号不支持WSL2…

Hyper-V数据文件丢失解决方案(有图有真相)

一、Hyper-V虚拟化故障概述 1、虚拟机环境故障虚拟化环境为ESXI虚拟化服务器&#xff0c;虚拟机环境&#xff0c;虚拟机的硬盘文件和配置文件放在北京某服务器托管公司的DELL MD3200存储中&#xff08;存储由5块容量为600G的硬盘组成raid磁盘阵列&#xff09;。该存储中4块硬盘…