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

news2024/11/25 2:41:41

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 {

    @Autowired
    private UserMapper userMapper;
    
     /**
     * 查询所有用户
     * @return
     */
    @Override
    public List<UserInfo> findAllUsers(Integer page,Integer size) {
        PageHelper.startPage(page,size);
        return this.userMapper.findAllUsers();
    }
}

编写UserController

/**
 * @Dese: 用户相关操作
 */
@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private 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 {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

   /**
     * 新增用户
     */
    @Override
    public void save(UserInfo userInfo) {
        //对密码进行加密处理
        userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
        this.userMapper.save(userInfo);
    }
}

编写UserController

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private 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
     */
    @Override
    public 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 rid
		FROM
				users u,
				role r,
				users_role ur
		WHERE
			u.id = ur.userId
		  AND r.id = ur.roleId
		  and
				u.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 {

    @Autowired
    private UserMapper userMapper;

     /**
     * 用户详情
     * @return
     */
    @Override
    public UserInfo findById(Integer id) {
        return this.userMapper.findById(id);
    }
}

编写UserController

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private 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` pid
        FROM
            users u
            LEFT JOIN users_role ur ON ur.userId = u.id
            LEFT JOIN role r ON ur.roleId = r.id
            LEFT JOIN role_permission rp ON rp.roleId = r.id
            LEFT JOIN permission p ON rp.permissionId = p.id
        WHERE
            u.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
     */
    @Override
    public UserInfo findUserByID(Integer id) {
        return this.userMapper.findUserByID(id);
    }

    /**
     * 添加角色前,查询当前用户可以添加的角色
     * @param id
     * @return
     */
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    public void deleteUserRole(Integer id) {
        this.userMapper.deleteUserRole(id);
    }

    /**
     * 删除用户
     * @param id
     */
    @Override
    public 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.coloradmin.cn/o/904337.html

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

相关文章

(2023,UniversalFakeDetect)跨生成模型泛化的通用假图像检测器

Towards Universal Fake Image Detectors that Generalize Across Generative Models 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 基础 3.1 问题设置 3.2 分析为什么先前的工作无法泛化 4. 方法 5. 实验 5.1 研究生成模型 5.2 真假分类基线 5.3 …

三重奏的和谐:如何完美对齐公司、部门与个人目标

引言 在企业的运营和管理中&#xff0c;目标的设定与对齐是至关重要的。它不仅决定了公司的方向和愿景&#xff0c;还影响到每一个部门和团队成员的工作内容和效果。如何确保公司目标、部门目标和团队个人目标之间的完美对齐&#xff0c;是每一个管理者都需要面对的挑战。 目…

HCIP学习--STP

在交换机上的线路冗余会产生的问题 昨天讲到了一个冗余的概念&#xff0c;下面就这个冗余引出来的问题来记录今天的内容 线路的冗余对于路由器来岁意味择可以选择更多的路线&#xff0c;但是对于交换机来说可不是啥好事情 比如下图假设A下面有一台设备要发送一个广播&#x…

第二讲:BeanFactory的实现

BeanFactory的实现 1. 环境准备2. 初始化DefaultListableBeanFactory3. 手动注册BeanDefinition4. 手动添加后置处理器5. 获取被依赖注入的Bean对象6. 让所有的单例bean初始化时加载7. 总结 Spring 的发展历史较为悠久&#xff0c;因此很多资料还在讲解它较旧的实现&#xff0c…

ROS与STM32通信(二)-pyserial

文章目录 下位机上位机自定义msg消息发布订阅 ROS与STM32通信一般分为两种&#xff0c; STM32上运行ros节点实现通信使用普通的串口库进行通信&#xff0c;然后以话题方式发布 第一种方式具体实现过程可参考上篇文章ROS与STM32通信-rosserial&#xff0c;上述文章中的收发频率…

一例Vague病毒的分析

这是一例通过U盘传播的文件夹病毒&#xff0c;有收集用户文件的行为&#xff0c;但是&#xff0c;没有回传和远控行为&#xff0c;有点奇怪&#xff0c;其中的字符串进行了加密。 样本比较简单&#xff0c;使用IDA很容易就看明白了。 根据匹配到威胁情报&#xff0c;有叫Vague蠕…

阿里云服务器和轻量云服务器对比有什么区别?

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

初识SD绘画

最近sd绘画可谓是火的一塌糊涂&#xff0c;AI的绘画能力是真强大。废话不多说&#xff0c;直入主题。 1&#xff0c;sd的本地安装大体有2种&#xff0c;一种是官网安装&#xff0c;一种是秋叶大神的整合包。我安装的是秋叶大神的包&#xff0c;里面的插件和模型都有了&#xf…

Personalize Segment Anything Model with One Shot【论文翻译】

​ 论文基础信息如下 https://arxiv.org/pdf/2305.03048.pdfhttps://github.com/ZrrSkywalker/Personalize-SAM Abstract 通过大数据预训练驱动&#xff0c;分段任意模型&#xff08;Segment Anything Model&#xff0c;SAM&#xff09;已被证明是一个强大且可提示的框架&am…

嵌入式通信底层逻辑演变 SWIRE/UART/I2C/SPI

文章目录 一、概念1.0、计算机通讯框架OSI 7层模型1.1、根据数据排布传输方式---并行通信 / 串行通信1.2、根据数据传输方向与时间关系分类----单工通信/半双工通信/全双工通1.3、半双工通信的 应答与流控机制----如I2C&#xff0c;通过开漏线与特性 实现1.4、根据收发方时间基…

【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

阅读导航 前言stack1. stack概念2. stack特点3. stack使用 queue1. queue概念2. queue特点3. queue使用 容器适配器1. 什么是适配器2. STL标准库中stack和queue的底层结构3. STL标准库中对于stack和queue的模拟实现⭕stack的模拟实现⭕stack的模拟实现 总结温馨提示 前言 文章…

单链表-Java实现

目录 概念 什么是链表&#xff1f; 为什么链表的头节点不能动&#xff0c;或者不能操作&#xff1f; 链表和数组的区别是什么&#xff1f; 实现 节点 单链表 末尾添加 遍历 按编号添加&#xff1a; 修改节点 删除 面试题 求单链表的长度 求单链表倒数第K个节点 …

Qt关于hex转double,或者QByteArray转double

正常的00 ae 02 33这种类型的hex数据类型可以直接通过以下代码进行转换 double QDataConversion::hexToDouble(QByteArray p_buf) {double retValue 0;if(p_buf.size()>4){QString str1 byteArrayToHexStr(p_buf.mid(0,1));QString str2 byteArrayToHexStr(p_buf.mid(1,…

更安全,更高效的自学网络安全与黑客技术

学习网络安全&#xff08;黑客技术&#xff09; 网络安全是&#xff1a;黑客技术是&#xff1a;网络安全与黑客技术的关系&#xff1a;自学网络安全学习的误区和陷阱&#xff1a;学习网络安全前期需要准备...学习网络安全中期大致步骤&#xff1a;学习网络安全推荐的学习资料&a…

【电子通识】什么是异常分析中的A-B-A方法

工作有了一定的经验之后&#xff0c;在做问题分析的时候&#xff0c;经常会听到别人说把这个部品&#xff08;芯片/模块&#xff09;拿去ABA一下&#xff0c;看看跟谁走。那么对于新人来说是否就会问一个问题&#xff1a;什么是ABA呢&#xff1f; A-B-A 交换是一种简单直接的交…

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第一期 ~ 华为OD初体验五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、双指针第5天、递归回溯第6天、二分查找第7天、贪心算法 && 二叉树 …

【双指针】经典数组双指针题LeetCode

文章目录 27. 移除元素 简单283. 移动零 简单&#x1f525;167. 两数之和 II - 输入有序数组 中等11. 盛最多水的容器 中等&#x1f525;15. 三数之和 中等&#xff08;N数之和&#xff09;中等&#x1f525;42. 接雨水 困难 &#x1f525;26. 删除有序数组中的重复项 简单5. 最…

Qt快速学习(一)--对象,信号和槽

目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序 3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型&#xff08;对象树&#xff09; 3.3 Qt窗口坐标体系 4 信号和槽机制 4.1 系统自带的信号和槽 4.2 自定义信号和槽 4.3信号槽的拓展 4…

GSM/CDMA/VoLTE/VoIP通话

1.GSM(Global System for Mobile Communications) 本质是一种多址技术&#xff0c;将多个通话放入一段无线电频道的方法。特点是通过“时间划分”&#xff0c;称为时分多址。 2.CDMA(Code Division Multiple Access) 一种多址技术&#xff0c;将多个通话放入一段无线电频道的…

11_Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现 一、Redis数据类型的底层数据结构 SDS动态字符串双向链表压缩列表 zpilist哈希表 hashtable调表 skiplist整数集合 intset快速列表 quicklist紧凑列表 listpack 二、Redis源码地址 Github&#xff1a;https://github.com/redis/redis 三、…