【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>
今客CRM客户管理系统主要是为了帮助企业解决在日常工作中遇到的客户管理等难题而开发,通过今客CRM客户管理系统可以对企业事务中的不同功能进行操作,用户通过自定义字段类型可以达到适合不同企业的需求。在今客客户关系管理系统中管理着一个企业最为完整的客户信息,全面的客户信息覆盖在企业的市场营销、销售和服务与技术支持等企业整个前端办公领域的各个环节里。它为企业带来附加价值是不可限量的。今客CRM客户管理系统是一款针对中小企业销售管理应用而开发的软件,帮助企业建立一个规范准确即时的客户数据库,改善企业与客户之间的关系,使客户时时感觉到企业的存在,企业随时了解到客户的变化。同时实现轻松、规范、细致的销售管理工作。提高管理效率、掌握及时准确全面的销售动态。完美融合客户管理、订单管理、合同管理、售后管理、进销存以及日常办公等核心功能于一体的客户管理工具。让客户关系管理过程变得高效、社会化、自动化,实现精细化管理。 软件优势: ①实现远程、移动办公、随时随地处理工作事务 无论何时何地,只要您登陆今客客户关系管理系统即可了解公司的运用状况、公司财务、客户需求、员工销售业绩,及时处理工作事务,确保各项工作顺利高效进行。完美解决企业的管理与业务不受地域限制,可无限范围覆盖; ②资源按需分配,合理高效 部门间信息协同合作,有效避免重复、无效工作,大大提高信息利用率。资源按需分配,高效合理,保障了企业各个项目的有效开展。客户资料系统化管理,查找方便,保障了客户资源的合理、有序分配。 ③挖掘潜在客户,把握商机 通过一键短信/邮件关怀,努力抓住每一个潜在客户和销售员手中的意向客户;让您随时随地了解重点客户或快成交客户所有信息; 对于任何企业,客户关怀都尤其重要,通过客户关怀提高客户满意度,便能提升销售额、提高次销售及转介绍客户数量。 ④优化销售过程、提升客户满意度 详细记录客户跟进情况(包括报价记录、跟单记录、订单记录等),查询结果一目了然,提升服务效率,增加客户满意度,即使员工离职也能快速完成业务交接,避免客户资源的流失; ⑤实施成本低,操作无需培训 无需安装,在线开通,按年付费,账号自由设置,用户数量不限制,大大降低企业成本; ⑥数据资料彻底安全 采用阿里云高端配置服务器,提供每天数据备份服务,系统提供多种安全机制保证数据的机密性及完整性,保障企业部门业务的正常运转,包括角色分配、用户操作监控、日志 报告、的安全性管理。系统能够做到一部分资料在一部分特定的人员间共享,以提高资料共享的利用率和安全性。销售员离职后客户资料和他与客户交往的所有记录完整保留在企业! 今客客户关系管理系统能为您的企业带来什么? ①多部门多权限统一规划管理 今客客户关系管理系统对企业的管理强调的是以人为本的团队分工合作,从市场营销到合同到售后服务的每一个环节,软件充分发挥每一个人每一个岗位的能力,集中团队的力量去完成每一项与客户有关的事项。使客户在购买商品等活动中能充分感觉到企业的精神所在、企业的能力所在,从而使企业在客户心里的形象在与客户的不断接触中得到有效的提高。 ②客户资源有效及时管理 今客客户关系管理系统通过对客户的实时的跟踪,企业可以实现异地销售和汇总销售。实现了企业前端办公领域的信息资源的共享,避免了企业不同部门的重复劳动、资源不共享带来的资源浪费。也解决了某些职员离职导致落单、丢单的现象。 ③对企业的高层决策人员 对企业的高层决策人员(如:总裁、总经理、部门主管等)而言,今客客户关系管理系统能够对售前、售中、售后的具体跟进情况了如指掌。充分发挥每一个人的能力,集中团队的力量去完成每一项与客户有关的活动。使客户感觉到企业的力量所在、企业的精神所在,企业在客户心中的形象在每一次与客户接触中不端的提高。 ④对业务人员 对业务人员(如:销售员、客户服务代表、现场服务工程师)来说,通过计划性地销售工作安排和整体协同配合机制,不管处在哪个环节的工作人员,都能及时快速的跟踪到客户和与客户有关的活动情况。而且不同环节的工作人员的职责界限分明,是用户时时感觉到企业的存在,但每次与企业的接触都是不一样的内容,从而消除了重复工作引起的客户厌倦感。这样以来提高了企业对客户的吸引力, 合理的使用企业里与客户有关的资源。 今客CRM客户关系管理系统 更新记录: v4.8.12.06 -修复名片夹查看的权限问题 -修复工作报告、内部公告显示问题 -修复工作报告编辑器内容过多时报错 -修复内部公告编辑器内容过多时报错 -修复新增客户部分字段错位换行问题 -修复跟单、订单、合同、售后跨权限查看问题 -修复自定义设置不能打开的问题 -修复普通员工可以修改权限和部门的问题 -修复数据导入页面错位问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值