资源描述
。
燕山大学
课 程 设 计 说 明 书
题目: 商品库存管理系统
学院(系):理学院
年级专业:13级应用软件
学 号:130108010020
学生姓名:杨亚南
指导教师:聂栋栋
燕山大学课程设计(论文)任务书
院(系): 理学院信息与计算科学系 基层教学单位:
学 号
130108010020
学生姓名
杨亚南
专业(班级)
应用软件
设计题目
商品库存管理系统
设
计
技
术
参
数
1. 以C++面向对象的设计思想完成设计任务;
2. 详细说明设计中的各个类,尤其是各类的属性及所提供的接口;
3. 要求对任务问题进行详细分析,说明程序所实现的功能;
4. 通过具体的应用程序对所实现的功能进行测试,并给出结果;
设
计
要
求
1. 详细说明程序的总体设计,及各个类的设计细节;
2. 写出各自对这次设计的心得体会;
3. 要求4篇以上参考文献;
4. 报告正文在5000字以上;
工
作
量
1. 主要包括程序的编码实现和数据库的设计
2. 代码总行数为307行,数据库中两张表
工
作
计
划
第一周:进行需求分析和业务流程图,实体关系图的绘制,建立逻辑模型
第二周:进行类的设计和数据库的设计,编码测试
参
考
资
料
1.马光志等编著. C++程序设计实践教程. 华中科技大学出版社,2001年
2.黄维通等编著.Visual C++ 面向对象与可视化程序设计.清华大学出版社,2000年
3.刘瑞新等编著. Visual C++ 面向对象程序设计教程. 机械工业出版社
指导教师签字
基层教学单位主任签字
说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。
年 月 日
燕山大学课程设计评审意见表
指导教师评语:
成绩:
指导教师:
年 月 日
答辩小组评语:
成绩:
组长:
年 月 日
课程设计总成绩:
答辩小组成员签字:
年 月 日
-可编辑修改-
。
目 录
摘要 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++面向对象编程的方法设计了一个商品库存管理系统,后台数据库采用轻量级数据库mysql 5.0,管理员通过账号密码登录系统后实现对库存商品的增加,删除,修改,查询等功能,进而实现对商品库存的管理。
1. 引言
面向对象程序设计与结构化程序设计考虑问题的角度不同,他的重点不是对问题本身的功能分解和各个功能的具体算法实现,而是从系统组成的角度进行分解,对问题进行自然分解,以更接近人类思维的方式建立问题域模型。
1.1 面向对象程序设计思想
将数据及对数据的操作方法进行封装,作为一个有机体——对象。封装使得算法和数据形成了相互依存的关系。
通过采用抽象、封装、继承和多态性等概念和措施,以一种模拟人类认知的方式对软件系统建模,从而构造出可重用性好、易维护的软件,提高软件的开放效率。
1.2 面向对象程序设计的优点
1) 程序模块之间的关系更为简单,程序模块的独立性、数据的安全性有良好的保障。
2) 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
2. 总体设计
2.1 需求分析
管理员可以登录系统,登录成功后对查询所有商品的名称,编号,数量,价格以及类型;
通过商品编号修改某一商品的价格;
通过商品编号删除该商品;
输入商品的名称,编号,数量,价格,类型进行添加;
2.2 业务流程图
开始
输入用户名
以及密码
登录验证
添加
删除
修改
查询
退出
操作选择
注销用户
结束
1
2
0
4
3
否
是
2.3 实体-关系模型
商品
管理
管理员
姓名
编号
密码
名称
编号
数量
价格
类型
1
n
2.4 类的设计
2.4.1 管理员类
管理员类静态属性有管理员姓名,管理员密码,管理员编号
动态方法有登录login();
2.4.2 商品基类
商品基类静态属性有商品名称,商品价格,商品数量,商品编号,商品类型
动态方法有添加商品addGoods(),更新商品价格updateGoods(),删除商品 deleteGoods(),查询所有商品 getAllGoods();
其中添加商品addGoods()为纯虚函数,因为考虑到散称和零售商品添加的时候商品价格表示不同,所以设置成纯虚函数,由各自的类重写该方法。
2.4.3 零售商品类
重写了添加商品addGoods();价格设置成:元/件
2.4.4 散称商品类
重写了添加商品addGoods();价格设置成:元/kg
2.4.5 数据库连接类
主要负责数据库的连接,操作指针的生成。
方法有构造方法DataBase();初始化数据库连接
2.5 数据库的设计
数据库中总共有两个表,管理员表adminer,商品表goods
管理员表adminer结构如下:
adminId 管理员在数据库中的id adminName 管理员姓名
adminPasswd 密码 adminNum 管理员编号
管理员表adminer的内容如下:
商品表goods的结构如下:
商品表的内容如下:
3. 实现方法
3.1 类的定义
/**
* mysql数据库操作类
**/
class DataBase{
public:
DataBase();
MYSQL *conn;
MYSQL_RES *resSet;
MYSQL_ROW row;
MYSQL_FIELD *field;
unsigned int ret,numFields;
MYSQL* getConnection();
};
/**
* 管理员类
*/
class Adminer{
public:
bool login(string user,string pwd); //登录方法
};
/**
* 商品基类
**/
class BaseGoods{
protected:
int goodsId; //数据库自增id
string goodsName; //商品名称
string goodsNum; //编号
string goodsPrice;//价格
string goodsCount;//剩余数量
string goodsType; //类型
public:
//基类属性的set get函数
void setGoodsId(int id);
int getGoodsId();
void setGoodsName(string name);
string getGoodsName();
void setGoodsNum(string num);
string getGoodsNum();
void setGoodsPrice(string price);
string getGoodsPrice();
void setGoodsCount(string count);
string getGoodsCount();
void setGoodsType(string type);
string getGoodsType();
//数据库操作函数
virtual void addGoods(BaseGoods* goods)=0; //纯虚函数--添加商品
void updateGoods(string goodsName,string goodsNum);
void deleteGoods(string goodsNum); //删除商品
void getAllGoods(string type); //查看所有商品
void getGoodsByCount(string type,int count); //条件查询库存数量低于count的商品
};
/**
* 散装商品类
**/
class BulkGoods:public BaseGoods{
public:
void addGoods(BaseGoods* goods);
};
/**
* 零售商品类
**/
class RetailGoods:public BaseGoods{
public:
void addGoods(BaseGoods* goods);
};
3.2 类的实现
/**
* mysql数据库操作类
**/
DataBase::DataBase(){
conn=mysql_init(NULL);
if(conn==NULL)
cout<<"数据库初始化连接失败"<<endl;
ret=mysql_options(conn,MYSQL_SET_CHARSET_NAME,"gb2312"); //设置字符编码
if(ret!=0)
cout<<"数据库初始化设置失败"<<endl;
if(mysql_real_connect(conn,"localhost","root","yyn1995","goodsManage",0,NULL,0)==NULL)
cout<<"数据库连接失败!"<<endl;
}
/**
* 管理员类
*/
bool Adminer::login(string user,string pwd){
DataBase db;
string sql="SELECT adminPasswd FROM adminer where adminNum='"+user+"'";
const char *c_sql=sql.c_str();
if(mysql_query(db.conn, c_sql)){ //查询成功返回非0
cout<<"查询失败"<<endl;
}else{
db.resSet = mysql_store_result(db.conn); //查询失败返回NULL
if(db.resSet==NULL){
cout<<"resSet is null"<<endl;
}else{
db.numFields = mysql_num_fields(db.resSet);
while ((db.row = mysql_fetch_row(db.resSet)) != NULL)
{
if(pwd!=db.row[0])
return false;
else
return true;
}
}
}
mysql_close(db.conn);
}
/**
* 商品基类
**/
void BaseGoods::setGoodsId(int id){
if(id>0)
this->goodsId=id;
}
int BaseGoods::getGoodsId(){
return goodsId;
}
void BaseGoods::setGoodsName(string name){
if(name.length()>0&&name.length()<=20)
this->goodsName=name;
}
string BaseGoods::getGoodsName(){
return goodsName;
}
void BaseGoods::setGoodsNum(string num){
if(num.length()>0&&num.length()<=5)
this->goodsNum=num;
}
string BaseGoods::getGoodsNum(){
return goodsNum;
}
void BaseGoods::setGoodsPrice(string price){
if(price.length()>0)
this->goodsPrice=price;
}
string BaseGoods::getGoodsPrice(){
return goodsPrice;
}
void BaseGoods::setGoodsCount(string count){
if(count.length()>0)
this->goodsCount=count;
}
string BaseGoods::getGoodsCount(){
return goodsCount;
}
void BaseGoods::setGoodsType(string type){
this->goodsType=type;
}
string BaseGoods::getGoodsType(){
return goodsType;
}
void BaseGoods::deleteGoods(string goodsNum){ //删除商品
DataBase db;
string sql="delete from goods where 编号='"+goodsNum+"'";
const char *c_sql=sql.c_str();
mysql_query(db.conn,c_sql);
int flag=mysql_affected_rows(db.conn);
if(flag>0)
cout<<"删除"<<flag<<"条记录成功"<<endl;
else
cout<<"删除失败"<<endl;
mysql_close(db.conn);
}
void BaseGoods::getAllGoods(string type){ //按类型查询商品
DataBase db;
string sql="SELECT * FROM goods where 类型='"+type+"'";
const char *c_sql=sql.c_str();
if(mysql_query(db.conn, c_sql)){ //查询成功返回非0
cout<<"mysql_query failed!"<<endl;
}else{
db.resSet = mysql_store_result(db.conn); //查询失败返回NULL
if(db.resSet==NULL){
cout<<"resSet is null"<<endl;
}else{
db.numFields = mysql_num_fields(db.resSet);
for(int i=0; i < db.numFields; i++)
{
db.field = mysql_fetch_field_direct(db.resSet, i);
cout<<setw(10)<<db.field->name;
}
cout<<endl;
while ((db.row = mysql_fetch_row(db.resSet)) != NULL)
{
for (int i = 0; i < mysql_num_fields(db.resSet); i ++)
{
cout<<setw(10)<<db.row[i];
}
cout<<endl;
}
}
}
mysql_close(db.conn);
}
void BaseGoods::updateGoods(string goodsPirce,string goodsNum){ //更新商品信息
DataBase db;
string sql="update goods set 价格='"+goodsPirce+"' where 编号='"+goodsNum+"'";
const char *c_sql=sql.c_str();
mysql_query(db.conn,c_sql); //执行插入一条商品记录操作
int flag=mysql_affected_rows(db.conn);
if(flag>0)
cout<<"修改"<<flag<<"条记录成功"<<endl;
else
cout<<"修改失败"<<endl;
mysql_close(db.conn);
}
/**
* 散装商品
**/
void BulkGoods::addGoods(BaseGoods* goods){ //添加商品
DataBase db;
string name=goods->getGoodsName();
string num=goods->getGoodsNum();
string count=goods->getGoodsCount();
count.append("kg");
string price=goods->getGoodsPrice();
price.append("元/kg");
string type=goods->getGoodsType();
string sql="insert into goods(名称,编号,价格,数量,类型)values('"+name+"','"+num+"','"+price+"','"+count+"','"+type+"')";
const char *c_sql=sql.c_str();
mysql_query(db.conn,c_sql); //执行插入一条商品记录操作
int flag=mysql_affected_rows(db.conn);
if(flag>0)
cout<<"插入"<<flag<<"条记录成功"<<endl;
else
cout<<"插入失败"<<endl;
mysql_close(db.conn);
}
/**
* 零售商品
**/
void RetailGoods::addGoods(BaseGoods* goods){ //零售商品的添加商品
DataBase db;
string name=goods->getGoodsName();
string num=goods->getGoodsNum();
string count=goods->getGoodsCount();
count.append("件");
string price=goods->getGoodsPrice();
price.append("元/件");
string type=goods->getGoodsType();
string sql="insert into goods(名称,编号,价格,数量,类型)values('"+name+"','"+num+"','"+price+"','"+count+"','"+type+"')";
const char *c_sql=sql.c_str();
mysql_query(db.conn,c_sql); //执行插入一条商品记录操作
int flag=mysql_affected_rows(db.conn);
if(flag>0)
cout<<"插入"<<flag<<"条记录成功"<<endl;
else
cout<<"插入失败"<<endl;
mysql_close(db.conn);
}
3.3 类的应用
void main(){
cout<<" -------------商品库存管理----------"<<endl;
bool flag=true;
bool flag2=true;
while(flag){
DataBase a;
RetailGoods bg;
BaseGoods* goods=&bg;
Adminer b;
bool result;
string user,password;
while(flag2){ //登录判断
cout<<"请输入用户名和密码"<<endl;
cin>>user>>password;
result=b.login(user,password);
if(result){
cout<<user<<"欢迎使用"<<endl;
flag2=false;
break;
}else{
cout<<"用户名或密码错误"<<endl;
}
}
if(result){
cout<<"请输入操作号 1.查看所有商品 2.添加商品 3.删除商品 4.修改商品 0.退出"<<endl;
string goodsName,goodsNum,goodsPrice,goodsCount,goodsType;
int num;
cin>>num;
switch(num){
case 0:
flag=false;break;
case 1:
goods->getAllGoods("零售");
goods->getAllGoods("散装");
break;
case 2:
cout<<"请输入商品名称,编号,价格,数量,类型"<<endl;
cin>>goodsName>>goodsNum>>goodsPrice>>goodsCount>>goodsType;
bg.setGoodsName(goodsName);
bg.setGoodsNum(goodsNum);
bg.setGoodsPrice(goodsPrice);
bg.setGoodsCount(goodsCount);
bg.setGoodsType(goodsType);
goods->addGoods(goods); //向上转型 分别调用对象各自的函数
break;
case 3:
cout<<"请输入要删除的商品编号"<<endl;
cin>>goodsNum;
goods->deleteGoods(goodsNum);
break;
case 4:
cout<<"请输入商品价格,商品编号"<<endl;
cin>>goodsPrice>>goodsNum;
goods->updateGoods(goodsPrice,goodsNum);
break;
}
}
}
}
3.4 程序代码
#include <iostream>
#include<iomanip>
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <mysql.h>
#include <string>
#pragma comment(lib, "libmysql.lib")
using namespace std;
/**
* mysql数据库操作类
**/
class DataBase{
public:
DataBase();
MYSQL *conn;
MYSQL_RES *resSet;
MYSQL_ROW row;
MYSQL_FIELD *field;
unsigned int ret,numFields;
MYSQL* getConnection();
};
DataBase::DataBase(){
conn=mysql_init(NULL);
if(conn==NULL)
cout<<"数据库初始化连接失败"<<endl;
ret=mysql_options(conn,MYSQL_SET_CHARSET_NAME,"gb2312"); //设置字符编码
if(ret!=0)
cout<<"数据库初始化设置失败"<<endl;
if(mysql_real_connect(conn,"localhost","root","yyn1995","goodsManage",0,NULL,0)==NULL)
cout<<"数据库连接失败!"<<endl;
}
/**
* 管理员类
*/
class Adminer{
public:
bool login(string user,string pwd); //登录方法
};
bool Adminer::login(string user,string pwd){
DataBase db;
string sql="SELECT adminPasswd FROM adminer where adminNum='"+user+"'";
const char *c_sql=sql.c_str();
if(mysql_query(db.conn, c_sql)){ //查询成功返回非0
cout<<"查询失败"<<endl;
}else{
db.resSet = mysql_store_result(db.conn); //查询失败返回NULL
if(db.resSet==NULL){
cout<<"resSet is null"<<endl;
}else{
db.numFields = mysql_num_fields(db.resSet);
while ((db.row = mysql_fetch_row(db.resSet)) != NULL)
{
if(pwd!=db.row[0])
return false;
else
return true;
}
}
}
mysql_close(db.conn);
}
/**
* 商品基类
**/
class BaseGoods{
protected:
int goodsId; //数据库自增id
string goodsName; //商品名称
string goodsNum; //编号
string goodsPrice;//价格
string goodsCount;//剩余数量
string goodsType; //类型
public:
//基类属性的set get函数
void setGoodsId(int id);
int getGoodsId();
void setGoodsName(string name);
string getGoodsName();
void setGoodsNum(string num);
string getGoodsNum();
void setGoodsPrice(string price);
string getGoodsPrice();
void setGoodsCount(string count);
string getGoodsCount();
void setGoodsType(string type);
string getGoodsType();
//数据库操作函数
virtual void addGoods(BaseGoods* goods)=0; //纯虚函数--添加商品
void updateGoods(string goodsName,string goodsNum);
void deleteGoods(string goodsNum); //删除商品
void getAllGoods(string type); //查看所有商品
void getGoodsByCount(string type,int count); //条件查询库存数量低于count的商品
};
void BaseGoods::setGoodsId(int id){
if(id>0)
this->goodsId=id;
}
int BaseGoods::getGoodsId(){
return goodsId;
}
void BaseGoods::setGoodsName(string name){
if(name.length()>0&&name.length()<=20)
this->goodsName=name;
}
string BaseGoods::getGoodsName(){
return goodsName;
}
void BaseGoods::setGoodsNum(string num){
if(num.length()>0&&num.length()<=5)
this->goodsNum=num;
}
string BaseGoods::getGoodsNum(){
return goodsNum;
}
void BaseGoods::setGoodsPrice(string price){
if(price.length()>0)
this->goodsPrice=price;
}
string BaseGoods::getGoodsPrice(){
return goodsPrice;
}
void BaseGoods::setGoodsCount(string count){
if(count.length()>0)
this->goodsCount=count;
}
string BaseGoods::getGoodsCount(){
return goodsCount;
}
void BaseGoods::setGoodsType(string type){
this->goodsType=type;
}
string BaseGoods::getGoodsType(){
return goodsType;
}
void BaseGoods::deleteGoods(string goodsNum){ //删除商品
DataBase db;
string sql="delete from goods where 编号='"+goodsNum+"'";
const char *c_sql=sql.c_str();
mysql_query(db.conn,c_sql);
int flag=mysql_affected_rows(db.conn);
if(flag>0)
cout<<"删除"<<flag<<"条记录成功"<<endl;
else
cout<<"删除失败"<<endl;
mysql_close(db.conn);
}
void BaseGoods::getAllGoods(string type){ //按类型查询商品
DataBase db;
string sql="SELECT * FROM goods where 类型='"+type+"'";
const char *c_sql=sql.c_str();
if(mysql_query(db.conn, c_sql)){ //查询成功返回非0
cout<<"mysql_query failed!"<<endl;
}else{
db.resSet = mysql_store_result(db.conn); //查询失败返回NULL
if(db.resSet==NULL){
cout<<"resSet is null"<<endl;
}else{
db.numFields = mysql_num_fields(db.resSet);
for(int i=0; i < db.numFields; i++)
{
db.field = mysql_fetch_field_direct(db.resSet, i);
cout<<setw(10)<<db.field->name;
}
cout<<endl;
while ((db.row = mysql_fetch_row(db.resSet)) != NULL)
{
for (int i = 0; i < mysql_num_fields(db.resSet); i ++)
{
cout<<setw(10)<<db.row[i];
}
cout<<endl;
}
}
展开阅读全文