基于JAVA毕业设计的客户关系系统的设计与实现

以下是资料介绍,如需要完整的请充值下载. 本资料已审核过,确保内容和网页里介绍一致.  
无需注册登录,支付后按照提示操作即可获取该资料.
我要下载该资源
资料介绍:
 
 
 

客户关系管理系统

 
 
 
 
 
学    院  
专    业  
班    级  
学    号  
姓    名  
指导教师  
教师职称  
 
 
 
 
 
 
 
 
 
     
 
 
 
 
 
 

摘要

【摘要】
随着市场体系的日益完善,我们已经进入了一个买方市场时代。选择空间扩大、购买渠道拓宽、消费心态和购买行为越发成熟,使客户再不会对某一企业或者产品盲目地保持绝对忠诚,如何不断改善客户关系,掌据更多的客户信息,提高客户满意度;如何在日益激烈的市场竞争中把握机会,占有更大的市场份额;如何建立高效业务流程,降低运营成本,获取更多的利润,这些已成为每个企业怕面临的首要问题。这种情况下,企业要在激烈的市场竞争中立于不败之地,就必须找一种全新的管理理念和管理手段,对其内部和外部资源进行有效的整合。新一代一ERP产品正在向客户端和供应端延伸,客户端的延伸是客户关系管理,而供应端的延伸则是跨企业供应链的同步管理。对于每个企业来说客户管理的完善程度将直接影响企业的经济效益。
 
【关键词】 客户关系管理系统、库存管理、报表管理


目录

摘要 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
4.1  客户信息管理设计 5
4.2  联系人信息管理设计 11
4.3  合同信息管理 14
5  服务管理 25
5.1  反馈信息添加 26
5.2  反馈信息修改 27
6  报表管理 9
6.1  客户报表模块
6.2  联系人报表模块
附录A  参考文献
附录B  数据表
 

0  引言

信息时代的今天,各企业商家所关心的不再局限于自身的产品质量、生产设备、员工的素质,更多的是关心自己的销售群体(客户群),关心他们的想法、需求、购卖目的。
众所周知,顾客就是我们的上帝,我们只有满足了上帝的需求,上帝才能给我们带来一切。一个企业要生存、要发展,就是要不断的满足客户的需求,无论我们做出什么样的决策,最终都是为了这个的目。每个领域都有自身生存法则,但无论这个法则如何变化,为客户服务的宗旨是不会变的。作为企业,我们只有不断地挖掘新客户,维护好和老客户的关系,占领市场客户群体的绝大多数份额,才能在整个领域取得一席之地。海尔总裁张瑞敏指出:“客户资源决定企业核心竞争力”,上个世纪80年代是物品短缺的时代,而现在,信息时代是客户短缺的时代。企业发展所需的各种资源(包括人力、物力、生产力)都是可以创造的,但每个领域中的客户资源确是有限的,所以通过创新(产品的创新、企业管理的创新、服务的创新)来抢占有限的客户资源、维护好企业和客户之间的关系、了解客户的需求动向,成为企业生存发展面临的重大问题。


1  系统分析

1.1  需求分析

通过调查研究,要求系统满足有以下功能;
q 由于操作人员的计算机知识普遍较差,要求有良好的人机界面。
q 方便的数据选择查询,支持模糊查询功能。
q 管理客户的详细信息:包括客户的基本信息、联系人信息、和客户签写的合同信息。
q 记录产品出库、入库的详细信息。
q 为更多的了解客户的需求,设计了服务模块,用以记录客户的反馈信息,并对反馈信息进行管理。
q 和客户联系人之间通过邮件(e-mail)进行联系,对联系人邮件地址进行管理。
q 提供信息数据导出Excel报表的功能,提供报表的打印功能。
q 对用户信息进行管理,并为用户设置管理权限。
q 数据计算自动完成,尽量减少人工干预。
q 修改当前管理员密码的功能。
q 系统退出。

1.2  可行性分析

q 经济性
通过计算机网络对客户信息进行管理,使企业对自身拥有的客户有了一个更为深该的了解。不仅能全面的统计客户的购买数量,及时的了解客户的动态信息,还可以根据计算机记录的数据信息,不断的调整企业的生产发展动向。
q 技术性
系统中设置了email管理模块,此模块大大的方便了企业和客户联系人之间的沟通。设置导入Excel功能、Web打印功能,方便用户报表打印。

2  总体设计

2.1  项目规划

客户关系管理系统是一个典型的数据库开发应用程序,由客户管理模块、库存管理模块、服务管理模块、报表管理模块、
q 客户管理模块
该模块主要功能是对客户信息、客户联系人信息、合同信息进行添加、删除、查询等操作。
q 库存管理模块
该模块的主要功能是管理入库、出库信息、产品信息进行管理,其中包括对库存信息、产品信息进行添加、删除、查询等操作。
q 服务管理模块
该模块主要功能是对客户反馈信息进行添加、删除、查询等操作。
q 报表管理模块
该模块主要通过查询条件,对各种信息进行查询,并将得到的结果导出Excul表、进行打印报表等操作(其中信息包括:客户信息、联系人信息、反馈客户信息、库存信息)。
q email管理模块
该模块主要管理客户联系人email地址信息,对企业客户之间的email文件进行管理,向客户发送邮件。
q 用户管理
该模块主要管理用户信息的添加、删除等操作,并设置用户的使用权限。

2.2  系统功能结构图

 
图1  数据表树型结构图

3  系统设计

3.1  设计目标

本系统是针对中小型企业通过网络实现对客户的管理而设计的,主要实现如下目标:
q 对客户信息(客户基本信息、联系人信息、合同信息)进行全面管理。
q 及时查看库存信息,并通过网站对入库、出库信息进行管理。
q 强大的客户信息、联系人信息报表导出、打印功能
q 及时了解客户的反馈信息,并对其进行管理。
q 实现各种信息的选择查询、模糊查询功能等。
q 实现了和客户通过网络在线沟通的功能,并对客户联系人的email地址进行管理。
q 管理员可以添加操作员信息、设置操作员的权限。
q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
q 要求系统的数据保密性强,通过为每个用户设置使用权限来实现。
q 系统运行稳定、安全可靠。
q 键盘操作,快速响应。

