JAVAEE免费工程师教程之springboot综合案例

day04_springboot综合案例

用户管理

查询用户

查询所有用户执行流程

在这里插入图片描述

编写UserMapper接口

public interface UserMapper {// 查询所有用户List<UserInfo> findAllUsers();
}

编写UserService

public interface UserService extends UserDetailsService {/*** 查询所有用户* @return*/List<UserInfo> findAllUsers(Integer page,Integer size);
}

@Service("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;/*** 查询所有用户* @return*/@Overridepublic List<UserInfo> findAllUsers(Integer page,Integer size) {PageHelper.startPage(page,size);return this.userMapper.findAllUsers();}
}

编写UserController

/*** @Dese: 用户相关操作*/
@Controller
@RequestMapping("user")
public class UserController {@Autowiredprivate UserService userService;/*** 查询所有* @param page* @param size* @param model* @return*/@GetMapping("findAll")public String findAll(@RequestParam(value = "page", defaultValue = "1") Integer page ,@RequestParam(value = "size",defaultValue = "5") Integer size,Model model){PageHelper.startPage(page,size);List<UserInfo> list =  this.userService.findAll();PageInfo pageInfo = new PageInfo(list);model.addAttribute("pageInfo",pageInfo);return "user-list";}
}

编写UserMapper.xml

 <!--查询所有用户-->
<select id="findAllUsers" resultType="UserInfo">select * from users
</select>

修改UserInfo类


@Data
public class UserInfo {private String id;private String username;private String email;private String password;private String phoneNum;private int status;private String statusStr;private List<Role> roles;public String getStatusStr() {if (status == 0){statusStr = "关闭";}else  if (status == 1){statusStr = "开启";}return statusStr;}
}

测试

在这里插入图片描述

用户添加

用户添加执行流程

在这里插入图片描述

编写UserMapper接口

public interface UserMapper {/*** 新增用户* @param userInfo*/void save(UserInfo userInfo);
}

编写UserService

public interface UserService extends UserDetailsService {/*** 新增用户* @param userInfo*/void save(UserInfo userInfo);
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;/*** 新增用户*/@Overridepublic void save(UserInfo userInfo) {//对密码进行加密处理userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));this.userMapper.save(userInfo);}
}

编写UserController

@Controller
@RequestMapping("user")
public class UserController {@Autowiredprivate UserService userService;/*** 新增用户* @param userInfo* @return*/@PostMapping("save")public String save(UserInfo userInfo){this.userService.save(userInfo);return "redirect:findAll";}
}

编写UserMapper.xml

