CRM项目记录(二)


目录:

(1)首页功能分析与设计

 (2)登录功能分析与设计

(3)crm搭建Mybatis逆向工程环境

(4)CRM登录功能实现Mapper层和Service层

(5)crm实现回车登录

(6)crm实现记录密码


(1)首页功能分析与设计、实现

一访问项目,跳转到首页,登录页面。

访问首页流程分析:

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";//使用视图解析器,带上前缀后缀
    }
}

CRM项目记录(二)_第2张图片

CRM项目记录(二)_第3张图片

修改index.html的为index.jsp,修改之前先改编码,换成一句话

CRM项目记录(二)_第4张图片 CRM项目记录(二)_第5张图片

跳转到index.jsp,他在跳转到Login.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>





	

再重命名:

CRM项目记录(二)_第6张图片

首页index.jsp在跳转登录页面login.jsp 

 创建UserController跳转到Login.jsp页面:

CRM项目记录(二)_第7张图片

 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的路径:

CRM项目记录(二)_第8张图片

 在修改Login.html的编码:

CRM项目记录(二)_第9张图片

重命名Login.jsp。

通过使用base标签,就不用指定.. /../了

CRM项目记录(二)_第10张图片

把href的路径都改为基于base的路径,里面再也不用谢../了 

但是上面的路径的IP写死了,以后可能发生改变,所以使用获取的方式 

CRM项目记录(二)_第11张图片

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" %>





	

重启启动项目跳转到:登录页面CRM项目记录(二)_第12张图片

 (2)登录功能分析与设计

用户在登录页面,输入用户名和密码,点击"登录"按钮或者回车,完成用户登录的功能.

         *用户名和密码不能为空

         *用户名或者密码错误,用户已过期,用户状态被锁定,ip受限 都不能登录成功

         *登录成功之后,所有业务页面显示当前用户的名称

         *实现10天记住密码

         *登录成功之后,跳转到业务主页面

         *登录失败,页面不跳转,提示信息

流程分析图:

CRM项目记录(二)_第13张图片

CRM项目记录(二)_第14张图片

(3)crm搭建Mybatis逆向工程环境

新建一个Model:

CRM项目记录(二)_第15张图片

CRM项目记录(二)_第16张图片 CRM项目记录(二)_第17张图片

CRM项目记录(二)_第18张图片

CRM项目记录(二)_第19张图片

 提供mybatis逆向工程的配置文件:

CRM项目记录(二)_第20张图片

 修改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:修改生成代码的路径,指定生成代码的表






    
    

    
    

    
    

    

        
        
            
            
        

        
        
        


        
        
            
        


        
        

            
            
            
            
            
            
            
            
        

        
        
            
        

        
        
            
        


        
        

双击这个插件生成代码: 

CRM项目记录(二)_第21张图片

CRM项目记录(二)_第22张图片 生成了User的实体类、Mapper接口、Mapper配置文件

 CRM项目记录(二)_第23张图片

 (4)CRM登录功能实现Mapper层和Service层

在UserMapper接口中:添加一个登录查询的方法

CRM项目记录(二)_第24张图片

 在UserMapper.xml中添加sql语句:

CRM项目记录(二)_第25张图片

在配置文件:让扫描这个Mapper所在的包

CRM项目记录(二)_第26张图片 CRM项目记录(二)_第27张图片

 创建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扫描这个包:

CRM项目记录(二)_第28张图片

 把返回的数据,封装成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:

CRM项目记录(二)_第29张图片

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:

CRM项目记录(二)_第30张图片

在UserController中:存在代码不合理,SimpleDateFormat对日期的格式格式化,可能会重复的写,可以写一个工具类

CRM项目记录(二)_第31张图片

 创建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;
    }
}

CRM项目记录(二)_第32张图片

修改UserController:中的常量0 和1

CRM项目记录(二)_第33张图片

 

把用户信息存入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主页面,修改获取用户信息:

CRM项目记录(二)_第34张图片

设置登录时显示正在加载,给用户体验在login.jsp中:添加一个发送请求之前的函数

CRM项目记录(二)_第35张图片

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
	String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>


	
	
	
	
	
	


CRM  ©2019 动力节点
  

 CRM项目记录(二)_第36张图片

CRM项目记录(二)_第37张图片

 登录成功之后:

CRM项目记录(二)_第38张图片

获取到了当前登录的用户名 

CRM项目记录(二)_第39张图片

 (5)crm实现回车登录

当输入账号密码,直接回车就可以登录

在login.jsp的js代码中添加回车事件:

CRM项目记录(二)_第40张图片

 

CRM项目记录(二)_第41张图片

 CRM项目记录(二)_第42张图片

回车:

CRM项目记录(二)_第43张图片 

(6)crm实现记录密码

 CRM项目记录(二)_第44张图片CRM项目记录(二)_第45张图片

CRM项目记录(二)_第46张图片 

 

 

 

在UserController:添加cookie设置

CRM项目记录(二)_第47张图片 

 在login.jsp中:使用EL表达式判断是否有cookie:

CRM项目记录(二)_第48张图片

<%@ 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 动力节点
  

 选择记录CRM项目记录(二)_第49张图片

 

CRM项目记录(二)_第50张图片 

关闭浏览器,重新打开输入网址:

 CRM项目记录(二)_第51张图片

回车:进入登录页面,就会显示账号密码

CRM项目记录(二)_第52张图片 

 

你可能感兴趣的