1.用户详情查询流程分析

2.代码实现

(1)user-list.jsp页面部分代码

点击jsp页面中的详情按钮,发送请求到UserController.java

<!--数据列表-->
<table id="dataList"
class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right: 0px"><input
id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting_desc">用户名</th>
<th class="sorting_asc sorting_asc_disabled">邮箱</th>
<th class="sorting_desc sorting_desc_disabled">联系电话</th>
<th class="sorting">状态</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody> <c:forEach items="${userList}" var="user">
<tr>
<td><input name="ids" type="checkbox"></td>
<td>${user.id }</td>
<td>${user.username }</td>
<td>${user.email }</td>
<td>${user.phoneNum }</td>
<td>${user.statusStr }</td>
<td class="text-center">
<a href="${pageContext.request.contextPath}/user/queryById?id=${user.id}" class="btn bg-olive btn-xs">详情</a>
<a href="${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id=${user.id}" class="btn bg-olive btn-xs">添加角色</a>
</td>
</tr>
</c:forEach>
</tbody>
<!--
<tfoot>
<tr>
<th>Rendering engine</th>
<th>Browser</th>
<th>Platform(s)</th>
<th>Engine version</th>
<th>CSS grade</th>
</tr>
</tfoot>-->
</table>

(2)表现层:UserController.java

package lucky.controller;

import lucky.domain.UserInfo;
import lucky.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import java.util.List; @Controller
@RequestMapping(path = "/user")
public class UserController {
@Autowired
private IUserService iUserService;
/**
* 查询指定id的用户
* @return 查询结果
* @throws Exception
* 注意:SpringMVC 绑定请求参数是自动实现的,会自动将参数绑定queryById方法的id上
*/
@RequestMapping(path = "/queryById")
public ModelAndView queryById(String id) throws Exception{
ModelAndView mv=new ModelAndView();
UserInfo userInfo=iUserService.queryById(id);
mv.addObject("user",userInfo);
mv.setViewName("user-show1");
return mv;
} }

(3)服务层:IUserService及其实现类

package lucky.service;

import lucky.domain.UserInfo;
import org.springframework.security.core.userdetails.UserDetailsService; import java.util.List; public interface IUserService extends UserDetailsService { /**
* 查询所有用户
*/
public List<UserInfo> queryAll() throws Exception; /**
* 保存用户
* @param userInfo 需要保存的用户
*/
void save(UserInfo userInfo) throws Exception; /**
* 根据用户id查询
* @param id 用户id
*/
UserInfo queryById(String id) throws Exception;
}

实现类:

package lucky.service.impl;

import lucky.dao.IUserDao;
import lucky.domain.Role;
import lucky.domain.UserInfo;
import lucky.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.List; /**
* 使用springsecurity进行用户登录
*/
@Service(value = "userService")
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao iUserDao; @Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo=null;
try {
userInfo=iUserDao.queryByUsername(username);
} catch (Exception e) {
e.printStackTrace();
}
//将自己的用户对象封装成UserDetails,参数1为用户名,参数2为密码,参数3是用户权限
User user=new User(userInfo.getUsername(),userInfo.getPassword(),getAuthority(userInfo.getRoles()));
return user;
} /**
* @return 返回一个list集合,集合中装的是用户权限描述
* @param roles
*/
public List<SimpleGrantedAuthority> getAuthority(List<Role> roles) {
List<SimpleGrantedAuthority> list=new ArrayList<>();
for (Role role : roles) {
list.add(new SimpleGrantedAuthority(role.getRoleName()));
}
return list;
} @Override
public List<UserInfo> queryAll() throws Exception {
return iUserDao.queryAll();
} @Override
public void save(UserInfo userInfo) throws Exception {
//调用spirngsecurity这个加密类BCryptPasswordEncoder,对密码进行加密
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
iUserDao.save(userInfo);
} /**
* 根据用户id查询
* @param id 用户id
* @return 查询结果
* @throws Exception
*/
@Override
public UserInfo queryById(String id) throws Exception {
return iUserDao.queryById(id);
}
}

(4)持久层Dao

<1>IUserDao.java

package lucky.dao;

