【CRM(二)】登录&客户管理模块

CRM综合练习:用户模块登录功能

用户模块:登录功能代码实现

修改登录页面

<FORM id=form1 name=form1 action="${ pageContext.request.contextPath }/user_login.action" method=post target="_parent">

编写Action中login方法

  • UserAction.java
/**
 * 用户登录的方法:login
 */
public String login(){
	//调用业务层查询用户:
	User existUser =  userService.login(user);
	if(existUser == null){
		//登录失败
		//添加错误信息
		this.addActionError("用户名或密码错误!");
		return LOGIN;
	}else{
		//登陆成功
//			ServletActionContext.getRequest().getSession().setAttribute("existUser", existUser);
		ActionContext.getContext().getSession().put("existUser", existUser);
		return SUCCESS;
	}
}

编写Service实现类

@Override
//业务层用户登陆的方法
public User login(User user) {
	user.setUser_password(MD5Utils.md5(user.getUser_password()));
	//调用DAO
	return userDao.login(user);
}

编写DAO实现类

@Override
//DAO中根据用户名和密码进行查询的方法:
public User login(User user) {
	List<User> list = (List<User>) this.getHibernateTemplate().find("from User where user_code=? and user_password = ?", user.getUser_code(),user.getUser_password());
	if(list.size() > 0){
		return list.get(0);
	}
	
	return null;
}

配置页面的跳转

struts.xml

<package name="crm" extends="struts-default" namespace="/">
	<action name="user_*" class="userAction" method="{1}">
		<result name="login">/login.jsp</result>
		<result name="success" type="redirect">/index.jsp</result>
	</action>
</package>

在页面中显示数据

  • 在登录成功的页面上显示用户的信息
    top.jsp
当前用户:<s:property value="#session.existUser.user_name"/>
  • 在失败的页面上显示错误信息
    login.jsp
<%@ taglib uri="/struts-tags" prefix="s"%>
 <s:actionerror/>

CRM综合练习:客户管理

客户管理:准备工作

创建表

CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建实体和映射

  • 创建实体
    在这里插入图片描述
  • 创建映射
    在这里插入图片描述

创建Action

在这里插入图片描述

创建Service

在这里插入图片描述

创建DAO

在这里插入图片描述

配置Action、Service、DAO

在这里插入图片描述

跳转到添加页面

修改左侧菜单页面

在这里插入图片描述

编写Action中的saveUI的方法

在这里插入图片描述

配置Action的跳转

在这里插入图片描述

测试跳转

在这里插入图片描述

引入数据字典

什么是数据字典

数据字典用来规范某些地方具体值和数据

创建数据字典表

