CRM客户管理系统综合练习总结(二)

一、客户管理保存客户

1、客户管理:准备工作

第一步:创建表

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

public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {

	// 模型驱动使用的对象
	private Customer customer = new Customer();

	@Override
	public Customer getModel() {
		return customer;
	}

	// 注入Service
	private CustomerService customerService;

	public void setCustomerService(CustomerService customerService) {
		this.customerService = customerService;
	}
}

第四步:创建Service

/**
 * 客户业务的Service接口
 * 
 * @author Administrator
 *
 */
public interface CustomerService {

}

/**
 * 客户管理的Service的实现类
 * 
 * @author Administrator
 *
 */
public class CustomerServiceImpl implements CustomerService {

	// 注入客户的DAO
	private CustomerDao customerDao;

	public void setCustomerDao(CustomerDao customerDao) {
		this.customerDao = customerDao;
	}
}

第五步:创建DAO

/**
 * 客户管理的DAO的接口
 * 
 * @author Administrator
 *
 */
public interface CustomerDao {

}

/**
 * 客户管理的DAO的实现类
 * 
 * @author Administrator
 *
 */
@Transactional
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

}

第六步:配置Action、Service、DAO

	<!--配置客户DAO -->
	<bean id="customerDao" class="crm.dao.impl.CustomerDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

	<!--配置客户Service -->
	<bean id="customerService" class="crm.service.impl.CustomerServiceImpl">
		<property name="customerDao" ref="customerDao"></property>
	</bean>

	<!--配置客户Action -->
	<bean id="customerAction" class="crm.web.action.CustomerAction"
		scope="prototype">
		<property name="customerService" ref="customerService"></property>
	</bean>

2、跳转到添加页面

第一步:修改左侧菜单页面

在这里插入图片描述

第二步:编写Action中的saveUI的方法

在这里插入图片描述

第三步:配置Action的跳转

在这里插入图片描述

3、引入数据字典

第一步:什么是数据字典

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

第二步:创建数据字典表

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;

第三步:客户表和字典表的关系分析

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

第四步:创建字典的实体和映射

创建实体

在这里插入图片描述

创建映射
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!--建立类与表的映射 -->
	<class name="crm.domain.BaseDict" table="base_dict">
		<!--建立类中属性与表中的主键对应 -->
		<id name="dict_id" column="dict_id">
			<generator class="uuid"></generator>
		</id>

		<!--建立类中的普通属性与表中的字段对应,非主键用property -->
		<property name="dict_type_code" column="dict_type_code"></property>
		<property name="dict_type_name" column="dict_type_name"></property>
		<property name="dict_item_name" column="dict_item_name"></property>
		<property name="dict_item_code" column="dict_item_code"></property>
		<property name="dict_sort" column="dict_sort"></property>
		<property name="dict_enable" column="dict_enable"></property>
		<property name="dict_memo" column="dict_memo"></property>

		<!--字典和客户是一对多的关系,如果查询字典数据的时候,不需要查询客户的数据,所以在字典端可以不配置客户相关内容 -->
	</class>
</hibernate-mapping>

第五步:修改字典和客户的关系映射

修改了客户的实体

在这里插入图片描述

修改客户的映射
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!--建立类与表的映射 -->
	<class name="crm.domain.Customer" table="cst_customer">
		<!--建立类中属性与表中的主键对应 -->
		<id name="cust_id" column="cust_id">
			<generator class="native"></generator>
		</id>

		<!--建立类中的普通属性与表中的字段对应,非主键用property -->
		<property name="cust_name" column="cust_name"></property>
		<!-- <property name="cust_source" column="cust_source"></property> -->
		<!-- <property name="cust_industry" column="cust_industry"></property> -->
		<!-- <property name="cust_level" column="cust_level"></property> -->
		<property name="cust_phone" column="cust_phone"></property>
		<property name="cust_mobile" column="cust_mobile"></property>

		<!--配置客户与字典的多对一的映射 -->
		<many-to-one name="baseDictSource" class="crm.domain.BaseDict"
			column="cust_source"></many-to-one>
		<many-to-one name="baseDictIndustry" class="crm.domain.BaseDict"
			column="cust_industry"></many-to-one>
		<many-to-one name="baseDictLevel" class="crm.domain.BaseDict"
			column="cust_level"></many-to-one>
	</class>
</hibernate-mapping>

第六步:将映射文件交给Spring

在这里插入图片描述

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

第一步:创建字典的Action、Service、DAO

  • 编写DAO
/**
 * 字典DAO的接口
 * 
 * @author Administrator
 *
 */
public interface BaseDictDao {
}

/**
 * 字典DAO的实现类
 * 
 * @author Administrator
 *
 */
public class BaseDictDaoImpl extends HibernateDaoSupport implements BaseDictDao {

}
  • 编写Service
/**
 * 字典的业务层的接口
 * 
 * @author Administrator
 *
 */
public interface BaseDictService {

}

/**
 * 字典的业务层的实现类
 * 
 * @author Administrator
 *
 */
public class BaseDictServiceImpl implements BaseDictService {
	// 注入DAO
	private BaseDictDao baseDictDao;

	public void setBaseDictDao(BaseDictDao baseDictDao) {
		this.baseDictDao = baseDictDao;
	}
}
  • 编写Action
/**
 * 字典的Action的类
 * 
 * @author Administrator
 *
 */
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;
	}
}

第二步:将字典类交给Spring

