1.客户需求(需求开发说明书)
用户在登录页面,输入用户名和密码,点击"登录"按钮或者回车,完成用户登录的功能.
*用户名和密码不能为空
*用户名或者密码错误,用户已过期,用户状态被锁定,ip受限 都不能登录成功
*登录成功之后,所有业务页面显示当前用户的名称
*实现10天记住密码
*登录成功之后,跳转到业务主页面
*登录失败,页面不跳转,提示信息
2.首先明确需求,规划程序访问流程,画好UML顺序图再编写代码,方便以后对项目进行管理,同时也是开发规范的硬性要求
3.前面已经使用mybatis逆向工程创建了UserMapper文件,自动创建的文件中已经包含了增删改查等基本操作语句,为了理解开发的流程,再自己写一个查询用户的语句添加进去。
mapper文件目录位置
UserMapper接口
package com.it.crm.settings.mapper;
import com.it.crm.settings.entity.User;
import java.util.Map;
public interface UserMapper {
int deleteByPrimaryKey(String id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(String id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
User selectUserByActAndPwd(Map map);
}
UserMapper.xml文件
id, login_act, name, login_pwd, email, expire_time, lock_state, deptno, allow_ips, createTime, create_by, edit_time, edit_by
4.创建service层文件
UserService接口
package com.it.crm.settings.service;
import com.it.crm.settings.entity.User;
import java.util.Map;
public interface UserService {
User queryUserByActAndPwd(Map map);
}
UserServiceImpl类
package com.it.crm.settings.service.impl;
import com.it.crm.settings.entity.User;
import com.it.crm.settings.mapper.UserMapper;
import com.it.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 {
@Autowired
private UserMapper userMapper;
@Override
public User queryUserByActAndPwd(Map map) {
return userMapper.selectUserByActAndPwd(map);
}
}
5.创建web层下的controller层
UserController类
package com.it.crm.settings.web.controller;
import com.it.crm.commons.contants.Contants;
import com.it.crm.commons.entity.ReturnObject;
import com.it.crm.commons.utils.DateUtils;
import com.it.crm.settings.entity.User;
import com.it.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
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 javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/settings/qx/user/toLogin.do")
public String toLogin(){
return "settings/qx/user/login";
}
@RequestMapping(value = "/settings/qx/user/login.do")
@ResponseBody
public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request, HttpSession session){
//封装参数
Map map=new HashMap<>();
map.put("loginAct",loginAct);
map.put("loginPwd",loginPwd);
map.put("isRemPwd",isRemPwd);
//调用service层方法,查询用户
User user = userService.queryUserByActAndPwd(map);
//根据查询结果生成响应信息
ReturnObject returnObject=new ReturnObject();
if (user==null){
//登录失败,用户名或密码错误
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("用户名或密码错误");
}else {//进一步判断账号是否合法
if (DateUtils.formateDateTime(new Date()).compareTo(user.getExpireTime())>0){
//登录失败,账号已过期
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("账号已经过期");
}else if ("0".equals(user.getLockState())){
//登录失败,状态被锁定
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{
//登录成功
returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
//把user保存到session中
session.setAttribute(Contants.SESSION_USER,user);
}
}
return returnObject;
}
}
UserController类调用了该项目中的通用层commons下多个类
如下所示
Contants类
把条件常量用封装好的类中的方法表示,有利于后期维护时,更改条件值时只更新该处,不需要更改整个项目
package com.it.crm.commons.contants;
//定义常量类,有利于后期维护
public class Contants {
//保存ReturnObject类中的Code值
public static final String RETURN_OBJECT_CODE_SUCCESS="1";//成功
public static final String RETURN_OBJECT_CODE_FAIL="0";//失败
//保存session中当前用户的key
public static final String SESSION_USER="sessionUser";
}
ReturnObject类
package com.it.crm.commons.entity;
public class ReturnObject {
private String code;//处理成功或者失败的标记,1:成功,0:失败
private String message;//提示信息
private Object returnData;//返回其他数据
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 getReturnData() {
return returnData;
}
public void setReturnData(Object returnData) {
this.returnData = returnData;
}
@Override
public String toString() {
return "ReturnObject{" +
"code='" + code + ''' +
", message='" + message + ''' +
", returnData=" + returnData +
'}';
}
}
DateUtils类(时间工具类)
package com.it.crm.commons.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
//对Date类型数据进行处理的工具类
public class DateUtils {
//对指定的date对象进行格式化
public static String formateDateTime(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
return format;
}
//对指定的date对象进行格式化
public static String formateDate(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(date);
return format;
}
//对指定的date对象进行格式化
public static String formateTime(Date date){
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
String format = sdf.format(date);
return format;
}
}
6.创建webapp下的登录页面
login.jsp
使用ajax异步传输判断,如果账号密码为空直接弹出提示框,不为空时进入UserController类 进行账号密码的各种验证,全部正确跳转到WorkBenchIndexContoller类,不正确时在登录页面上显示错误信息。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; %>CRM 客户关系管理系统 登录
7.创建workbench包下的web层
WorkBenchIndexContoller类
登录成功时跳转到该类
package com.it.crm.workbench.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WorkBenchIndexContoller {
@RequestMapping(value = "/workbench/index.do")
public String index(){
//跳转到业务主页面
return "workbench/index";
}
}
8.创建工作台首页
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; %>我的资料 姓名:张三
登录帐号:zhangsan
组织机构:1005,市场部,二级部门
邮箱:zhangsan@bjpowernode.com
失效时间:2017-02-14 10:10:10
允许访问IP:127.0.0.1,192.168.100.2修改密码
离开
您确定要退出系统吗?
CRM 客户关系管理系统(LJL)-
${sessionUser.name}
- 系统设置
- 我的资料
- 修改密码
- 退出
- 工作台
- 动态
- 审批
- 客户公海
- 市场活动
- 线索(潜在客户)
- 客户
- 联系人
- 交易(商机)
- 售后回访
-
统计图表
- 市场活动统计图表
- 线索统计图表
- 客户和联系人统计图表
- 交易统计图表
- 报表
- 销售订单
- 发货单
- 跟进
- 产品
- 报价
项目效果展示
直接点击登录
输入用户名后点击登录
全部输入后
输入正确的用户名和密码
数据库用户表信息如下所示
输入李四信息登录
输入张三信息登录
已经进入到了工作台主页面