3.2  开发及运行环境

硬件平台:
q CPU:P41。8GHz;
q 内存:256MB以上。
软件平台:
q 操作系统:Windows xp/ Windows 2000/ Windows 2003;
q 数据库:SQL Server 2000;
q 浏览器:IE5.0,推荐使用IE6.0;
q Web服务器:IIS5.0;
q 分辨率:最佳效果1024*768。

3.3  数据库设计

本系统数据库采用SQLServer2000数据库,系统数据库名称为db_System。数据库db_ System中包含8张表。关于数据库中的数据表请参见附录B。

客户管理模块设计

客户管理模块的主要功能是对客户信息进行管理,主要包括客户信息管理、联系人信息管理和合同信息管理3个部分。

客户信息管理设计

客户信息管理设计主要包括对客户信息进行显示/查询、添加、修改和删除4个部分的功能。用户可以通过功能导航进入客户信息管理页面,页面设计效果如图3所示。
 
图3  客户信息管理页面的设计效果
在客户信息管理页面中,用户可以在查询区域输入查询条件,并选择查询方式,查找相关的客户信息;也可以单击客户信息,在展示区会显示此客户的详细信息,也可对客户信息进行修改;在选中每条信息前面的复选框,单击【删除】按钮,选中的客户信息将被删除。

1.客户信息显示/查询

用户可以在客户信息管理页面中的查询部分,输入一定的查询条件进行客户信息的查询。
当用户在查询部分输入条件后,并单击【查询】按钮,用户添加的查询条件将被提交给本页,本页将根据用户提交的表单信息对数据库进行检索,并将结果集通过操作区输出到浏览器中。
客户信息查询页面涉及的HTML表单元素如表1所示。
表1                      客户信息查询页面涉及的HTML表单元素
名称 类型 含义 重要属性
form1 Form 表单 method="post" action=""
post hidden 判断表单是否提交 value="true"
tiao select 查询类型 <option value="模糊查询" <%if request("tiao")="模糊查询" then%>selected<%end if%>>模糊查询</option>
<option value="精确查询" <%if request("tiao")="精确查询" then%>selected<%end if%>>精确查询</option>
sel select 关键字类别 <option value="ClientName" <%if request("sel")="ClientName" then%>selected<%end if%>>客户名称</option>
……
<option value="ClientHabitude" <%if request("sel")="ClientHabitude" then%>selected<%end if%>>企业性质</option>
search text 关键字 <input name="search" type="text" id="search" value="<%=request("search")%>">
Submit submit 查询按钮 class="input" value=" 查 询 "
 
在表单提交之后,在本页将数据进行处理。程序代码如下:
<%
if request("post")<>"" then
if request("tiao")="模糊查询" then ‘条件输入为模糊查询时获得相应的记录集
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Client where "&request("sel")&" like '%"&request("search")&"%' order by id desc"
rs.open sql,conn,1,1
else                              ‘条件输入为精确查询时获得相应的记录集
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Client where "&request("sel")&"='"&request("search")&"' order by id desc"
rs.open sql,conn,1,1
end if
else                   ‘默认状态下获得相应的记录集
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Client order by id desc"
rs.open sql,conn,1,1
end if
'实现分页
 
if not rs.eof then
tol=rs.recordcount             '总记录数
rs.pagesize=15                   '获取每页显示的记录数
maxpage=rs.pagecount             
requestpage=clng(request("p"))  '获取当前页
if requestpage="" or requestpage=0 then '当接收页码的值为空或者0时使其等于1
requestpage=1
end if
if requestpage>maxpage then '在接收页码的值大于最大页码时,使其等于最大页码
requestpage=maxpage
end if
if requestpage<>1 then  '向上或向下移动相应的记录
rs.move (requestpage-1)*rs.pagesize
end if
for i=1 to rs.pagesize and not rs.eof  '利用循环输出数据
if i mod 2=1 then
bg="#FFFFFF"
else
bg="#efefef"
end if
%>
          <tr align="center" bgcolor=<%=bg%> style="cursor: hand" onClick="window.parent.frames('bo').window.location = 'KeHu_ed.asp?id=<%=rs("id")%>'"onMouseOver="HLItem(this)" onMouseOut="Re(this)">
            <td height="22"><%=rs("ClientName")%></td>
            <td><%=rs("ClientCountry")%></td>
            <td><%=rs("ClientCity")%></td>
            <td><%=rs("ClientTel")%></td>
            <td><%=rs("ClientEmail")%></td>
          </tr>
<%
rs.movenext
if rs.eof then exit for      ’ 如果记录集为空那么跳出循环
next
else
response.Write("没有客户信息,请<a href='KeHu_add.asp' target='bo'>添加</a>")
end if%>
当鼠标在某条记录上悬停时,其记录所在行的背景颜色会发生改变,此功能用到的js代码如下:
<script language="javascript">
function HLItem(obj)//鼠标经过
{
obj.oldClassName=obj.className;
obj.className="List";
}
function Re(obj)//鼠标移开
{
 obj.className=obj.oldClassName
}
</script>
其调用的代码如下:
<tr align="center" bgcolor=<%=bg%> style="cursor:hand" onClick="window.parent.frames('bo').window.location = 'KeHu_ed.asp?id=<%=rs("id")%>'" onMouseOver="HLItem(this)" onMouseOut="Re(this)">
客户信息显示/查询页面的运行结果如图4所示:
 
图4  客户信息查询页面的运行结果

2.客户信息添加

客户信息添加的主要功能是用于用户添加客户信息。在查询页面中单击【添加】按钮,在展示区中会显示添加页面,其设计效果如图5所示。
 
