首页 > 其他分享 >springboot综合案例第四课

springboot综合案例第四课

时间:2023-08-13 16:34:31浏览次数:48  
标签:第四课 return springboot 用户 param public 案例 Integer id

day04_springboot综合案例

用户管理

查询用户

查询所有用户执行流程

image-20201016150857525

编写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;
    }
}

测试

image-20210518224802447

用户添加

用户添加执行流程

<img src="assets/image-20201016160937375.png" alt="image-20201016160937375" style="zoom:150%;" />

编写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>

测试

image-20210518230435763

image-20210518230452569

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查询用户详情,要查询【用户】对应的【角色】信息,以及角色所包含的【资源权限】的信息

用户表,角色表,权限表,两个中间表

image-20201017102307699

编写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>

测试

image-20210520220235008

用户查询可添加角色

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

编写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>

测试

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

image-20220615223736481

用户添加角色

给用户添加角色,用户与角色是多对多关系,操作中间表(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>
column1 column2 column3
content1 content2 content3

标签:第四课,return,springboot,用户,param,public,案例,Integer,id
From: https://blog.51cto.com/teayear/7067837

相关文章

  • Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
    UnityAssetPostprocessor的Model的动画相关的函数修改实际应用在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使......
  • Redundant declaration: @SpringBootApplication already applies given @ComponentSc
    报错提示内容: 解决:将启动类文件移动到com.atguigu.eduservice包。应该是EduApplication.java文件自带的@SpringBootApplication中包含@ComponentScan,默认是扫描该类所在的包和子包的,即@ComponentScan(basePackages={"com.atguigu"}),所以再写一遍就提示多余的。 ......
  • pinia入门案例-获取频道分类列表并渲染
    使用pinia的action异步获取频道分类列表数据并渲染到页面中。接口:GET请求,http://geek.itheima.net/v1_0/channelsstore/channel.jsimport{defineStore}from'pinia'import{ref,computed}from"vue"importaxiosfrom'axios'exportconstuseChannelStore=......
  • JavaScript之循环及其案例
    1循环循环的目的在实际问题中,有许多具有规律性重复性操作,因此在程序中要完成这类操作就需要重复执行某些语句。1.1JS中的循环在JS中,主要有三种类型的循环语句:for循环while循环do...while循环2for循环在程序中,一组被重复执行的语句被称之为循环体,能否继续重复执行,取决于循环的终......
  • springboot统一异常处理
    1全局异常处理:先新建一个类,之后在类上面添加注解之后在类中添加方法,在方法上添加注解,指定哪个异常出现会执行2特定异常处理:把全局异常出行中的方法上面的注解变化一下就可以3自定义异常处理:第一步创建异常类,继承RuntimeException;第二步在异常类中添加属性(状态码和描述信......
  • 机器学习编译(三):张量程序案例 TensorIR
    使用张量程序抽象的目的是为了表示循环和相关的硬件加速选择,如多线程、特殊硬件指令的使用和内存访问。1.一个例子使用张量程序抽象,我们可以在较高层的抽象制定一些与特定硬件无关的较通用的IR优化(计算优化)。比如,对于两个大小为128×128的矩阵A和B,我们进行如下两步的......
  • SpringBoot的核心特性
    SpringBoot是一个用于简化Spring应用程序开发的框架,它提供了一系列核心特性,使得开发者能够更快速、更简单地构建和部署Spring应用程序。本文将详细介绍SpringBoot的五个核心特性,并为每个特性提供三个子特性的详细解释。1.独立运行的Spring应用程序SpringBoot允许开发者创建独立......
  • SpringBoot3集成Quartz
    目录一、简介二、工程搭建1、工程结构2、依赖管理3、数据库4、配置文件三、Quartz用法1、初始化加载2、新增任务3、更新任务4、暂停任务5、恢复任务6、执行一次7、删除任务8、任务执行四、参考源码标签:Quartz.Job.Scheduler;一、简介Quartz由Java编写的功能丰富的开源作业调度......
  • Springboot 启动流程
    整体流程1.SpringApplication静态调用run方法,从静态run方法中new一个自己的实例,并调用实例的run方法。2.构造方法中会初始化容器一些属性,主要是初始化两个数据集合:a.配置文件中以ApplicationContextInitializer为key的初始化器的实例集合。b.配置文件中以ApplicationListener......
  • python案例
    这猜单词游戏。具体步骤如下:导入random模块,用于随机选择单词。设置初始生命次数为3。创建一个单词列表words,其中包含了一些单词。使用random.choices()函数从单词列表中随机选择一个单词作为秘密单词secret_word。创建一个clue列表,用于表示未猜中的字母的占位符。初始时,将cl......