目录:
(1)首页功能分析与设计
(2)登录功能分析与设计
(3)crm搭建Mybatis逆向工程环境
(4)CRM登录功能实现Mapper层和Service层
(5)crm实现回车登录
(6)crm实现记录密码
(1)首页功能分析与设计、实现
一访问项目,跳转到首页,登录页面。
访问首页流程分析:
创建IndexController:
package com.bjpowernode.crm.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
/*
理论上,给Controller方法分配url:http://127.0.0.1:8080/crm/
为了简便,协议://ip:port/应用名称必须省去,用/代表应用根目录下的/
*/
@RequestMapping("/")
public String index(){
//请求转发
return "index";//使用视图解析器,带上前缀后缀
}
}
修改index.html的为index.jsp,修改之前先改编码,换成一句话
跳转到index.jsp,他在跳转到Login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
再重命名:
首页index.jsp在跳转登录页面login.jsp
创建UserController跳转到Login.jsp页面:
UserController:
package com.bjpowernode.crm.settings.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
/**
* url要和controller方法处理完请求之后,响应信息返回的页面的资源目录保持一致
*/
@RequestMapping("/settings/qx/user/toLogin.do")
public String toLogin(){
//请求转发到登录页面
return "settings/qx/user/login";
}
}
在springmvc配置文件中添加扫描创建的UserController的路径:
在修改Login.html的编码:
重命名Login.jsp。
通过使用base标签,就不用指定.. /../了
把href的路径都改为基于base的路径,里面再也不用谢../了
但是上面的路径的IP写死了,以后可能发生改变,所以使用获取的方式
Login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<%--
request.getScheme():获取协议
request.getServerName():获取动态IP地址
request.getServerPort():获取服务器端口号
request.getContextPath():获取应用的名字
--%>
CRM ©2019 动力节点
登录
修改index.js的跳转路径为访问UserController的路径:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
(2)登录功能分析与设计
用户在登录页面,输入用户名和密码,点击"登录"按钮或者回车,完成用户登录的功能.
*用户名和密码不能为空
*用户名或者密码错误,用户已过期,用户状态被锁定,ip受限 都不能登录成功
*登录成功之后,所有业务页面显示当前用户的名称
*实现10天记住密码
*登录成功之后,跳转到业务主页面
*登录失败,页面不跳转,提示信息
流程分析图:
(3)crm搭建Mybatis逆向工程环境
新建一个Model:
提供mybatis逆向工程的配置文件:
修改generator.properties:
jdbc.driverLocation=D:/software/Maven/apache-maven-3.3.9/resp/mysql/mysql-connector-java/5.1.43/mysql-connector-java-5.1.43.jar
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/crm2008
jdbc.userId=root
jdbc.password=123456
generatorConfig.xml:修改生成代码的路径,指定生成代码的表
双击这个插件生成代码:
生成了User的实体类、Mapper接口、Mapper配置文件
(4)CRM登录功能实现Mapper层和Service层
在UserMapper接口中:添加一个登录查询的方法
在UserMapper.xml中添加sql语句:
在配置文件:让扫描这个Mapper所在的包
创建UserService接口:
package com.bjpowernode.crm.settings.service;
import com.bjpowernode.crm.settings.domain.User;
import java.util.Map;
public interface UserService {
//登录查询方法
User queryUserByLoginActAndPwd(Map map);
}
创建实现类:UserSDerviceImpl:
package com.bjpowernode.crm.settings.service.impl;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.mapper.UserMapper;
import com.bjpowernode.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service("userService")
public class UserServiceImpl implements UserService {
//注入UserMapper
@Autowired
private UserMapper userMapper;
@Override
public User queryUserByLoginActAndPwd(Map map) {
//调用usermapper方法
return userMapper.selectUserByLoginActAndPwd(map);
}
}
为了让@Service起作用让spring扫描这个包:
把返回的数据,封装成java对象,用java对象来封装数据:ReturnObject类:
package com.bjpowernode.crm.commons.domain;
public class ReturnObject {
private String code;//处理成功获取失败的标记:1---成功,0---失败
private String message;//提示信息
private Object retData;//其它数据
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getRetData() {
return retData;
}
public void setRetData(Object retData) {
this.retData = retData;
}
}
UserController:添加登录方法:
package com.bjpowernode.crm.settings.web.controller;
import com.bjpowernode.crm.commons.domain.ReturnObject;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
public class UserController {
/**
* url要和controller方法处理完请求之后,响应信息返回的页面的资源目录保持一致
*/
@RequestMapping("/settings/qx/user/toLogin.do")
public String toLogin(){
//请求转发到登录页面
return "settings/qx/user/login";//使用视图解析器,这个return不用带/,因为视图解析器已经带了
}
@Autowired
private UserService userService;
@RequestMapping("/settings/qx/user/login.do")//这个url书写看方法返回到那个页面去
//返回json字符串,需要加一个注解ResponseBody
public @ResponseBody
Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request){
//封装参数
Map map=new HashMap<>();
map.put("loginAct",loginAct);
map.put("loginPwd",loginPwd);
//调用service层方法,查询用户
User user=userService.queryUserByLoginActAndPwd(map);
//根据查询结果,生成响应信息
ReturnObject returnObject=new ReturnObject();
if(user==null){
//登录失败,用户名或者密码错误 进行封装信息
returnObject.setCode("0");
returnObject.setMessage("用户名或者密码错误");
}else{//进一步判断账号是否合法
//user.getExpireTime() //2019-10-20
// new Date() //2020-09-10
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowStr=sdf.format(new Date());
//这两个字符串比较
if(nowStr.compareTo(user.getExpireTime())>0){
//登录失败,账号已过期
returnObject.setCode("0");
returnObject.setMessage("账号已过期");
}else if("0".equals(user.getLockState())){
//登录失败,状态被锁定
returnObject.setCode("0");
returnObject.setMessage("状态被锁定");
}else if(!user.getAllowIps().contains(request.getRemoteAddr())){
//登录失败,ip受限
returnObject.setCode("0");
returnObject.setMessage("ip受限");
}else{
//登录成功
returnObject.setCode("1");
}
}
return returnObject;
}
}
给前台登录页面添加点击发送请求:
Login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
CRM ©2019 动力节点
登录
创建controller:
WorkbenchIndexController:
package com.bjpowernode.crm.workbench.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WorkbenchIndexController {
@RequestMapping("/workbench/index.do")
public String index(){
//跳转到业务主页面
return "workbench/index";
}
}
mvc配置文件中扫描这个controller:
在UserController中:存在代码不合理,SimpleDateFormat对日期的格式格式化,可能会重复的写,可以写一个工具类
创建DataUtils类:
package com.bjpowernode.crm.commons.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 对Date类型数据进行处理的工具类
*/
public class DateUtils {
/**
* 对指定的date对象进行格式化: yyyy-MM-dd HH:mm:ss
* @param date
* @return
*/
public static String formateDateTime(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr=sdf.format(date);
return dateStr;
}
/**
* 对指定的date对象进行格式化: yyyy-MM-dd
* @param date
* @return
*/
public static String formateDate(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(date);
return dateStr;
}
/**
* 对指定的date对象进行格式化: HH:mm:ss
* @param date
* @return
*/
public static String formateTime(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
String dateStr=sdf.format(date);
return dateStr;
}
}
修改UserController:中的常量0 和1
把用户信息存入session:
UserController:
package com.bjpowernode.crm.settings.web.controller;
import com.bjpowernode.crm.commons.contants.Contants;
import com.bjpowernode.crm.commons.domain.ReturnObject;
import com.bjpowernode.crm.commons.utils.DateUtils;
import com.bjpowernode.crm.settings.domain.User;
import com.bjpowernode.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
public class UserController {
/**
* url要和controller方法处理完请求之后,响应信息返回的页面的资源目录保持一致
*/
@RequestMapping("/settings/qx/user/toLogin.do")
public String toLogin(){
//请求转发到登录页面
return "settings/qx/user/login";//使用视图解析器,这个return不用带/,因为视图解析器已经带了
}
@Autowired
private UserService userService;
@RequestMapping("/settings/qx/user/login.do")//这个url书写看方法返回到那个页面去
//返回json字符串,需要加一个注解ResponseBody
public @ResponseBody
Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request, HttpSession session){
//封装参数
Map map=new HashMap<>();
map.put("loginAct",loginAct);
map.put("loginPwd",loginPwd);
//调用service层方法,查询用户
User user=userService.queryUserByLoginActAndPwd(map);
//根据查询结果,生成响应信息
ReturnObject returnObject=new ReturnObject();
if(user==null){
//登录失败,用户名或者密码错误 进行封装信息
returnObject.setCode("0");
returnObject.setMessage("用户名或者密码错误");
}else{//进一步判断账号是否合法
//user.getExpireTime() //2019-10-20
// new Date() //2020-09-10
//SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String nowStr=sdf.format(new Date());
//这两个字符串比较 nowStr.compareTo(user.getExpireTime())>0
if(DateUtils.formateDateTime(new Date()).compareTo(user.getExpireTime())>0){
//登录失败,账号已过期
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("账号已过期");
}else if("0".equals(user.getLockState())){
//登录失败,状态被锁定 Contants.RETURN_OBJECT_CODE_FAIL是定义的常量0
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("状态被锁定");
}else if(!user.getAllowIps().contains(request.getRemoteAddr())){
//登录失败,ip受限
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("ip受限");
}else{
//登录成功 Contants.RETURN_OBJECT_CODE_SUCCESS是常量1
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
//把user保存到session中 Contants.SESSION_USER定义的常量user key
session.setAttribute(Contants.SESSION_USER,user);
}
}
return returnObject;
}
}
在index.jsp主页面,修改获取用户信息:
设置登录时显示正在加载,给用户体验在login.jsp中:添加一个发送请求之前的函数
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
CRM ©2019 动力节点
登录
登录成功之后:
获取到了当前登录的用户名
(5)crm实现回车登录
当输入账号密码,直接回车就可以登录
在login.jsp的js代码中添加回车事件:
回车:
(6)crm实现记录密码
在UserController:添加cookie设置
在login.jsp中:使用EL表达式判断是否有cookie:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
CRM ©2019 动力节点
登录
关闭浏览器,重新打开输入网址:
回车:进入登录页面,就会显示账号密码