java通关整理汇总-Java基础、计算机网络、数据库、设计模式、框架、算法模板、笔试
ssm订单管理系统1-数据库表结构和mysql语句
ssm订单管理系统2-订单详情操作
ssm订单管理系统3-用户管理操作
ssm订单管理系统4-角色管理操作
3. 用户管理
3.1 用户登录
3.1.1 spring security
Spring Security快速入门、自定义页面、退出-配置篇
3.2 用户退出
- 在
spring-security.xml
配置中添加配置 - 指定退出请求的路径
/logout.do
- 指定退出成功后返回的页面
/login.jsp
<!-- 退出 -->
<security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />
- 在(自定义页面)退出/注销的按钮上添加路径:绝对路径+
/logout.do
- 然后在自定义页面中点击注销按钮,就完成退出操作
- 返回登录页面
3.3 查询所有用户
- 需要在
webapp/pages
下添加user-list.jsp
页面~~(在我的资料里面)~~
3.3.1 Controller
- UserController
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
ModelAndView mv = new ModelAndView();
List<UserInfo> userList = userService.findAll();
//在user-list.jsp中找到使用到userList的名字
mv.addObject("userList",userList);
//表示跳转的user-list.jsp页面,需要添加
mv.setViewName("user-list");
return mv;
}
}
3.3.2 Service
-
需要在Service中实现
findAll()
方法 -
IUserService
public interface IUserService extends UserDetailsService {
List<UserInfo> findAll() throws Exception;
}
- UserServiceImpl
- 自动注入userDao
@Override
public List<UserInfo> findAll() throws Exception {
return userDao.findAll() ;
}
3.3.3 Dao
- 需要在Dao中实现
findAll()
方法 - IUserDao
@Select("select * from users")
List<UserInfo> findAll() throws Exception;
3.3.4 处理状态信息
- 点击
订单管理
,页面展示
- 这是因为我们在数据库中只有status的信息,在展示时,我们希望用statusStr展示,所以需要根据status的值设置statusStr
private int status;
private String statusStr;
user-list.jsp
展示页面
- domain中的UserInfo的get方法
public String getStatusStr() {
// 0-未开启 1-已开启
if (status == 0) {
statusStr = "未开启";
} else if (status == 1) {
statusStr = "开启";
}
return statusStr;
}
3.3.5 启动服务器
- 点击
订单管理
,页面展示
3.4 用户添加
- 需要在
webapp/pages
下添加user-add.jsp
页面~~(在我的资料里面)~~
user-add.jsp
页面表单- 所以需要在controller中创建一个
/user/save.do
<form action="${pageContext.request.contextPath}/user/save.do"
3.4.1 Controller
- UserController
//用户添加
@RequestMapping("/save.do")
public String save(UserInfo userInfo){
userService.save(userInfo);
return "redirect:findAll.do";
}
3.4.2 Service
-
需要在Service中实现
save()
方法 -
IUserService
void save(UserInfo userInfo) throws Exception;
- UserServiceImpl
- 自动注入userDao
@Override
public void save(UserInfo userInfo) throws Exception{
userDao.save(userInfo);
}
3.4.3 Dao
- 需要在Dao中实现
save(userInfo)
方法 - IUserDao
- value(REPLACE(UUID(),"-","")表示的是自动生成uuid值0主键,因为在表设计的时候我没有设计为自动生成,需要非空
@Insert("insert into user(id, email,username,password,phoneNum,status) " +
"value(REPLACE(UUID(),\"-\",\"\"),#{email},# {username},#{password},#{phoneNum},#{status})")
void save(UserInfo userInfo) throws Exception;
3.4.4 往数据库添加的密码需要加密
在spring-security.xml
中声明加密的类
<!-- 配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
- `BCryptPasswordEncoder`可以作为一个类直接使用
第一种加密方法:
- UserServiceImpl
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private IUserDao userDao;
@Override
public void save(UserInfo userInfo) throws Exception{
//对密码进行加密处理
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
userDao.save(userInfo);
}
第二种加密方法:工具类
@Override
public void save(UserInfo userInfo) throws Exception{
//对密码进行加密处理
userInfo.setPassword(BCryptPasswordEncoderUtils.encodePassword(userInfo.getPassword()));
userDao.save(userInfo);
}
BCryptPasswordEncoderUtils
工具类
public class BCryptPasswordEncoderUtils {
private static BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
public static String encodePassword(String password){
return bCryptPasswordEncoder.encode(password);
}
public static void main(String[] args) {
String password="123";
String pwd = encodePassword(password);
//$2a$10$tJHudmJh6MRPdiL7mv0yfe0nZJbDHuhl7sSTnqNC4DauMik9ppi4K
//$2a$10$Ce8LB3jdYDZ2f6HB281zA.4eC7v6ziJdK8MMWg0Yu8ETMg5ToMpIe
System.out.print(pwd.length());
}
}
3.4.5 启动服务器
- 点击
订单管理
,新建用户,页面展示
3.4.6 密码加密后,如何处理用户登录问题
- 因为此时的密码时加密存储在数据库中,所以直接用新建的用户密码登录是不成功的。
1.打开spring-security.xml
中的加密方式配置
<security:authentication-provider user-service-ref="userService">
<!-- 配置加密的方式 -->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
2.在UserServiceImpl
中密码设置中删除"{noop}"
- 加上表示明文方式
对比修改前后
User user = new User(userInfo.getUsername(),"{noop}" + userInfo.getPassword(),userInfo.getStatus() == 0?false:true,true,true,true,getAuthority(userInfo.getRoles()));
User user = new User(userInfo.getUsername(),userInfo.getPassword(),userInfo.getStatus() == 0?false:true,true,true,true,getAuthority(userInfo.getRoles()));
3.然后就可以根据新建的用户密码登录了
- 原来在数据库中直接添加的用户密码无法登录,因为没有加密,也就不能解密
- 可以用加密工具类
BCryptPasswordEncoderUtils
将密码手动更新加密
3.5 用户详情查询
- 在用户管理
user-list.jsp
的页面,点击用户后的详情,就可以查询到用户的详情信息 - 给详情添加链接-------
/user/findById.do
所以我们要在Controller编写中编写/user/findById.do
- 注意:这里传入的
id
名需要和方法中的命名相同
<a href="${pageContext.request.contextPath}/user/findById.do?id=${user.id}" class="btn bg-olive btn-xs">详情</a>
3.5.1 Controller
- UserController
1、mv.setViewName("user-show1")
表示跳转的页面
2、mv.addObject("user",userInfo)
表示将查询到的userInfo信息封装到user中,具体的命名需要查看跳转页面
//根据用户Id查询用户的详情信息
@RequestMapping("/findById.do")
public ModelAndView findById(String id) throws Exception{
ModelAndView mv = new ModelAndView();
UserInfo userInfo = userService.findById(id);
mv.addObject("user",userInfo);
mv.setViewName("user-show1");
return mv;
}
3.5.2 Service
-
需要在Service中实现
findAll()
方法 -
IUserService
UserInfo findById(String id) throws Exception;
- UserServiceImpl
@Override
public UserInfo findById(String id) throws Exception {
return userDao.findById(id);
}
3.5.3 Dao
- 需要在Dao中实现
findById()
方法 - IUserDao
1、因为用户的详情需要包括用户的角色(USER/ADMIN),还有权限(可以访问那些页面),所以需要将查询数据处理一下
2、中间表:用户_角色表、角色_权限表
3、到IRoleDao
中寻找findRoleByUserId
方法,通过用户查找用户角色
@Select("select * from users where id=#{userId}")
@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 = "com.itheima.ssm.dao.IRoleDao.findRoleByUserId"))
})
UserInfo findById(String userId) throws Exception;
- IRoleDao
public interface IRoleDao {
//根据用户id查找对应的角色
@Select("select * from role where id in (select roleId from 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 = "com.itheima.ssm.dao.IPermissionDao.findPermissionByRoleId"))
})
public List<Role> findRoleByUserId(String userId) throws Exception;
}
4、到IPermissionDao
中寻找findPermissionByRoleId
方法,通过角色查找权限
@Select("select * from permission where id in (select permissionId from role_permission where roleId=#{id})")
public List<Permission> findPermissionByRoleId(String id) throws Exception;
3.5.4 编写uesr-show
用户详情展示页面
3.5.5 启动服务器
- 点击
详情
,页面展示