import lucky.domain.UserInfo;
import org.apache.ibatis.annotations.*; import java.util.List; public interface IUserDao {
/**
* @param username 用户名
* @Results 映射查询结果集到实体类属性
* column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。
* 涉及多对多查询,有中间表
*/
@Select("select * from LUCKY.USERS where username=#{username}")
@Results({
@Result(id=true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "email",column = "email"),
@Result(property = "password",column = "password"),
@Result(property = "phoneNum",column = "phoneNum"),
@Result(property = "status",column = "status"),
@Result(property = "roles",column = "id",javaType = java.util.List.class,many = @Many(select="lucky.dao.IRoleDao.queryByUserId")),
})
public UserInfo queryByUsername(String username) throws Exception; /**
* @return 查询所有用户
*/
@Select("select * from LUCKY.USERS")
public List<UserInfo> queryAll() throws Exception; @Insert("insert into LUCKY.USERS(email,username,password,phoneNum,status) values(#{email},#{username},#{password},#{phoneNum},#{status})")
public void save(UserInfo userInfo) throws Exception; /**
* 根据id查询
* @param id 用户id
*/
@Select("select * from LUCKY.USERS where id=#{id}")
@Results({
@Result(id=true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "email",column = "email"),
@Result(property = "password",column = "password"),
@Result(property = "phoneNum",column = "phoneNum"),
@Result(property = "status",column = "status"),
@Result(property = "roles",column = "id",javaType = java.util.List.class,many = @Many(select="lucky.dao.IRoleDao.queryByUserId")),
})
UserInfo queryById(String id) throws Exception;
}

<2>IRoleDao.java

package lucky.dao;

import lucky.domain.Role;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select; import java.util.List; public interface IRoleDao {
/**
* 多对多查询
* 思路分析:先根据userid,从中间表USERS_ROLE中查到roleId,再根据roleId到ROLE表查询数据
* @param userId USER表id值
* @return 查询结果
*/
@Select("select * from LUCKY.ROLE where id in (select roleId from LUCKY.USERS_ROLE WHERE userId=#{userId})")
@Results({
@Result(id=true,property = "id",column = "id"),
@Result(property = "roleName",column = "roleName"),
@Result(property = "roleDesc",column = "roleDesc"),
@Result(property = "permissions",column = "id",javaType = java.util.List.class,many = @Many(select="lucky.dao.IPermissionsDao.queryByRoleId")),
})
public List<Role> queryByUserId(String userId)throws Exception;
}

<3>IPermission.java

package lucky.dao;

import lucky.domain.Permission;
import org.apache.ibatis.annotations.Select; import java.util.List; public interface IPermissionsDao {
@Select("select * from LUCKY.PERMISSION where id in (select permissionId from LUCKY.ROLE_PERMISSION WHERE roleId=#{roleId})")
public List<Permission> queryByRoleId(String roleId);
}

(5)user-show1.jsp部分代码

<div class="box-body">
<!--树表格-->
<div class="tab-pane" id="tab-treetable">
<table id="collapse-table" class="table table-bordered table-hover dataTable">
<thead>
<tr>
<th>用户</th>
<th>描述</th>
</tr>
</thead> <tr data-tt-id="0">
<td colspan="2">${user.username}</td>
</tr> <tbody>
<c:forEach items="${user.roles}" var="role" varStatus="vs">
<tr data-tt-id="${vs.index+1}" data-tt-parent-id="0">
<td>${role.roleName }</td>
<td>${role.roleDesc }</td>
</tr>
<c:forEach items="${role.permissions}" var="permission">
<tr data-tt-id="1-1" data-tt-parent-id="${vs.index+1}">
<td>${permission.permissionName}</td>
<td>${permission.url}</td>
</tr> </c:forEach>
</c:forEach> </tbody>
</table>
</div>
<!--树表格/--> <!-- .box-footer
<div class="box-footer"></div>
-->
<!-- /.box-footer--> </div>

3.效果图

