项目描述:

  • 项目背景
  • 项目核心功能
  • 项目模块划分
  • 数据库设计
  • 设计API
  • 项目总结

一. 项目背景

收银台:作为商场超市所必不可少的配套设施,越来越多的被客户所关注。收银台俗称付款处,是顾客付款交易的地方,也是顾客在商店最后停留的地方。

传统收银台存在很多问题,诸如:

  • 收款结算速度慢,容易出现营业差错
  • 不宜进行商品调价,盘点效率低
  • 商品信息管理和人员信息管理不当而造成利润受损
  • 用户体验不好

二. 核心功能:

因此我们实现了新型收银台系统,快捷方便,节省大量人力成本,不容易出错,能够快速反馈出商品的详细信息。
开发这个系统可以方便快捷地查出顾客结帐情况,商品信息情况,每天的售货情况,方便了对超市商品管理、人员管理,大大提高了超市的售货速度。进而加速了社会的发展速度,提高了人民的生活水平。

整体框架

收银台demo 收银台的拼音_收银台demo

三. 模块划分

1.登录模块

后台管理员和前台售货员需要根据自己的用户名以及密码进行登录。用户输入名户名以及密码后,根据不同身份,显示不同界面,用户进行其相应操作。

  • 此时我们需要用到Duilib开源库以及MySQLS数据库
  • 界面通过xml文件来配置

使用Dui Designer工具绘制图像

收银台demo 收银台的拼音_数据库_02


xml文件代码

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="800,600">
    <HorizontalLayout bkcolor="#FF00FF00">
        <Button name="btnHello" text="Hello World" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" />
    </HorizontalLayout>
</Window>

由此可得到我们的登陆界面:

收银台demo 收银台的拼音_收银台demo_03

//获取用户名
CEditUI* pEditUserName = (CEditUI*)m_PaintManager.FindControl(_T("EDIT_USER_NAME"));
CDuiString strUserName = pEditUserName->GetText();
//获取密码
CEditUI* pEditPassword = (CEditUI*)m_PaintManager.FindControl(_T("EDIT_USER_PASSWORD"));
CDuiString strPassword = pEditPassword->GetText();
2. 后台管理员模块

员工操作

  • 查询员工基本信息
  • 添加新员工
  • 员工离职后,删除员工信息
  • 员工信息变更时,更新员工信息,比如:更新员工薪资

商品操作

  • 按照条件查询商品的信息
  • 商品入库
  • 过期商品的删除
  • 商品信息更新,比如:价格发生变动
  • 按照日期查询商品销售情况
3. 售货员模块

售货

  • 录入商品信息
  • 出售:会员出售和普通用户出售
  • 如果客户不满意,退货

会员管理

  • 增加会员
  • 删除会员
  • 查询会员
  • 更新会员信息

四. 数据库设计

这里我们用到了四张表
职工表

create table Employee(
	id int, -- 员工编号 
	name varchar(20), -- 员工名字 
	gender varchar(3), -- 员工性别 
	birthday Date, -- 生日 
	password varchar(20), -- 员工密码 
	position varchar(10), -- 员工职位 
	telephone varchar(11), -- 联系方式 
	salary double(9,2) -- 联系方式 
);

商品表

create table Goods( 
	GoodsID int, -- 商品编号 
	GoodsName varchar(20), -- 商品名称 
	GoodsType varchar(20), -- 商品类别:水果、烟酒、日常用品、副食等 
	ProductDate DATE, -- 商品生产日期 
	DeadDate DATE, -- 商品过期日期 
	Price double(9,2), -- 商品价格 
	Unit varchar(3), -- 计量单位 
	Inventory int, -- 库存量:商品剩余数量 
	AlarmValye int -- 报警值:低于该值时,应提醒管理员进货 
);

售货记录表

create table SellRecord( 
	GoodsName varchar(20), -- 商品名称 
	GoodsPrice double(9, 2), -- 商品价格 
	Amount int, -- 售出数量 
	Unit varchar(3), -- 计量单位 
	SellTime Date, -- 售出时间 
	Operator varchar(20) -- 售货员
);

会员表