如图5 客户信息添加页面设计效果
当单击添加页面中的【添加】按钮时,调用js编写的自定义函数(checks()),通过函数验证填写的数据是否正确,该函数的代码如下:
<script language="javascript">
function checks()
{
 if(form1.ClientName.value=="")
{
alert("公司名称不能为空");
return false;
}
……//中间过程不详细介绍,因为实现方法类似
 else if(form1.ClientCyc.value=="")
{
alert("需求周期不能为空");
return false;
}
}
</script>
表单提交之后,添加的数据将被提交到本页进行处理,本页数据处理的程序代码如下:
<%
if request("post")<>"" then
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Client"
rs.open sql,conn,1,3
rs.addnew
rs("ClientName")=request("ClientName")      ‘添加公司名称
rs("ClientAddress")=request("ClientAddress")   ‘公司地址
rs("ClientTel")=request("ClientTel")          ‘公司电话
rs("ClientFax")=request("ClientFax")          ‘公司传真
rs("ClientNumber")=request("ClientNumber")   ‘邮政编码
rs("ClientPage")=request("ClientPage")         ‘公司网址
rs("ClientEmail")=request("ClientEmail")       ‘公司email
rs("ClientCountry")=request("ClientCountry")   ‘所属国家/地区
rs("ClientHabitude")=request("ClientHabitude")  ‘公司性质
rs("ClientSize")=request("ClientSize")          ‘公司规模
rs("ClientCity")=request("ClientCity")          ‘所属城市
rs("ClientPay")=request("ClientPay")           ‘结款方式
rs("ClientCredit")=request("ClientCredit")       ‘结款信用
rs("ClientList")=request("ClientList")           ‘最高订单‘
rs("ClientYear")=request("ClientYear")          ‘年度订单
rs("ClientCyc")=request("ClientCyc")           ‘需求周期
rs("SetTime")=now()         ‘创建时间
rs("EditTime")=now()                        ‘修改时间
rs("SetName")=session("admin_name")          ‘创建人
rs.update
rs.close
conn.close
response.Write("<script language=javascript>alert('客户信息添加成功')</script>")‘弹出成功对话框
end if%>

3.客户信息修改

在显示客户详细信息页面,用户可以浏览、修改其客户的详细信息。进行客户详细信息浏览和修改的页面设计效果如图6所示:
 
图6  客户信息修改页面设计效果
在客户信息修改页面,用户可以浏览客户详细的信息,也可以修改客户的信息(当用户有修改的权限时,那么用户可以进行修改,至于用户权限的实现,将在后面的章节中进行讲解)。当用户单击【修改】按钮后,修改的数据将被提交到本页进行处理。数据处理的代码如下:
<%
  if request("post")<>"" and (rsr("Client")="可写" or rsr("chaoji")="是") then
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Client where id="&request("id")
rs.open sql,conn,1,3
rs("ClientName")=request("ClientName")      ‘添加公司名称
rs("ClientAddress")=request("ClientAddress")   ‘公司地址
rs("ClientTel")=request("ClientTel")          ‘公司电话
rs("ClientFax")=request("ClientFax")          ‘公司传真
rs("ClientNumber")=request("ClientNumber")   ‘邮政编码
rs("ClientPage")=request("ClientPage")         ‘公司网址
rs("ClientEmail")=request("ClientEmail")       ‘公司email
rs("ClientCountry")=request("ClientCountry")   ‘所属国家/地区
rs("ClientHabitude")=request("ClientHabitude")  ‘公司性质
rs("ClientSize")=request("ClientSize")          ‘公司规模
rs("ClientCity")=request("ClientCity")          ‘所属城市
rs("ClientPay")=request("ClientPay")           ‘结款方式
rs("ClientCredit")=request("ClientCredit")       ‘结款信用
rs("ClientList")=request("ClientList")           ‘最高订单‘
rs("ClientYear")=request("ClientYear")          ‘年度订单
rs("ClientCyc")=request("ClientCyc")           ‘需求周期
rs("EditTime")=now()                        ‘修改时间
rs("SetName")=session("admin_name")          ‘创建人
rs.update
rs.close
response.Write("<script language=javascript>alert('客户信息修改成功')</script>")‘弹出成功对话框
end if
%>

4.客户信息删除

在客户信息管理页面,用户可以点选任意一条客户信息前面的复选框,然后单击页面下方的【删除】按钮,被选择的客户信息将被删除。
客户信息删除主要是根据传递的参数(本例中的参数为客户信息的id),将数据库中对应id的客户信息和其他和客户相关的信息全部删除,程序代码如下:
<%
call client '验证是否有删除客户信息的权限
if request("del")<>"" then
kid=Split(Request("del"),",") ‘分解字符串成数组
for i=0 to ubound(kid)
sqld="delete from tb_Client where id="&clng(kid(i))'删除客户信息
conn.execute(sqld)
sqll="delete from tb_Linkman where LinkmanClient="&clng(kid(i))'删除客户的联系人信息
conn.execute(sqll)
sqlp="delete from tb_Pact where PactClient="&clng(kid(i))'删除客户的合同信息
conn.execute(sqlp)
sqlp="delete from tb_Feedback where FeedbackClient="&clng(kid(i))'删除客户反馈信息
conn.execute(sqlp)
sqlp="delete from tb_Product where ProductProvider="&clng(kid(i))'删除客户的产品信息
conn.execute(sqlp)
next
if request("p")="" then                                   '返回用户操作页
response.Redirect("KeHu_KeHu.asp")
else
response.Redirect("KeHu_KeHu.asp?p="&request("p"))
end if
else
response.Write("<script language=javascript>alert('请选择要删除的信息');location='javascript:history.go(-1)'</script>")
end if%>

联系人信息管理设计

联系人信息管理的主要功能包括显示/查询、添加、修改和删除联系人信息4个部分。用户可以通过功能导航进入联系人信息管理页面,页面设计效果如图7所示。
 
图7  联系人信息管理页面设计效果

1.联系人信息显示/查询

