MySQL和C++外卖管理系统

1.MySQL与QT的连接

MySQL的下载和安装教程

装入相关的驱动

可以在里面找到下载和安装驱动的教程

在txt文件中加入相关的语句

将find_package(Qt Q T V E R S I O N M A J O R R E Q U I R E D C O M P O N E N T S W i d g e t s ) 改为 f i n d p a c k a g e ( Q t {QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) 改为find_package(Qt QTVERSIONMAJORREQUIREDCOMPONENTSWidgets)改为findpackage(Qt{QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)。将target_link_libraries(Mysql_qt PRIVATE Qt${QT_VERSION_MAJOR}::Sql)放进去。

连接数据库

db = QSqlDatabase::addDatabase("QMYSQL");//启动MySQL的驱动
db.setHostName("127.0.0.1");
db.setPort(3306);
db.setUserName("root");
db.setPassword("password");
db.setDatabaseName("database name");

用户端 登录 注册 忘记密码的实现,使用Qsqlquery中的方法

登录:`QSqlQuery query(db);

query.prepare("SELECT user_id, password_hash FROM user WHERE phone = ?");
query.addBindValue(phone);`

注册: QSqlQuery query(db);

    query.prepare("INSERT INTO user (phone, password_hash)"
                  "VALUES (:phone , :pwd)");
    query.bindValue(":phone",phone);
    query.bindValue(":pwd",password);

忘记密码: `QSqlQuery query(db);

    query.prepare("UPDATE user SET password_hash = :pwd WHERE phone = :phone");
    query.bindValue(":phone",phone);
    query.bindValue(":pwd",newpassword);

用户端的功能

1.模糊搜索订单

通过输入栏来获取关键字,通过like语句来进行搜索商品。

在商品栏中有下单和查看详情的功能


在这里插入图片描述
可以查看到之前买家的评论和评分,以及商品的详细信息描述

2.增加地址 设置地址通过 insert 语句在库中插入地址

3.对已完成的订单进行订单评价和评分

在这里插入图片描述

4.查询订单

可以通过订单的ID ,名称,状态 来搜索到订单

if (isNumber) {
            searchClause =
                "AND (o.order_id LIKE ? "
                " OR o.name LIKE ? "
                " OR o.status LIKE ? "
                " OR oi.product_id = ?) ";
            searchProductId = true;
        } else {
            searchClause =
                "AND (o.order_id LIKE ? "
                " OR o.name LIKE ? "
                " OR o.status LIKE ?) ";
        }
    }

    query.prepare(
        QString(
            "SELECT o.order_id, o.order_time, o.total_amount, o.status, o.name, "
            "oi.product_id, oi.quantity, oi.price_at_order "
            "FROM `order` o "
            "JOIN order_item oi ON o.order_id = oi.order_id "
            "WHERE o.user_id = ? "
            "%1"
            "ORDER BY o.order_id"
            ).arg(searchClause)
        );

    // 绑定用户ID
    query.addBindValue(userId);
    QString effectiveKeyword = keyword;
    auto statusMap = statusChineseToEnglish();
    if (statusMap.contains(keyword)) {
        effectiveKeyword = statusMap.value(keyword); // 替换为英文关键词
    }
    // 绑定搜索参数
    if (!keyword.isEmpty()) {
       QString likeParam = "%" + effectiveKeyword + "%";
        query.addBindValue(likeParam); // order_id
        query.addBindValue(likeParam); // name
        query.addBindValue(likeParam); // status

        if (searchProductId) {
            query.addBindValue(keyword.toInt()); // 精确匹配product_id
        }
    }

5.商家的注册和登录

在这里插入图片描述

商家表的功能

在这里插入图片描述

展示产品

通过创建QVector 来存储商家的所有的产品

while (query.next()) {
            Product p;
            p.id = query.value("product_id").toInt();
            products.append(p);
        }

产品下架

通过设置product的isvible 来起到下架的功能

查看历史产品

可以对已经下架的产品重新修改信息,然后再次上架

订单的展示

 std::sort(orders.begin(), orders.end(), [](const Order& a, const Order& b) {
            // 定义状态优先级(数值越小越靠前)
            QHash<QString, int> priority{
                {"pending", 1},    // 待处理(最前)
                {"accepted", 2},   // 已接受
                {"shipped", 3},    // 已发货
                {"rejected", 4},   // 已拒绝
                {"completed", 5}   // 已完成(最后)
            };
            return priority[a.status.toLower()] < priority[b.status.toLower()];
        });

使用了QHash来进行排序展示

const QHash<QString, QString> m_statusMap = {
        {"pending",   "待处理"},
        {"accepted",  "已接受"},
        {"shipped",   "已发货"},
        {"completed", "已完成"},
        {"cancelled", "已取消"},
        {"rejected",  "已拒绝"}
    };

对数据库中的英文在系统中以中文的形式展示

设置时间,修改店名,地址功能

Websocket的使用

体现在用户下单商家口会出现弹窗
当商家接受 拒绝以及出单的时候用户端都会有弹窗出现
user 和merchant作为两个客户端连接到服务器中通过

void WebSocketServer::notifyNewOrder(int merchantId, const QJsonObject &orderData) {
    if (m_merchantConnections.contains(merchantId)) {
        QWebSocket *socket = m_merchantConnections[merchantId];
        QJsonObject msg;
        msg["type"] = "new_order";
        msg["data"] = orderData;
        socket->sendTextMessage(QJsonDocument(msg).toJson());
    }
}
bool WebSocketServer::notifyUser(int userId, const QJsonObject &data) {
    if (m_userConnections.contains(userId)) {
        QWebSocket *socket = m_userConnections[userId];
        QJsonObject msg;
        msg["type"] = "order_update";
        msg["data"] = data;
        socket->sendTextMessage(QJsonDocument(msg).toJson());
        return true;
    }
    return false;
}

实现功能

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值