031 SSM综合练习07--数据后台管理系统--用户详情查询的更多相关文章

  1. 029 SSM综合练习05--数据后台管理系统--订单分页查询

    1.PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql.oracle.mariaDB.DB2.SQLite.H ...

  2. 025 SSM综合练习01--数据后台管理系统--功能介绍及数据库表

    1.功能介绍 (1)环境搭建 主要讲解maven工程搭建,以及基于oracle数据库的商品表信息,并完成SSM整合.(2)商品查询 基于SSM整合基础上完成商品查询,要掌握主面页面main.jsp及商 ...

  3. 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建

    1.数据库准备 本项目我们Oracle数据库,Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间. (1)采用数据库管理员账号:SYSTEM,再配合数据库 ...

  4. 027 SSM综合练习03--数据后台管理系统--product-list.jsp和main.jsp页面制作

    1.product-list.jsp页面制作 (1)创建一个product-list1.jsp文件,清空,只保留 <%@ page contentType="text/html;cha ...

  5. 033 SSM综合练习09--数据后台管理系统--基于AOP的日志处理

    1.数据库与表结构 (1)日志表信息描述sysLog (2)Sql语句 CREATE TABLE sysLog ( id ) DEFAULT SYS_GUID () PRIMARY KEY, visi ...

  6. 032 SSM综合练习08--数据后台管理系统--jsp页面显示当前用户名

    1. 页面端标签控制权限 在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制. (1)在pom文件中导入依赖 <dependency> <group ...

  7. 030 SSM综合练习06--数据后台管理系统--SSM权限操作及Spring Security入门

    1.权限操作涉及的三张表 (1)用户表信息描述users sql语句: CREATE TABLE users ( id ) DEFAULT SYS_GUID () PRIMARY KEY, email ...

  8. 028 SSM综合练习04--数据后台管理系统--订单相关操作

    1.订单表及其关联表的关系分析 2.数据库表对应实体类 (1)Orders.java package lucky.domain; import lucky.utils.DateUtils; impor ...

  9. LayUI+SSM实现一个简单的后台管理系统

    该后台管理系统是用于管理视频网站数据的,目前分5个菜单项,这篇博客主要讲述[影片管理]的具体功能和实现 后台代码结构和[影片管理]的界面如下图 该界面分为上下2部分,[搜索条件]和[影片列表],2部分 ...

随机推荐

  1. 在jsp中获取SpringSecurity中已登录的用户的用户名

    1.先引入secrity的标签库 <%@ taglib prefix="security" uri="http://www.springframework.org/ ...

  2. C#中RadioButton选中和取消选中(一种没办法选中和未选中切换)

    今天在做Winform 中RadioButton控件时,遇到一个小坑,虽然很简单,但是浪费我十分钟,感觉需要记录一下共勉. 问题描述:(RadioButton控件名为rbTime) 本来以为判断一下是 ...

  3. @EnableFeignClients 客户端详细

    在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情 : 1.使用注解@EnableFeignClients启用feign客户端: 示例 : @SpringBootA ...

  4. 单片机模块化程序: 单片机加入JSON是个不错的选择

    这节需要知道的知识点 https://www.cnblogs.com/yangfengwu/p/11685325.html 下载JSON文件: 链接:         https://sourcefo ...

  5. 用户生命周期(User Lifetime)

    什么是用户生命周期? 用户生命周期是从用户开始接触产品到离开产品的整个过程.用户生命周期可分为:引入期.成长期.成熟期.休眠期.流失期.对应的是用户对产品不同的参与程度. 用户生命周期有什么用? 按照 ...

  6. AngularJS实现地址栏取值

    有时候我们由如下需求 1.从a.html跳转到b.html 2.从a跳转时携带参数和值. 3.从b.html中取出传过来的参数值 在AngularJS的操作如下 在a.html中添加 <a hr ...

  7. 【BigData】Java基础_数组

    什么是数组?数据是可以装一组数据的变量 1.定义数组 float[] arr1 = new float[10]; // 可以装10个float数据 int[] arr2 = new int[10]; ...

  8. R 语言输入输出 读取命令函参数

    输入数据 使用键盘输入数据 只能处理小样本,很少使用 在创建 data.txt 字符串之后,用函数 read.table() 创建数据框 data.1.这种方法可以让我们把数据嵌入到R代码中,此处切记 ...

  9. js回文数的四种判断方法

    目录 1. 字符串的转换 1.1 简单点,使用高阶函数来完成 1.2 从后往前循环字符串数组 1.3 以中间数为节点,判断左右两边首尾是否相等 2. 数字转换 2.1 求模得尾数,除10得整数 判断一 ...

  10. android双进程守护,让程序崩溃后一定可以重启

    由于我们做的是机器人上的软件,而机器人是24小时不间断服务的,这就要求我们的软件不能退出到系统桌面.当然最好是能够做到程序能够不卡顿,不崩溃,自己不退出.由于我们引用了很多第三方的开发包,也不能保证他 ...