用户可以在联系人信息管理页面中的查询部分,输入一定的查询条件进行联系人信息的查询。
用户在查询部分输入条件后,单击【查询】按钮,用户添加的查询条件将被提交给本页,本页则将根据用户提交的表单信息对数据库进行检索,并将结果集通过操作区输出到浏览器中。
查询代码如下:
<%
if request("post")<>"" then
if request("tiao")="模糊查询" then’ 联系人模糊查询
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Linkman where "&request("sel")&" like '%"&request("search")&"%' order by id desc"
rs.open sql,conn,1,1
else ‘联系人精确查询
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Linkman where "&request("sel")&"='"&request("search")&"' order by id desc" 
rs.open sql,conn,1,1
end if
else’ 默认状态下显示联系人列表
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Linkman order by id desc"
rs.open sql,conn,1,1
end if
%>
分页代码请参考4.1节中介绍的客户信息显示/查询中的相关代码。
也可在查看客户的详细信息中,单击“联系人信息”,就会产生此客户的联系人列表,传参代码如下:
<a href="KeHu_Linkman.asp?post=true&sel=LinkmanClient&search=<%=rsx("id")%>&dd=dd">联系人信息</a>

2.联系人信息添加

联系人信息添加的主要功能是添加客户的联系人信息。
在查询页面中单击【添加】按钮,在展示区中会显示添加页面。在添写表单选择所属客户时,所属客户是在数据库中直接读取出来的。其代码如下:
<%
set rsc=server.CreateObject("adodb.recordset")
sqlc="select * from tb_Client order by id desc"
rsc.open sqlc,conn,1,1
if not rsc.eof then
 %>
  <select name="LinkmanClient" id="LinkmanClient">
<%
for i=1 to rsc.recordcount and not rsc.eof
%>
        <option value="<%=rsc("id")%>"><%=rsc("ClientName")%></option>
<%
rsc.movenext
next%>
</select>
<%
else
response.Write("没有客户信息,请<a href='KeHu_add.asp' target='bo'>添加</a>")
end if%>
添加联系人页面的运行结果如图8所示。
 
图8  添加联系人的页面运行结果
也可在客户的详细信息中单击【新建】按钮,在此添加用户不用选择所属客户,直接就会生成所属客户,主要是根据传递的参数(本例中的参数为客户信息的id),传参代码如下:
<a href="KeHu_Linkman_addy.asp?id=<%=rsx("id")%>"><span class="style2">新建</span></a>
其显示代码如下:
<%
set rsc=server.CreateObject("adodb.recordset")
sqlc="select * from tb_Client where id="&request("id")&" order by id desc"
rsc.open sqlc,conn,1,1
response.Write(rsc("ClientName"))
%>

3.联系人信息修改

联系人信息修改的主要功能是用户修改联系人信息,方便用户和客户之间的联系和沟通。
在显示联系人详细信息页面,用户可以更改其联系人的信息。联系人信息修改页面运行结果如图9所示。
 
图9  联系人信息修改页面运行结果

4.联系人信息删除

联系人信息删除的主要功能是删除联系人的信息。,其程序代码如下:
<%
kid=Split(Request("del"),",") ‘分解字符串成数组
response.Write("正在删除...")
for i=0 to ubound(kid)
sqld="delete from tb_Linkman where id="&clng(kid(i)) ‘删除指定的记录
conn.execute(sqld)
next
%>

合同信息管理

合同信息管理设计主要包括显示/查询、添加、修改和删除合同信息4个部分。用户可以通过功能导航进入合同信息管理页面,页面设计效果如图10所示。
 
图10 合同信息管理页面的运行结果

1.合同信息显示/查询

用户可以在合同信息管理页面中的查询部分,输入一定的查询条件,进行合同信息的查询。
用户在查询部分输入查询条件后,单击【查询】按钮,用户所添加的查询条件将被提交给本页,本页将根据用户提交的表单信息对数据库进行检索,并将结果集通过操作区输出到浏览器中。
合同信息查询程序代码如下:
<%
if request("post")<>"" then
if request("tiao")="模糊查询" then‘模糊查询合同信息
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Pact where "&request("sel")&" like '%"&request("search")&"%' order by id desc"
rs.open sql,conn,1,1
else’精确查询合同信息
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Pact where "&request("sel")&"='"&request("search")&"' order by id desc"
rs.open sql,conn,1,1
end if
else’ 默认状态下显示的合同信息
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Pact order by id desc"
rs.open sql,conn,1,1
end if
%>
也可在查看客户的详细信息中,单击“合同信息”,就会产生此客户的合同列表,传参代码如下:
<a href="KeHu_Pact.asp?post=true&sel=PactClient&search=<%=rsx("id")%>&dd=dd" >合同信息</a>

2.合同信息添加

合同信息添加的主要功能是用户添加客户的合同信息。
在查询页面中单击【添加】按钮,在展示区中会显示添加页面,其运行结果如图17(上)所示;也可在客户的详细信息页面单击“新建”,在展示区中会显示添加页面,然后进行合同信息添加。合同信息添加页面的运行结果如图12(下)所示。
 
图12  合同信息添加页面运行结果

3.合同信息修改

合同信息修改的主要功能是用户修改合同信息。
在显示合同详细信息页面,用户可以更改其合同的信息。

4.合同信息的删除

合同信息删除的主要功能是删除合同信息,其代码如下:
<%
    kid=Split(Request("del"),",")
    response.Write("正在删除...")
    for i=0 to ubound(kid)
sqld="delete from tb_Pact where id="&clng(kid(i))
conn.execute(sqld)
next
%>

服务管理

服务管理设计的主要功能包括反馈信息的显示/查询、添加、修改和删除4个部分。用户可以通过功能导航进入服务管理页面,页面设计效果如图20所示。
 
图20  服务管理页面的设计效果

反馈信息添加

反馈信息添加的主要功能是用户添加客户的反馈信息。在查询页面中单击【添加】按钮,在展示区中会显示添加页面。反馈信息添加页面的设计效果如图21所示。
 
