在线音像制品销售系统说明书.docx
*实践教学* 兰州理工大学计算机与通信学院2011年秋季学期 面向对象 课程设计题 目:在线音像制品销售系统专业班级:计算机科学与技术1班 姓 名:赵王正 学 号:10240136 指导教师:年福忠 成 绩: 摘要在线音像制品销售系统是用于管理音像的出租和出售的系统。该系统用于音像出租或销售店,方便出售、销售、还回、查找等操作,可自定义音像,方便添加、管理音像和会员。提供完善的出租和还回操作,完全独立的数据库系统,数据管理提供:音像管理,会员管理。数据查询提供:租借情况,音像查询,会员查询。本系统界面美观,操作简单。 关键词:销售;信息查询;会员管理;数据库目 录摘要2一、需求分析11.1需求概述11.2需求说明1二、总体设计22.1算法设计22.2功能模块:32.3组织结构3三、详细设计43.1 系统IPO图43.2 数据库设计61. 概念结构设计62. 逻辑结构设计73. 数据库表格设计8四、编码11五、调试13六、设计总结18致谢19参考文献20附录(源程序清单)211一、需求分析1.1需求概述 设计一个在线音像制品销售系统,使之能提供以下功能:(1)顾客查询管理功能(2)管理人员查询音像制品功能(3)管理人员添加音像制品功能1.2需求说明 (1)系统要实现基本信息录入、修改、查询等功能:客户管理。库存管理(包括入库和发货)。统计分析。(2)系统要实现满足多种条件的统计分析功能,有些统计数据要采用图表的格式呈现;(3)销售管理系统所涉及的信息有: 客户信息。包括的数据项有:客户代码、名称、联系人,地址、电话,手机,传真,邮编,E-mail,税号,开户行,账号,信誉度等。商品信息。包括的数据项有:商品代码、商品名称、品牌、供应商名称、尺码、款式、颜色、面料、包装方式等。入库/发货信息。包括的数据项有:入库/发货单号、客户代码、经手人、商品代码、数量、单价、金额、日期等。统计分析。主要包括库存信息、销售信息、利润分析等。二、总体设计2.1算法设计系统主要流程如图1所示:结束选择4,退出程序调用相应的函数Choice判断进入菜单界面,选择相应的操作的编号。开始图1 系统主要流程图2.2功能模块:模块如图2所示: 音像店管理系统管理员属性顾客管理影碟管理 图2 模块图2.3组织结构组织结构如图3所示负责人业务柜台采购中心采购员员工顾客会员 图3 组织结构图三、详细设计3.1 系统IPO图音像管理模块完成音像店音像信息相关的操作如图4所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:音像管理日期:2011-06-23由下列模块调用:调用下列模块:系统主模块添加音像、修改音像、删除音像、查询音像输入: 输出: 编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数音像管理操作是否成功处理内容: 检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。图4音像管理IPO图客户管理模块完成会员顾客信息相关的操作如图5所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:客户管理日期:2011-06-23由下列模块调用:调用下列模块:系统主模块添加会员、修改会员、删除会员、查询会员输入: 输出: 顾客编号,姓名,电话,OICQ,Email会员管理操作是否成功处理内容: 检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。图5音像管理IPO图操作员管理模块完成系统操作员即员工信息相关的操作如图6所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:操作员管理日期:2011-06-23由下列模块调用:调用下列模块:系统主模块添加、修改、删除和查询操作员输入: 输出: 编号,姓名,密码,锁屏密码操作员管理操作是否成功处理内容: 检查输入信息的合法性后,调用数据库添加、修改、删除或者查询操作并返回结果信息。图6操作员管理IPO图日常操作模块是完成日常业务工作操作的模块如图7所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:日常操作模块日期:2011-06-23由下列模块调用:调用下列模块:系统主模块销售音像、出租音像、归还音像输入: 输出: 顾客编号,音像编号,日期售/借/还操作是否成功处理内容: 检查输入信息的合法性后,调用数据库修改操作,完成音像的销售、出租或者归还操作,修改数据库信息。图7日常操作IPO图查询模块是完成顾客对库存音像信息、可租音像信息查询的操作如图8所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:查询模块日期:2011-06-23由下列模块调用:调用下列模块:系统主模块输入: 输出: 查询关键词和关键词的类型满足条件的查询结果处理内容: 检查输入信息的合法性后,调用数据库查询操作,完成对音像信息、顾客信息或者租借记录的查询。图8查询模块IPO图用户登录模块是系统用户登录该管理系统进行身份认证的操作如图9所示。IPO图系统名:音像制品出租及销售管理系统 制图者:冯伟强模块图:用户登录日期:2011-06-23由下列模块调用:调用下列模块:系统主模块输入: 输出: 用户名、密码。处理内容: 验证用户名和密码的合法性,并根据用户权限,进入不同的主界面。图9用户登陆IPO图3.2 数据库设计1. 概念结构设计概念模型可以看成是现实世界到机器世界的一个过渡的中间层,是整个数据库设计的关键。概念结构设计的结果是产生概念模型,将现实世界中的客观对象首先抽象为不依赖任何具体机器的信息结构,这种信息结构不是DBMS支持的数据模型,而是概念型模型。然后再把概念模型转换为具体机器上的DBMS支持的数据模型。要对数据词典中的数据存储进行分析,得到系统的关系模型,可以采用实体联系图(简称E-R图)的方法来进行数据结构分析,从而得出概念模型。E-R图由实体、联系、属性三部分组成。(1)、实体和属性实体指客观存在并可相互区分的事物,可以是人、物、实际对象、某些概念、事物本身,也可指事物和事物之间的联系。属性是实体具有的某一特性。一个实体可以由若干个属性来描述。具体到该系统,概念设计得到的实体和对应属性如表10所示:实体属性音像制品编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数顾客顾客编号,姓名,电话,OICQ,Email操作员编号,姓名,密码,锁屏密码系表10系统实体及其属性表(2)、实体间联联系是指现实世界的事物之间的联系。这种联系反映到信息世界中,就分为两类,一类是实体内部的联系,另一类是实体之间的联系。两个实体之间的联系可分为三类:1)一对一的联系(1:1)2)一对多的联系(1:n)3)多对多的联系(n: m)本系统包括的联系如表11所示:实体一实体二联系名称联系类别备注音像顾客租借M:N对应租借日志表表11系统联系表2. 逻辑结构设计逻辑结构设计的任务是根据DBMS的特征把概念模型转换为相应的逻辑结构。概念设计所得到的E-R模型,是独立与DBMS的,这里的转换就是把表示概念结构的E-R图转换为层次模型或网状模型或关系模型的逻辑结构。E-R图向关系模型的转化要解决的问题是如何将实体和实体间的联系转换为关系模型,如何确定这些关系模式的属性和码。E-R模型转换为关系模型的一般转换规则包括以下两条:(1)、实体类型的转换将每个实体类型转换为一个关系模式,实体的属性即为关系模式的属性,实体标志符即为关系模式的键。(2)、联系类型的转换根据不同的情况做不同的处理:1)若实体间的联系是1:1的,可以在两个实体类型转换成的两个关系模式中的任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。2)若实体间的联系是1:N的,可以在N端实体类型转换成的关系模式中加入1端实体类型转换成的关系模式的键和联系类型的属性。若实体间的联系是M:N的,可以将联系也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。根据上述转换规则,得到本系统的关系模式如下:音像制品:(音像编号,影片名称,时间长度,导演,发行年度,影片介绍,购买价格,出租价格,影片类型,影片格式,影片语言,总数)顾客:(顾客编号,姓名,电话,OICQ,Email)操作员:(编号,姓名,密码,锁屏密码)租借日志:(顾客编号、音像编号、借阅日期、归还日期)销售日志(顾客编号、音像编号、销售日期)3. 数据库表格设计我在系统中定义的表格都严格地按照范式的思想和要求去完成,数据库中的所有表格都达到了三范式的要求。针对本系统的特点和需要实现的功能,在对所搜集的数据进行规范化之后,定义了如下9表格,分别是管理员表、客户管理表、客户日志表、演员表、演员格式、影片类型、影片资料、价格自定义表。通过对这九张表格的操作可以较好地完成系统设计的各项功能,9张表格之间有着不同程度的联系。(1)、管理员表管理员表主要用于记录音像店管理操作员的的详细信息,包括姓名、密码、销售总数、级别、解屏密码等相关信息,主要提供管理员对相关信息的管理,在此表中姓名是主键。管理员可以对管理员信息进行添加、查询、删除、修改等操作。ID姓名密码销售数量级别解屏密码1文本数字数字文本数字表12管理员表(2)、客户表客户表主要用于记录有客户会员的各类信息,包括客户姓名、客户号、电话、OICQ等。它主要用来为管理员提供本音像店所有会员的有关信息以进行相关的优惠或者奖励。ID客户姓名客户号电话OICQEmail1文本数字数字数字文本表13客户表(3)、客户日志表主要是为操作员提供客户是否已经租借音像制品信息信息,操作员根据这些信息进行操作,就可以在此表中查询日志的相关信息,比如:客户姓名、影片编号、借出时期。ID客户姓名影片编号借出时期1文本数字日期/时间表14客户日志表(4)、演员表每一影片都有自己的主要的演员,这个表就为顾客全面的介绍了所有影片的演员,帮助顾客了解和选取自己满意的影片。ID影片编号 演员1文本文本表15演员表(5)、影片格式表影片格式表定义了影片的格式,有三种选择:VCD,DVD,RM。ID影片格式1文本表16影片格式表(6)、影片类型表影片类型表里集中了关于影片类型的信息,包括科幻、动画、喜剧、恐怖、贺岁、警匪、历史、伦理、动作、战争、灾难、爱情等类型。ID 影片类型1文本表17影片类型表(7)、影片语言表因为所有影片的语言不是一样的,所以我们设计出了这个表,语言包括中文、英语、日语、法语。ID影片语言1文本表18影片语言表(8)、影片资料表影片资料是总表,基本包括了影片的所有属性,包括:影片编号、影片名称、时间长度、导演、发行年度、影片介绍等等,顾客根据这些影片资料进行选择影片。ID编号名称时间导演年度价格类型格式语言介绍租价数字1数字文本数字文本数字数字文本文本文本文本数字数字表19影片资料表(9)、价格定义表主要介绍影片资料的出租以及销售的价格。ID购买价格租出价格1数字数字表20购买价格表四、编码# include <fstream.h> /包含文件读写# include <iostream.h># include <string.h> /包含strcmp()字符是否相等#include <stdlib.h> /包含system("cls")清屏#define MAX 20 /下列字符数组的大小struct Date/日期 char yearMAX;/年 char monthMAX;/月 char dayMAX;/日;struct Goods/物品信息 char nameMAX;/音像名称 char priceMAX;/音像价格 char numberMAX;/音像数量 char costMAX;/音像总价 char kindMAX;/音像的种类 Date indate;/购进日期 Goods * next;/下一个结点 ;class yinxiangzhipini /类定义与实现private: int length;/客户数量 Goods * head;/列表的头结点 Goods * current;/当前结点public: yinxiangzhipin ()/构造函数 head=new Goods;/创建头结点 current=head; current->next=NULL; length=0;/长度为0 void Creatlist()/创建新的列表 char g='Y' int s=0; length=0;/初始长度为0;current=head;do Goods * temp=new Goods ;/构建新结点信息 length+; /每加一个结点 链表长度增1 temp->next=NULL; cout<<" 请输入音像名称: " cin>>temp->name; cout<<" 请输入音像单价 : " cin>>temp->price; cout<<" 请输入音像数量: " cin>>temp->number; cout<<" 请输入总费用 : " cin>>temp->cost; cout<<" 请输入日期 (* * *) : " cin>>temp->indate.year>>temp->indate.month>>temp->indate.day; cout<<" 请输入的种类: " cin>>temp->kind; if(head=NULL)head=temp;current=temp; /head头指针,current尾指针 else current->next=temp,current=temp; do cout<<" next ? (Y N) " /是否继续存入新产品 cin>>g; if(g!='Y'&&g!='N') cout<<"n error !n " while(g!='Y'&&g!='N'); while(g='Y');/判断是否继续插入新结点五、调试程序输入与结果输出:5.1主菜单:5.2音碟管理子菜单:5.3查找音碟: 5.4查看音碟库存:5.5打印音碟详情:5.6顾客管理子菜单:5.7显示已有顾客的信息: 5.8注册新顾客 5.9顾客出租一张音碟:5.10顾客返回一张音碟:5.11管理员属性子菜单:5.12重设音碟数量: 5.13增加管理员: 5.14管理员一览:5.15退出总程序: 六、设计总结此次课程设计是第一次利用面向对象程序设计思想来编写程序。在整个过程中并不是十分成功的,但结果还是令人满意的,最终程序还是可以运行了。不但完成了实验的要求,而且还更加深刻了自己对面向对象编程的思想:面向对象程序设计是对数据的封装;范式(模板)的程序设计是对算法的封装。利用面向对象思想编程是可以简化程序员的懒惰,无论是对象,还是函数,如果你输入有问题,那么都会在编译的时候报告出来,方便你修改,而不是在执行的时候出错,害的你到处去捉虫子。 这就是用面向对象思想编程的好处。通过此次实验,我学到了许多知识。 程序的成功运行离不开老师的教导,在此,十分感谢课程设计老师的指导!致谢在这次课程设计的撰写过程中,我得到了很多人的帮助。首先,我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次课设的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。其次,我要感谢帮过我的同学,他们也为我解决了不少我不太明白的问题。同时也感谢学院为我提供良好的做课程设计的坏境。最后,再一次的感谢所有在设计中帮助过我的良师益友和同学。参考文献1 周靖译.C+面向对象程序设计基础、数据结构与编程思想,清华大学出版2 王连相.C/C+程序设计上机指导与测试. 北京:中国铁道出版社,20063 钱能.C+程序设计教程,清华大学出版社,19994 王育坚等.Visual C+程序基础教程,北京邮电大学出版社,20005 陈文宇.面向对象程序设计语言C 机械工业出版社,20046 廉师友.C+面向对象程序设计简明教程,西安电子科技大学出版社,19987 刁成嘉.面向对象C+程序设计,机械工业出版社,20048 江明德.面向对象的程序设计,电子工业出版社,1993附录(源程序清单)#include <vector>#include <fstream>#include <string.h>#include "VideoType.h"#include "VideoListType.h"#include "CustomerType.h"#include "CustomerListType.h"#include "AdminstratorType.h"#include "AdminstratorListType.h"using namespace std;int Member = 0;/顾客会员号int Num=0;/管理员工作号/从文件VideoData.txt中读取数据并创建影碟列表void createVideoList(ifstream &infile, VideoListType &videolist)char title50, star150, star250, producer50, director50, productionco70, ch;int instock, videoid;VideoType newvideo;infile.get(title, 50);infile.get(ch);while (infile)infile.get(star1, 50);infile.get(ch);infile.get(star2, 50);infile.get(ch);infile.get(producer, 50);infile.get(ch);infile.get(director, 50);infile.get(ch);infile.get(productionco, 50);infile.get(ch);infile >> instock;infile.get(ch);infile >> videoid;infile.get(ch);newvideo.setVideoInfo(title, star1, star2, producer, director, productionco, instock, videoid);videolist.push_back(newvideo);infile.get(title, 50);infile.get(ch);/从文件CustomerData.txt中读取数据并创建顾客会员列表void createCustomerList(ifstream &infile, CustomerListType &customerlist)char name20,ch,str150; int num,id50;CustomerType newcustomer;infile.get(name, 20);infile.get(ch);while (infile) Member+; infile.get(str1,50); infile.get(ch); infile >> num; infile.get(ch); for(int i=0;i<50;i+) idi=str1i; idi=idi-48;newcustomer.setCustomerInfo(name,num,id);customerlist.push_back(newcustomer);infile.get(name, 20);infile.get(ch);/从文件AdminstratorData.txt中读取数据并创建管理员列表void createAdminstratorList(ifstream &infile, AdminstratorListType &Adminstratorlist)char name20,ch; int num;AdminstratorType newadminstrator;infile.get(name, 20);infile.get(ch);while (infile) Num+; infile >> num; infile.get(ch);newadminstrator.setAdminstratorInfo(name,num);Adminstratorlist.push_back(newadminstrator);infile.get(name, 20);infile.get(ch);void Menu1()cout << "tt" <<endl;cout << "tt 欢迎进入影像店系统 " <<endl;cout << "tt 1: 音碟管理 " <<endl;cout << "tt 2: 顾客管理 " <<endl;cout << "tt 3: 管理员属性 " <<endl;cout << "tt 4: 退出 "<<endl;cout << "tt" <<endl;void Menu2()cout << "*" <<endl;cout << "* 欢迎进入音碟管理 *" <<endl;cout << " 1: 查找音碟 *" << endl; cout << " 2: 库存音碟 *" << endl; cout << " 3: 打印所有音碟详情 *" << endl;cout << " 4: 退出 *" <<endl;cout << "*" <<endl;void Menu3()cout << "*" <<endl;cout << "* 欢迎进入顾客管理 *" <<endl;cout << " 1: 显示已有顾客的信息 *" << endl;cout << " 2: 注册新顾客 *" << endl;cout << " 3: 顾客出租一张影碟 *" << endl;cout << " 4: 顾客返回一张影碟 *" << endl; cout << " 5: 退出 *" <<endl;cout << "*" <<endl;void Menu4()cout << "*" <<endl;cout << "* 欢迎进入管理员属性 *" <<endl; cout << " 1: 重新设置某张影碟的数量 *" << endl;cout << " 2: 增加管理员 *" << endl;cout << " 3: 管理员一览 *" << endl; cout << " 4: 退出 *" <<endl;cout << "*" <<endl;/从文件中写入注册的新会员void login(CustomerListType &customerlist)Member+;char name50;int title50 = 0;CustomerType customer; ofstream file;/打开CustomerData.txt输入文件file.open("f:CustomerData.txt",ios:app);cout << "输入新会员的名字:" << endl;cin >> name;file << name;file << "n"file << 0; file << "n" file << Member; file << "n"file.close();customer.setCustomerInfo(name,Member,title);customerlist.push_back(customer);cout << "注册成功!会员号为:" << Member << endl << endl;/从文件中写入增加的新管理员void creat(AdminstratorListType &Adminstratorlist)Num+;char name50;int title50 = 0;AdminstratorType adminstrator; ofstream file;/打开AdminstratorData.txt输入文件file.open("f:AdminstratorData.txt",ios:app);cout << "输入新管理员的名字:" << endl;cin >> name;file << name;file << "n" file << Num; file << "n"file.close(); adminstrator.setAdminstratorInfo(name, Num);Adminstratorlist.push_back(adminstrator);cout << "注册成功!工作号为:" << Num << endl << endl;int main()VideoListType videolist;CustomerListType customerlist;AdminstratorListType Adminstratorlist;int choice, number;char ch, title50, name50;ifstream file1,file2,file3;/打开VideoData.txt输入文件file1.open("f:VideoData.txt");if (!file1)cout << "VideoData.txt文件不存在!" << endl;return 1;/创建影碟列表createVideoList(file1, videolist);file1.close();/打开AdminstratorData.txt输入文件file2.open("f:AdminstratorData.txt");if (!file2)cout << "AdminstratorData.txt文件不存在!" << endl;return 1;/创建管理员列表createAdminstratorList(file2, Adminstratorlist);file2.close(); /打开CustomerData.txt输入文件file3.open("f:CustomerData.txt");if (!file3)cout << "CustomerData.txt文件不存在!" << endl;return 1;/创建顾客会员列表createCustomerList(file3, customerlist);file3.close();/显示菜单Menu1();cout << "输入选项:" << endl;cin >> choice;/处理输入while (choice != 4)switch (choice)case 1:int a;Menu2();cout<<"请输入选项:"<<endl;cin>>a;while (a!=4)switch (a)case 1: cout << "输入音碟名称:" << endl; cin.get(ch);