出版社客户管理系统.docx
《出版社客户管理系统.docx》由会员分享,可在线阅读,更多相关《出版社客户管理系统.docx(33页珍藏版)》请在冰点文库上搜索。
出版社客户管理系统
数学与计算机学院
课程设计说明书
课程名称:
软件工程课程设计
课程代码:
8404131
题目:
出版社客户管理系统
年级/专业/班:
2009级软件四班
学生姓名:
学 号:
开始时间:
2011年05月27日
完成时间:
2011年06月12日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书(计算书、图纸、分析报告)撰写质量(45)
总分(100)
指导教师签名:
年月日
软件工程课程设计任务书
学院名称:
数学与计算机学院课程代码:
___8404131______________
专业:
软件工程年级:
2009
一、设计题目
出版社客户管理系统
二、主要内容
本课程是计算机软件专业的必修专业课程,通过理论讲述和实际训练,使学生掌握软件工程的基本原理和基本方法,学会用软件工程学的概念、原理、方法和技术开发和维护软件。
本课程设计要求学生运用软件工程的思想,严格按照软件生命周期各阶段的目的和任务,完成对系统的定义、设计、编码、运行以及后期的维护。
三、具体要求及应提交的材料
1.分析阶段:
一个小型的出版社客户管理系统系统,需完成以下工作:
(1)在出版社客户管理系统中增加/删除一客户;
(2)对某一客户赠送样书、发慰问信、发慰问礼品;
(3)找出某一批出售书名和编号的相应客户;。
导出系统的数据流程图和实体关系图(E-R)
2.设计阶段:
针对分析阶段提出的软件要求,给出实现的方案和具体细节的说明。
(1)考虑该软件基本功能成份,该系统具有3个基本功能成分:
客户管理,
系统设置,
数据查询。
(2)根据分析,导出系统的功能模块图。
(3)设计数据库。
使用MicrosoftAccess创建数据库。
确定数据库中数据表的组成。
确定数据表中字段的构成、主键字段和有关字段的约束条件等。
依靠数据表中主键字段建立数据表之间的关系,并由此建立数据表之间的参照完整性约束。
(4)根据功能确定软件模块组成及调用关系。
3.编码阶段
建造模块,在可视化编程环境下,按照软件设计要求制作界面和完成对模块的编码,由此使软件设计具体化为软件作品。
4.运行维护
在软件运行时,检查软件的不足或错误,并进行维护。
5.编写课程设计报告
(1)设计题目
(2)任务要求
(3)系统总体方案
(4)各功能模块和流程图
(5)心得体会和参考资料
注:
学生完成课程设计后,提交课程设计报告及相关电子文档,要求将前述全部内容依先后顺序写成设计报告一份,要求文字通畅、字迹工整,文字不少于5000字,装订成册。
四、主要技术路线提示
五、进度安排
序号
设计内容
天数
1
分析设计内容,给出解决方案
3
2
创建数据库及建表
3
3
可视化界面设计
3
4
对所建数据库进行设计,整理设计思路,编码、测试,写出课程设计报告
3
5
指导老师检查设计结果并做成绩评定
2
总计
14
六、推荐参考资料(不少于3篇)
[1]张海藩.软件工程导论,清华大学出版社,2004
[2]陈明.实用软件工程基础,清华大学出版社,2003
[3]殷人昆.实用软件工程,清华大学出版社,2003
[4]宋波.UML面向对象技术与实践,科学出版社,2004
指导教师签名日期2011年5月27日
系主任审核日期2011年6月12日
1前言
随着生产规模的扩大、自动化技术的应用,以及市场经济体系的培育,使得我国企业管理的性质和环境都发生了巨大的变化。
企业的组织机构更加庞大,管理功能更为复杂,企业各部门之间的联系越来越紧密,所采用的决策对经济的影响越来越复杂,因而管理决策问题不仅数量多,而且复杂程度高,难度大。
管理信息系统在企业生产、管理中的应用越来越广泛和重要,一套好的管理信息系统直接影响到企业的生存和发展。
云南999电池股份有限公司管理信息系统(简称MDMIS),就是针对云南999电池股份有限公司的管理实际开发的软件系统,以期对该公司的生产、管理等活动进行科学、高效的管理。
MDMIS是一个完整的企业管理信息系统,由多个模块有机结合而成,包括原辅材料管理、产成品管理、工资管理、固定资产管理、人事档案管理、技术档案管理、用户与市场管理、财务管理、成本核算、内部银行微机管理等十多个软件模块。
本说明书介绍的是MDMIS中的产品管理子系统的开发过程。
为了解决各种客户和各地客户的矛盾,出版社的信息化网络化管理是势在必行。
因此出版社的客户管理系统就不可缺少了。
2需求分析
出版社管理系统是一个庞大的任务,传统方式会造成巨大的人力和物力资源浪费。
我们需要设计一个让工作人员使用的计算软件的系统,减少工作量,实现出版社客户管理的高效化,进行相应的查找、修改、删除等功能。
2.1功能分析
1.待开发软件的功能需求
产成品管理信息系统必须能够完成对公司产成品入库、出库数据的录入、更新、统计、查询、打印等工作,进行高效、准确的管理。
产生以下信息:
(1)产品库存表:
随时(定期/不定期)报告产品库存情况;
(2)产品生产完成情况表:
按要求定期/不定期报告产品生产情况;
(3)产品出库情况表:
按要求定期/不定期报告产品出库情况;
(4)产品生产、销售、库存情况表:
按要求报告一定时期内产品生产、销售和当前库存情况;
以上四表,满足了企业生产、销售、对帐等各方面管理的需要。
2.待开发软件的功能
按照用户需求,要满足以上功能,我们设计出了产品管理系统的结构。
见图1。
图2.1产成品管理系统层次方框图
结合系统需求,对图1所示的系统功能解释如下:
维护入库:
提供对产成品入库数据的维护(记录的录入、归档前的数据编辑)功能。
维护出库:
提供对产成品出库数据的维护。
数据归档:
实现入库、出库记录的数据归档。
统计入库情况:
提供对产成品信息的各种查询、统计,以及对错录产品入库单的维护功能,当用户输入正确的密码后,系统允许用户维护错录或数据归档前未发现的错误记录。
统计出库情况:
提供对产成品销售信息的各种查询、统计,以及对错录产品出厂记录的维护功能。
定期打印入库情况:
显示/打印任一时期,任一生产阶段的各生产车间以及全公司的产成品生产情况。
还可以按用户要求定期打印反映整个企业生产的汇总、明细报表。
其中明细报表反映了各生产车间的生产完成情况,汇总报表反映了全公司的生产完成情况。
定期打印出库(销售)情况:
对任一时期、任一阶段各种产成品的出库情况进行报表显示或打印,以汇总、明细报表反映公司的产成品销售情况。
显示/打印库存情况:
统计显示/打印出截止打印时刻为止的全公司和各产成品车间的各种产成品的库存情况。
报表分为汇总和明细两表,以满足不同的统计和查询要求。
打印月末仓库情况:
完成全公司和各车间的各种产成品的上月结存数、本月生产数、本月出库数、本月结存数的统计、汇总,生成月末结帐表,为生产部门、物资管理部门、财务部门等相关业务部门提供考核、对帐、记帐等方面的产成品信息。
月末处理:
提供了对各种产成品数据的转移功能。
完成了下月统计、记帐的初始化工作(如提供上月结存数)。
同时,通过分析,我们给出了成品管理系统的顶层数据流图。
见图2。
图2.2产成品管理系统顶层数据流图
2.2方案分析
设计该系统需要解决的主要问题是对出版社客户的管理,需要及时的与服务器进行通信、保持信息及时的动态更新。
该方案主要用C语言设计实现,使用C语言可以在设计时按照结构图逐次的设计模块,并且C语言使用起来简单一点。
该方案采用瀑布模型建立,因为这个系统的规模不是很大,采用瀑布模型能更快捷、安全的进行开发。
技术可行性:
前面做了详细的需求分析,大致把握了该教室管理系统的功能及用户的需求,另外在该系统之前已有类似的管理系统,比如图书管理系统,机票管理系统等在技术方面开发人员可以借鉴,所以技术上是可行的。
经济可行性:
软件的开发,不但要考虑到当前技术的可行性,还要考虑到软件开发的成本/效益,所谓经济可行性,换句话说,也就是说通过成本/效益分析,总结整个软件的开发经费,以及软件开发成功以后,可能给学校带来的经济效益,把两者进行权衡,再作认真仔细的估计,总结整个系统在经济上是否可行。
本系统的开发成本主要包括计算机软硬件配置成本;效益主要包括学校在多媒体教室管理上节省的人力资源,以及学校信息化建设的要求,总的来说经济上也是可行的。
操作可行性分析:
虽然该系统是在控制台上运行的,用户界面不是很好,但开发人员作了大量的提示语句。
操作人员不需要太多的计算机专业知识,只要懂得计算机的基本操作,并且对本系统有基本的了解,按照提示语句就可以了,而且本系统会提供给使用者详尽的使用说明,也可以对使用者进行短期的操作培训,所以,从操作上来讲,该教室管理系统是完全可行的。
3概要设计
本软件将辅助管理人员完成全公司产成品入库、出库、库存等方面的管理,可以进行查询、统计、打印报表等工作,提高公司对产成品的管理效率。
在分析阶段,我们已经提出了系统的结构、顶层数据流图和数据字典。
本节我们将对系统的硬件环境作简要介绍,并对待开发系统作概要设计。
3.1数据结构
3.2逻辑结构与物理结构
逻辑结构设计
1)数据库Sale-Management-nameTable定义如表3.1所示。
表3.1数据库Sale-Management-nameTable定义
2)配置文件:
保留上次程序运行结束后的相关状态如表3.2所示。
表3.2上次运行结束后的相关状态
3)全局变量如表3.3所示。
表3.3全局变量
物理结构设计
数据库Sale-Management-name的文件物理结构:
采用顺序介机构记录文件
数据结构与程序的关系
♦初始化模块(M1.1):
我们将会设置全局变量1~5;
♦刷新基本资料模块(M1.2):
利用全局变量3、4的基本信息,有可能访问数据库;
♦刷新详细资料模块(M1.3):
访问数据库和全局变量3、4的详细信息;
♦关闭系统模块(M1.4):
将全局变量1、5保存至配置文件中;
♦系统功能模块(M1.5):
利用鼠标和键盘操作事件;
♦信息添加模块(M2.1):
设置全局变量1、2、4和5;
♦信息删除模块(M2.2):
利用全局变量3和4,设置全局变量1、2和4;
♦信息修改模块(M2.3):
访问数据库和全局变量3;
♦查询模块(M2.4):
查询客户基本信息;
♦客户权益分配模块(M2.5):
利用全局变量4中的相应数据;
♦客户类型分配模(M2.6):
利用全局变量4、5中的相应数据;
♦接受订单模块(M3.1):
利用全局变量1中的数据;
♦订单审核模块(M3.2):
利用全局变量1和5中的信息;
♦撤销订单模块(M3.3):
完成用户撤销订单的功能;
♦修改订单模块(M3.4):
完成客户对已交订单的修改;
♦查询订单模块(M3.5):
完成查询客户订单的功能;
♦发货单模块(M4.1):
由公司像生产商发出订货单;
♦收款模块(M4.2):
公司向客户发出收款请求并收款;
♦综合查询模块(M4.3):
完成客户对整个过程的查询;
♦报表生成功能(M5.1):
当前记录生成报表;
♦打印功能(M6):
利用全局变量2、3和4;
♦导入导出模块(M7):
完成对数据的导入和导出;
♦帮助模块(M8):
为用户提供随时的操作帮助;
♦密码管理模块(M9):
完成对用户密码的管理;
♦身份验证模块(M10);完成对用户身份的验证,以便分配相应的功能;
3.3功能模块划分
3.3.1结构框图
3.4结构框图
3.3.2程序流图
3.3.3模块功能分析及外部设计
表4模块设计
功能分配
系统控制功能
♦初始化模块(M1.1);
♦刷新基本资料模块(M1.2);
♦刷新详细资料模块(M1.3);
♦关闭系统模块(M1.4);
♦系统功能模块(M1.5);
客户关系管理功能:
♦信息添加模块(M2.1);
♦信息删除模块(M2.2);
♦信息修改模块(M2.3);
♦刷新基本资料模块(M1.2);
♦刷新详细资料模块(M1.3);
♦查询模块(M2.4);
♦客户权益分配模块(M2.5);
♦客户类型分配模(M2.6);
订单管理功能:
♦接受订单模块(M3.1);
♦订单审核模块(M3.2);
♦撤销订单模块(M3.3);
♦修改订单模块(M3.4);
♦刷新基本资料模块(M1.2);
♦刷新详细资料模块(M1.3);
♦查询订单模块(M3.5);
销售与收款功能:
♦发货单模块(M4.1);
♦收款模块(M4.2);
♦综合查询模块(M4.3);
♦刷新基本资料模块(M1.2);
♦刷新详细资料模块(M1.3);
报表生成功能:
♦报表生成功能(M5);
打印功能:
♦打印功能(M6);
导入导出功能:
♦导入导出模块(M7);
帮助功能:
♦帮助模块(M8);
密码管理功能:
♦密码管理模块(M9);
身份验证功能:
♦身份验证模块(M10);
3.4抽象数据类定义
voidinput();//信息录入
voidoutput();//信息输出
voidamend();//信息修改
voidDelete();//修改操作
voidmenu();//菜单
voidsearch();//查找函数
4详细设计
4.1数据类型定义
structmember
{
intdate;//日期
charid[15];//客户编号
charname[11];//客户姓名最多5个汉字
intphonenumber[15];//电话号码最多5个汉字
};
4.2主要模块内部设计
voidmain()
{
intchoice;//存放用户的操作选项
menu();
while
(1)
{
printf("请选择:
");scanf("%d",&choice);//输入要执行功能的对应数字
switch(choice)
{
default:
exit(0);//调用结束函数
case1:
input();//调用输入函数break;
case2:
output();//调用输出函数break;
case3:
amend();//调用修改函数
break;
case4:
sta();//调用统计函数
break;
}
printf("\n\n");
menu();
}
}
4.2.1模块1设计
4.2.1.1模块算法
voidinput()//输入函数
{
inti=0;
charch[]="kk";
FILE*fp;
fp=fopen("D:
\\WORKERINFOR--1.rec","ab+");
while(i<99)
{
printf("客户编号:
");
getchar();
gets(num[i].id);
if(!
strcmp(num[i].id,ch))
break;
printf("客户姓名:
");
getchar();
gets(num[i].name);
printf("日期:
");getchar();
scanf("%d",&num[i].date);
printf("电话号码:
");getchar();
scanf("%d",&num[i].phonenumber);
printf("客户费用:
");getchar();
scanf("%f",&num[i].fee);
fwrite(&num[i],sizeof(num[i]),1,fp);
printf("该挂号信息已录完,请录入下一个客户信息!
\n\n");
i++;
}
if(i>=99)printf("挂号信息已录满!
!
!
\n");
fclose(fp);
}
4.2.1.2流程图
4.2.2模块2设计
voidoutput()//输出函数
{
inti=0;
charch;//储存字符Y/N
FILE*fp;
fp=fopen("D:
\\WORKERINFOR--1.rec","rb");
while(!
fp)//保证成功打开文件
fp=fopen("D:
\\WORKERINFOR--1.rec","rb");
printf("------------------------------------------------\n");
printf("客户编号客户姓名日期电话号码客户费用\n");
printf("------------------------------------------------\n");
while(fread(&num[i],sizeof(num[i]),1,fp)==1)
{
if(strcmp(num[i].name,num[i-1].name))//避免因删除了某条记录而造成的最后一条记录重复操作一次
{
printf("%s%s%d%d\n",num[i].id,num[i].name,num[i].date,num[i].phonenumber,num[i].fee);
}
i++;
}
do
{
printf("返回主菜单(Y/N):
");
getchar();//跳过回车符
ch=getchar();
if(ch=='y'||ch=='Y')break;
elseexit(0);
}while
(1);
}
4.2.3模块3设计
voidsta()//统计函数
{
inti=0,count=0;//count统计人数
charch;//接受回车符
floatfeesum=0;//numbersum表示本日客户费用
FILE*fp;
fp=fopen("D:
\\WORKERINFOR--1.rec","rb");
while(!
fp)//保证成功打开文件fp=fopen("D:
\\WORKERINFOR--1.rec","rb");
while(fread(&num[i],sizeof(num[i]),1,fp)==1)
{
if(strcmp(num[i].name,num[i-1].name))//避免因删除了某条记录而造成的最后一条记录重复操作一次
{
feesum=feesum+num[i].fee;
count++;
}
i++;
}
printf("本日总的客户费用:
%d总人数:
%d\n",feesum,count);
do
{
printf("返回主菜单(Y/N):
");
getchar();//跳过回车符
ch=getchar();
if(ch=='y'||ch=='Y')break;
elseexit(0);
}while
(1);
}
voidamend()//修改函数
{
inti=0,choose;//存放修改项
charNAME[11];
FILE*fp;
fp=fopen("D:
\\WORKERINFOR--1.rec","rb+");
while(!
fp)//保证成功打开文件
fp=fopen("D:
\\WORKERINFOR--1.rec","rb+");
printf("输入将要修改的客户编号:
");
scanf("%s",&NAME);
while(fread(&num[i],sizeof(num[i]),1,fp)==1)
{
if(!
strcmp(num[i].name,NAME))
{
printf("修改选项:
\n1、客户编号2、客户姓名3、日期4、电话号码10、费用\n请选择:
");
scanf("%d",&choose);
switch(choose)
{
case1:
printf("客户编号:
");
scanf("%s",&num[i].id);
break;
case2:
printf("客户姓名:
");
scanf("%s",&num[i].name);
break;
case3:
printf("日期:
");
scanf("%f",&num[i].date);
break;
case4:
printf("电话号码:
");
scanf("%d",&num[i].phonenumber);
break;
case5:
printf("客户费用:
");
scanf("%f",&num[i].fee);
break;
default:
printf("输入错误!
!
!
\n");
break;
}
fseek(fp,-68L,1);
fwrite(&num[i],sizeof(num[i]),1,fp);
printf("\n该挂号信息修改成功!
!
!
\n");
break;
}
i++;
}
fclose(fp);
}
5实现与调试分析
5.1实现环境
硬件:
装有WindowsXP的微型计算机。
软件:
MicrosoftVisualC++6.0。
5.2语言选择
C语言
5.3调试分析
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:
∙对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。
∙一些函数返回错误,需要用其他函数获得错误的具体信息。
例如accept返回INVALID_SOCKET表示accept失败,为了查明具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。
∙有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误
∙程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。
如果程序出了异常,却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。
∙另外:
VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。
因为只有这样,VC才能选择合适的编译、连接选项。
对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是MicrosoftVisualStudio为了加快编译速度而设置的预编译头文件。
在这个#include"stdafx.h"行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。
对于.c文件,由于不能