资源描述
客户管理系统
学 院
专 业
班 级
学 号
姓 名
指导教师
教师职称
年
月
日
摘要
【摘要】
本文介绍了如何使用JSP开发一个客户关系管理系统,目的在于让大家共同学习和运用这一语言的体会和收获。本系统是Intranet环境下面的电子商务的客户关系管理,通过企业管理技术、电子商务和信息技术的高度集成,帮助企业在全球经济一体化的激烈市场竞争环境中,建立以市场、客户为中心的管理体系,有效管理企业与客户之间的关系,提高客户忠诚度,实现客户价值的最大化。从而提高企业的核心竞争力。企业要想生存发展,就必须与与之息息相关的客户建立起良好的关系,不断发展新客户,以企业高质量的产品、优质的服务、良好的资信吸引新客户;经常维系与老客户的关系,以规范的客户管理方式、温馨的客户关怀、高效的客户服务来提升老客户的忠诚度。由此,客户管理系统应运而生。
【关键词】 Struts框架、Struts框架的工作原理、样式层、持久层、服务层、控制层。
目录
摘要 1
0 引言 1
1 系统分析 2
1.1 需求分析 2
1.2 可行性分析 2
2 总体设计 2
2.1 项目规划 2
2.2 系统功能结构图 3
3 系统设计 3
3.1 设计目标 3
3.2 开发及运行环境 4
3.3 数据库设计 4
4 网站总体架构 5
1 系统架构设计 5
3.6.2 文件架构 6
3.6.3 网站首页的运行结果 9
3.6.4 类的分布 12
5 基础信息维护模块设计 13
5.1 工具层的实现 13
5.2 样式层的实现 17
5.3 持久层的实现 18
5.4 服务层的实现 20
10 小结 27
附录一 参考文献 28
附录二 数据表 31
附录三 文件架构图 33
0 引言
客户资源决定企业的核心竞争力。任何一家企业,有钱就可以买到最好的设备、尖端的技术,但却买不到强大的客户资源。面对着竞争对手不断截留我们的客户,各企业商家所关心的不再局限于自身的产品质量、生产设备、员工的素质,更多的是关心自己的销售群体(客户群),关心他们的想法、需求、购买目的,并与客户建立好良好的、长期的客户关系,强化与客户的沟通,帮助企业留住老客户的同时,更好地拓展新客户,提升客户价值,从而全面提升企业竞争能力和盈利能力,为企业的发展壮大保驾护航。
1 系统分析
1.1 需求分析
通过调查研究,要求系统满足以下功能:
q q 由于操作人员的计算机知识水平有限,要求有良好的人机界面,可以很简单方便的管理各种客户信息。
q q 方便的数据查询功能。
q q 管理客户的详细信息:包括客户的基本信息、联系人信息、业务来往信息等。
q q 为更多地了解客户的需求,应设置客户服务模块,用以记录客户的反馈信息及投诉信息,并对反馈信息及投诉信息进行图表分析。
q q 与客户联系人之间通过邮件(E-mail)进行联系,对联系人邮箱地址进行管理。
q q 提供各种信息列表的打印功能,并可实现客户信封打印。
q q 在相应的权限下,可以删除或修改数据。
1.2 可行性分析
目前,大多数企业内部的客户管理还处于手工管理阶段,工作起来效率很低,不能及时了解各类客户的实际情况,也无法快速地进行客户信息的查询等操作;不便于动态及时地了解客户的需求及反馈信息,致使企业不能更好地适应当前经济形势发展的需要。手工管理还存在着许多弊端,由于不可避免的人为因素,经常造成数据的遗漏、误报。计算机信息化管理有着储存信息量大、速度快等许多优点,提供给用户的处理信息及时、准确、快捷,同时也能提高企业员工的自身素质。
2 总体设计
2.1 项目规划
客户管理系统是一个典型的数据库开发应用程序,由基础信息维护、客户信息维护、客户服务、信息查询、客户管理、辅助工具、系统管理7部分组成。
q q 基础信息维护
该模块主要是对客户的企业类型、企业性质、客户银行、企业资信、客户级别、客户满意程度、区域信息等一些基础信息进行设置。
q q 客户信息维护
该模块主要是对客户信息、联系人信息、业务来往等一些客户信息进行添加及维护操作的功能。
q q 客户服务
该模块主要是对客户反馈信息及客户投诉信息进行添加、删除等操作,同时对反馈及投拆的数据以图表的形式加以分析。
q q 信息查询
该模块主要实现对客户信息、联系人信息等各种信息的查询,同时可对国内的各大城市的区号及邮编进行查询。
q q 数据管理
该模块主要实现各种数据的打印操作,主要包括:客户信封打印、客户信息打印、联系人信息打印及全国各省份的邮编信息的打印。
q q 系统管理
访模块主要实现对操作员、操作员权限进行设置及修改的操作,主要包括操作员设置、密码修改、权限设置、退出4个部分。
q q 辅助工具
该模块主要为用户提供一些辅助的工具,包括调用Word、调用Excel、发送邮件、计算器及工作业务备忘录。
2.2 系统功能结构图
图1 客户管理系统功能结构图
3 系统设计
3.1 设计目标
本系统是针对中小型企业客户管理现状,通过网络实现对客户的管理,主要实现如下目标:
q q 对客户信息(客户基本信息、联系人信息、业务来往信息)进行全面管理。
q q 及时查看库存信息,并通过网站对入库、出库信息进行管理。
q q 强大的客户信息、联系人信息报表打印功能及客户信封打印功能。
q q 及时了解客户的反馈信息及投诉信息,并以图表形式对数据进行分析。
q q 实现各种信息查询功能。
q q 实现了直接通过网络拨打用户电话及发送E-mail。
q q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
q q 操作员可以随时修改自己的口令。
q q 数据保密性强,为每个用户设置相应的权限级别。
q q 提供辅助工具,方便用户操作及使用。
q q 系统运行稳定、安全可靠。
3.2 开发及运行环境
硬件平台:
q q CPU:P41.8GHz;
q q 内存:256MB以上。
软件平台:
q q 操作系统:Windows 2000;
q q 数据库:SQL Server 2000;
q q 开发工具包:JDK Version1.4.2;
q q JSP服务器:Tomcat;
q q 浏览器:IE5.0,推荐使用IE6.0;
q q 分辨率:最佳效果1024×768。
3.3 数据库设计
本系统数据库采用SQL Server 2000数据库,系统数据库名称为db_Client。数据库db_Client中包含18张表。关于数据库中的数据表请参见附录B
4 网站总体架构
1 系统架构设计
在编写代码之前,可以先把网站中可能用到的文件夹创建出来(例如:创建一个名为image的文件夹,用于保存网站中需要的图片),这样可以方便以后的开发工作,也可以规范网站的整体架构,我在开发客户管理系统时,首先设计了如图3所示的文件夹架构图。在开发时只需要将文件保存在相应的文件夹中就可以了,非常方便。
2 网站首页的运行结果
当管理员在进入客户管理系统后,首先进入客户管理系统的大厅,也就是客户管理系统的首页。客户管理系统首页包含基础信息维护、客户信息维护、客户服务、信息查询、数据管理、辅助工具以及系统管理的超链接。
客户管理系统网站首页的运行结果如图4所示。
2
3
1
图4 网站首页运行结果
网站框架说明如表1所示:
表1 网站首页页面说明
区域
名称
说明
对应文件
1
网站导航
主要展示网站的旗帜广告和站内导航条
top.jsp
2
功能模块
主要用于显示导航模块中的功能
information.jsp
3
内容显示
主要用于显示功能模块中的内容
right.jsp
整个网站利用到jsp中的一个框架,框架由名称分别为top、left和main的3个jsp页面组成的,然后利用html代码在index.jsp(和WEB-INF同级目录中)页面中组合起来。
代码如下:
/*********************************** index.jsp***************************************/
<title>客户管理系统主页面</title>
</head>
<frameset rows="115,*" cols="*" frameborder="NO" border="0" framespacing="0">
<frame src="jsp/top.jsp" name="top" scrolling="NO" noresize >
<frameset rows="*" cols="246,*" framespacing="0" frameborder="yes" border="0" bordercolor="#404040">
<frame src="jsp/information/information.jsp" name="left" scrolling="no">
<frame src="jsp/right.jsp" name="main">
</frameset>
</frameset>
<noframes><body>
</body></noframes>
区域top所对应的jsp页面(top.jsp,在jsp文件夹)的代码如下:
/*********************************** top.jsp***************************************/
<body>
<div align="center" class="style1">
<p class="style2">客户管理系统</p>
<p><a href="information/information.jsp" target="left">基础信息维护</a> <a href="information/khxxInformation.jsp" target="left"> 客户信息维护</a>
<a href="information/seriveClient.jsp" target="left">客户服务</a>
<a href="information/queryInformation.jsp" target="left">信息查询</a> <a href="information/printInformation.jsp" target="left">
数据管理</a>
<a href="information/tool.jsp" target="left">辅助工具</a> </p>
</div>
</body>
区域left所对应的jsp页面(information.jsp,在jsp/information/information.jsp文件夹)的代码如下:
/*********************************** information.jsp*********************************/
<body>
<div align="right">
<table width="199" height="500" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="199" height="97" align="center" valign="middle" background="images/clientbar.jpg" class="style5"></td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../cqylxSelect.do" target="main">企业类型设置</a> </td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../cqyxzSelect.do" target="main">企业性质设置</a></td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../cbankSelect.do" target="main">客户银行设置</a></td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../cqyzxSelect.do" target="main" class="style12">企业资信设置</a></td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../ckhjbSelect.do" target="main">客户级别设置</a></td>
</tr>
<tr>
<td width="199" height="37" valign="middle" background="images/cbar.jpg"> <a href="../../ckhmydSelect.do" target="main">客户满意程度设置</a></td>
</tr>
<tr>
<td width="199" height="37" align="center" valign="middle" background="images/cbar.jpg"><a href="../../cqyxxSelect.do" target="main">区域信息设置</a></td>
</tr>
<tr>
<td align="left" valign="top" bgcolor="#F7F7F7"> </td>
</tr>
</table>
</div>
</body>
区域main所对应的jsp页面(right.jsp,在jsp文件夹)的代码如下:
/*********************************** right.jsp***************************************/
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>右页面</title>
<style type="text/css">
<!--
body {
background-color: #000000;
margin-left: 0px;
margin-top: 0px; }
-->
</style></head>
<body>
<table width="579" height="500" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top" bgcolor="#FFFFFF"><p> </p>
<p> </p>
<p> </p>
<p> </p>
<table width="79%" height="118" border="0" cellpadding="0" cellspacing="0" background="../images/background.gif">
<tr>
<td> </td>
</tr>
</table> </td>
</tr>
</table>
</body>
</html>
3 类的分布
整个网站的实现功能利用到的框架Struts,基本上是以“类”的形式实现的。所以我设计一个类的分布图如下:
图5 类的分布图
各个类所实现的功能如表2所示。
表2 类的功能
名称
功能
持久层(dao文件夹)
各种方法的实现
样式层(domain文件夹)
所存放的类是Actionform类,在类中必须要继承ActionForm(也就是entends ActionForm)
服务层(server文件夹)
存放的dao层功能的业务的类
控制层(webtier文件夹)
存放在jsp页面中存在的方法实现的类
工具层(tool文件夹)
类名为JDBConnection.java(连接数据库的功能)、类名为Chinese.java(字符级转换的类)、文件名为sqlSQLCode、Properties(主要存放sql语句)、SQLCode.java(主要是解析sqlSQLCode. Properties中的sql语句中的?)
5 基础信息维护模块设计
基础信息维护主要功能块分为:区域信息设置、企业性质设置、企业类型设置、企业资信设置、客户级别设置、客户满意程度设置和客户银行设置。
在这里单击任何一个功能模块都是一个查询功能。这些功能块的实现方法基本相同,下面以“企业类型设置”功能模块为例,详细介绍其通过MVC框架所实现的功能。
单击“企业类型设置”超链接,即可进入到企业类型设置页。在该页中可以看到企业类型的各种详细功能,包括对数据的添加、修改、删除功能。下面就分层介绍各种功能的实现。
5.1 工具层的实现
在工具层(tool文件夹)中主要存放的是常用的基本类,在这里不管任何一项功能都要调用相对应的类的方法。
1.Chinese.java类(字符级转换的类)
/******************************* Chinese .java*************************************/
package com.tool;
import java.io.UnsupportedEncodingException;
public class Chinese {
//将从form 表单中去出的数据转换为汉字
public static String str(String a) {
try {
return new String(a.getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} return null; }
}
2.sqlCode.properties文件(sql语句的存放位置)
/******************************* sqlCode.properties**********************************/
#--基础信息维护--#
#--对区域信息表的操作(tb_Client_qyxx)--#
#--查询的操作—
sql.qyxx.select=select * from tb_Client_qyxx
#--插入的操作—
sql.qyxx.insert=insert into tb_Client_qyxx values('?','?','?','?','?','?')
3.SQLCode.java类(通过这个类解析properties文件中的sql语句)
/******************************** SQLCode.java***********************************/
package com.tool;
public final class SQLCode {
private static SQLCode sqlCode = null;
private static java.util.Properties sqlCodeProperties = new java.util.Properties();
static {
sqlCode = new SQLCode();
}
private SQLCode() {
_load();
}
public static String getSQLCode(String sqlKey) {
String sql = "";
if (sqlCodeProperties.containsKey(sqlKey)) {
sql = sqlCodeProperties.getProperty(sqlKey);
}
return sql;
}
public static SQLCode getInstance() {
return sqlCode;
}
//指向sqlcode.properties的位置
public void _load() {
String fileName = "/com/tool/sqlCode.properties"; //通过指定路径找到资源文件存放在fileName中
sqlCodeProperties.clear(); // SqlCodeProperties清空
try {
java.io.InputStream in = null; //定义输出流的变量
try {
in = getClass().getResourceAsStream(fileName); //把fileName中存放值放入in字符流中
sqlCodeProperties.load(in);
}
finally {
in.close();
}
}
catch (java.io.IOException e) {
System.out.println(e.getMessage());
} }}
4.JDBConnction.java(这是个JDBC的类,用于加载数据库)
/******************************* JDBConnection.java********************************/
package com.tool;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
//这是一个工具类实现与数据库的连接
public class JDBConnection {
String sd = "sun.jdbc.odbc.JdbcOdbcDriver";
String sc = "jdbc:odbc:db_Client";
ResultSet rs = null;
Connection conect = null;
public JDBConnection() {
try {
Class.forName(sd); //通过构造方法加载对象
}
catch (java.lang.ClassNotFoundException e) {
System.err.println(e.getMessage());
}
}
//只能执行查询的sql语句,并且通过Resulit类型的对象,把所读取的内容返回。
public ResultSet executeQuery(String sql) {
try {
conect = DriverManager.getConnection(sc);
Statement stmt = conect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}
catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return rs;
}
public int executeUpdate(String sql) { //能够执行修改。删除和插入的sql语句。
int result = 0;
try {
conect = DriverManager.getConnection(sc);
Statement stmt = conect.createStatement();
result = stmt.executeUpdate(sql);
}
catch (SQLException er) {
System.err.println(er.getMessage());
}
return result;
}
public void close() { //数据库连接关闭的方法
try {
if (conect != null) {
conect.close();
}
}
catch (Exception e) {
System.out.println(e);
}
}
public void setAutoCommit(boolean flag) { //设置自动提交的方法
try {
conect.setAutoCommit(flag);
}
catch (Exception exception) {
System.out.println("Exception in set autoCommit :" + exception.getMessage());
}
}
public void commit() {
try {
mit();
}
catch (Exception exception) {
System.out.println("Exception in commit :" + exception.getMessage());
}
}
public void rollback() { //执行事物的回滚
try {
conect.rollback();
}
catch (Exception exception) {
System.out.println("Exception in rollback :" + exception.getMessage());
}
}
//将sql语句中的?号转为相应的参数 ,其中参数为字符串型
public String editSqlCode(String sql, String str) {
try {
// 截取从0到第一个问号的字符串加参数str,然后在加上第一问号以后的字符串
sql = sql.substring(0, sql.indexOf("?")) + str +
sql.substring(sql.indexOf("?") + 1);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
return sql;
}
public String editSqlCode(String sql, Integer str) {//提取SQL语句,并把(int str)传出来的值来代替?
try {
sql = sql.substring(0, sql.indexOf("?")) + str +
sql.substring(sql.indexOf("?") + 1);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
return sql;
}
public String editSqlCode(String sql, int str) { //提取SQL语句,并把(int str)传出来的值来代替?
try {
sql = sql.substring(0, sql.indexOf("?")) + str +
sql.substring(sql.indexOf("?") + 1);
}
catch (Exception e) {
System.out.println(e.getMessage());
} return sql; }}
5.2 样式层的实现
在样式层(在domain文件夹)中的类是一个继承了ActionForm(也就是extends ActionForm)的类。对于每个请求参数通过其名称来对应到bean的一个属性上,并调用相对应的setter方法来设置属性值。这个方法类似于标准jsp中<jsp:setProerty>标记。同样调用相应的getter方法来取得属性值,更新后的ActionForm Bean被传递给Action类的perform方法,以便使这些值能被系统状态和业务逻辑bean来使用。
企业类型设置模块对应的ActionForm类CqylxForm.java的代码如下:
/*********************************** CqylxForm.java******************************/
package com.domain;
//对企业生产类型表的操作(tb_client_qylx)
public class CqylxForm extends ActionForm {//使用Struts需要继承ActionForm
private String qylx_bz = ""; //备注信息
private String qylx_id = ""; //企业生产类型编号
private String qylx_lxmc = ""; //企业生产类型名称
public CqylxForm() {}
public String getQylx_bz() {
return qylx_bz;
}
public void setQylx_bz(String qylx_bz) {
this.qylx_bz = qylx_bz;
}
public String getQylx_id() {
return qylx_id;
}
public void setQylx_id(String qylx_id) {
this.qylx_id = qylx_id;
}
public String getQylx_lxmc() {
return qylx_lxmc;
}
public void setQylx_lxmc(String qylx_lxmc) {
this.qylx_lxmc = qylx_lxmc;
}}
5.3 持久层的实现
在持久层(dao层文件夹)中,主要
展开阅读全文