兰州理工大学C汽车零部件行业客户关系管理系统的设计28148.docx
*实践教学* 兰州理工大学计算机与通信学院2011年秋季学期面向对象课程设计题 目:汽车零部件行业客户关系管理系统的设计与实现专业班级:计算机科学与技术一班 姓 名: * 学 号: 12345678 指导教师: * 成 绩: 摘 要随着社会的发展,行业客户关系的种类数量急速增加,传统的选课管理模式已经无法满足当前的实际需求,为此,我们开发了学生选课管理系统。此次C+设计我选择的是学生选课系统设计,系统设计采用C+在microsoft visual c+6.0下编译而成。文中首先对课题背景,数据库基础理论进行了简单的讨论;接着,对系统开发工具、学生选课管理系统进行了详细分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。系统可以实现学生选课的一些重要功能,如:关系的添加、删除,信息查询、生成关系表,以及系统、关系课管理人员、用户个人信息的维护等。关键词:汽车零部件,客户关系,管理,设计目 录1、引言32、系统总体设计43、汽车零部件行业客户关系管理系统的结构设计54、基于BS模式的汽车零部件行业客户关系管理系统的分析与实现65、系统实现的关键技术96、系统用行界面107、源代码128、设计总结359、致谢3610、参考资料371.引言 客户关系管理(Customer Relationship Management,CRM)是近年来在美国出现,在西方国家迅速得到应用的一整套管理体系。CRM的主要含义就是通过对客户详细资料的深入分析,提高客户满意程度,从而提高企业竞争力的一种手段。随着我国经济的持续增长,企业竞争日趋激烈,客户资源成为企业的宝贵财富。企业客户关系管理系统可以有效地管理企业的客户资源,记录企业与客户之间的商业活动,这对于现代企业是非常重要的。 “十五”期间,我国汽车零部件行业得到迅速发展,汽车零部件基本满足了汽车生产和维修服务的要求。随着汽车工业的快速发展,汽车零部件的需求将迸一步增加,市场竞争将进一步激烈。为了在竞争日趋激烈的市场上赢得筹码,为客户提供优质的服务,提高客户的忠诚度和满意度,汽车零部件企业建立良好的客户资源变得非常重要。本文利用现代网络技术、计算机技术和多媒体技术等设计基于BS模式的汽车零部件行业客户关系管理信息系统,在企业中获得了很好的运用。2系统总体设计 汽车零部件行业客户关系管理系统由系统管理、地域信息管理、参数设置管理、客户信息管理、客户联系人管理、销售机会管理和任务进度管理等7个子系统构成,其总体结构如图1所示。汽车零部件行业客户关系管理系统的设计与实现系统管理地域信息管理参数设置管理客户信息管理参数设置管理客户联系人管理销售机会管理任务进度管理 图1 汽车零部件行业客户关系管理系统结构 (1)系统管理:主要的功能是对用户数据进行日常维护处理和对操作员资料的管理等功能。包括操作员资料的录入和密码的修改。为了坚持谁操作谁负责原则,操作员登陆后,其用户名将记录在他输入的每张作业单中,以便进行监控和责任的追究,所以操作员必须管理好自己的用户名和密码。 (2)地域信息管理:主要的功能是录入、修改、删除和查询客户的地域信息资料,包括地域编号、地域名称和上级地域等信息。 (3)参数设置管理:主要功能是对有关客户类别、职务以及项目类型信息等参数进行录入、修改和删除。 (4)客户信息管理:主要功能是对客户的基本信息进行管理,包括客户所属地域、客户名称、行业及通信地址等信息。 (5)客户联系人信息管理:客户联系人信息管理子系统主要对客户联系人的信息进行有效的管理,具体包括对客户联系人所在单位、客户姓名、性别及职务等信息的管理。 (6)销售机会管理:销售机会管理子系统主要用来对客户销售机会信息的管理,具体包括对客户信息、项目信息和签约金额等信息的管理。 (7)任务进度管理:任务进度管理子系统用来对任务进度进行有效管理,包括项目信息、销售人员、任务日期、工作方式、任务目的和任务地点等信息的管理。3. 汽车零部件行业客户关系管理系统的结构设计 目前流行的有客户机服务器(CS)模式和浏览器服务器(BS)模式。BS模式由于具有开放性好、易于维护、安全性高、应用程序开发周期短和易用性等优点,同时能真正做到资源共享,而广泛用于客户关系管理信息系统中。 系统采用3层结构,将任务划分为用户浏览层、系统应用层和数据服务层3个层次。用户的请求由客户端传递到中间层,再经中间层的应用服务器逻辑分析后,转换为数据服务器能够识别的指令进行传递。数据服务器执行指令后将执行结果返回给应用服务器,再由应用服务器将结果生成浏览器能够识别的格式传给客户端。 BS模式的3层结构不仅平衡应用服务器和数据服务器之间的负载,还实现分布式计算。浏览层提供用户与计算机进行人机交互的可视化接口,用户通过浏览器完成系统的远程服务和信息共享;系统应用层作为用户浏览与数据服务的桥梁,用于存放系统的功能模块和应用程序;数据服务层用于存储系统所需要的各种数据,主要完成数据的定义、维护、访问与更新等的数据服务,并管理和响应系统应用层的数据请求。系统结构如图2所示。客户端浏览器WEB服务器数据库服务器图2 汽车零部件行业客户关系管理系统的结构设计4 .基于BS模式的汽车零部件行业客户关系管理系统的分析与实现 4.1 工作原理 基于BS模式的汽车零部件行业客户关系管理系统的三层结构中,尤其重要的是系统应用层与数据服务层之间的接口问题,即数据引擎,本系统采用ASP技术。 用户通过浏览器登陆汽车零部件行业客户关系管理系统主页,通过身份验证后,选择所需要的功能。点击ASP链接,ASP通过ADO访问数据库,同时Web服务器使用ODBC把对数据库的各种操作通过网络传输到数据库服务器,数据服务器接受处理结果,并生成相应的HTML网页送到用户浏览器。 4.2 实体分析 根据汽车零部件行业客户关系管理系统的功能,规划出地域信息实体、客户信息实体、客户联系人实体、类型信息实体、销售机会实体和任务进度信息实体等。 (1)地域信息实体:地域信息实体E-R图如图3所示。地域信息实体地域标号地域名称上级地域图3 地域信息实体E-R图(2)客户信息实体:客户信息实体E-R图如图4所示。客户实体信息联客户单位编号客户单位名邮政编码其他通信地址图4 客户信息实体E-R图(3)客户联系人信息实体:客户联系人信息实体E-R图如图5所示。客户联系人实体联系人编号客户编号性别其他联系人姓名图5 客户联系人信息实体E-R图(4)类型信息实体:类型信息实体ER图如图6所示。类型信息实体类型编号类型名称类型分类 图6 类型信息实体E-R图4.3大致流程图根据具体分析、分级处理可绘制一下流程图:登 录 系 统资料管理我方信息管理统计分析用户管理系统维护帮助各子基本数据操作退出 (具体参见程序)5 .系统实现的关键技术 为了连接数据对象,本系统采用ASP的核心技术之一AD0作为关键技术。ADO技术集中体现ASP技术简洁而强大的数据库访问功能。AD0是基于Microsoft的面向对象的数据访问技术,并且是基于COM组件,具有COM组件技术的诸多优点。 因此易于使用是ADO最重要的特点之一。在ADO对象结构中,对象与对象之间的层次结构不是非常明显,这会给编写数据库程序带来更多的便利。同时访问多种数据源,使应用程序具有很好的通用性和灵活性。6.系统用行界面1.登陆界面:2.各子菜单登陆界面图七“客户信息录入”界面图八“客户管理”界面图九“销售机会管理”界面7.附录(源代码) using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace WindowsApplication1.DataManage public partial class frmClientManage : Form public frmClientManage() InitializeComponent(); BaseClass.BaseOperate boperate = new WindowsApplication1.BaseClass.BaseOperate(); BaseClass.OperateAndValidate opAndvalidate = new WindowsApplication1.BaseClass.OperateAndValidate(); protected string M_str_sql = "select ClientID as 客户编号,CName as 客户名称,CStep as 客户等级," + "CRoot as 客户来源,CTrade as 所属行业,CType as 客户类别,CArea as 所在区域,CPhone as 联系电话," + "CFax as 传真号码,CPostCode as 邮政编码,CAddress as 联系地址,CEmail as Email地址,CRemark as 备注 from tb_ClientInfo" protected string M_str_table = "tb_ClientInfo" protected int M_int_judge; private void frmClientManage_Load(object sender, EventArgs e) opAndvalidate.cboxBind("select AreaName from tb_Area", "tb_Area", "AreaName", cboxCArea); DataSet myds = boperate.getds(M_str_sql, M_str_table); dgvClientInfo.DataSource = myds.Tables0; if (myds.Tables0.Rows.Count > 0) tsbtnDel.Enabled = true; else tsbtnDel.Enabled = false; private void tsbtnAdd_Click(object sender, EventArgs e) opAndvalidate.autoNum("select ClientID from tb_ClientInfo", "tb_ClientInfo", "ClientID", "KH", "1000001", txtClientCode); tsbtnSave.Enabled = true; M_int_judge = 0; ClearText(); /51aspx private void tsbtnEdit_Click(object sender, EventArgs e) tsbtnSave.Enabled = true; M_int_judge = 1; private void tsbtnSave_Click(object sender, EventArgs e) if (M_int_judge = 0) if (txtCName.Text = "") MessageBox.Show("客户名称不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); else if (!opAndvalidate.validatePhone(txtCPhone.Text.Trim() errorCFax.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); errorCPhone.SetError(txtCPhone, "电话号码格式不正确"); else if (!opAndvalidate.validateFax(txtCFax.Text.Trim() errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); errorCFax.SetError(txtCFax, "传真号码输入格式不正确"); else if (!opAndvalidate.validatePostCode(txtCPostCode.Text.Trim() errorCFax.Clear(); errorCPhone.Clear(); errorCEmail.Clear(); errorCPostCode.SetError(txtCPostCode, "邮编输入格式不正确"); else if (!opAndvalidate.validateEmail(txtCEmail.Text.Trim() errorCFax.Clear(); errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.SetError(txtCEmail, "E-mail地址输入格式不正确"); else errorCFax.Clear(); errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); boperate.getcom("insert into tb_ClientInfo(ClientID,CName,CStep,CRoot,CTrade,CType," + "CArea,CPhone,CFax,CPostCode,CAddress,CEmail,CRemark) values('" + txtClientCode.Text.Trim() + "','" + txtCName.Text.Trim() + "','" + cboxCStep.Text.Trim() + "','" + cboxCRoot.Text.Trim() + "','" + cboxCTrade.Text.Trim() + "','" + cboxCType.Text.Trim() + "','" + cboxCArea.Text.Trim() + "','" + txtCPhone.Text.Trim() + "','" + txtCFax.Text.Trim() + "','" + txtCPostCode.Text.Trim() + "','" + txtCAddress.Text.Trim() + "','" + txtCEmail.Text.Trim() + "','" + txtCRemark.Text.Trim() + "')"); frmClientManage_Load(sender, e); MessageBox.Show("客户信息添加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); tsbtnSave.Enabled = false; /5-1-a-s-p-x if (M_int_judge = 1) if (txtCName.Text = "") MessageBox.Show("客户名称不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); else if (!opAndvalidate.validatePhone(txtCPhone.Text.Trim() errorCFax.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); errorCPhone.SetError(txtCPhone, "电话号码格式不正确"); else if (!opAndvalidate.validateFax(txtCFax.Text.Trim() errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); errorCFax.SetError(txtCFax, "传真号码输入格式不正确"); else if (!opAndvalidate.validatePostCode(txtCPostCode.Text.Trim() errorCFax.Clear(); errorCPhone.Clear(); errorCEmail.Clear(); errorCPostCode.SetError(txtCPostCode, "邮编输入格式不正确"); else if (!opAndvalidate.validateEmail(txtCEmail.Text.Trim() errorCFax.Clear(); errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.SetError(txtCEmail, "E-mail地址输入格式不正确"); else errorCFax.Clear(); errorCPhone.Clear(); errorCPostCode.Clear(); errorCEmail.Clear(); boperate.getcom("update tb_ClientInfo set CName='" + txtCName.Text.Trim() + "',CStep='" + cboxCStep.Text.Trim() + "',CRoot='" + cboxCRoot.Text.Trim() + "',CTrade='" + cboxCTrade.Text.Trim() + "',CType='" + cboxCType.Text.Trim() + "',CArea='" + cboxCArea.Text.Trim() + "',CPhone='" + txtCPhone.Text.Trim() + "',CFax='" + txtCFax.Text.Trim() + "',CPostCode='" + txtCPostCode.Text.Trim() + "',CAddress='" + txtCAddress.Text.Trim() + "',CEmail='" + txtCEmail.Text.Trim() + "',CRemark='" + txtCRemark.Text.Trim() + "' where ClientID='" + txtClientCode.Text.Trim() + "'"); frmClientManage_Load(sender, e); MessageBox.Show("客户信息修改成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); tsbtnSave.Enabled = false; private void tsbtnDel_Click(object sender, EventArgs e) if (MessageBox.Show("确定要删除该客户吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = DialogResult.OK) boperate.getcom("delete from tb_ClientInfo where ClientID='" + Convert.ToString(dgvClientInfo0, dgvClientInfo.CurrentCell.RowIndex.Value).Trim() + "'"); frmClientManage_Load(sender, e); MessageBox.Show("删除数据成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); private void tsbtnLook_Click(object sender, EventArgs e) if (tstxtKeyWord.Text = "") frmClientManage_Load(sender, e); if (tscboxCondition.Text.Trim() = "客户编号") DataSet myds = boperate.getds(M_str_sql + " where ClientID like '%" + tstxtKeyWord.Text.Trim() + "%'", M_str_table); if (myds.Tables0.Rows.Count > 0) dgvClientInfo.DataSource = myds.Tables0; else MessageBox.Show("没有要查找的相关记录!"); if (tscboxCondition.Text.Trim() = "客户名称") DataSet myds = boperate.getds(M_str_sql + " where CName like '%" + tstxtKeyWord.Text.Trim() + "%'", M_str_table); if (myds.Tables0.Rows.Count > 0) dgvClientInfo.DataSource = myds.Tables0; else MessageBox.Show("没有要查找的相关记录!"); if (tscboxCondition.Text.Trim() = "客户来源") DataSet myds = boperate.getds(M_str_sql + " where CRoot like '%" + tstxtKeyWord.Text.Trim() + "%'", M_str_table); if (myds.Tables0.Rows.Count > 0) dgvClientInfo.DataSource = myds.Tables0; else MessageBox.Show("没有要查找的相关记录!"); if (tscboxCondition.Text.Trim() = "所属行业") DataSet myds = boperate.getds(M_str_sql + " where CTrade like '%" + tstxtKeyWord.Text.Trim() + "%'", M_str_table); if (myds.Tables0.Rows.Count > 0) dgvClientInfo.DataSource = myds.Tables0; else MessageBox.Show("没有要查找的相关记录!"); /51(aspx) private void tsbtnRClient_Click(object sender, EventArgs e) DataManage.frmRClient dmFRC = new frmRClient(); dmFRC.ShowDialog(); private void tsbtnExit_Click(object sender, EventArgs e) Close(); public void ClearText() txtCName.Text = "" txtCPhone.Text = "" txtCFax.Text = "" txtCPostCode.Text = "" txtCAddress.Text = "" txtCEmail.Text = "" txtCRemark.Text = "" private void dgvClientInfo_CellClick(object sender, DataGridViewCellEventArgs e) txtClientCode.Text = Convert.ToString(dgvClientInfo0, dgvClientInfo.CurrentCe