基于C++和QT开发的校园超市库存物资管理系统
資源下載地址:https://download.csdn.net/download/sheziqiong/85837970
資源下載地址:https://download.csdn.net/download/sheziqiong/85837970
2 應用環境
2.1 硬件環境
列出運行該軟件所需要的硬設備。說明其中的新型設備及其專門功能,包括:
2.2 軟件環境
操作系統windows系統,數據庫管理系統:SQL數據庫系統,QTCreator編譯工具。
2.3 應用環境
Windows 10系統
3 基于UML分析系統功能需求
3.1 用例圖
用例圖從用戶角度描述系統功能。該用例圖描述系統的參與者倉庫管理員與系統的登錄、用戶管理、供貨商管理、商品管理、入庫管理、出庫管理、報表管理等用例之間的關系。
系統用例圖入圖1所示:
圖 1 用例圖
3.2活動圖
活動圖是描述活動的順序。此系統的活動圖分為:出庫活動圖和入庫活動圖,它們各自描述了各自與系統進行交互的流程操作。
該出庫活動圖描述了倉庫管理員與系統進行交互的流程操作。
出庫活動圖如圖2所示:
圖 2出庫活動圖
該入庫活動圖描述了倉庫管理員與系統進行交互的流程操作。
入庫活動圖如圖3所示:
圖3 入庫活動圖
3.3類圖
類圖是描述類,接口以及它們之間關系的圖,是一種靜態模型,顯示了系統中各個類的靜態結構。該類圖描述超市庫存管理系統中的相關類以及各個類的關系來描述靜態視圖,為的是讓開發人員能夠更加清楚了解組成該系統的結構。
超市庫存管理系統類圖如圖4所示:
圖 4 超市庫存管理系統類圖
3.4 順序圖
順序圖代表了一個相互作用,在以時間為次序的對象之間的通信集合。
**出庫順序圖:**該順序圖描繪了倉庫管理員、出庫、數據庫之間傳遞消息的時間順序,以此來表示出庫的行為順序。
出庫順序圖如圖5所示:
圖 5出庫順序圖
**入庫順序圖:**該順序圖描繪了倉庫管理員、入庫、數據庫之間傳遞消息的時間順序,以此來表示入庫的行為順序。
入庫順序圖如圖6所示:
圖6 入庫順序圖
3.6狀態圖
狀態圖主要描述了系統在各個狀態之間的轉換關系。在進行商品入庫操作時,通過點擊界面上的各個菜單跳轉到各個不同的頁面,顯示商品的不同狀態,各個操作執行完成之后都可以直接返回到系統操作界面,執行其他操作。超市庫存管理系統狀態圖如圖9所示:
4 性能需求
4.1精度
輸入的數據必須符合設計的格式要求:
4.2時間特性要求
說明對于該軟件的時間特性要求:
要求登陸系統時,系統的響應時間控制在一秒內,更新的時間越低越好, 數據傳送時間盡量縮短。
4.3靈活性
該系統是以C++語言為背景的,應該是可以跨平臺運行的,至于操作系統應該也是可以轉換在windows操作系統。數據庫是SQL Server。
如果需求發生某些變化時,該軟件對這些變化的適應能力如下:
5 系統實現
5.1 管理員進入系統
系統里已寫入默認管理員,輸入用戶名、密碼,即可進入該系統。管理員進入系統界面截圖如圖10所示。
圖10 登錄界面截圖
bool Mysql::verifyLogin(const QString name,const QString password) {QSqlQuery query;query.exec("select * from [user] where exist = 1");bool chekname=false;bool chekpassword=false;// 打印輸出用戶名和密碼while (query.next()) {qDebug() << query.value(0).toInt()<< query.value(1).toInt()<< query.value(2).toString();if(query.value(1).toInt() ==1 ){chekname = (QString::compare(name,query.value(2).toString(),Qt::CaseSensitive) == 0);chekpassword = (QString::compare(password,query.value(3).toString(),Qt::CaseSensitive) == 0);}else{continue;}if(chekname&&chekpassword){return true;}}return false; }5.2注冊新用戶功能
管理員進入系統后可添加新的用戶或者注冊新的管理員。注冊界面截圖如圖11所示:
圖11注冊界面截圖
// 當注冊頁面的注冊按下 void Register::on_pushButton_login_clicked() {Mysql sql;if(sql.isUid(ui->lineEdit_id->text().toInt())){ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("編號已存在"));return;}// 用戶名是否存在if(sql.isUname(ui->lineEdit_uname->text())!=-1){ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("用戶名已存在"));return;}// 兩次密碼是否一致if((QString::compare(ui->lineEdit_password->text(),ui->lineEdit_password_2->text(),Qt::CaseSensitive) == 0)){User user;user.setId(ui->lineEdit_id->text().toInt());user.setUname(ui->lineEdit_uname->text());user.setUpassword(ui->lineEdit_password->text());user.setExit(1);int age = ui->lineEdit_age->text().toInt();if(age>0&&age<200){ // 年齡user.setAge(age);}else{ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("年齡錯誤"));return;}user.setSex(ui->combo_sex->currentText());user.setTel(ui->lineEdit_tel->text());if(sql.applyAccount(user)){user.printUser();QMessageBox::warning(nullptr, "注意", "用戶創建成功");on_pushButton_clear_clicked();}}else { // 兩次密碼不一樣ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("兩次密碼不一致"));} }5.3獲取管理員用戶界面截圖
倉庫管理員可以獲取用戶管理員界面如圖12所示:
圖12獲取用戶界面圖
std::vector<User>* Mysql::getUsers() {std::vector<User> *List = new std::vector<User>;QSqlQuery query;query.exec("select * from [user] where exist = 1");while (query.next()) {User user;user.setId(query.value(0).toInt());user.setExit(query.value(1).toInt());user.setUname(query.value(2).toString());user.setUpassword(query.value(3).toString());user.setSex(query.value(4).toString());user.setAge(query.value(5).toInt());user.setTel(query.value(6).toString());user.setTime(query.value(7).toDateTime());List->push_back(user);}return List; }5.4用戶信息模糊查詢界面截圖
默認管理員可以通過模糊信息查詢用戶信息,用戶信息模糊查詢界面如圖13所示:
圖13模糊查詢界面圖
5.5商品入庫界面截圖
管理員進入商品入庫界面,選擇供應商、輸入商品名稱等一系列信息,并選擇過期時間。商品入庫界面如圖14所示:
圖14商品入庫界面圖
void InForm::on_pushButton_in_clicked() {QString sname = ui->comboBox->currentText();QString catename = ui->comboBox_2->currentText();QString cname = ui->lineEdit->text();int id = sql.getGoodCid(sname,catename,cname);if(id == 0){// 創建商品ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("請先創建新商品"));return ;}int num = ui->spinBox_num->text().toInt();float price = ui->doubleSpinBox_price->text().toFloat();float weight = ui->doubleSpinBox__kg->text().toFloat();if(num <= 0 || price <= 0 || weight <= 0){ui->label_tip->clear();ui->label_tip->setStyleSheet(QString("color:red;"));ui->label_tip->setText(QString("商品數量、價格、質量不能為零"));return ;}QString selftime = ui->dateTimeEdit->dateTime().toString("yyyy-MM-dd hh:mm:ss");QString tmpSql = QString("INSERT INTO [dbo].[in] ([cid], [price], [time], ""[shelftime], [num], [uid], [weight] )""VALUES""( %1, %2, GETDATE(), '%3', %4, %5, %6 )").arg(id).arg(price).arg(selftime).arg(num).arg(uid).arg(weight);qDebug() << tmpSql;sql.Myexec(tmpSql);QMessageBox::warning(nullptr, "提示", "入庫成功");ui->label_tip->clear(); }5.6新建商品信息界面截圖
管理員進入新建商品界面,依次添加信息、選擇商品類別、供應商即可成功添加新的商品。新建商品信息界面如圖15所示:
圖15新建商品信息界面圖
void CommodityAddForm::on_pushButton_new_clicked() {QString name = ui->lineEdit_cname->text();QString category = ui->comboBox_category->currentText();QString suppliername = ui->comboBox->currentText();if(suppliername.isEmpty()){this->ui->label_tip->setText("請先選擇供應商");return;}int sid = sql.SupplierID(suppliername);int maxnum = ui->lineEdit_MAX->text().toInt();int minnum = ui->lineEdit_MIN->text().toInt();QString tmp = QString("INSERT INTO [dbo].[commodity]([cname],"" [sid], [category], [minnum], [maxmun]) ""VALUES ('%1', %2, '%3', %4, %5)").arg(name).arg(sid).arg(category).arg(minnum).arg(maxnum);qDebug() << tmp;sql.Myexec(tmp);suppliercomboBox();QMessageBox::warning(nullptr, "提示", "商品信息創建成功"); }5.7獲取供應商界面截圖
進入供應商界面即可獲取所有的供應商信息,輸入供應商任一信息即可相對應的供應商信息。獲取供應商界面如圖16所示:
圖16獲取供應商界面圖**
std::vector<Supplier> *Mysql::getSupplier(QString name) {std::vector<Supplier> *list = new std::vector<Supplier>;QSqlQuery query;query.exec(QString("select * from [supplier] where exist = 1 and sname LIKE '%%1%'").arg(name));while (query.next()) {Supplier supplier;supplier.setSid(query.value(0).toInt());supplier.setExist(query.value(1).toInt());supplier.setSname(query.value(2).toString());supplier.setAddr(query.value(3).toString());supplier.setTel(query.value(4).toString());list->push_back(supplier);}return list; }5.8刪除界面截圖
點擊刪除供應商的任一信息即可刪除該供應商對應的所有信息。刪除供應商界面如圖17所示:
圖17刪除供應商界面圖
void SupplierForm::on_pushButton_delete_clicked() {int row = ui->tableView->currentIndex().row();int id = this->model->data(this->model->index(row,0)).toInt();list[size] =id;qDebug() << list[size] << "row = " << row;size++;model->removeRow(ui->tableView->currentIndex().row()); } // 點擊修改供應商 void SupplierForm::on_pushButton_alter_clicked() {int row = ui->tableView->currentIndex().row();Supplier supplier;getSupplier(row,supplier);supplier.printSupplier();upadteSupplier(supplier); }5.9出庫界面截圖
管理員進入商品出庫界面,選擇供應商以及商品類別即可。出庫界面如圖18所示:
圖18出庫界面圖
void OutForm::on_pushButton_out_clicked() {int row = ui->tableView->currentIndex().row();int id = this->model->data(this->model->index(row,0)).toInt();int num = this->model->data(this->model->index(row,2)).toInt();int outnum = this->model->data(this->model->index(row,8)).toInt();if(num < outnum){QMessageBox::warning(nullptr, "警告", "出庫數量超過庫存");this->model->setItem(row, 8,new QStandardItem(QString("")));return;}if(outnum <= 0){QMessageBox::warning(nullptr, "警告", "請輸入出庫數量");return;}int out = num - outnum;QString tmp = QString("UPDATE [dbo].[in] ""SET [num] = %1 WHERE [iid] = %2").arg(out).arg(id);sql.outgood(id,outnum,uid);qDebug() << tmp;sql.Myexec(tmp);QMessageBox::warning(nullptr, "提示", "出庫成功");on_pushButton_refresh_clicked(); }5.10出入庫報表管理界面截圖
進出入庫界面,在報表類型下拉框中選擇入庫,在時間下拉框中選擇時間段即可導出相應的信息。入庫報表管理界面如圖19所示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sLBrNNHm-1656579241835)(img/Aspose.Words.33957aab-3b25-4d17-ad3a-a8929c155f1d.015.png)]
圖19入庫報表管理界面圖
進出入庫界面,在報表類型下拉框中選擇出庫,在時間下拉框中選擇時間段即可導出相應的信息。出庫報表管理界面如圖20所示:
圖20出庫報表管理界面圖
void StatementForm::on_pushButton_refresh_clicked() {QString IO = ui->comboBox->currentText();QString time = ui->comboBox_2->currentText();// 獲取當前時間QDateTime data = QDateTime::currentDateTime();if(QString::compare(time,QString("一天以內")) == 0){//data = data.addDays(-1);time = data.toString("yyyy-MM-dd");}else if(QString::compare(time,QString("一個月內"))== 0){data = data.addMonths(-1);time = data.toString("yyyy-MM-dd");}else if(QString::compare(time,QString("一個季度內"))== 0){data = data.addMonths(-3);time = data.toString("yyyy-MM-dd");}else if(QString::compare(time,QString("一年以內"))== 0){data = data.addYears(-1);time = data.toString("yyyy-MM-dd");}else{time = QString("");}std::vector<Goods> *Slist;if(QString::compare(IO,QString("入庫")) == 0){initable(1);Slist = sql.getinGoods(time);int i = 0;for(std::vector<Goods>::iterator it=(*Slist).begin();it!=(*Slist).end();it++){/*setItem設置條目欄中的一個格子的信息*/setINTable(i,it);i++;}if(Slist!=NULL)delete Slist;Slist = NULL;}else{initable(2);Slist = sql.getoutGoods(time);int i = 0;for(std::vector<Goods>::iterator it=(*Slist).begin();it!=(*Slist).end();it++){/*setItem設置條目欄中的一個格子的信息*/setOUTable(i,it);i++;}if(Slist!=NULL)delete Slist;Slist = NULL;}qDebug() << uid << "id id";qDebug() << data.toString("yyyy-MM-dd") << " " << IO ; }5.11商品管理界面截圖
進入商品信息管理界面,在供應商下拉框中選擇供應商,在商品類別下拉框中選擇商品類別即可導出相應的信息。商品管理界面如圖21所示:
圖21商品管理界面圖
void GoodManangeForm::on_pushButton_find_clicked() {initTable();QString sname = ui->comboBox->currentText();QString catename = ui->comboBox_2->currentText();qDebug() << sname << " " << catename;std::vector<Goods> *Slist = sql.getGoods(sname,catename);int i = 0;for(std::vector<Goods>::iterator it=(*Slist).begin();it!=(*Slist).end();it++){/*setItem設置條目欄中的一個格子的信息*/setTable(i,it);i++;}if(Slist!=NULL)delete Slist;Slist = NULL; }5.12警告界面截圖
實時更新警告,一分鐘更新一次。
警告商品過期界面如圖22所示:
圖22警告商品過期界面圖
警告商品即將過期界面如圖23所示:
圖23警告商品即將過期界面圖
警告商品庫存不足界面如圖24所示:
圖24警告商品庫存不足界面圖
警告商品庫存過量界面如圖25所示:
圖25警告商品庫存過量界面圖
void WarningForm::settableGoods(int i, std::vector<Goods>::iterator s) {s->printGoods();this->model->setItem(i, 0, new QStandardItem(QString("%1").arg(s->getCid())));this->model->setItem(i, 1, new QStandardItem(QString(s->getCname())));this->model->setItem(i, 2, new QStandardItem(QString("%1").arg(s->getNum())));this->model->setItem(i, 3, new QStandardItem(QString(s->getCategory())));this->model->setItem(i, 4, new QStandardItem(QString(s->getSnmae())));this->model->setItem(i, 5, new QStandardItem(QString(s->getAddr())));this->model->setItem(i, 6, new QStandardItem(QString(s->getTel()))); } void WarningForm::Overdue() {ui->label->clear();ui->label->setText(QString("警告商品過期"));std::vector<Goods> goodlist = getgoods();int i = 0;for(std::vector<Goods>::iterator it=goodlist.begin();it!=goodlist.end();it++){/*setItem設置條目欄中的一個格子的信息*/settable(i,it);i++;} }void WarningForm::Expiring() {ui->label->clear();ui->label->setText(QString("警告商品即將過期"));std::vector<Goods> goodlist = getExpiringgoods();int i = 0;for(std::vector<Goods>::iterator it=goodlist.begin();it!=goodlist.end();it++){/*setItem設置條目欄中的一個格子的信息*/settable(i,it);i++;} }void WarningForm::lack() {ui->label->clear();ui->label->setText(QString("警告商品庫存不足"));std::vector<Goods> goodlist = getlackgoods();int i = 0;for(std::vector<Goods>::iterator it=goodlist.begin();it!=goodlist.end();it++){/*setItem設置條目欄中的一個格子的信息*/settableGoods(i,it);i++;} }void WarningForm::nimiety() {ui->label->clear();ui->label->setText(QString("警告商品庫存過量"));std::vector<Goods> goodlist = getnimietygoods();int i = 0;for(std::vector<Goods>::iterator it=goodlist.begin();it!=goodlist.end();it++){/*setItem設置條目欄中的一個格子的信息*/settableGoods(i,it);i++;} }bool WarningForm::ifOverdue() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where shelftime < GETDATE()"));query.next();return !query.value(1).toString().isEmpty(); }bool WarningForm::ifExpiring() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where shelftime < GETDATE()+30 and shelftime > GETDATE()"));query.next();return !query.value(1).toString().isEmpty(); }bool WarningForm::iflack() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where num < minnum"));query.next();return !query.value(1).toString().isEmpty(); }bool WarningForm::ifnimiety() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where num > maxmun"));query.next();return !query.value(1).toString().isEmpty(); } ing().isEmpty(); }bool WarningForm::ifExpiring() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where shelftime < GETDATE()+30 and shelftime > GETDATE()"));query.next();return !query.value(1).toString().isEmpty(); }bool WarningForm::iflack() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where num < minnum"));query.next();return !query.value(1).toString().isEmpty(); }bool WarningForm::ifnimiety() {QSqlQuery query;query.exec(QString("SELECT * from goodsin where num > maxmun"));query.next();return !query.value(1).toString().isEmpty(); }資源下載地址:https://download.csdn.net/download/sheziqiong/85837970
資源下載地址:https://download.csdn.net/download/sheziqiong/85837970
總結
以上是生活随笔為你收集整理的基于C++和QT开发的校园超市库存物资管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: clion连接mysql,使用 CLio
- 下一篇: iPhone app 和android