这里写目录标题
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;
}
实现功能