CREATE TABLE `base_dict` (
  `dict_id` varchar(32) NOT NULL COMMENT '数据字典id(主键)',
  `dict_type_code` varchar(10) NOT NULL COMMENT '数据字典类别代码',
  `dict_type_name` varchar(64) NOT NULL COMMENT '数据字典类别名称',
  `dict_item_name` varchar(64) NOT NULL COMMENT '数据字典项目名称',
  `dict_item_code` varchar(10) DEFAULT NULL COMMENT '数据字典项目(可为空)',
  `dict_sort` int(10) DEFAULT NULL COMMENT '排序字段',
  `dict_enable` char(1) NOT NULL COMMENT '1:使用 0:停用',
  `dict_memo` varchar(64) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `base_dict`(`dict_id`,`dict_type_code`,`dict_type_name`,`dict_item_name`,`dict_item_code`,`dict_sort`,`dict_enable`,`dict_memo`) values ('1','001','客户行业','教育培训 ',NULL,1,'1',NULL),('10','003','公司性质','民企',NULL,3,'1',NULL),('12','004','年营业额','1-10万',NULL,1,'1',NULL),('13','004','年营业额','10-20万',NULL,2,'1',NULL),('14','004','年营业额','20-50万',NULL,3,'1',NULL),('15','004','年营业额','50-100万',NULL,4,'1',NULL),('16','004','年营业额','100-500万',NULL,5,'1',NULL),('17','004','年营业额','500-1000万',NULL,6,'1',NULL),('18','005','客户状态','基础客户',NULL,1,'1',NULL),('19','005','客户状态','潜在客户',NULL,2,'1',NULL),('2','001','客户行业','电子商务',NULL,2,'1',NULL),('20','005','客户状态','成功客户',NULL,3,'1',NULL),('21','005','客户状态','无效客户',NULL,4,'1',NULL),('22','006','客户级别','普通客户',NULL,1,'1',NULL),('23','006','客户级别','VIP客户',NULL,2,'1',NULL),('24','007','商机状态','意向客户',NULL,1,'1',NULL),('25','007','商机状态','初步沟通',NULL,2,'1',NULL),('26','007','商机状态','深度沟通',NULL,3,'1',NULL),('27','007','商机状态','签订合同',NULL,4,'1',NULL),('3','001','客户行业','对外贸易',NULL,3,'1',NULL),('30','008','商机类型','新业务',NULL,1,'1',NULL),('31','008','商机类型','现有业务',NULL,2,'1',NULL),('32','009','商机来源','电话营销',NULL,1,'1',NULL),('33','009','商机来源','网络营销',NULL,2,'1',NULL),('34','009','商机来源','推广活动',NULL,3,'1',NULL),('4','001','客户行业','酒店旅游',NULL,4,'1',NULL),('5','001','客户行业','房地产',NULL,5,'1',NULL),('6','002','客户信息来源','电话营销',NULL,1,'1',NULL),('7','002','客户信息来源','网络营销',NULL,2,'1',NULL),('8','003','公司性质','合资',NULL,1,'1',NULL),('9','003','公司性质','国企',NULL,2,'1',NULL);

客户表和字典表的关系分析

在这里插入图片描述
在这里插入图片描述

创建字典的实体和映射

  • 创建实体
    在这里插入图片描述
  • 创建映射
    在这里插入图片描述

修改字典和客户的关系映射

  • 修改了客户的实体
    在这里插入图片描述
  • 修改客户的映射
    在这里插入图片描述

将映射文件交给Spring

在这里插入图片描述

在添加页面上异步加载字典数据

创建字典的Action、Service、DAO

  • 编写DAO
    在这里插入图片描述
  • 编写Service
    在这里插入图片描述
  • 编写Action
    在这里插入图片描述

将字典类交给Spring

在这里插入图片描述

引入jquery的js(在添加页面上)

在这里插入图片描述

编写异步加载的方法

<script type="text/javascript">
	$(function(){
		// 页面加载函数就会执行:
		// 页面加载,异步查询字典数据:
		// 加载客户来源
		$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"002"},function(data){
			// 遍历json的数据:
			$(data).each(function(i,n){
				$("#cust_source").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
			});
		},"json");
	});
</script>

编写Action

  • 引jar包
    在这里插入图片描述
package com.lele.crm.web.action;

import java.io.IOException;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.lele.crm.domain.BaseDict;
import com.lele.crm.service.BaseDictService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;
/**
 * 字典的Action的类
 * @author lele
 *
 */
public class BaseDictAction extends ActionSupport implements ModelDriven<BaseDict> {
	//模型驱动使用的对象
	private BaseDict baseDict = new BaseDict();
	@Override
	public BaseDict getModel() {
		return baseDict;
	}
	
	//注入Service
	private BaseDictService baseDictService;
	public void setBaseDictService(BaseDictService baseDictService) {
		this.baseDictService = baseDictService;
	}
	
	/**
	 * 根据类型名称查询字典的方法:findByTypeCode
	 * @throws IOException 
	 */
	public String findByTypeCode() throws IOException{
		System.out.println("BaseDictAction中的findByTypeCode方法执行了...");
		//调用业务层查询:
		List<BaseDict> list = baseDictService.findByTypeCode(baseDict.getDict_type_code());
		//将list转成JSON。----jsonlib fastjson
		
		/**
		 * JSONConfig:转JSON的配置对象
		 * JSONArray :将数组和list集合转成JSON
		 * JSONObject:将数组和Map集合转成JSON
		 */
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setExcludes(new String[]{"dict_sort","dict_enable","dict_memo"});
		JSONArray jsonArray = JSONArray.fromObject(list,jsonConfig);
		System.out.println(jsonArray.toString());
		//将JSON打印到页面
		ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
		ServletActionContext.getResponse().getWriter().println(jsonArray.toString());
		return NONE;
	}
}

编写Service

public class BaseDictServiceImpl implements BaseDictService {
	//注入DAO
	private BaseDictDao baseDictDao;

	public void setBaseDictDao(BaseDictDao baseDictDao) {
		this.baseDictDao = baseDictDao;
	}

	@Override
	public List<BaseDict> findByTypeCode(String dict_type_code) {
		return baseDictDao.findByTypeCode(dict_type_code);
	}
}

编写DAO

public class BaseDictDaoImpl extends HibernateDaoSupport implements BaseDictDao {

