联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码

联系人管理-客户拜访记录| CRM客户关系管理系统项目 实战七(Struts2+Spring+Hibernate)解析+源代码
客户拜访记录的列表的显示,
客户拜访记录的保存,
客户拜访记录查询(条件搜索),
修改保存操作

一、客户拜访记录的管理

1、客户拜访记录需求的概述

一个系统的用户(公司的业务员),业务员需要对客户进行拜访,对拜访的过程进行记录。业务员(用户)和客户(客户)之间的关系(需要具体业务进行具体分析:一对多-公司产品比较单一,只允许一个业务员来对应多个客户。多对多-一些大公司有不同的产品,不同产品下有不同的业务员都可以接触到同一个客户,一个客户也可以对应多业务员)。大部分情况习惯与创建为多对多的。

2、多对多建表原则
  • 创建中间表,中间表当中至少两个字段,分别作为外键指向多对多双方的各自的主键。
    在这里插入图片描述

二、客户拜访记录的准备工作

1、创建表
CREATE TABLE `sale_visit` (
  `visit_id` varchar(32) NOT NULL,
  `visit_cust_id` bigint(32) DEFAULT NULL COMMENT '客户id',
  `visit_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
  `visit_time` datetime DEFAULT NULL COMMENT '拜访时间',
  `visit_addr` varchar(128) DEFAULT NULL COMMENT '拜访地点',
  `visit_detail` varchar(256) DEFAULT NULL COMMENT '拜访详情',
  `visit_nexttime` datetime DEFAULT NULL COMMENT '下次拜访时间',
  PRIMARY KEY (`visit_id`),
  KEY `FK_sale_visit_cust_id` (`visit_cust_id`),
  KEY `FK_sale_visit_user_id` (`visit_user_id`),
  CONSTRAINT `FK_sale_visit_cust_id` FOREIGN KEY (`visit_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_sale_visit_user_id` FOREIGN KEY (`visit_user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

2、创建实体和映射
  • 创建实体
    在SaleVisit当中配置属性并设置客户对象以及对应的用户
    在这里插入图片描述
  • 创建映射SaleVisit.hbm.xml文件当中设置多对一的映射关系
<?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="com.itzheng.crm.domain.SaleVisit" table="sale_vist">	
		<id name="visit_id" column="visit_id">
			<generator class="uuid">			
			</generator>
		</id>
		<property name="visit_time" column="visit_time"/>
		<property name="visit_addr" column="visit_addr"/>
		<property name="visit_detail" column="visit_detail"/>
		<property name="visit_nexttime" column="visit_nexttime"/>		
		<!-- 配置与客户的关联关系 -->
		<many-to-one name="customer" class="com.itzheng.crm.domain.Customer" column="visit_cust_id"></many-to-one>		
		<!-- 配置与用户的关联关系 -->
		<many-to-one name="user" class="com.itzheng.crm.domain.User" column="visit_user_id"/>
	</class>
</hibernate-mapping>
  • 将实体交给Spring管理,在appliactionContext.xml当中配置对应
    在这里插入图片描述
3、创建相关的类

SaleVisitDao
在这里插入图片描述
SaleVisitDaoImpl
在这里插入图片描述
创建SaleVisitAction,并注入SaleVisit

package com.itzheng.crm.web.action;
import com.itzheng.crm.domain.SaleVisit;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/*
 - 客户拜访记录的Action的类
 */
public class SaleVisitAction extends ActionSupport implements ModelDriven<SaleVisit> {
	private SaleVisit saleVisit = new SaleVisit();
	@Override
	public SaleVisit getModel() {
		// TODO Auto-generated method stub
		return saleVisit;
	}
}
4、将相关的类进行配置
  • Bean管理交给Spring的XML
  • 属性注入使用注解方式
(1)在applicationContext.xml当中开启属性注入

在这里插入图片描述

  • 将saleVisitAction和saleVisitService和saleVisitDao交给Spring管理
    在这里插入图片描述
(2)在要注入类当中设置标签@Resource(name="")

在action当中注入service
在这里插入图片描述
在service层注入DAO
在这里插入图片描述

三、客户拜访记录的列表的显示

1、修改menu.jsp的提交订单路径

在这里插入图片描述

2、编写Action的findAll的方法

在SaleVisitAction
在这里插入图片描述

3、编写service

SaleVisitServiceImpl

package com.itzheng.crm.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.criterion.DetachedCriteria;
import com.itzheng.crm.dao.SaleVisitDao;
import com.itzheng.crm.domain.PageBean;
import com.itzheng.crm.domain.SaleVisit;
import com.itzheng.crm.service.SaleVisitService;
/*
 - 客户拜访记录的业务层的接口
 */
public class SaleVisitServiceImpl implements SaleVisitService {
	// 注入客户拜访记录的DAO:
	@Resource(name = "saleVisitDao")
	private SaleVisitDao saleVisitDao;
	@Override
	// 业务层分页显示拜访记录的方法:
	public PageBean<SaleVisit> findByPage(DetachedCriteria detachedCriteria, Integer currPage, Integer pageSize) {
		PageBean<SaleVisit> pageBean = new PageBean<SaleVisit>();
		// 设置当前页数
		pageBean.setCurrPage(currPage);
		// 设置每一页显示的记录数
		pageBean.setPageSize(pageSize);
		// 设置总的记录数
		Integer totalCount = saleVisitDao.findCount(detachedCriteria);
		pageBean.setTotalCount(totalCount);
		// 设置总页数:
		double tc = totalCount;
		Double num = Math.ceil(tc / pageSize);
		// 设置总页数:
		pageBean.setTotalPage(num.intValue());
		// 设置每一页所显示的数据的集合
		Integer begin = (currPage - 1) * pageSize;
		List<SaleVisit> list = saleVisitDao.findByPage(detachedCriteria, begin, pageSize);		
		pageBean.setList(list);
		return pageBean;
	}
}
4、在页面上进行显示
(1)配置struts.xml

在这里插入图片描述

(2)在创建salevisit并创建list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<TITLE>客户拜访记录列表</TITLE> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
	rel=stylesheet>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<SCRIPT language=javascript>
	function to_page(page){
		if(page){
			$("#page").val(page);
		}
		document.customerForm.submit();
		
	}
</SCRIPT>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
</HEAD>
<BODY>
	<FORM id="customerForm" name="customerForm"
		action="${pageContext.request.contextPath }/saleVisit_findAll.action"
		method=post>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
						border=0></TD>
					<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
						height=20></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15 background="${pageContext.request.contextPath }/images/new_022.jpg"><IMG
						src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
					<TD vAlign=top width="100%" bgColor=#ffffff>
						<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
							<TR>
								<TD class=manageHead>当前位置:客户拜访记录管理 &gt; 客户拜访记录列表</TD>
							</TR>
							<TR>
								<TD height=2></TD>
							</TR>
						</TABLE>
						<TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0
							width="100%" align=center border=0>
							<TBODY>
								<TR>
									<TD height=25>
										<TABLE cellSpacing=0 cellPadding=2 border=0>
											<TBODY>
												<TR>
													<TD>联系人名称:</TD>
													<TD>
														<s:textfield theme="simple" name="lkm_name" cssClass="textbox" cssStyle="WIDTH: 80px" maxLength="50"/>
													<TD>													
													<TD>联系人性别:</TD>
													<TD>
														<s:select theme="simple" name="lkm_gender" list="#{'1':'男','2':'女'}" headerKey="" headerValue="-请选择-"/>
													<TD>																																						
													<INPUT class=button id=sButton2 type=submit value="筛选 " name=sButton2></TD>
												</TR>
											</TBODY>
										</TABLE>
									</TD>
								</TR>							    
								<TR>
									<TD>
										<TABLE id=grid
											style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc"
											cellSpacing=1 cellPadding=2 rules=all border=0>
											<TBODY>
												<TR
													style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none">
													<TD>业务员名称</TD>
													<TD>客户名称</TD>
													<TD>拜访时间</TD>
													<TD>拜访地点</TD>
													<TD>拜访详情</TD>
													<TD>下次拜访时间</TD>
													<TD>操作</TD>
												</TR>
												<s:iterator value="list">
												<TR
													style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
													<TD><s:property value="user.user_name"/> </TD>
													<TD>
														<s:property value="customer.cust_name"/>
													</TD>
													<TD>
													<s:date name="visit_time" format="yyyy-MM-dd"/>
													</TD>
													<TD><s:property value="visit_addr"/> </TD>
													<TD><s:property value="visit_detail"/> </TD>
													<TD>
													<s:date name="visit_nexttime" format="yyyy-MM-dd"/>
													</TD>													
													<TD>
													<a href="#">修改</a>
													&nbsp;&nbsp;
													<a href="#">删除</a>
													</TD>
												</TR>
												</s:iterator>
											</TBODY>
										</TABLE>
									</TD>
								</TR>
								
								<TR>
									<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(<s:property value="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>
								</TR>
							</TBODY>
						</TABLE>
					</TD>
					<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"><IMG
						src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
						border=0></TD>
					<TD align=middle width="100%"
						background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
	</FORM>
</BODY>
</HTML>
(3)测试

在这里插入图片描述

四、客户拜访记录的保存

1、跳转到添加保存页面(修改menu.jsp的链接地址)

在这里插入图片描述

2、编写Action中的saveUI方法

在这里插入图片描述

3、跳转到添加页面
  • 在struts2当中配置跳转
    在这里插入图片描述
4、在salevisit下的add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>添加客户拜访记录</TITLE> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
	rel=stylesheet>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
</HEAD>
<BODY>
	<s:form id="form1" name="form1" namespace="/" action="saleVisit_save" method="post" theme="simple">

		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
						border=0></TD>
					<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
						 height=20></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg>
					<IMG src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
					<TD vAlign=top width="100%" bgColor=#ffffff>
						<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
							<TR>
								<TD class=manageHead>当前位置:客户拜访记录管理 &gt; 添加客户拜访记录</TD>
							</TR>
							<TR>
								<TD height=2></TD>
							</TR>
						</TABLE>
						<TABLE cellSpacing=0 cellPadding=5  border=0>
							<tr>
								<td>拜访客户:</td>
								<td>
									<select name="customer.cust_id" id="customer">
										<option value="">-请选择-</option>
									</select>
								</td>
								<td>业务员名称:</td>
								<td>
									<select name="user.user_id" id="user">
										<option value="">-请选择-</option>
									</select>
								</td>
							</tr>
							<TR>
								<td>拜访时间:</td>
								<td>
									<s:textfield cssClass="textbox" id="sChannel2" cssStyle="WIDTH: 180px" name="visit_time"/>
								</td>
								<td>拜访地点:</td>
								<td>
								<s:textfield cssClass="textbox" id="sChannel2" cssStyle="WIDTH: 180px" maxlength="50" name="visit_addr"></s:textfield>
								</td>
							</TR>
							<TR>
								<td>拜访详情 :</td>
								<td>
								<s:textfield cssClass="textbox" id="sChannel2" cssStyle="WIDTH: 180px" maxlength="50" name="visit_detail"></s:textfield>
								</td>
								<td>下次拜访时间:</td>
								<td>
								<s:textfield cssClass="textbox" id="sChannel2" cssStyle="WIDTH: 180px" maxlength="50" name="visit_nexttime"></s:textfield>
								</td>
							</TR>
							<tr>
								<td rowspan=2>
								<INPUT class=button id=sButton2 type=submit value="保存 " name=sButton2>
								</td>
							</tr>
						</TABLE>							
					</TD>
					<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg">
					<IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
				</TR>
			</TBODY>
		</TABLE>
		<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
			<TBODY>
				<TR>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
						border=0></TD>
					<TD align=middle width="100%"
						background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
					<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
						border=0></TD>
				</TR>
			</TBODY>
		</TABLE>	
	</s:form>
</BODY>
</HTML>
5、在salevisit下的add.jsp

在这里插入图片描述

6、异步加载数据

在这里插入图片描述

7、修改页面数据-异步加载客户信息

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

8、编写异步加载的Action
(1)CustomerAction

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

(2)CustomerAction

在这里插入图片描述

(3)UserAction

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

9、测试

在这里插入图片描述

10、客户拜访记录的保存操作
(1)导入日期控件

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

(2)在salevisit下的add.jsp引入日期控件

在这里插入图片描述
设置对应标签的ID并设置只读属性
在这里插入图片描述

(3)日期控件显示的效果

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

11、编写保存客户信息的Action即Action的save方法
(1)编写SaleVisitAction

在这里插入图片描述

(2)编写SaleVisitServiceImpl的save方法

设置事务
在这里插入图片描述
在这里插入图片描述

(3)在struts.xml当中配置跳转

在这里插入图片描述

五、客户拜访记录查询(条件搜索)

1、salevisit当中的list.jsp页面上
(1)引入JQuery的日期控件

在这里插入图片描述

(2)修改搜索表单的属性

在这里插入图片描述

2、SaleVisitAction当中的findAll方法当中组织添加条件

在这里插入图片描述

3、设置visit_end_time的get方法(因为visit_end_time不再栈当中)

设置get方法后就可以在页面当中回显
在这里插入图片描述

4、测试

在这里插入图片描述

六、修改保存操作

1、在salevisit下的list.jsp页面上修改

在这里插入图片描述

2、在创建salevisit下创建edit.jsp页面

直接复制add.jsp,修改回显数据的下拉列表
在这里插入图片描述

3、在SaleVisitAction当中设置查询所有的Customer和user对应的list
(1)通过属性注入的方式注入service

在这里插入图片描述

(2)在SaleVisitAction下创建edit方法

在这里插入图片描述

(3)在struts.xml当中配置

在这里插入图片描述

4、测试

在这里插入图片描述

5、保存操作
(1)修改页面salevisit的edit.jsp

设置提交的action和隐藏id属性
在这里插入图片描述

(2)遍历对应值栈当中的list集合以及对应的回显的属性

在这里插入图片描述

(3)在SaleVisitAction当中设置update方法

在这里插入图片描述

(4)在SaleVisitServiceImpl

在这里插入图片描述

(5)测试

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Git是一个版本控制系统,它可以追踪和管理软件项目中的所有代码和文件的变动。在移动PC项目开发过程中,Git能够提供很多有用的功能和帮助。 首先,Git可以对项目中的代码进行版本控制。通过使用Git,开发人员可以轻松地创建新的分支和合并代码,这对于团队协作开发非常重要。开发人员可以在自己的分支中独立开发和测试功能,然后合并到主分支中,确保项目的代码始终保持稳定和可用。 其次,Git还可以通过追踪和记录每个文件的修改历史,帮助开发人员快速定位和修复问题。如果CRM客户管理系统出现了bug或者错误,开发人员可以查看Git中的历史记录,找到引入该问题的代码变动,进行定位和修复。 此外,Git还提供了一些功能来管理和协调团队中多个开发人员的工作。例如,通过在Git上进行代码评审,团队成员可以对彼此的代码进行检查和审查,以确保代码质量和风格一致。团队成员还可以使用Git的提交注释和分支注释来进行沟通和讨论,以提高团队合作效率。 最后,移动PC项目通常需要在不同的环境中进行部署和测试,例如开发环境、测试环境和生产环境。Git可以轻松地在这些环境之间进行代码的切换和部署,确保每个环境中的代码都是最新的和正确的。 综上所述,使用Git来管理移动PC项目CRM客户管理系统可以提供更好的版本控制、团队协作和问题追踪功能,提高开发效率和项目质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值