-
1:通过点击【登录】按钮,获取登录的接口地址
-
2:在UserLoginController类中,增加登录接口
-
3:首先判断用户名是否存在,其次判断匹配是否匹配
-
4:处理session问题
-
代码如下:
-
UserLoginController.java:
/**
-
登录首页
-
@author likang
-
@date 2018-4-19 下午5:33:34
*/
@Controller
public class UserLoginController {
@Autowired
private IUserService userService;
/**
-
跳转登录页面
-
@param model
-
@return
*/
@RequestMapping(value = “/login.do”,method = RequestMethod.GET)
public String index(Model model){
return JumpViewConstants.SYSTEM_LOGIN;
}
/**
-
登录功能
-
@param request
-
@param email 用户名
-
@param password 密码
-
@param sign
-
@return
*/
@RequestMapping(value = “/login.do”,method = RequestMethod.POST)
public String login(HttpServletRequest request,String email,String password,String sign,Model model){
// if (email != null && !“”.equals(email)) {
//
// }
//isnotblank:判断参数是否为空和“”
//isNotEmpty:只会判断参数是否为null
if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(password)) {
//利用spring容器获取map中的属性值
email = email + ContextUtil.getInitConfig(“email_suffix”);
//验证用户名是否存在
User user = userService.queryUserByEmail(email);
if (user == null) {//用户不存在
// model.addAttribute(ReturnConstants.USER_NOT_EXIST);
model.addAttribute(“msg”, ReturnConstants.USER_NOT_EXIST);
return JumpViewConstants.SYSTEM_LOGIN;
}
//验证密码是否匹配
boolean isExis = userService.isExisPassword(String.valueOf(user.getUserid()), password);
if (!isExis) {
// model.addAttribute(ReturnConstants.PASSWORD_ERROR);
model.addAttribute(“msg”, ReturnConstants.PASSWORD_ERROR);
return JumpViewConstants.SYSTEM_LOGIN;
}
//cookie
//TODO…
//处理session
UserContext.setLoginUser(user);
request.getSession(true).setAttribute(“loginName”, user.getUsername());
request.getSession(true).setAttribute(“ischange”, user.getIschange());
//跳转成功首页
return JumpViewConstants.SYSTEM_INDEX;
}
return ReturnConstants.PARAM_NULL;//接收参数为空
}
}
- IUserService.java:
/**
-
用户信息接口
-
@author likang
-
@date 2018-4-23 上午9:36:12
*/
public interface IUserService {
/**
-
根据邮箱查询用户信息
-
@param email 邮箱
-
@return
*/
public User queryUserByEmail(String email);
/**
-
验证密码是否匹配
-
@param userid 用户主键ID
-
@param password 密码
-
@return
*/
public boolean isExisPassword(String userid,String password);
}
- UserServiceImpl.java:
@Service
@Transactional(rollbackFor=Exception.class)
public class UserServiceImpl implements IUserService{
// @Resource//首先按照名称匹配,其次按照类型匹配
@Autowired//只会按照类型匹配(推荐使用)
IDataAccess userDao;
public User queryUserByEmail(String email) {
Map<String, Object> param = new HashMap<String, Object>();
param.put(“email”, email);
List list = userDao.queryByStatment(“queryUserByEmail”, param, null);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
public boolean isExisPassword(String userid, String password) {
Map<String, Object> param = new HashMap<String, Object>();
param.put(“userid”, userid);
param.put(“password”, MD5Tools.encode(password));
List list = userDao.queryByStatment(“isExisPassword”, param, null);
if (list != null && list.size() > 0) {
return true;
}
return false;
}
}
- UserMapper.xml:
select
u.userid,u.username,u.email,u.roleid,u.deptid,u.ischange
from hj_user u
where u.email = #{email}
select
u.userid,u.username,u.email,u.roleid,u.deptid
from hj_user u
where u.userid = #{userid} and u.password = #{password}
mybatis-config.xml:
### []( )登录功能-首页访问–完善功能
* 代码如下:
* UserLoginController.java:
/**
* 登录首页
* @author likang
* @date 2018-4-19 下午5:33:34
*/
@Controller
public class UserLoginController {
@Autowired
private IUserService userService;
/**
* 跳转登录页面
* @param model
* @return
*/
@RequestMapping(value = "/login.do",method = RequestMethod.GET)
public String index(Model model){
if (UserContext.getLoginUser() != null) {
return "redirect:/main.do";
}
return JumpViewConstants.SYSTEM_LOGIN;
}
/**
* 主页面
* @param model
* @return
*/
@RequestMapping(value = "/main.do",method = RequestMethod.GET)
public String main(Model model){
if (UserContext.getLoginUser() != null) {
return JumpViewConstants.SYSTEM_INDEX;
}
return JumpViewConstants.SYSTEM_LOGIN;
}
/**
* 登录功能
* @param request
* @param email 用户名
* @param password 密码
* @param sign
* @return
*/
@RequestMapping(value = "/login.do",method = RequestMethod.POST)
public String login(HttpServletRequest request,String email,String password,String sign,Model model){
// if (email != null && !"".equals(email)) {
//
// }
//isnotblank:判断参数是否为空和“”
//isNotEmpty:只会判断参数是否为null
if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(password)) {
//利用spring容器获取map中的属性值
email = email + ContextUtil.getInitConfig("email_suffix");
//验证用户名是否存在
User user = userService.queryUserByEmail(email);
if (user == null) {//用户不存在
// model.addAttribute(ReturnConstants.USER_NOT_EXIST);
model.addAttribute("msg", ReturnConstants.USER_NOT_EXIST);
return JumpViewConstants.SYSTEM_LOGIN;
}
//验证密码是否匹配
boolean isExis = userService.isExisPassword(String.valueOf(user.getUserid()), password);
if (!isExis) {
// model.addAttribute(ReturnConstants.PASSWORD_ERROR);
model.addAttribute("msg", ReturnConstants.PASSWORD_ERROR);
return JumpViewConstants.SYSTEM_LOGIN;
}
//cookie
//TODO......
//处理session
UserContext.setLoginUser(user);
request.getSession(true).setAttribute("loginName", user.getUsername());
request.getSession(true).setAttribute("ischange", user.getIschange());
//跳转成功首页
// return JumpViewConstants.SYSTEM_INDEX;
return "redirect:/main.do";
}
return ReturnConstants.PARAM_NULL;//接收参数为空
}
}
### []( )登录功能-cookie问题
* 开发步骤:
* 1:为了解决用户端禁用浏览器cookie第三方数据的问题
* 2:只需要在服务器中保存一份cookie即可,同步到浏览器客户端
* 示例代码:
* UserLoginController.java:
private static final String COOKIE_KEY = "_auth_";
private static final String COOKIE_SPI = "_#_";
/**
* 登录功能
* @param request
* @param email 用户名
* @param password 密码
* @param sign
* @return
*/
@RequestMapping(value = "/login.do",method = RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response,String email,String password,String sign,Model model){
// if (email != null && !"".equals(email)) {
//
// }
//isnotblank:判断参数是否为空和“”
//isNotEmpty:只会判断参数是否为null
if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(password)) {
//利用spring容器获取map中的属性值
email = email + ContextUtil.getInitConfig("email_suffix");
//验证用户名是否存在
User user = userService.queryUserByEmail(email);
if (user == null) {//用户不存在
// model.addAttribute(ReturnConstants.USER_NOT_EXIST);
model.addAttribute("msg", ReturnConstants.USER_NOT_EXIST);
return JumpViewConstants.SYSTEM_LOGIN;
}
//验证密码是否匹配
boolean isExis = userService.isExisPassword(String.valueOf(user.getUserid()), password);
if (!isExis) {
// model.addAttribute(ReturnConstants.PASSWORD_ERROR);
model.addAttribute("msg", ReturnConstants.PASSWORD_ERROR);
return JumpViewConstants.SYSTEM_LOGIN;
}
//cookie
Cookie cok = new Cookie(COOKIE_KEY, URLEncoder.encode(user.getUsername())+COOKIE_SPI+MD5Tools.encode(user.getEmail()));
cok.setPath("/");
cok.setMaxAge(-1);//-1:立即创建,并且在登录成功之后,就生效
//0:在客户端关闭浏览器之后,即失效
response.addCookie(cok);
//处理session
UserContext.setLoginUser(user);
request.getSession(true).setAttribute("loginName", user.getUsername());
request.getSession(true).setAttribute("ischange", user.getIschange());
//跳转成功首页
// return JumpViewConstants.SYSTEM_INDEX;
return "redirect:/main.do";
}
return ReturnConstants.PARAM_NULL;//接收参数为空
}
[]( )退出功能
-----------------------------------------------------------------
* 开发步骤:
* 1:清除session信息
* 2:清除存放于服务器中的cookie数据
* 3:清除客户端中的cookie数据
* 4:跳转登录页面即可
* 示例代码:
* UserLoginController.java:
/**
* 退出
* @param request
* @return
*/
@RequestMapping(value = "/logout.do",method = RequestMethod.GET)
public String logout(HttpServletRequest request,HttpServletResponse response){
//清除session
UserContext.clearLoginUser();
//清除服务器中的cookie数据
Cookie cok = new Cookie(COOKIE_KEY,null);
cok.setMaxAge(0);
cok.setPath("/");
response.addCookie(cok);
//清除客户端中的cookie数据
Cookie coksessionID = new Cookie("JSESSIONID",null);
coksessionID.setMaxAge(0);
coksessionID.setPath(request.getContextPath());
response.addCookie(coksessionID);
//跳转登录页面
return "redirect:/main.do";
}
[]( )登录成功-权限管理-左侧菜单展示功能
-------------------------------------------------------------------------------
* 开发步骤:
* 1:根据登录成功用户的角色ID,查询对应的菜单信息,参考第一天的sql语句
* 2:首先查询一级菜单信息
* 3:循环遍历一级菜单信息,查询当前一级菜单对应的二级菜单信息
* 示例代码:
* UserLoginController.java:
/**
* 主页面
* @param model
* @return
*/
@RequestMapping(value = "/main.do",method = RequestMethod.GET)
public String main(Model model){
if (UserContext.getLoginUser() != null) {
//根据当前登录用户的角色,查询当前角色对应的菜单信息
List
UserServiceImpl.java:
public void saveOrUpdateUser(User user) {
if (user != null) {
if (user.getUserid() != null) {//修改
user.setUpdate_id(UserContext.getLoginUser().getUserid());
user.setUpdate_time(new Timestamp(System.currentTimeMillis()));
userDao.update(user);
}else{//增加
user.setCreate_id(UserContext.getLoginUser().getUserid());
user.setCreate_time(new Timestamp(System.currentTimeMillis()));
userDao.insert(user);
}
}
}
### []( )删除
* 开发步骤:
* 1:通过前端找到删除的接口地址(支持批量删除,真正企业做的时候,接口是后台来定义)
* 2:增加删除的接口和方法
* 示例代码:
* UserController.java:
/**
* 删除用户信息,支持批量删除
* @param request
* @param ids 用户主键ID,多个用逗号隔开
* @return
*/
@RequestMapping(value = "/system/deleteUser.do",method = RequestMethod.POST)
public @ResponseBody String deleteUsers(HttpServletRequest request,String ids){
if (StringUtils.isNotBlank(ids)) {
userService.deleteUserByIds(ids);
return ReturnConstants.SUCCESS;
}
return ReturnConstants.PARAM_NULL;
}
* IUserService.java:
/**
* 删除用户信息,批量删除
* @param ids 用户主键ID,多个用逗号隔开
*/
public void deleteUserByIds(String ids);
* UserServiceImpl.java:
public void deleteUserByIds(String ids) {
if (StringUtils.isNotBlank(ids)) {
userDao.deleteByIds(User.class, ids);
}
}
* 提示:
* 1:回顾mysql的删除别名问题
* 2:练习mybatis中的for标签
### []( )页面展示
\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHQiKuqq-1602315802000)(https://i.imgur.com/rUyy9qq.png)\]
[]( )测试环境项目部署过程
-----------------------------------------------------------------------
* 系统环境:
* linux-CentOS7
* 使用工具:
* CRT\\SCP
* 部署步骤:
* 1:首先确认本地访问运行没有任何问题
* 2:导出本地的数据库脚本,将脚本文件在虚拟机服务器的数据库中执行
* 3:使用scp工具连接服务器,将本地tomcat的webapps目录下的项目,拖到虚拟机服务器tomcat的webapps目录下(可选:修改项目访问名称,ROOT在访问时,不需要输入)
* 4:修改虚拟机服务器中项目的jdbc配置文件,修改为虚拟机数据库的连接信息
* 5:使用crt工具,启动tomcat
* 6:本地访问服务器项目信息
* 注意事项:
* 1:本地连接服务器的数据库,需要开启3306端口号(防火墙允许3306端口允许)
命令:/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
* 2:需要开启tomcat访问的端口号,命令如下:
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
* 3:如果新增增量补丁,如下地方是需要重启tomcat服务的
- 接口代码
- 配置文件、属性文件
- xml对应的sql语句
* 4:查看服务器mysql是否开启的命令
ps -ef|grep mysql
[]( )菜单管理
-----------------------------------------------------------------
### []( )跳转页面
略,参考工程文件
### []( )查询
略,参考工程文件
### []( )增加、修改
略,参考工程文件
### []( )删除
* 需求:
1:如果菜单存在下一级菜单,则不允许删除
2:如果菜单已经被分配,则不允许删除
* 开发步骤:
1://查询菜单ID,是否存在下一级菜单
2://查询菜单ID,是否存在权限分配
3://如果当前菜单ID,既不存在下一级菜单,又不存在权限分配,则可以直接删除成功
4://如果满足其中一条信息,则都不允许删除,返回错误信息
5://如果都不满足,删除成功
* 示例代码:
* MenuController.java:
/**
* 菜单删除功能
*
* 1:如果菜单存在下一级菜单,则不允许删除
* 2:如果菜单已经被分配,则不允许删除
*
* error1 = [菜单:用户管理,菜单管理] 存在下一级菜单信息,不允许删除
* error2 = [菜单:角色管理,部门管理] 存在权限分配,不允许删除
*
* @param request
* @param ids 菜单主键ID,多个用逗号隔开
* @return
*/
@RequestMapping(value = "/menu/delete.do",method = RequestMethod.POST)
public @ResponseBody String deleteMenus(HttpServletRequest request,String ids){
if (StringUtils.isNotBlank(ids)) {
StringBuffer error1 = new StringBuffer();
StringBuffer error2 = new StringBuffer();
boolean ishasCh = false;
boolean ishasrm = false;
for (String id : ids.split(",")) {
//查询菜单ID,是否存在下一级菜单
if (menuService.isHasChiredMenu(id)) {//true:存在下一级菜单
if (!ishasCh) {
ishasCh = true;
}
if (error1.length() == 0){
error1.append("[菜单:");
}
error1.append(menuService.queryMenuById(id) != null ?menuService.queryMenuById(id).getMenuname() : "" ).append(",");
continue;
}
//查询菜单ID,是否存在权限分配
if (menuService.isHasRoleMenu(id)) {//true:存在权限分配
if (!ishasrm) {
ishasrm = true;
}
if (error2.length() == 0){
error2.append("[菜单:");
}
error2.append(menuService.queryMenuById(id) != null ?menuService.queryMenuById(id).getMenuname() : "" ).append(",");
continue;
}
menuService.deleleMenuById(id);//如果当前菜单ID,既不存在下一级菜单,又不存在权限分配,则可以直接删除成功
}
//如果满足其中一条信息,则都不允许删除,返回错误信息
if (ishasCh){
error1.deleteCharAt(error1.length() - 1).append("] 存在下一级菜单信息,不允许删除");
}
if (ishasrm){
error2.deleteCharAt(error2.length() - 1).append("] 存在权限分配,不允许删除");
}
// String msgbegin = ishasCh ? error1.toString() : “” + ishasrm ? ishasCh?error1.toString() : “”:""+error2.toString():"";
String msg = error1.toString()+error2.toString();
if (StringUtils.isNotBlank(msg)) {
return msg;
}
//如果都不满足,删除成功
return ReturnConstants.SUCCESS;
}
return ReturnConstants.PARAM_NULL;
}
* IMenuService.java:
/**
* 根据菜单主键ID,判断当前菜单是否存在下一级菜单
* @param id 菜单主键ID
* @return
*/
public boolean isHasChiredMenu(String id);
/**
* 根据菜单主键ID,判断当前菜单是否存在权限分配
* @param id 菜单主键ID
* @return
*/
public boolean isHasRoleMenu(String id);
/**
* 根据菜单id,查询菜单信息
* @param id 主键ID
* @return
*/
public Menu queryMenuById(String id);
/**
* 根据主键ID,删除菜单信息
* @param id
*/
public void deleleMenuById(String id);
MenuServiceImpl.java:
public boolean isHasChiredMenu(String id) {
Map