资源描述
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2023年秋季学期
面向对象课程设计
题 目:汽车零部件行业客户关系管理系统的设计与实现
专业班级:计算机科学与技术一班
姓 名: ***
学 号: 12345678
指导教师: ***
成 绩:
摘 要
随着社会的发展,行业客户关系的种类数量急速增长,传统的选课管理模式已经无法满足当前的实际需求,为此,我们开发了学生选课管理系统。
本次C++设计我选择的是学生选课系统设计,系统设计采用C++在microsoft visual c++6.0下编译而成。文中一方面对课题背景,数据库基础理论进行了简朴的讨论;接着,对系统开发工具、学生选课管理系统进行了具体分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。
系统可以实现学生选课的一些重要功能,如:关系的添加、删除,信息查询、生成关系表,以及系统、关系课管理人员、用户个人信息的维护等。
关键词:汽车零部件,客户关系,管理,设计
目 录
1、引言…………………………………………………………………………………3
2、系统总体设计………………………………………………………………………4
3、汽车零部件行业客户关系管理系统的结构设计…………………………………5
4、基于B/S模式的汽车零部件行业客户关系管
理系统的分析与实现…………………………………………………………………6
5、系统实现的关键技术………………………………………………………………9
6、系统用行界面……………………………………………………………………10
7、源代码……………………………………………………………………………12
8、设计总结…………………………………………………………………………35
9、致谢………………………………………………………………………………36
10、参考资料…………………………………………………………………………37
1.引言
客户关系管理(Customer Relationship Management,CRM)是近年来在美国出现,在西方国家迅速得到应用的一整套管理体系。CRM的重要含义就是通过对客户具体资料的进一步分析,提高客户满意限度,从而提高公司竞争力的一种手段。随着我国经济的连续增长,公司竞争日趋剧烈,客户资源成为公司的宝贵财富。公司客户关系管理系统可以有效地管理公司的客户资源,记录公司与客户之间的商业活动,这对于现代公司是非常重要的。
“十五”期间,我国汽车零部件行业得到迅速发展,汽车零部件基本满足了汽车生产和维修服务的规定。随着汽车工业的快速发展,汽车零部件的需求将迸一步增长,市场竞争将进一步剧烈。为了在竞争日趋剧烈的市场上赢得筹码,为客户提供优质的服务,提高客户的忠诚度和满意度,汽车零部件公司建立良好的客户资源变得非常重要。本文运用现代网络技术、计算机技术和多媒体技术等设计基于B/S模式的汽车零部件行业客户关系管理信息系统,在公司中获得了很好的运用。
2.系统总体设计
汽车零部件行业客户关系管理系统由系统管理、地区信息管理、参数设立管理、客户信息管理、客户联系人管理、销售机会管理和任务进度管理等7个子系统构成,其总体结构如图1所示。
汽车零部件行业客户关系管理系统的设计与实现
系统管理
地区信息管理
参数设立管理
客户信息管理
参数设立管理
客户联系人管理
销售机会管理
任务进度管理
图1 汽车零部件行业客户关系管理系统结构
(1)系统管理:重要的功能是对用户数据进行平常维护解决和对操作员资料的管理等功能。涉及操作员资料的录入和密码的修改。为了坚持谁操作谁负责原则,操作员登陆后,其用户名将记录在他输入的每张作业单中,以便进行监控和责任的追究,所以操作员必须管理好自己的用户名和密码。
(2)地区信息管理:重要的功能是录入、修改、删除和查询客户的地区信息资料,涉及地区编号、地区名称和上级地区等信息。
(3)参数设立管理:重要功能是对有关客户类别、职务以及项目类型信息等参数进行录入、修改和删除。
(4)客户信息管理:重要功能是对客户的基本信息进行管理,涉及客户所属地区、客户名称、行业及通信地址等信息。
(5)客户联系人信息管理:客户联系人信息管理子系统重要对客户联系人的信息进行有效的管理,具体涉及对客户联系人所在单位、客户姓名、性别及职务等信息的管理。
(6)销售机会管理:销售机会管理子系统重要用来对客户销售机会信息的管理,具体涉及对客户信息、项目信息和签约金额等信息的管理。
(7)任务进度管理:任务进度管理子系统用来对任务进度进行有效管理,涉及项目信息、销售人员、任务日期、工作方式、任务目的和任务地点等信息的管理。
3. 汽车零部件行业客户关系管理系统的结构设计
目前流行的有客户机/服务器(C/S)模式和浏览器/服务器(B/S)模式。B/S模式由于具有开放性好、易于维护、安全性高、应用程序开发周期短和易用性等优点,同时能真正做到资源共享,而广泛用于客户关系管理信息系统中。
系统采用3层结构,将任务划分为用户浏览层、系统应用层和数据服务层3个层次。用户的请求由客户端传递到中间层,再经中间层的应用服务器逻辑分析后,转换为数据服务器可以辨认的指令进行传递。数据服务器执行指令后将执行结果返回给应用服务器,再由应用服务器将结果生成浏览器可以辨认的格式传给客户端。
B/S模式的3层结构不仅平衡应用服务器和数据服务器之间的负载,还实现分布式计算。浏览层提供用户与计算机进行人机交互的可视化接口,用户通过浏览器完毕系统的远程服务和信息共享;系统应用层作为用户浏览与数据服务的桥梁,用于存放系统的功能模块和应用程序;数据服务层用于存储系统所需要的各种数据,重要完毕数据的定义、维护、访问与更新等的数据服务,并管理和响应系统应用层的数据请求。系统结构如图2所示。
客户端浏览器
WEB服务器
数据库服务器
图2 汽车零部件行业客户关系管理系统的结构设计
4 .基于B/S模式的汽车零部件行业客户关系管理系统的分析与实现
4.1 工作原理
基于B/S模式的汽车零部件行业客户关系管理系统的三层结构中,特别重要的是系统应用层与数据服务层之间的接口问题,即数据引擎,本系统采用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)类型信息实体:类型信息实体E—R图如图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.Tables[0];
if (myds.Tables[0].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(dgvClientInfo[0, 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.Tables[0].Rows.Count > 0)
dgvClientInfo.DataSource = myds.Tables[0];
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.Tables[0].Rows.Count > 0)
dgvClientInfo.DataSource = myds.Tables[0];
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.Tables[0].Rows.Count > 0)
dgvClientInfo.DataSource = myds.Tables[0];
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.Tables[0].Rows.Count > 0)
dgvClientInfo.DataSource = myds.Tables[0];
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(dgvClientInfo[0, dgvClientInfo.Current
展开阅读全文