基于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秒,无数据丢失

七、系统优化建议

  1. 缓存机制

    // 使用QCache缓存高频访问数据
    QCache<QString, QVariantMap> productCache(100);  // 最大缓存100条
    
  2. 异步操作

    // 使用QtConcurrent处理耗时数据库操作
    QFuture<bool> future = QtConcurrent::run([=]{
        return QSqlDatabase::database().transaction();
    });
    
  3. 日志系统

    // 集成QsLog日志框架
    QsLogging::Logger& logger = QsLogging::Logger::instance();
    logger.setLoggingLevel(QsLogging::InfoLevel);
    
posted @ 2025-10-22 09:29  u95900090  阅读(3)  评论(0)    收藏  举报