图21  反馈信息添加页面的设计效果
反馈信息添加页面涉及的HTML表单元素如表3所示。
表3                      反馈信息信息添加页面涉及的HTML表单元素
名称 类型 含义 重要属性
form1 Form 表单 method="post" action=""
post hidden 判断表单是否提交 value="true"
FeedbackTitle text 反馈主题 class="in" size="30"
FeedbackFulfill radio 是否完成 value="未完成" value="已完成"
year select <option value="<%=i%>"><%=i%></option>
month select <option value="<%=i%>"><%=i%></option>
day select <option value="<%=i%>"><%=i%></option>
FeedbackClient select 相关客户 <option value="<%=rsc("id")%>">
<%=rsc("ClientName")%></option>
FeedbackContent textarea 详细内容 cols="88" rows="4" class="table"
FeedbackResult textarea 处理结果 cols="88" rows="4" class="table"
Submit select 添加按钮 class="input" value=" 添 加 " onClick="return checks()"
 
表单提交之后,添加的数据将被提交到本页进行处理。数据处理的程序代码如下:
<%
call feedback
if request("post")<>"" then
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Feedback"
rs.open sql,conn,1,3
rs.addnew  '主要用于添加客户反馈信息的数据
rs("FeedbackTitle")=request("FeedbackTitle")
rs("FeedbackDate")=request("year")&"-"&request("month")&"-"&request("day")
rs("FeedbackClient")=request("FeedbackClient")
rs("FeedbackContent")=request("FeedbackContent")
rs("FeedbackResult")=request("FeedbackResult")
rs("FeedbackFulfill")=request("FeedbackFulfill")
rs("SetTime")=now()
rs("SetName")=session("admin_name")
rs.update
rs.close
response.Write("<script language=javascript>alert('反馈信息添加成功')</script>")
end if
%>

反馈信息修改

因为反馈信息是客户的反馈意见所以不得随意修改,用户只可以修改“处理结果”和“服务完成”两项信息。当服务完成选项,选中“已完成”时,那么任何信息都不可以修改,也就是说只有在服务“未完成”的情况下才能修改“处理结果”。
反馈信息页面设计效果如图22所示。
 
图22  反馈信息页面设计效果
反馈信息修改页面涉及的HTML表单元素如表4所示。
表4                      反馈信息信息修改页面涉及的HTML表单元素
名称 类型 含义 重要属性
form1 Form 表单 method="post" action=""
post hidden 判断表单是否提交 value="true"
FeedbackTitle text 反馈主题 value="<%=rsx("FeedbackTitle")%>" size="30" readonly="true"  class="in"
FeedbackFulfill radio 是否完成 value="未完成" <%if rsx("FeedbackFulfill")="未完成" then%>checked <%end if%>
 value="已完成" <%if rsx("FeedbackFulfill")="已完成" then%>checked<%end if%>
FeedbackDate text value="<%=rsx("FeedbackDate")%>" size="30" readonly="true" class="in"
FeedbackClient select 相关客户 value="<%=rsc("ClientName")%>" size="30" readonly="true"  class="in"
FeedbackContent textarea 详细内容 cols="88" rows="4" class="table" readonly=true
FeedbackResult textarea 处理结果 cols="88" rows="4" class="table" <%if rsx("FeedbackFulfill")="已完成" then%> readonly=true<%else%>onfocus=this.select(); onmouseover=this.focus();<%end if%>
Submit select 添加按钮 class="input" value=" 修 改 " onClick="return checks()"
 
在反馈信息修改页面,当用户单击【修改】按钮后,修改数据将被提交到本页进行处理,数据处理程序的代码如下:
<%
if request("post")<>"" then
set rs=server.CreateObject("adodb.recordset")
sql="select * from tb_Feedback where id="&request("id")
rs.open sql,conn,1,3
rs("FeedbackFulfill")=request("FeedbackFulfill")
rs("FeedbackResult")=request("FeedbackResult")
rs.update
rs.close
response.Write("<script language=javascript>alert('反馈信息修改成功');location='Feedback_ed.asp?id="&request("id")&"</script>")
end if
%>

报表管理

报表管理的主要功能是打印各种类型的报表,包括客户报表打印、联系人报表打印、反馈报表打印和库存报表打印4个部分。报表管理页面设计效果如图23所示。
 
图23  报表管理页面设计效果

客户报表模块

客户报表模块的主要功能包括客户报表查询、导入Excel和用web打印3个部分。

1.客户报表查询

客户报表查询页面涉及的HTML表单元素如表5所示。
表5                      客户报表查询页面涉及的HTML表单元素
名称 类型 含义 重要属性
form1 Form 表单 method="post" action=""
eeeet Hidden 判断表单如何处理  
ClientCountry Select 国家/地区 <option value="<%=rsg("ClientCountry")%>">
<%=rsg("ClientCountry")%></option>
ClientCity Select 城市 <option value="<%=rsc("ClientCity")%>">
<%=rsc("ClientCity")%></option>
SetName Select 创建者 <option value="<%=rss("SetName")%>">
<%=rss("SetName")%></option
searchtype   类别 <option value="ClientName">公司名称</option>
……
<option value="ClientAddress">公司地址</option>
Submit submit 导入Execul class="input" value="导入Excul" onClick="form1.eeeet.value='excul'"
Submit submit 直接打印 class="input" value="打印报表" onClick="form1.eeeet.value='print_c'"
 
用户可以在报表管理页面中的客户报表查询部分,输入查询条件,进行客户信息的查询。

2.导入Excel