	@Override
	//根据类型编码查询字典数据
	public List<BaseDict> findByTypeCode(String dict_type_code) {
		return (List<BaseDict>) this.getHibernateTemplate().find("from BaseDict where dict_type_code = ?", dict_type_code);
	}
}

加载其他字典项数据

<script type="text/javascript">
	$(function(){
		// 页面加载函数就会执行:
		// 页面加载,异步查询字典数据:
		// 加载客户来源
		$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"002"},function(data){
			// 遍历json的数据:
			$(data).each(function(i,n){
				$("#cust_source").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
			});
		},"json");
		$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"006"},function(data){
			// 遍历json的数据:
			$(data).each(function(i,n){
				$("#cust_level").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
			});
		},"json");
		$.post("${pageContext.request.contextPath }/baseDict_findByTypeCode.action",{"dict_type_code":"001"},function(data){
			// 遍历json的数据:
			$(data).each(function(i,n){
				$("#cust_industry").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
			});
		},"json");
	});
</script>

保存数据到数据库中

修改添加页面

在这里插入图片描述

  • 修改表单项名称
    在这里插入图片描述

编写Action

在这里插入图片描述

编写Service

在这里插入图片描述

编写DAO

在这里插入图片描述

添加事务

在这里插入图片描述

CRM综合练习:客户管理分页查询客户

查询客户(分页)

修改menu.jsp

在这里插入图片描述

编写Action中findAll的方法

public String findAll(){
		//接收参数:分页参数
		//最好使用DetachedCriteria对象(条件查询--带分页)
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		//调用业务层查询
		PageBean<Customer> pageBean = customerService.findByPage(detachedCriteria,currPage,pageSize);
		ActionContext.getContext().getValueStack().push(pageBean);
		return "findAll";
	}

编写Service

//业务层分页查询客户的方法
	public PageBean<Customer> findByPage(DetachedCriteria detachedCriteria, Integer currPage,Integer pageSize) {
		PageBean<Customer> pageBean = new PageBean<Customer>();
		//封装当前页面
		pageBean.setCurrPage(currPage);
		//封装每页显示的记录数:
		pageBean.setPageSize(pageSize);
		//封装总记录数
		//调用DAO
		Integer totalCount = customerDao.findCount(detachedCriteria);
		pageBean.setTotalCount(totalCount);
		//封装总页数
		Double tc = totalCount.doubleValue();
		Double num = Math.ceil(tc/pageSize);
		pageBean.setTotalPage(num.intValue());
		//封装每页显示的数据的集合
		Integer begin = (currPage - 1) * pageSize;
		List<Customer> list = customerDao.findByPage(detachedCriteria,begin,pageSize);
		pageBean.setList(list);
		return pageBean;
	}

编写DAO

//DAO中带条件统计个数
	public Integer findCount(DetachedCriteria detachedCriteria) {
		//select count(*) from xxx where 条件;
		detachedCriteria.setProjection(Projections.rowCount());
		List<Long> list = (List<Long>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
		if(list.size()>0){
			return list.get(0).intValue();
		}
		return null;
	}

	@Override
	//DAO中分页查询客户的方法
	public List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		return (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
	}

配置页面跳转

在这里插入图片描述

在list.jsp中显示数据(分页显示)

<DIV
	style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
	共[<B><s:property value="totalCount"/></B>]条记录,[<B><s:property value="totalPage"/></B>]页
	,每页显示
	<select name="pageSize" onchange="to_page()">
		<option value="3" <s:if test="pageSize == 3">selected</s:if>>3</option>
		<option value="5" <s:if test="pageSize == 5">selected</s:if>>5</option>
		<option value="10" <s:if test="pageSize == 10">selected</s:if>>10</option>
	</select><s:if test="currPage != 1">
	[<A href="javascript:to_page(1)">首页</A>]
	[<A href="javascript:to_page(<s:property value="currPage-1"/>)">前一页</A>]
	</s:if>&nbsp;&nbsp;
	<B>
	
	<s:iterator var="i" begin="1" end="totalPage">
		<s:if test="#i == currPage">
			<s:property value="#i"/>
		</s:if>
		<s:else>
			<a href="javascript:to_page(<s:property value="#i"/>)"><s:property value="#i"/></a>
		</s:else>
	</s:iterator>
	
	</B>
	<s:if test="currPage != totalPage">
	[<A href="javascript:to_page(<s:property value="currPage+1"/>)">后一页</A>] 
	[<A href="javascript:to_page(<s:property value="totalPage"/>)">尾页</A>] 
	</s:if><input type="text" size="3" id="page" name="currPage" /><input type="button" value="Go" onclick="to_page()"/>
</DIV>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值