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

用户与角色之间的关系

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

这里写图片描述

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

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

这里写图片描述

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

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

用户: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 …

POJ 1562深搜判断连体油田个数

http://poj.org/problem?id1562 大意&#xff1a;输入mp二维矩阵&#xff0c;规定‘’连体的包括对角线为一片油田&#xff0c;统计共有多少油田。深搜方向数组dir设置8个方向遇到继续搜索把当前位置赋值*避免重复遍历即可 #include <iostream> #include <cmath> …

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

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

系统配置vue.config.js(通用)和vue3中的vite.config.js的通用配置

vue配置大全 本人实例自用&#xff0c;不喜勿喷 vue.config.js的配置 module.exports {devServer: {host: ,hot: true,port: 8086,disableHostCheck: true,//新版的webpack-dev-server出于安全考虑&#xff0c;默认检查hostname&#xff0c;//如果hostname不是配置内的&#x…

.NET 6应用程序适配国产银河麒麟V10系统随记

最近想在麒麟系统上运行.NET 6程序&#xff0c;经过一番折腾最终完成了&#xff0c;简单记录一下。目标系统:CPU: aarch64架构&#xff08;ARM64)操作系统&#xff1a;银河麒麟V10高级服务器系统银河麒麟V10系统&#xff08;以下简称麒麟&#xff09;使用的是redhat类似的dnf包…

SQL优化大法

一、查询SQL尽量不要使用select *&#xff0c;而是具体字段 1、反例 SELECT * FROM user2、正例 SELECT id,username,tel FROM user3、理由 节省资源、减少网络开销。 可能用到覆盖索引&#xff0c;减少回表&#xff0c;提高查询效率。 注意&#xff1a;为节省时间&#x…

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…

Mac系统之----教你怎么显示隐藏文件,或者关闭显示隐藏文件

显示&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool true隐藏&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool false转载于:https://www.cnblogs.com/akiha/p/6936332.html

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

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

HTML5_02之视频、音频、Canvas

1、HTML5新特性之视频播放——video&#xff1a; ①例&#xff1a;<video src""></video> ②video标签默认为300*150的inline-block&#xff1b; ③成员属性&#xff1a; autoplay&#xff1a;是否自动播放&#xff1b; controls&#xff1a;是否显示播…

Win11的这个功能,厉害了!

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

platform_set_drvdata和platform_get_drvdata用法【转】

本文转载自&#xff1a;http://www.cnblogs.com/wangxianzhen/archive/2013/04/09/3009530.html 在用到Linux设备驱动的platform框架时&#xff0c;常常会遇到两个函数platform_get_drvdata和 platform_set_drvdata。通常&#xff0c;会在驱动的probe函数中获取device的相关信息…

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 中引入资…

WebApi 将 DataRow、DataTable转换成JObject返回

/// <summary> /// 扩展&#xff1a;将object强制转化为int /// </summary> /// <param name"o">要强制转换的object</param> /// <param name"defaultValue">o为null或者转换失败的默认值</param> /// <returns&g…

空间矢量数据(.shp文件)之JAVA操作

Shape文件由ESRI开发。一个ESRI&#xff08;Environmental Systems Research Institute&#xff09;的shape文件包含一个主文件&#xff0c;一个索引文件&#xff0c;和一个dBASE表。当中主文件的后缀就是.shp。 Shape文件已经是一种开源的文件格式。官方早在2006年就出版了对应…

[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…