基于Qt框架开发商品库存管理系统
一、系统架构设计
1. 技术栈选型
| 模块 | 技术方案 | 优势说明 |
|---|---|---|
| 核心框架 | Qt 5.15.2 (C++/QML) | 跨平台支持/信号槽机制 |
| 数据库 | MySQL 8.0 + ODBC驱动 | 事务支持/ACID特性 |
| 数据加密 | QCryptographicHash (SHA-256) | 密码安全存储 |
| 界面设计 | Qt Designer + QSS | 可视化布局/样式表定制 |
| 部署方案 | 跨平台编译 (Windows/Linux) | 一次开发多端运行 |
2. 功能模块划分
graph TD
A[系统] --> B[用户管理]
A --> C[商品管理]
A --> D[库存操作]
A --> E[查询统计]
A --> F[系统设置]
B --> B1(用户登录/注销)
B --> B2(角色权限管理)
C --> C1(商品分类)
C --> C2(品牌管理)
C --> C3(供应商管理)
D --> D1(入库登记)
D --> D2(出库登记)
D --> D3(库存盘点)
E --> E1(实时库存看板)
E --> E2(出入库记录)
E --> E3(效期预警)
F --> F1(数据备份)
F --> F2(日志审计)
二、核心功能实现
1. 数据库设计
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash CHAR(64) NOT NULL,
role ENUM('admin', 'manager', 'staff') DEFAULT 'staff',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 商品表
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
category_id INT,
brand VARCHAR(50),
model VARCHAR(50),
unit_price DECIMAL(10,2),
stock_quantity INT CHECK (stock_quantity >= 0),
supplier_id INT,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
-- 库存操作日志
CREATE TABLE inventory_log (
log_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT,
operation ENUM('IN', 'OUT', 'ADJUST'),
quantity INT NOT NULL,
operator_id INT,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
2. Qt数据库连接
// database.cpp
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
bool connectDatabase() {
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={MySQL ODBC 8.0 Unicode Driver};"
"SERVER=localhost;DATABASE=inventory_db;"
"UID=root;PWD=your_password;");
if(!db.open()) {
qDebug() << "DB Error:" << db.lastError().text();
return false;
}
return true;
}
3. 商品管理模块
// productmanager.h
class ProductManager : public QObject {
Q_OBJECT
public:
explicit ProductManager(QObject *parent = nullptr);
QList<QVariantMap> getProducts();
bool addProduct(const QString &name, const QString &category,
const QString &brand, double price, int quantity);
signals:
void productAdded(const QVariantMap &product);
private:
QSqlDatabase m_db;
};
// productmanager.cpp
ProductManager::ProductManager(QObject *parent) : QObject(parent) {
m_db = QSqlDatabase::database("inventoryConnection");
}
QList<QVariantMap> ProductManager::getProducts() {
QList<QVariantMap> products;
QSqlQuery query("SELECT * FROM products", m_db);
while(query.next()) {
QVariantMap product;
product["id"] = query.value("product_id");
product["name"] = query.value("name");
// ...其他字段
products.append(product);
}
return products;
}
三、界面实现方案
1. 主界面布局
<!-- mainwindow.ui -->
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1024</width>
<height>768</height>
</rect>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTreeWidget" name="categoryTree"/>
</item>
<item>
<widget class="QTabWidget" name="mainTabs">
<widget class="QWidget" name="tab_1">
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLineEdit" name="searchEdit"/>
</item>
<item row="1" column="0">
<widget class="QTableView" name="productTable"/>
</item>
</layout>
</widget>
<!-- 其他Tab页 -->
</widget>
</item>
</layout>
</widget>
</widget>
</ui>
2. 库存预警实现
// inventorymonitor.cpp
void InventoryMonitor::checkLowStock() {
QSqlQuery query("SELECT * FROM products WHERE stock_quantity < 10");
while(query.next()) {
QString productName = query.value("name").toString();
emit lowStockAlert(productName); // 触发预警信号
}
}
// 在构造函数中启动定时器
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &InventoryMonitor::checkLowStock);
timer->start(60000); // 每分钟检查一次
四、高级功能扩展
1. 权限控制模型
// authmanager.h
class AuthManager {
public:
enum UserRole { Guest, Staff, Manager, Admin };
static UserRole currentRole();
static bool hasPermission(UserRole role, QString permission);
private:
static UserRole m_currentRole;
static QMap<QString, QList<UserRole>> m_permissions;
};
// 权限配置表
QMap<QString, QList<UserRole>> AuthManager::m_permissions = {
{"add_product", {Manager, Admin}},
{"delete_product", {Admin}},
{"edit_inventory", {Staff, Manager, Admin}}
};
2. 数据报表生成
// reportgenerator.cpp
void ReportGenerator::exportToExcel() {
QXlsx::Document xlsx;
// 写入表头
xlsx.write("A1", "商品名称");
xlsx.write("B1", "当前库存");
xlsx.write("C1", "最低库存");
// 填充数据
QSqlQuery query("SELECT name, stock_quantity, min_stock FROM products");
int row = 2;
while(query.next()) {
xlsx.write(row, 1, query.value("name"));
xlsx.write(row, 2, query.value("stock_quantity"));
xlsx.write(row, 3, query.value("min_stock"));
row++;
}
xlsx.saveAs("inventory_report.xlsx");
}
参考代码 QT 商品库存管理系统 www.youwenfan.com/contentcnj/72971.html
五、部署与维护
1. 跨平台编译配置
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(InventorySystem)
set(CMAKE_CXX_STANDARD 17)
find_package(Qt6 COMPONENTS Widgets Sql REQUIRED)
add_executable(InventorySystem
main.cpp
database.cpp
productmanager.cpp
# ...其他源文件
)
target_link_libraries(InventorySystem PRIVATE
Qt6::Widgets
Qt6::Sql
)
2. 数据库迁移方案
# 使用mysqldump进行数据备份
mysqldump -u root -p inventory_db > backup_$(date +%F).sql
# 自动化部署脚本
#!/bin/bash
rm -rf build/*
cmake ..
make
scp InventorySystem user@server:/opt/inventory/
六、测试用例设计
| 测试类型 | 测试场景 | 预期结果 |
|---|---|---|
| 功能测试 | 添加新商品 | 数据库新增记录,界面同步更新 |
| 边界测试 | 库存数量设为0 | 禁止出库操作,提示库存不足 |
| 安全测试 | 输入超长商品名称 | 字段截断/输入验证提示 |
| 性能测试 | 同时100次出入库操作 | 响应时间≤2秒,无数据丢失 |
七、系统优化建议
-
缓存机制
// 使用QCache缓存高频访问数据 QCache<QString, QVariantMap> productCache(100); // 最大缓存100条 -
异步操作
// 使用QtConcurrent处理耗时数据库操作 QFuture<bool> future = QtConcurrent::run([=]{ return QSqlDatabase::database().transaction(); }); -
日志系统
// 集成QsLog日志框架 QsLogging::Logger& logger = QsLogging::Logger::instance(); logger.setLoggingLevel(QsLogging::InfoLevel);

浙公网安备 33010602011771号