<!--将字典交给Spring管理 -->
	<!--配置字典DAO -->
	<bean id="baseDictDao" class="crm.dao.impl.BaseDictDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

	<!--配置字典Service -->
	<bean id="baseDictService" class="crm.service.impl.BaseDictServiceImpl">
		<property name="baseDictDao" ref="baseDictDao"></property>
	</bean>

	<!--配置字典Action -->
	<bean id="baseDictAction" class="crm.web.action.BaseDictAction"
		scope="prototype">
		<property name="baseDictService" ref="baseDictService"></property>
	</bean>

第三步:引入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

/**
 * 字典的Action的类
 * 
 * @author Administrator
 *
 */
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
	 * 
	 * @return
	 * @throws IOException
	 */
	public String findByTypeCode() throws IOException {
		 System.out.println("BaseDictAction中的findByTypeCode方法执行了...");
		List<BaseDict> list = baseDictService.findByTypeCode(baseDict.getDict_type_code());
		// list转成JSON ----jsonlib(jar包可能比较多) fastjson(相对于jsonlib来说jar包较少)
		/*
		 * 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

/**
 * 字典的业务层的接口
 * 
 * @author Administrator
 *
 */
public interface BaseDictService {
	List<BaseDict> findByTypeCode(String dict_item_code);
}

/**
 * 字典的业务层的实现类
 * 
 * @author Administrator
 *
 */
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

/**
 * 字典DAO的接口
 * 
 * @author Administrator
 *
 */
public interface BaseDictDao {

	List<BaseDict> findByTypeCode(String dict_type_code);

}


/**
 * 字典DAO的实现类
 * 
 * @author Administrator
 *
 */
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>

5、保存数据到数据库中

第一步:修改添加页面

在这里插入图片描述

第二步:编写Action

在这里插入图片描述

第三步:编写Service

/**
 * 客户业务的Service接口
 * 
 * @author Administrator
 *
 */
public interface CustomerService {
	void save(Customer customer);
}

/**
 * 客户管理的Service的实现类
 * 
 * @author Administrator
 *
 */
public class CustomerServiceImpl implements CustomerService {

	// 注入客户的DAO
	private CustomerDao customerDao;

	public void setCustomerDao(CustomerDao customerDao) {
		this.customerDao = customerDao;
	}

	@Override
	// 业务层保存客户的方法
	public void save(Customer customer) {
		customerDao.save(customer);
	}
}

第四步:编写DAO

/**
 * 客户管理的DAO的接口
 * 
 * @author Administrator
 *
 */
public interface CustomerDao {
	void save(Customer customer);
}

/**
 * 客户管理的DAO的实现类
 * 
 * @author Administrator
 *
 */
@Transactional
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

	@Override
	// DAO中保存客户的方法
	public void save(Customer customer) {
		this.getHibernateTemplate().save(customer);
	}
}

第五步:添加事务

在这里插入图片描述

二、客户管理分页查询客户

1、查询客户(分页)

在这里插入图片描述

2、编写Action中findAll的方法

public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {

	// 模型驱动使用的对象
	private Customer customer = new Customer();

	@Override
	public Customer getModel() {
		return customer;
	}

	// 注入Service
	private CustomerService customerService;

	public void setCustomerService(CustomerService customerService) {
		this.customerService = customerService;
	}

	// 使用set方法的方式接收数据:
	private Integer currPage = 1;

	public void setCurrPage(Integer currPage) {
		if (currPage == null) {
			currPage = 1;
		}
		this.currPage = currPage;
	}

	private Integer pageSize = 3;

	public void setPageSize(Integer pageSize) {
		if (pageSize == null) {
			pageSize = 3;
		}
		this.pageSize = pageSize;
	}

	/**
	 * 客户管理:跳转到添加页面的方法:saveUI
	 */
	public String saveUI() {
		return "saveUI";
	}

	/**
	 * 客户保存的方法
	 */
	public String save() {
		customerService.save(customer);
		return NONE;
	}

	/**
	 * 客户查找的方法
	 */
	public String findAll() {
		// 接收参数:分页参数
		// 最好使用DetachedCriteria对象(条件查询--带分页)
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		// 调用分页查询
		System.out.println(pageSize);
		PageBean<Customer> pageBean = customerService.findByPage(detachedCriteria, currPage, pageSize);
		ActionContext.getContext().getValueStack().push(pageBean);
		return "findAll";
	}
}

3、编写Service

@Override
	// 业务层分页查询客户的方法:
	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;
	}

4、编写DAO

	@Override
	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
	public List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer begin, Integer pageSize) {
		detachedCriteria.setProjection(null);
		return (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria, begin, pageSize);
	}

5、配置页面跳转

在这里插入图片描述

6、在list.jsp中显示数据

在这里插入图片描述

7、延迟加载配置

注:如果已经完成到这里,测试的时候不会只会查询客户,并不会查询字典,客户表中含有外键的属性不会有数据,这是因为hibernate关联查询的时候默认是延迟加载,需要在web.xml中配置Hibernate延迟加载的filter,而且特别值得注意的是Hibernate延迟加载配置必须在struts2核心过滤器前面配置。

在这里插入图片描述

8、分页设置

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

因为在Action中已经将PageBean的对象放入值栈了,所以使用strut2标签就可以进行取值了。

	<TD><SPAN id=pagelink>
	<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>&nbsp;&nbsp;
		 <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>
	</SPAN></TD>

作为一个新手,我觉得这个项目的难点就是Hibernate关联查询部分(异步加载机制),一对多的配置问题以及Ajax和SSH的结合部分,希望这篇文章可以帮到大家。By the way,点关注,不迷路。haha

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值