 <!--新增用户-->
<insert id="save">insert into users(email,username,password,phoneNum,status)values(#{email},#{username},#{password},#{phoneNum},#{status})
</insert>

测试

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

Spring Security 密码加密

测试Spring Security 密码加密

public class BCryptPasswordEncoderUtil {public static void main(String[] args) {//第一次加密都不一样,通常情况下是无法逆向解密的String encode = new BCryptPasswordEncoder().encode("520");System.out.println(encode);// 可以使用 new BCryptPasswordEncoder().matches()// 方法来验证用户输入的密码是否与存储在数据库中的已加密密码匹配boolean matches = new BCryptPasswordEncoder().matches("520", encode);System.out.println(matches);}}

加密实现

    /*** 新增用户* @param userInfo* @return*/@Overridepublic void save(UserInfo userInfo) {//用户进行加密userInfo.setPassword( new BCryptPasswordEncoder().encode(userInfo.getPassword()) );this.userMapper.save(userInfo);}

注意事项:登录认证时用户必须得有角色才能登录成功,添加用户后给出角色,才能登录

	<!--登录认证--><resultMap id="ByUserNameAnRole" type="UserInfo" autoMapping="true"><id property="id" column="uid"/><!--映射role--><collection property="roles" ofType="Role" javaType="List" autoMapping="true"><id property="id" column="rid"/></collection></resultMap><select id="findUserByUserName" resultMap="ByUserNameAnRole">SELECT*,u.id as uid,r.id as ridFROMusers u,role r,users_role urWHEREu.id = ur.userIdAND r.id = ur.roleIdandu.username = #{s}</select>

用户详情

用户详情执行流程

需求:根据id查询用户详情,要查询【用户】对应的【角色】信息,以及角色所包含的【资源权限】的信息

用户表,角色表,权限表,两个中间表
在这里插入图片描述

编写UserMapper接口

    /*** 用户详情* @return*/UserInfo findById(Integer id);

编写UserService

public interface UserService extends UserDetailsService {/*** 用户详情* @return*/UserInfo findById(Integer id);
}
}

@Service("userService")
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;/*** 用户详情* @return*/@Overridepublic UserInfo findById(Integer id) {return this.userMapper.findById(id);}
}

编写UserController

@Controller
@RequestMapping("user")
public class UserController {@Autowiredprivate UserService userService;/*** 用户详情* @param id* @return*/@GetMapping("findById")public String findById(@RequestParam("id") Integer id, Model model){UserInfo userInfo =  this.userService.findById(id);model.addAttribute("user",userInfo);return "user-show";}
}

编写UserMappr.xml

    <!--用户详情--><resultMap id="userInfoById" type="UserInfo" autoMapping="true"><id column="id" property="id"/><!--用户对应的角色--><collection property="roles" ofType="Role" javaType="List" autoMapping="true"><id column="rid" property="id"/><!--角色对应的资源--><collection property="permissions" ofType="Permission" javaType="List" autoMapping="true"><id column="pid" property="id"/></collection></collection></resultMap><select id="findById"  resultMap="userInfoById">SELECT* ,r.`id` rid,p.`id` pidFROMusers uLEFT JOIN users_role ur ON ur.userId = u.idLEFT JOIN role r ON ur.roleId = r.idLEFT JOIN role_permission rp ON rp.roleId = r.idLEFT JOIN permission p ON rp.permissionId = p.idWHEREu.id = #{id}</select>

测试

在这里插入图片描述

用户查询可添加角色

给用户添加角色,要查看当前这个用户有什么角色,哪些角色可以添加

编写UserController

    /*** 添加角色前。查询哪些角色可以添加* @param id* @return*/@GetMapping("findUserByIdAndAllRole")public String findUserByIdAndAllRole(@RequestParam("id") Integer id , Model model){//得知道给谁进行添加角色UserInfo userInfo = this.userService.findById(id);model.addAttribute("user",userInfo);//根据用户id查询该用户哪些角色可以添加List<Role> roleList =  this.userService.findOtherRole(id);model.addAttribute("roleList",roleList);return "user-role-add";}

编写UserService

   /*** 添加角色前,查询当前用户* @param id* @return*/UserInfo findUserByID(Integer id);/*** 添加角色前,查询当前用户可以添加的角色* @param id* @return*/List<Role> findOtherRoles(Integer id);
    /*** 添加角色前,查询当前用户* @param id* @return*/@Overridepublic UserInfo findUserByID(Integer id) {return this.userMapper.findUserByID(id);}/*** 添加角色前,查询当前用户可以添加的角色* @param id* @return*/@Overridepublic List<Role> findOtherRoles(Integer id) {return this.userMapper.findOtherRoles(id);}

编写UserMapper

    /*** 添加角色前,查询当前用户* @param id* @return*/UserInfo findUserByID(Integer id);/*** 添加角色前,查询当前用户可以添加的角色* @param id* @return*/List<Role> findOtherRoles(Integer id);

编写UserMapper.xml

    <!--添加角色前,查询当前用户--><select id="findUserByID" resultType="UserInfo">select * from users where id = #{id}</select><!--添加角色前,查询当前用户可以添加的角色--><select id="findOtherRoles" resultType="Role">select * from role where id not in(select roleId from users_role where userId = #{id})</select>

测试

查询当前用户哪些用户还可以添加什么角色

在这里插入图片描述

用户添加角色

给用户添加角色,用户与角色是多对多关系,操作中间表(users_role)即可

编写UserController

    /*** 给用户添加角色* @param userId* @param ids* @return*/@PostMapping("addRoleToUser")public String addRoleToUser(@RequestParam("userId") Integer userId , @RequestParam("ids") Integer[] ids){this.userService.addRoleToUser(userId,ids);return "redirect:findAll";}

编写UserService

/*** 给用户添加角色* @param userId* @param ids* @return*/void addRoleToUser(Integer userId, Integer[] ids);
    /*** 给用户添加角色* @param userId* @param ids* @return*/@Overridepublic void addRoleToUser(Integer userId, Integer[] ids) {for(Integer roleid : ids){this.userMapper.addRoleToUser(userId,roleid);}}

编写UserMapper

 /*** 给用户添加角色* @param userId* @return*/void addRoleToUser(@Param("userId") Integer userId,@Param("roleid") Integer roleid);

编写UserMapper.xml

    <!--给用户添加角色--><insert id="addRoleToUser">INSERT INTO `ssm_crud`.`users_role`(`userId`, `roleId`) VALUES (#{userId}, #{roleid});</insert>

用户删除

编写UserController

    /*** 删除用户* @param id* @return*/@GetMapping("deleteUser")public String deleteUser(@RequestParam("id") Integer id){//先把用户对应角色关系删除this.userService.deleteUserRole(id);//删除用户this.userService.deleteUser(id);return "redirect:findAll";}

编写UserService

    /*** 删除用户对应的关系* @param id*/@Overridepublic void deleteUserRole(Integer id) {this.userMapper.deleteUserRole(id);}/*** 删除用户* @param id*/@Overridepublic void deleteUser(Integer id) {this.userMapper.deleteUser(id);}

编写UserMapper

   /*** 删除用户对应的关系* @param id*/void deleteUserRole(Integer id);/*** 删除用户* @param id*/void deleteUser(Integer id);

编写UserMapper.xml

	<!--删除用户对应的关系--><delete id="deleteUserRole">delete from users_role where userId = #{id}</delete><!-- 删除用户--><delete id="deleteUser">delete from users where id = #{id}</delete>

blic void deleteUserRole(Integer id) {
this.userMapper.deleteUserRole(id);
}

/*** 删除用户* @param id*/
@Override
public void deleteUser(Integer id) {this.userMapper.deleteUser(id);
}

### 编写UserMapper```java/*** 删除用户对应的关系* @param id*/void deleteUserRole(Integer id);/*** 删除用户* @param id*/void deleteUser(Integer id);

编写UserMapper.xml

	<!--删除用户对应的关系--><delete id="deleteUserRole">delete from users_role where userId = #{id}</delete><!-- 删除用户--><delete id="deleteUser">delete from users where id = #{id}</delete>

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

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

相关文章

C语言入门 Day_10 判断的进阶

目录 前言 1.多重判断 2.代码块 3.条件运算符 3.易错点 4.思维导图 前言 if和else能够处理两种不同的情况&#xff0c;如果&#xff08;if&#xff09;满足条件&#xff0c;我们就执行这几行代码&#xff1b;否则&#xff08;else&#xff09;的话&#xff0c;我们就执行…

LEADTOOLS V22 for Python -Crack

LEAD Technologies Inc 是面向所有主要平台和编程语言的应用程序开发的人工智能 SDK 的领先提供商&#xff0c;很高兴地宣布在其最新的 LEADTOOLS 版本 22 更新中添加了完整的 Python 支持。 Python是一种动态的高级编程语言&#xff0c;广泛应用于科学计算、数据分析、人工智…

element 下拉组件获取对象

// 选择数据user:[{name:"小白",id:1,money:"100",love:"蛋糕"},{name:"小黑",id:2,money:"200",love:"奶茶"},{name:"小红",id:3,money:"300",love:"烧烤"},] <div><el…

激活函数总结(十九):激活函数补充(ISRU、ISRLU)

激活函数总结&#xff08;十九&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Inverse Square Root Unit &#xff08;ISRU&#xff09;激活函数2.2 Inverse Square Root Linear Unit (ISRLU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函…

Python科研数据可视化

在过去的20 年中&#xff0c;随着社会产生数据的大量增加&#xff0c;对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身&#xff0c;所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”&#xff0c;对于数量、规模与复杂性不断增加的数据&…

基础论文学习(5)——MAE

MAE&#xff1a;Masked Autoencoders Are Scalable Vision Learners Self-Supervised Learning step1&#xff1a;先用无标签数据集&#xff0c;把参数从一张白纸训练到初步预训练模型&#xff0c;可以得到数据的 Visual Representationstep2&#xff1a;再从初步成型&#x…

Linux(Ubuntu)安装docker

2017年的3月1号之后&#xff0c;Docker 的版本命名开始发生变化&#xff0c;同时将 CE 版本和 EE 版本进行分开。 Docker社区版&#xff08;CE&#xff09;&#xff1a;为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。docker-ce 提供了简单的安装…

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…

Vue2-快速搭建pc端后台管理系统

一.推荐二次开发框架 vue-element-admin Star(84k)vue-antd-admin Star(3.5k) 二.vue-element-admin 官网链接:https://panjiachen.github.io/vue-element-admin-site/zh/ 我这里搭建的是基础模版vue-admin-template(推荐) # 克隆项目 git clone https://github.com/PanJi…

html-dom核心内容--四要素

1、结构 HTML DOM (文档对象模型) 当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09;。 2、核心关注的内容&#xff1a;“元素”&#xff0c;“属性”&#xff0c;“修改样式”&#xff0c;“事件反应”。>四要素…

静态代码扫描持续构建(Jenkins)

前提条件 已正确安装、配置Jenkins环境&#xff0c;并装有 Gradle 插件、HTML 插件、SVN 插件等。如下图所示&#xff1a; 已正确安装、配置android sdk&#xff0c;在cmd窗口输入命令“android -h”,回车 配置步骤 打开Jenkins&#xff0c;新建一个job&#xff0c;输入项目…

uniapp日期选择组件优化

<uni-forms-item label="出生年月" name="birthDate"><view style="display: flex;flex-direction: row;align-items: center;height: 100%;"><view class="" v-

Cookie for Mac:隐私保护工具保护您的在线隐私

随着互联网的发展&#xff0c;我们每天都会浏览各种网站&#xff0c;享受在线购物、社交娱乐和学习资料等各种便利。然而&#xff0c;您是否曾经遇到过需要频繁输入用户名和密码的情况&#xff1f;或者不方便访问您常用的网站&#xff1f;如果是这样&#xff0c;那么Cookie for…

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解&#xff1a; 一维数组&#xff1a; 解析&#xff1a; 字符数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 字符串数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 一级指针&#xff1a; 解析&#xff1a; 解析&#xff1a; 二维数组&a…

SQL注入之HTTP头部注入

文章目录 cookie注入练习获取数据库名称获取版本号 base64注入练习获取数据库名称获取版本号 user-agent注入练习获取数据库名称获取版本号 cookie注入练习 向服务器传参三大基本方法:GPC GET方法&#xff0c;参数在URL中 POST&#xff0c;参数在body中 COOKIE&#xff0c;参数…

部署 ssm 项目到云服务器上(购买云服务器 + 操作远程云服务器 + 服务器中的环境搭建 + 部署项目到服务器)

部署 Web 项目 1、获取 Linux 环境1.1、如何去买一个云服务器1.2、远程操作云服务器1.3、在 Linux 系统中搭建 Java Web 的运行环境。1&#xff09;安装 JDK&#xff08;使用包管理器 yum 来安装&#xff09;2&#xff09; 安装Tomcat3&#xff09;安装 MySQL。 1.4、在云服务器…

【Python爬虫】使用代理ip进行网站爬取

前言 使用代理IP进行网站爬取可以有效地隐藏你的真实IP地址&#xff0c;让网站难以追踪你的访问行为。本文将介绍Python如何使用代理IP进行网站爬取的实现&#xff0c;包括代理IP的获取、代理IP的验证、以及如何把代理IP应用到爬虫代码中。 1. 使用代理IP的好处 在进行网站爬…

前端开发工具: VSCode

VSCode 安装使用教程&#xff08;图文版&#xff09; | arry老师的博客-艾编程 1. 下载 在官方网站&#xff1a;https://code.visualstudio.com/ 下载最新版本的 VSCode 即可 2. VSCode 常见插件安装 所有插件安装后,需要重启一下才生效 2.1 简体中文语言包 2.2 编辑器主…

贝叶斯公式中的动词 命名技巧

一项血液化验有95%的把我诊断某种疾病&#xff0c;但是&#xff0c;这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验&#xff0c;则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%&#xff0c;若某人化验结果为阳…

CSS内边距和外边距属性

外边距属性用margin&#xff1b;padding属性叫填充&#xff0c;或者也叫内边距&#xff1b; margin:标签与标签的距离&#xff0c;到包围它的元素的边框的距离&#xff1b; padding&#xff1a;内边距&#xff0c;用于控制内容与边框之间的距离&#xff1b; CSS padding&…