当用户在查询部分输入条件,并单击【导入Excel】按钮后,用户添加的查询条件将被提交给数据处理页,处理页用select case判断隐藏域的值,进而确定怎样处理。
数据处理页对查询条件经过处理,产生相应的SQL查询语句,其代码如下:
<%
sql="id is not null"
if request("ClientCountry")<>"全部" then '国家/地区不为全部时
sql=sql&" and ClientCountry='"&request("ClientCountry")&"'"
end if
if request("ClientCity")<>"全部" then   '城市不为全部时
sql=sql&"  and ClientCity='"&request("ClientCity")&"'"
end if
if request("SetName")<>"全部" then     '客户名称不为全部时
sql=sql&" and SetName='"&request("SetName")&"'"
end if
if trim(request("search"))<>"" then    '当关键字不为空时
sql=sql&" and "&request("searchtype")&" like '%"&request("search")&"%'"
end if
sql="select ClientName,ClientCountry,ClientCity,ClientTel,ClientFax,ClientEmail from tb_Client where "&sql
response.Redirect("Table_print_Cd.asp?sql="&sql&"&tt=excul")'把参数传给下载页面
%>
当数据处理页处理完毕之后,会自动转向下载页,在下载页中单击左键,直接用web打开Excel, 右键单击“下载”选择“目标另存为...”把Excel保存在相应的路径下。处理Excel的页面代码如下:
<%
if request("tt")="excul" then          '当为客户报表查询时产生相应字段
a=array("公司名称","所在国家/地区","所在城市","公司电话","公司传真","E-mail")
elseif  request("tt")="excul_l" then    '当为联系人报表查询时产生相应字段
a=array("姓名","客户名称","部门","职务","电话","手机","E-mail")
elseif request("tt")="excul_k" then     '当为反馈客户报表查询时产生相应字段
a=array("客户名称","反馈日期","是否解决","反馈主题","反馈内容","处理结果")
elseif request("tt")="excul_kc" then    '当为库存报表查询时产生相应字段
a=array("客户编号","客户名称","产品数量","单位","库存类型")
end if
%>
<%response.ContentType="application/vnd.ms-excel"%>
<%
set rs=conn.execute(request("sql"))
%>
<table width="100"  border="1" cellspacing="0">
  <tr>
<%
for i=0 to rs.fields.count-1
%>
    <td align="center"><%=a(i)%></td>
<%next%>
  </tr>
<%do while not rs.eof%>
  <tr>
<%for i=0 to rs.fields.count-1%>
    <td align="center" class="table"><%=rs(i)%></td>
<%next%>
  </tr>
<%
rs.movenext
loop
rs.close
%>
报表下载页面的运行结果如图24所示。
 
图24  报表下载页面的运行结果

3.用web打印

用户在查询部分输入查询条件后,单击【打印报表】按钮,用户添加的查询条件将被提交给数据处理页,处理页用select case判断隐藏域的值,进而确定怎样处理。
数据处理页对查询条件经过处理,产生相应的SQL查询语句。程序代码如下:
<%
sql="id is not null"
if request("ClientCountry")<>"全部" then'国家/地区不为全部时
sql=sql&" and ClientCountry='"&request("ClientCountry")&"'"
end if
if request("ClientCity")<>"全部" then   '城市不为全部时
sql=sql&"  and ClientCity='"&request("ClientCity")&"'"
end if
if request("SetName")<>"全部" then      '客户名称不为全部时
sql=sql&" and SetName='"&request("SetName")&"'"
end if
if trim(request("search"))<>"" then     '当关键字不为空时
sql=sql&" and "&request("searchtype")&" like '%"&request("search")&"%'"
end if
sql="select * from tb_Client where "&sql
response.Redirect("Table_print_p.asp?sql="&sql)'把参数传给打印页面
%>
当数据处理页处理完毕之后,会自动转向打印页,打印页是一个框架集,包含三个页面。框架页代码如下:
<%
sql=request("sql")
if sql="" then
sql=session("sql")
end if
session("sql")=sql
show=request("show")
if show="" then
show=15
end if
p=request("p")
if p="" or p=0 then
p=1
end if
%>
<frameset rows="42,*" framespacing="0" frameborder="NO" border="0">
  <frame src="Table_print_top.asp?sql=<%=request("sql")%>&show=<%=show%>&p=<%=p%>" name="topFrame" frameborder="no" scrolling="NO" noresize>
  <frame src="Table_print.asp?sql=<%=request("sql")%>&show=<%=show%>&p=<%=p%>" name="mainFrame" frameborder="no">
</frameset><noframes></noframes>
</frames>
控制页面代码如下:
<%
sql=request("sql")'获取sql语句
if sql="" then
sql=session("sql")
end if
session("sql")=sql
show=request("show")
set rs=server.CreateObject("adodb.recordset")
sql=sql
rs.open sql,conn,1,1
if not rs.eof then
tol=rs.recordcount
rs.pagesize=show
maxpage=rs.pagecount
requestpage=clng(request("p"))
else
maxpage=0
tol=0
show=0
end if
%>
<table width="649"  border="0" align="center">
  <tr valign="middle">
    <form name="form1">
    <td width="14%" valign="middle">      
        <select name="menu1" onChange="MM_jumpMenu('parent',this,0)">
  <%for i=1 to 200%>
        <option value="Table_print_p.asp?show=<%=i%>" <%if i=int(show) then%>selected<%end if%>>每页显示<%=i%>条记录</option>
<%next%>
      </select>    </td></form>
    <form name="form2">
    <td width="7%" valign="middle">  
  
        <select name="menu3" onChange="MM_jumpMenu('parent.mainFrame',this,0)">
  <%for i=1 to maxpage%>
          <option value="Table_print.asp?p=<%=i%>&show=<%=show%>&sql=<%=request("sql")%>" >第<%=i%>页</option>
<%next%>   
        </select>      </td>
   <td width="64%" height="23" valign="middle">        总页数:<%=maxpage%> 总条数:<%=tol%></td>
    <td width="15%" align="right"><a href=javascript:parent.mainFrame.fcous;window.print();>打印</a></td>
      </form>
  </tr>
</table>
打印预览页面代码如下:
<%
sql=request("sql")
if request("sql")="" then
sql=session("sql")
end if
session("sql")=sql
show=request("show")
set rs=server.CreateObject("adodb.recordset")
sql=session("sql")
rs.open sql,conn,1,1
%>
<%
if not rs.eof then
tol=rs.recordcount
rs.pagesize=show
maxpage=rs.pagecount
requestpage=clng(request("p"))
if requestpage="" or requestpage=0 then
requestpage=1
end if
if requestpage>maxpage then
requestpage=maxpage
end if
if requestpage<>1 then
rs.move (requestpage-1)*rs.pagesize
end if
for i=1 to rs.pagesize and not rs.eof
%>
  <tr align="center">
    <td height="30"><%=rs("ClientName")%></td>
    <td><%=rs("ClientCountry")%></td>
    <td><%=rs("ClientCity")%></td>
    <td><%=rs("ClientTel")%></td>
    <td><%=rs("ClientFax")%></td>
    <td><%=rs("ClientEmail")%></td>
  </tr>
