项目描述:
- 项目背景
- 项目核心功能
- 项目模块划分
- 数据库设计
- 设计API
- 项目总结
一. 项目背景
收银台:作为商场超市所必不可少的配套设施,越来越多的被客户所关注。收银台俗称付款处,是顾客付款交易的地方,也是顾客在商店最后停留的地方。
传统收银台存在很多问题,诸如:
- 收款结算速度慢,容易出现营业差错
- 不宜进行商品调价,盘点效率低
- 商品信息管理和人员信息管理不当而造成利润受损
- 用户体验不好
二. 核心功能:
因此我们实现了新型收银台系统,快捷方便,节省大量人力成本,不容易出错,能够快速反馈出商品的详细信息。
开发这个系统可以方便快捷地查出顾客结帐情况,商品信息情况,每天的售货情况,方便了对超市商品管理、人员管理,大大提高了超市的售货速度。进而加速了社会的发展速度,提高了人民的生活水平。
整体框架
三. 模块划分
1.登录模块
后台管理员和前台售货员需要根据自己的用户名以及密码进行登录。用户输入名户名以及密码后,根据不同身份,显示不同界面,用户进行其相应操作。
- 此时我们需要用到Duilib开源库以及MySQLS数据库
- 界面通过xml文件来配置
使用Dui Designer工具绘制图像
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>
由此可得到我们的登陆界面:
//获取用户名
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数据库的操作实现的新型收银台,通过数据库操作类的封装,创建不同使用者界面,根据身份信息不同,登录不同的操作界面,来管理商品或人员信息。