create table Member( 
	Name varchar(20), -- 会员名字 
	Telephone varchar(20), -- 会员电话 
	Level int, -- 会员级别 
	Score int, -- 会员积分 
	Time Date -- 办理会员日期 
);

五. 设计API

数据库操作类的封装

class MySQL{
public:
	MySQL();
	bool ConnectMySql(const char* host, // 主机名称
					  const char* user, // 用户名
					  const char* passward, // 密码
					  const char* dbName, // 数据库名
					  int port=3306); // 端口号:默认为3306
	~MySQL();
	bool Insert(const string& strSQL); 
	bool Delete(const string& strSQL); 
	bool Update(const string& strSQL); 
	size_t GetCount(const string& strSQL); 
	vector<vector<string>> Select(const string& strSQL);
	// 切换数据库 
	bool SelectDB(const string& daName);
private:
	MYSQL* _mySql; // mysql连接的实例对象
	std::string _dbName;
	vector<string> _tables;
};

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")

MySQL::MySQL(){
	// 初始化mySql
	_mySql = mysql_init(nullptr);
}

bool MySQL::ConnectMySql(const char* host, 
						 const char* user, 
						 const char* passward,
						 const char* dbName,
						 int port){
	// 连接mySql数据库
	if (!mysql_real_connect(_mySql,host,user,passward,dbName,port,NULL,0)){
		return false;
	}
	//c++连接mysql时,比如查询语句中含有中文,或者得到结果中含有中文,经常出现编译出错或乱码问题。
	//VS编译器默认使用gbk编码。
	//如果将mysql设置为utf-8编码,则需要先将c++中的各种中文字符串转为utf-8编码输入mysql,
	//得到的结果为utf-8编码,需要转为gbk才能正常显示。转来转去很麻烦。
	mysql_query(_mySql, "set names 'gbk'");
	return true;
}

bool MySQL::SelectDB(const string& dbName){
	if (mysql_select_db(_mySql, dbName.c_str())){
		return false;
	}
	return true;
}

bool MySQL::Insert(const string& strSql){
	// 执行sql语句
	if (mysql_query(_mySql, strSql.c_str())){
		return false;
	}
	return true;
}

bool MySQL::Update(const string& strSQL){
	// 执行sql语句
	if (mysql_query(_mySql, strSQL.c_str())){
		return false;
	}
	return true;
}

vector<vector<string>> MySQL::Select(const string& sql){
	vector<vector<string>> vRet;
	//指定SQL语句
	if (mysql_query(_mySql, sql.c_str())){
		string vsRet(mysql_error(_mySql));
		return vRet;
	}
	// 检索完整的数据集到客户端
	MYSQL_RES *res = mysql_store_result(_mySql);
	if (res == NULL){
		return vRet;
	}
	// 用来保存结果集中行的信息
	MYSQL_ROW rows;
	// 结果集中总共有多少行数据
	int num_fields = mysql_num_fields(res);
	while (rows = mysql_fetch_row(res)){
		int i = 0; 
		vector<string> vItem; 
		vItem.resize(num_fields); 
		for (i = 0; i < num_fields; i++){
			vItem[i] = rows[i];
		}
		vRet.push_back(vItem);
	}
	const char* str = mysql_error(_mySql); 
	mysql_free_result(res); 
	return vRet;
}

size_t MySQL::GetCount(const string& strSQL){
	// 指定指定SQL语句
	if (mysql_query(_mySql, strSQL.c_str())) {
		return 0; 
	}
	// 检索完整的数据集到客户端
	MYSQL_RES *res = mysql_store_result(_mySql); 
	if (res == NULL) { 
		return 0; 
	}
	return mysql_num_fields(res);
}

bool MySQL::Delete(const string& strSQL){
	// 执行sql语句
	if (mysql_query(_mySql, strSQL.c_str())) {
		return false; 
	}
	return true;
}

MySQL::~MySQL(){
	mysql_close(_mySql);
}

六. 项目总结

本项目基于Duilib界面库MySQL数据库的操作实现的新型收银台,通过数据库操作类的封装,创建不同使用者界面,根据身份信息不同,登录不同的操作界面,来管理商品或人员信息。