<%
rs.movenext
if rs.eof then exit for
next
else
response.Write("<span class='style2'>没有找到相关信息</span>")
end if
%>
客户报表打印页面运行结果如图25所示。
 
图25  客户报表打印页面的运行结果

联系人报表模块

1.联系报表查询

联系人报表查询页面涉及的HTML表单元素如表6所示。
表6                      联系人报表查询页面涉及的HTML表单元素
名称 类型 含义 重要属性
form1 Form 表单 method="post" action=""
eeeet hidden 判断表单如何处理  
LinkmanDept select 国家/地区 <option value="<%=rsg("ClientCountry")%>">
<%=rsg("ClientCountry")%></option>
LinkmanDuty select 城市 <option value="<%=rsc("ClientCity")%>">
<%=rsc("ClientCity")%></option>
select2 select 创建者 <option value="<%=rss("SetName")%>">
<%=rss("SetName")%></option
Submit submit 导入Execul class="input" value="导入Excul" onClick="form1.eeeet.value='excul'"
Submit submit 直接打印 class="input" value="打印报表" onClick="form1.eeeet.value='print_c'"
 
用户可以在报表管理页面中的联系人报表查询部分,输入一定的查询条件,进行联系人信息的查询。

2.导入Excul

用户在查询部分输入查询条件后,单击【导入Excul】按钮,用户所添加的查询条件将被提交给数据处理页,处理页用select case判断隐藏域的值,进而确定怎样处理,传值的程序代码如下:
<%
sql="dbo.tb_Linkman.id is not null"
if request("LinkmanDept")<>"全部" then
sql=sql&" and dbo.tb_Linkman.LinkmanDept='"&request("LinkmanDept")&"'"
end if
if request("LinkmanDuty")<>"全部" then
sql=sql&"  and dbo.tb_Linkman.LinkmanDuty='"&request("LinkmanDuty")&"'"
end if
if request("select2")<>"全部" then
sql=sql&" and dbo.tb_Linkman.SetName='"&request("SetName")&"'"
end if
sql="SELECT dbo.tb_Linkman.LinkmanName, dbo.tb_Client.ClientName,dbo.tb_Linkman.LinkmanDept,dbo.tb_Linkman.LinkmanDuty,dbo.tb_Linkman.LinkmanTel, dbo.tb_Linkman.LinkmanHander, dbo.tb_Linkman.LinkmanEmail FROM dbo.tb_Client INNER JOIN dbo.tb_Linkman ON dbo.tb_Client.ID= dbo.tb_Linkman.LinkmanClient where "&sql
response.Redirect("Table_print_kh.asp?sql="&sql)
%>
由于查询和导入的实现方法和客户报表的实现方法相似,在此不再详细介绍,请读者参考7.1节中介绍的导入Excel的程序代码。

3.用web打印

用户在查询部分输入查询条件后,单击【打印报表】按钮,用户所添加的查询条件将被提交给数据处理页,处理页用select case判断隐藏域的值,进而确定怎样处理。传值程序代码如下:
<%
sql="dbo.tb_Linkman.id is not null"
if request("LinkmanDept")<>"全部" then
sql=sql&" and dbo.tb_Linkman.LinkmanDept='"&request("LinkmanDept")&"'"
end if
if request("LinkmanDuty")<>"全部" then
sql=sql&"  and dbo.tb_Linkman.LinkmanDuty='"&request("LinkmanDuty")&"'"
end if
if request("select2")<>"全部" then
sql=sql&" and dbo.tb_Linkman.SetName='"&request("SetName")&"'"
end if
sql="SELECT dbo.tb_Linkman.LinkmanName, dbo.tb_Client.ClientName,dbo.tb_Linkman.LinkmanDept, dbo.tb_Linkman.LinkmanDuty,dbo.tb_Linkman.LinkmanTel, dbo.tb_Linkman.LinkmanHander, dbo.tb_Linkman.LinkmanEmail FROM dbo.tb_Client INNER JOIN dbo.tb_Linkman ON dbo.tb_Client.ID= dbo.tb_Linkman.LinkmanClient where "&sql
response.Redirect("Table_print_Cd.asp?sql="&sql&"&tt=excul_l")%>
由于联系人查询和导入实现的方法和客户报表的实现的方法相似,在此不再详细介绍,请读者参考7.1节中介绍的用web打印的程序程序代码。
联系人报表页面运行结果如图26所示。
 
图26  联系人报表页面的运行结果
由于客户报表查询、联系人报表查询、反馈客户查询和库存报表查询实现的方法比较类似,在这里不再详细介绍,请参考7.1节和7.2节的相关内容。
 

附录A  参考文献

1.Visual Basic精彩编程200例 机械工业出版社  
2.Visual Basic数据库开发实例解析 机械工业出版社  
3.Visual FoxPro数据库开发实例解析 机械工业出版社  
4.Power Builder数据库开发实例解析 机械工业出版社  
5.Delphi数据库开发实例解析 机械工业出版社  
6.PowerBuilder 精彩编程200例 机械工业出版社  
7.Visual FoxPro 精彩编程200例 机械工业出版社
8.ASP数据库开发实例解析 机械工业出版社  
9.Delphi工程应用与项目实践 机械工业出版社  
10.Visual Basic工程应用与项目实践 机械工业出版社  
11.Visual C++工程应用与项目实践 机械工业出版社  
12.JSP工程应用与项目实践 机械工业出版社  
13.ASP工程应用与项目实践 机械工业出版社  
14.Visual Basic 信息系统开发实例精选  机械工业出版社  
15.ASP 信息系统开发实例精选  机械工业出版社  
16.Delphi 信息系统开发实例精选 机械工业出版社  
17.Visual foxpro数据库开发关键技术与实例应用 人民邮电出版社  
18.PoweBuilder数据库开发关键技术与实例应用 人民邮电出版社  
19.Delphi数据库开发关键技术与实例应用 人民邮电出版社   
20.Visual basic数据库开发关键技术与实例应用 人民邮电出版社
21.Visual C++ 管理信息系统完整项目实例剖析 人民邮电出版社
22.Visual Basic 管理信息系统完整项目实例剖析 人民邮电出版社
 
