1)用户管理项目:基本功能介绍
1)登录功能:只能是超级管理员管理员登录,普通用户无法进行登录
2)用户的列表页面:普通用户的列表页和超级管理员的列表页
3)条件查询:组合条件查询,不定规则的查询,指定名称,指定籍贯,指定邮箱来进行查询
4)分页功能:前端显示分页功能
5)添加用户:普通管理员不可以操作超级管理员(修改,删除),但是可以新增普通管理员
6)单条删除功能,多条删除功能(选中多条进行删除),不可以删除超级管理员
7)修改用户:不可以修改登录名字,登录名和用户名不一样的,不可以修改超级管理员的信息
8)单条删除用户,多条批量删除用户(用动态标签,判断里面是否有超级管理员,如果有超级管理员,是不能删除的)
2)设计数据库:
使用的技术:SpringBoot+Mybatis+SpringMVC+拦截器+统一数据格式的返回
用户表:
UserID 用户的唯一身份标识 int
姓名 Varchar(50)
性别 varchar(10)
年龄 int
籍贯 varchar(50)
QQ varchar(15)
邮箱 varchar(50)是否是超级管理员,int
登录名 varchar(50)-----不允许有中文的
密码 varchar(100)
用户创建时间 varchar(50)
数据库插入操作:
drop database if exists Java100; create database if not Java100 character set utf8; use Java100; create table User( userID int primary key auto_increment, userName varchar(50) unique not null, loginName varchar(60) unique not null, passWord varchar(90) unique not null, sex varchar(30) default "男", address varchar(60), qq varchar(60), email varchar(40), isAdmin int default 0, createTime datetime default Now(), updateTime datetime default Now() );
引入依赖:
1)SpringBootDevTools
2)Lombok
3)SpringWeb
4)MyBatisFrameWork
5)MySQL Dirver
6)拦截器
3)配置配置文件:
#下面是配置数据库连接的基本信息 spring.datasource.username=root spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Java100?characterEncoding=utf-8&useSSL=true spring.datasource.password=12503487 #下面是配置数据库XML文件的保存路径 mybatis.mapper-locations=classpath: mapper/**.Mapper.xml #配置MyBatis打印的SQL mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl logging.level.com.example.demo=debug
我们在配置文件里面指定了mapper的xml文件的路径,在我们的xml里面,我们通过namespace指定了被mapper修饰的接口的路径
4)对同一的异常进行处理,对于统一的对全局生效的文件,我们可以把它放在Configuration文件里面
/对统一的异常进行处理 @ControllerAdvice public class ProcessException { @ExceptionHandler(Exception.class) @ResponseBody public HashMap<String,Object> Start(Exception e){ //我们这一次返回的是JSON格式的数据 HashMap<String,Object> hashMap=new HashMap<>(); hashMap.put("status",200); hashMap.put("data",""); hashMap.put("state",-1); hashMap.put("message",e.getMessage()); return hashMap; } }
5)返回原则:所有的接口必须有统一的数据格式返回
我们要想进行统一的数据格式的返回,方法有两种:
1)定义一个全局的返回对象,每一个接口返回的时候调用该对象来进行返回
2)Advice接口增强实现统一的数据封装
返回JSON格式的数据: { status:状态码 data:后端返回的数据 state:-1/1 message:是对status返回状态的一个对应声明,比如说登陆失败,用户名密码错误,用户名密码是空 }
6)配置拦截器
public class ProcessLogin implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果这个方法的返回值是true,那么表示当前用户已经登陆,那么直接可以访问目标方法 //如果说这个方法的返回值是false,那么表示当前用户没有进行登录,那么会直接跳转到登陆界面 HttpSession httpSession= request.getSession(false); if(httpSession==null||httpSession.equals("")||httpSession.getAttribute("user")==null||httpSession.getAttribute("user").equals("")){ response.sendRedirect("login.html"); return false; } return true; } } //把这个注册到Spring里面 @Configuration class InsertSpringBoot implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new ProcessLogin()) .addPathPatterns("/**") .excludePathPatterns("/css/**") .excludePathPatterns("/fonts/**") .excludePathPatterns("/images/**") .excludePathPatterns("/js/**") .excludePathPatterns("/css/**") .excludePathPatterns("/**/login.html"); } }
7)将所有的前端文件放在static目录下面
8)根据数据库的表创建实体类
@Data public class User { private int userID; private String userName; private String loginName; private String passWord; private String sex; private String address; private String qq; private String email; private String isAdmin; private Timestamp createTime; private Timestamp updateTime; }
![]()
除此之外,咱们还要向数据库中插入一条记录
1.实现登录功能:我们要根据前端传递的用户名和密码来进行
2.实现添加功能:有两个和后端交互的接口
1)获取到当前用户登陆权限的接口(是超级管理员还是普通管理员)(后面会做统一的登录拦截)
2)点击添加要实现添加功能
在咱们的添加功能里面,普通管理员是可以进行添加普通管理员的,是不可以添加超级管理员的,但是咱们的超级管理员啥都能添加;
根据用户的身份显示登陆界面:
3)在我们的前端按钮时有一个选项展示给咱们的超级管理员的,当执行添加操作的时候,超级管理员点击是还是不是,这部分的内容是一个div标签,所以说当用户进行登陆之后,加载我们的添加页面的时候,我们的前端要给后端发送一个Http请求,后端要根据HttpSession对象来获取User对象,后端返回User对象中的IsAdmin字段,然后前端再次拿到后端返回的参数,根据IsAdmin的值来决定是否显示这个div标签
4)咱们的前端直接使用Jquery("#adminDiv").show()方法来决定是否显示这部分内容,想要隐藏调用hidde()方法
进行插入操作:
1)在我们的前端直接获取到登陆名字,用户名,密码,确认密码,年龄,QQ,邮箱,判断他们是否为空,检测密码和确认密码是否一致
2)将这些参数传递到我们的后端,添加操作成功了,我们就返回一个1,失败我们就返回一个数字0
3)在这里面我们还是要注意,我们的有几个控件
1.比如说我们想要获取到性别这样的控件
<input id="man" type="radio" name="sex" value="男" checked="checked">男 <input id="women" type="radio" name="sex" value="女">女 当我们的单选框中的name属性一样的时候,我们才可以进行单选
该怎们进行实现呢?
针对上面的控件:
jQuery("input[name=sex]:checked").val(); 1)先通过name来进行获取到radio控件 2)checked拿到选中的控件 3)val()方法可以拿到性别信息是因为input里面有value属性
2.我们还要要拿到籍贯的控件:
<select name="address" id="address" class="form-control"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="广州">广州</option> </select> jQuery("#address").val 根据id来进行取值
当我们的用户进行添加操作的时候,后端在继续进行插入的时候,如果前端请求的参数User对象,当User对象的IdAdmin是1的时候,表明当前用户是管理员,他要进行添加管理员操作,我们要验证当前登录的用户是否是管理员!!!!我们就通过HttpSession中的Session对象来进行判断:
实现修改操作:
当前我们的项目是不能够修改超级管理员的,况且我们的登陆名字是不可以进行修改的
1)从我们的url中获取到UserID(前端)
2)展示信息(展示用户信息)
3)用户进行编辑信息再去提交信息
涉及到的安全问题:
再进行展示页面的时候先要获得用户登录权限的校验,还有查看权限的校验,普通管理员是不能进行查看超级管理员的信息(后端),普通用户是不能进行编辑超级管理员的信息的
在我们进行编辑和提交信息的时候也是要做上面两个步骤的校验