商品库存管理系统课程设计说明书Word文档格式.docx
《商品库存管理系统课程设计说明书Word文档格式.docx》由会员分享,可在线阅读,更多相关《商品库存管理系统课程设计说明书Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
工
作
量
1.主要包括程序的编码实现和数据库的设计
2.代码总行数为307行,数据库中两张表
划
第一周:
进行需求分析和业务流程图,实体关系图的绘制,建立逻辑模型
第二周:
进行类的设计和数据库的设计,编码测试
考
资
料
1.马光志等编著.C++程序设计实践教程.华中科技大学出版社,2001年
2.黄维通等编著.VisualC++面向对象与可视化程序设计.清华大学出版社,2000年
3.刘瑞新等编著.VisualC++面向对象程序设计教程.机械工业出版社
指导教师签字
基层教学单位主任签字
说明:
此表一式四份,学生、指导教师、基层教学单位、系部各一份。
年月日
燕山大学课程设计评审意见表
指导教师评语:
成绩:
年月日
答辩小组评语:
组长:
年月日
课程设计总成绩:
答辩小组成员签字:
摘要5
1.引言5
1.1面向对象程序设计思想5
1.2面向对象程序设计的优点5
2.总体设计5
2.1需求分析5
2.2程序流程图6
2.3实体-关系模型6
2.4类的设计7
2.4.1管理员类7
2.4.2商品基类7
2.4.3零售商品类7
2.4.4散称商品类7
2.4.5数据库连接类7
2.5数据库的设计7
3.实现方法8
3.1类的定义8
3.2类的实现10
3.3类的应用15
3.4程序源代码16
4.运行结果及分析25
5.结论26
6.心得体会26
参考文献28
摘要
商品库存管理系统是商店中不可缺少的部分,本篇主要利用C++面向对象编程的方法设计了一个商品库存管理系统,后台数据库采用轻量级数据库mysql5.0,管理员通过账号密码登录系统后实现对库存商品的增加,删除,修改,查询等功能,进而实现对商品库存的管理。
1.引言
面向对象程序设计与结构化程序设计考虑问题的角度不同,他的重点不是对问题本身的功能分解和各个功能的具体算法实现,而是从系统组成的角度进行分解,对问题进行自然分解,以更接近人类思维的方式建立问题域模型。
1.1面向对象程序设计思想
将数据及对数据的操作方法进行封装,作为一个有机体——对象。
封装使得算法和数据形成了相互依存的关系。
通过采用抽象、封装、继承和多态性等概念和措施,以一种模拟人类认知的方式对软件系统建模,从而构造出可重用性好、易维护的软件,提高软件的开放效率。
1.2面向对象程序设计的优点
1)程序模块之间的关系更为简单,程序模块的独立性、数据的安全性有良好的保障。
2)通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
2.总体设计
2.1需求分析
管理员可以登录系统,登录成功后对查询所有商品的名称,编号,数量,价格以及类型;
通过商品编号修改某一商品的价格;
通过商品编号删除该商品;
输入商品的名称,编号,数量,价格,类型进行添加;
2.2业务流程图
2.3实体-关系模型
2.4类的设计
2.4.1管理员类
管理员类静态属性有管理员姓名,管理员密码,管理员编号
动态方法有登录login();
2.4.2商品基类
商品基类静态属性有商品名称,商品价格,商品数量,商品编号,商品类型
动态方法有添加商品addGoods(),更新商品价格updateGoods(),删除商品deleteGoods(),查询所有商品getAllGoods();
其中添加商品addGoods()为纯虚函数,因为考虑到散称和零售商品添加的时候商品价格表示不同,所以设置成纯虚函数,由各自的类重写该方法。
2.4.3零售商品类
重写了添加商品addGoods();
价格设置成:
元/件
2.4.4散称商品类
元/kg
2.4.5数据库连接类
主要负责数据库的连接,操作指针的生成。
方法有构造方法DataBase();
初始化数据库连接
2.5数据库的设计
数据库中总共有两个表,管理员表adminer,商品表goods
管理员表adminer结构如下:
adminId管理员在数据库中的idadminName管理员姓名
adminPasswd密码adminNum管理员编号
管理员表adminer的内容如下:
商品表goods的结构如下:
商品表的内容如下:
3.实现方法
3.1类的定义
/**
*mysql数据库操作类
**/
classDataBase{
public:
DataBase();
MYSQL*conn;
MYSQL_RES*resSet;
MYSQL_ROWrow;
MYSQL_FIELD*field;
unsignedintret,numFields;
MYSQL*getConnection();
};
*管理员类
*/
classAdminer{
boollogin(stringuser,stringpwd);
//登录方法
*商品基类
classBaseGoods{
protected:
intgoodsId;
//数据库自增id
stringgoodsName;
//商品名称
stringgoodsNum;
//编号
stringgoodsPrice;
//价格
stringgoodsCount;
//剩余数量
stringgoodsType;
//类型
//基类属性的setget函数
voidsetGoodsId(intid);
intgetGoodsId();
voidsetGoodsName(stringname);
stringgetGoodsName();
voidsetGoodsNum(stringnum);
stringgetGoodsNum();
voidsetGoodsPrice(stringprice);
stringgetGoodsPrice();
voidsetGoodsCount(stringcount);
stringgetGoodsCount();
voidsetGoodsType(stringtype);
stringgetGoodsType();
//数据库操作函数
virtualvoidaddGoods(BaseGoods*goods)=0;
//纯虚函数--添加商品
voidupdateGoods(stringgoodsName,stringgoodsNum);
voiddeleteGoods(stringgoodsNum);
//删除商品
voidgetAllGoods(stringtype);
//查看所有商品
voidgetGoodsByCount(stringtype,intcount);
//条件查询库存数量低于count的商品
*散装商品类
classBulkGoods:
publicBaseGoods{
voidaddGoods(BaseGoods*goods);
*零售商品类
classRetailGoods:
3.2类的实现
DataBase:
:
DataBase(){
conn=mysql_init(NULL);
if(conn==NULL)
cout<
<
"
数据库初始化连接失败"
endl;
ret=mysql_options(conn,MYSQL_SET_CHARSET_NAME,"
gb2312"
);
//设置字符编码
if(ret!
=0)
数据库初始化设置失败"
if(mysql_real_connect(conn,"
localhost"
"
root"
yyn1995"
goodsManage"
0,NULL,0)==NULL)
数据库连接失败!
}
boolAdminer:
login(stringuser,stringpwd){
DataBasedb;
stringsql="
SELECTadminPasswdFROMadminerwhereadminNum='
+user+"
'
;
constchar*c_sql=sql.c_str();
if(mysql_query(db.conn,c_sql)){//查询成功返回非0
查询失败"
}else{
db.resSet=mysql_store_result(db.conn);
//查询失败返回NULL
if(db.resSet==NULL){
cout<
resSetisnull"
}else{
db.numFields=mysql_num_fields(db.resSet);
while((db.row=mysql_fetch_row(db.resSet))!
=NULL)
{
if(pwd!
=db.row[0])
returnfalse;
else
returntrue;
}
}
}
mysql_close(db.conn);
voidBaseGoods:
setGoodsId(intid){
if(id>
0)
this->
goodsId=id;
intBaseGoods:
getGoodsId(){
returngoodsId;
setGoodsName(stringname){
if(name.length()>
0&
&
name.length()<
=20)
goodsName=name;
stringBaseGoods:
getGoodsName(){
returngoodsName;
setGoodsNum(stringnum){
if(num.length()>
num.length()<
=5)
goodsNum=num;
getGoodsNum(){
returngoodsNum;
setGoodsPrice(stringprice){
if(price.length()>
goodsPrice=price;
getGoodsPrice(){
returngoodsPrice;
setGoodsCount(stringcount){
if(count.length()>
goodsCount=count;
getGoodsCount(){
returngoodsCount;
setGoodsType(stringtype){
this->
goodsType=type;
getGoodsType(){
returngoodsType;
deleteGoods(stringgoodsNum){//删除商品
deletefromgoodswhere编号='
+goodsNum+"
mysql_query(db.conn,c_sql);
intflag=mysql_affected_rows(db.conn);
if(flag>
cout<
删除"
flag<
条记录成功"
else
删除失败"
getAllGoods(stringtype){//按类型查询商品
SELECT*FROMgoodswhere类型='
+type+"
if(mysql_query(db.conn,c_sql)){//查询成功返回非0
mysql_queryfailed!
for(inti=0;
i<
db.numFields;
i++)
db.field=mysql_fetch_field_direct(db.resSet,i);
cout<
setw(10)<
db.field->
name;
for(inti=0;
mysql_num_fields(db.resSet);
i++)
{
cout<
db.row[i];
}
updateGoods(stringgoodsPirce,stringgoodsNum){//更新商品信息
updategoodsset价格='
+goodsPirce+"
where编号='
//执行插入一条商品记录操作
修改"
修改失败"
*散装商品
voidBulkGoods:
addGoods(BaseGoods*goods){//添加商品
stringname=goods->
getGoodsName();
stringnum=goods->
getGoodsNum();
stringcount=goods->
getGoodsCount();
count.append("
kg"
stringprice=goods->
getGoodsPrice();
price.append("
元/kg"
stringtype=goods->
getGoodsType();
insertintogoods(名称,编号,价格,数量,类型)values('
+name+"
'
+num+"
+price+"
+count+"
)"
插入"
插入失败"
*零售商品
voidRetailGoods:
addGoods(BaseGoods*goods){//零售商品的添加商品
件"
元/件"
3.3类的应用
voidmain(){
-------------商品库存管理----------"
boolflag=true;
boolflag2=true;
while(flag){
DataBasea;
RetailGoodsbg;
BaseGoods*goods=&
bg;
Adminerb;
boolresult;
stringuser,password;
while(flag2){//登录判断
请输入用户名和密码"
cin>
>
user>
password;
result=b.login(user,password);
if(result){
user<
欢迎使用"
flag2=false;
break;
}else{
用户名或密码错误"
if(result){
请输入操作号1.查看所有商品2.添加商品3.删除商品4.修改商品0.退出"
stringgoodsName,goodsNum,goodsPrice,goodsCount,goodsType;
intnum;
num;
switch(num){
case0:
flag=false;
break;
case1:
goods->
getAllGoods("
零售"
散装"
case2:
请输入商品名称,编号,价格,数量,类型"
cin>
goodsName>
goodsNum>
goodsPrice>
goodsCount>
goodsType;
bg.setGoodsName(goodsName);
bg.setGoodsNum(goodsNum);
bg.setGoodsPrice(goodsPrice);
bg.setGoodsCount(goodsCount);
bg.setGoodsType(goodsType);
addGoods(goods);
//向上转型分别调用对象各自的函数
case3:
请输入要删除的商品编号"
goodsNum;
deleteGoods(goodsNum);
case4:
请输入商品价格,商品编号"
updateGoods(goodsPrice,goodsNum);