23.PowerBuilder 管理信息系统完整项目实例剖析 人民邮电出版社  
 
24.Visual FoxPro管理信息系统完整项目实例剖析 人民邮电出版社  
25.SQL Server数据库开发实例解析 机械工业出版社  宋昆、李严等   
26.Access数据库开发实例解析  机械工业出版社  李俊民、高春燕等  
 


附录B  数据表

(1)tb_Addresser(发件人信息表)
发件人信息表主要用于保存发件人信息。该数据表的结构如表B.1所示。
表B.1                               表tb_Addresser的结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
EmailName varchar 50 发件人姓名
EmailPwd varchar 50 发件人邮箱密码
Email varchar 50 发件人email
SmtpEmail varchar 50 企业邮局地址
 
(2)tb_Client(客户信息)
客户信息表主要用于保存客户信息信息。该数据表的结构如表B.2所示。
表B.2                               表tb_Client的结构
字段名 数据类型 长度 主键否 描述
ID int 4 自动编号
ClientName varchar 100 公司名称
ClientAddress varchar 100 公司详细地址
ClientTel varchar 20 公司电话
ClientFax varchar 20 公司传真
ClientEmail varchar 50 公司email
ClientNumber varchar 10 邮政编码
ClientPage varchar 50 公司网址
ClientHabitude varchar 50 企业性质
ClientSize varchar 10 公司
ClientCity varchar 50 所在城市
ClientCredit varchar 50 结款信用
ClientCountry varchar 50 所属国家/地区
ClientPay varchar 50 结款方式
ClientList varchar 50 最高订单
ClientYear varchar 10 年度订单
ClientCyc varchar 10 需求周期
SetTime varchar 20 创建时间
EditTime varchar 20 修改时间
SetName char 10 创建人
 
(3)tb_Feedback(反馈信息表)
反馈信息表主要用于保存客户的反馈信息。该数据表的结构如表B.3所示。
表B.3                               表tb_Feedback的结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
FeedbackTitle varchar 50 反馈标题
FeedbackDate varchar 50 反馈日期
FeedbackClient varchar 50 反馈客户
FeedbackContent varchar 2000 反馈内容
FeedbackFulfill varchar 50 是否完成
FeedbackResult varchar 2000 处理结果
SetTime varchar 20 创建时间
SetName varchar 50 创建人
 
(4)tb_Stockpile(库存记录表)
库存记录表主要用于保存库存记录信息。该数据表的结构如表B.4所示。
表B.4                                表tb_Stockpile的结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
StockpileProductName varchar 50 产品编号
StockpileProductNumber int 4 产品数量
StockpileType varchar 50 库存类型
StockpileContent varchar 50 库存说明
SetName varchar 50 创建人
SetTime varchar 20 创建时间
 
(5)tb_Pact(合同信息表)
合同信息表主要用于保存合同详细信息。该数据表的结构如表B.5所示。
表B.5                                 表tb_Pact的结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
PactClient varchar 50 客户id
PactNumber varchar 50 合同编号
PactDate varchar 50 签定日期
PactMoney varchar 50 签定日期
PactExecutor varchar 100 执行人
PactSignatory varchar 50 签单人
PactRemark varchar 2000 备注
SetTime varchar 20 创建时间
EditTime varchar 20 修改时间
SetName varchar 50 创建人
 
(6)tb_User(发件人信息表)
发件人信息表主要用于保存用户的信息。该数据表的结构如表B.6所示。
表B.6                                      表tb_User结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
username varchar 50 用户名
userpwd varchar 50 密码
Client varchar 50 管理客户权限
Linkman varchar 50 管理联系人权限
Pact varchar 50 管理合同权限
Stockpile varchar 50 管理库存权限
Feedback varchar 50 服务管理权限
Forms varchar 50 报表管理权限
Addresser varchar 50 发件人管理权限
Email varchar 50 email管理权限
users varchar 50 管理用户权限
chaoji varchar 50 超级用户权限
 
(7)tb_Addresser(发件人信息表)
发件人信息表主要用于保存发件人信息。该数据表的结构如表B.7所示。
表B.7                               表tb_Product结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
ProductNumber varchar 50 产品编号
ProductName varchar 50 产品名称
ProductUnit varchar 50 单位
ProductProvider varchar 50 供应商
ProductContent varchar 2000 产品简介
SetName varchar 50 操作用户
SetTime varchar 20 操作时间
EditTime varchar 20 修改时间
 
(8)tb_Addresser(发件人信息表)
发件人信息表主要用于保存发件人信息。该数据表的结构如表B.8所示。
表B.8                                表tb_linkman结构
字段名 数据类型 长度 主键否 描述
id int 4 自动编号
LinkmanName varchar 50 联系人姓名
LinkmanClient varchar 100 所属客户
LinkmanLike varchar 50 爱好
LinkmanFax varchar 20 传真
LinkmanTel varchar 20 电话
LinkmanHander varchar 20 手机
LinkmanEmail varchar 50 电子邮件
LinkmanDept varchar 50 所属部门
LinkmanDuty varchar 50 职位
LinkmanBirth varchar 20 生日
LinkmanSex varchar 2 性别
LinkmanMien varchar 4 合作态度
Remark varchar 2000 备注
SetTime varchar 20 操作时间
EditTime varchar 20 修改时间
SetName varchar 50 操作员