• 基于QML和JavaScript的嵌入式自助零售服务终端界面:整合SQLite、OAuth 2.0与Qt Linguist实现多功能解决方案(代码示例))


    一、项目概述

    随着零售行业的快速发展,自助服务终端逐渐成为提升顾客体验和运营效率的重要工具。本项目旨在开发一个用于零售环境中的自助服务终端界面,主要功能包括商品浏览、购物车管理、用户登录、支付处理等。该终端不仅要具备良好的用户界面体验,还要支持多语言和多货币,满足不同地区客户的需求。我们将使用QML(Qt Modeling Language)作为主要的界面开发工具,结合C++作为后端逻辑支持,构建一个稳定、高效的系统。

    二、系统架构

    为了实现项目的需求,我们设计了一套合理的系统架构。整体架构分为前端、后端和数据存储三大部分。以下是系统架构的技术栈和组件:

    • 前端技术栈

    • QML:构建用户界面

    • Qt Quick:提供基本元素和交互动画。

    • Qt Quick Controls:标准控件。

    • Qt Quick Layouts:布局管理。

    • JavaScript:逻辑控制和事件处理。

    • Qt Multimedia:播放多媒体内容。

    • 后端技术栈

    • C++(Qt Framework):核心逻辑和性能优化。

    • Qt Core:基本的数据结构和事件循环。

    • Qt Network:网络通信。

    • Qt SQL:本地数据库操作。

    • 数据存储

    • SQLite:轻量级本地数据库。

    • 安全与认证

    • OAuth 2.0:用户认证。

    • 多语言支持

    • Qt Linguist:界面国际化。

    • 多货币支持

    • 货币转换API:实时汇率转换。

    • 硬件交互

    • Qt Serial Port:与外部设备通信。

    系统架构图

    使用
    使用
    前端
    QML
    Qt Quick
    Qt Quick Controls
    Qt Quick Layouts
    JavaScript
    Qt Multimedia
    后端
    C++ Qt Framework
    Qt Core
    Qt Network
    Qt SQL
    数据存储
    SQLite
    安全与认证
    OAuth 2.0
    多语言支持
    Qt Linguist
    多货币支持
    货币转换API
    硬件交互
    Qt Serial Port

    三、环境搭建

    为了开始开发,我们需要搭建合适的开发环境,以下是具体步骤:

    1. 安装Qt SDK
    • 下载并安装最新版本的Qt SDK

    • 在安装过程中,选择Qt Quick、Qt Multimedia等模块。

    1. 配置Qt Creator
    • 启动Qt Creator,选择合适的Qt版本进行新项目创建。
    1. 安装SQLite
    • SQLite通常与Qt自带,但如果需要,可以从SQLite官网下载并集成。
    1. 配置OAuth 2.0
    • 使用Qt Network模块设置OAuth 2.0的相关依赖。
    1. 准备多语言支持
    • 使用Qt Linguist工具准备多语言支持文件。

    四、代码实现

    在本节中,我们将详细实现自助服务终端的核心功能,包括用户界面、数据交互、用户认证等。我们将分模块展示代码示例,并对每个部分进行详细说明。

    1. QML界面设计

    在自助服务终端中,用户界面是用户交互的主要部分。我们使用QML构建一个简单而直观的界面。

    示例代码:主界面 QML
    import QtQuick 2.15
    import QtQuick.Controls 2.15
    
    ApplicationWindow {
        visible: true
        width: 800
        height: 600
        title: "自助服务终端"
    
        Rectangle {
            anchors.fill: parent
            color: "#f0f0f0"
    
            Column {
                spacing: 20
                anchors.centerIn: parent
    
                Text {
                    text: "欢迎使用自助服务终端"
                    font.pointSize: 24
                    horizontalAlignment: Text.AlignHCenter
                }
    
                Button {
                    text: "浏览商品"
                    onClicked: {
                        // 导航到商品列表页面
                        stackView.push("ProductList.qml")
                    }
                }
    
                Button {
                    text: "查看购物车"
                    onClicked: {
                        // 导航到购物车页面
                        stackView.push("Cart.qml")
                    }
                }
    
                Button {
                    text: "用户登录"
                    onClicked: {
                        // 导航到登录页面
                        stackView.push("Login.qml")
                    }
                }
            }
        }
    }
    
    代码说明
    • ApplicationWindow:应用的主窗口,设置宽度和高度。

    • Rectangle:用于设置背景颜色。

    • Column:用于垂直排列组件。

    • Text:显示欢迎信息。

    • Button:创建多个按钮以实现导航功能。每个按钮的 onClicked 信号连接到对应页面的导航逻辑。

    2. 商品列表页面

    商品列表页面展示可供购买的商品信息,并允许用户将商品添加到购物车。

    示例代码:商品列表 QML
    import QtQuick 2.15
    import QtQuick.Controls 2.15
    import QtQuick.Layouts 1.15
    
    Rectangle {
        width: 800
        height: 600
        color: "#ffffff"
    
        ColumnLayout {
            anchors.fill: parent
    
            Text {
                text: "商品列表"
                font.pointSize: 24
                Layout.alignment: Qt.AlignHCenter
            }
    
            ListView {
                id: productListView
                width: parent.width
                height: parent.height * 0.8
                model: productModel
                delegate: Item {
                    width: productListView.width
                    height: 60
    
                    RowLayout {
                        anchors.fill: parent
                        spacing: 10
    
                        Text {
                            text: model.name
                            width: parent.width * 0.6
                        }
    
                        Text {
                            text: "$" + model.price
                            width: parent.width * 0.2
                        }
    
                        Button {
                            text: "添加到购物车"
                            onClicked: {
                                // 添加商品到购物车的逻辑
                                addToCart(model.id)
                            }
                        }
                    }
                }
            }
        }
    }
    
    代码说明
    • ListView:用于显示商品列表,使用 productModel 作为数据源。

    • Item:每个商品项的显示结构,包括名称、价格和添加到购物车的按钮。

    • addToCart():函数用于将选中的商品添加到购物车。

    3. 数据交互

    使用C++实现后端逻辑,处理与数据库的交互和网络请求。以下示例展示如何使用Qt SQL模块与SQLite数据库进行交互。

    示例代码:C++ 数据库操作

    在自助服务终端中,我们使用Qt SQL模块与SQLite数据库进行交互,以便加载商品数据、添加商品到购物车等操作。以下是具体的实现代码。

    1. 数据库管理类

    我们首先定义一个DatabaseManager类,用于管理数据库的连接和操作。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    class Product {
    public:
        int id;
        QString name;
        double price;
    
        Product(int id, const QString &name, double price)
            : id(id), name(name), price(price) {}
    };
    
    class DatabaseManager {
    public:
        DatabaseManager() {
            // 连接到SQLite数据库
            db = QSqlDatabase::addDatabase("QSQLITE");
            db.setDatabaseName("retail_terminal.db");
    
            // 打开数据库连接
            if (!db.open()) {
                qDebug() << "无法连接到数据库:" << db.lastError().text();
            } else {
                qDebug() << "数据库连接成功";
            }
        }
    
        ~DatabaseManager() {
            db.close();
        }
    
        // 加载商品数据
        QVector<Product> loadProducts() {
            QVector<Product> products; // 用于存储商品信息
    
            QSqlQuery query("SELECT id, name, price FROM products");
            if (!query.exec()) {
                qDebug() << "查询失败:" << query.lastError().text();
                return products; // 返回空的商品列表
            }
    
            while (query.next()) {
                int id = query.value(0).toInt();
                QString name = query.value(1).toString();
                double price = query.value(2).toDouble();
                products.append(Product(id, name, price)); // 添加商品到列表
            }
    
            return products; // 返回商品列表
        }
    
        // 将商品添加到购物车
        bool addToCart(int productId) {
            QSqlQuery query;
            query.prepare("INSERT INTO cart (product_id) VALUES (:product_id)");
            query.bindValue(":product_id", productId);
    
            if (!query.exec()) {
                qDebug() << "添加到购物车失败:" << query.lastError().text();
                return false; // 添加失败
            }
            return true; // 添加成功
        }
    
    private:
        QSqlDatabase db; // 数据库连接
    };
    
    代码说明
    • Product 类:用于存储商品的基本信息,包括idnameprice

    • DatabaseManager 类:

    • 使用INSERT INTO语句将商品ID插入到购物车表中。

    • 在执行查询时,检查是否成功,并输出相应的错误信息。

    • 使用SQL查询语句SELECT id, name, price FROM products

    • 遍历查询结果,将每个商品的信息创建为Product对象并添加到返回的QVector中。

    • 构造函数:创建SQLite数据库连接,设置数据库名称为retail_terminal.db,并尝试打开连接。如果连接失败,将输出错误信息。

    • 析构函数:关闭数据库连接。

    • loadProducts():查询数据库中的所有商品,并返回QVector类型的商品列表。

    • addToCart(int productId):将指定商品添加到购物车。

    4. 在 QML 中使用数据库操作

    接下来,我们需要在QML中调用DatabaseManager以加载商品数据并处理用户操作。

    在 QML 中使用数据库
    #include 
    #include 
    #include 
    #include "DatabaseManager.h"
    
    int main(int argc, char *argv[]) {
        QGuiApplication app(argc, argv);
        QQmlApplicationEngine engine;
    
        DatabaseManager dbManager; // 创建数据库管理对象
        engine.rootContext()->setContextProperty("dbManager", &dbManager); // 将数据库管理对象暴露给QML
    
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        return app.exec();
    }
    
    QML 示例代码

    在这个示例中,我们将创建一个商品列表界面,使用DatabaseManager来加载商品数据,并允许用户将商品添加到购物车。

    1. 商品列表 QML

    以下是商品列表的完整QML代码示例:

    import QtQuick 2.15
    import QtQuick.Controls 2.15
    import QtQuick.Layouts 1.15
    
    Rectangle {
        width: 800
        height: 600
        color: "#ffffff"
    
        ColumnLayout {
            anchors.fill: parent
    
            Text {
                text: "商品列表"
                font.pointSize: 24
                Layout.alignment: Qt.AlignHCenter
            }
    
            ListView {
                id: productListView
                width: parent.width
                height: parent.height * 0.8
                model: productModel // 这里使用 QML 的 ListModel
                delegate: Item {
                    width: productListView.width
                    height: 60
    
                    RowLayout {
                        anchors.fill: parent
                        spacing: 10
    
                        Text {
                            text: model.name
                            width: parent.width * 0.6
                        }
    
                        Text {
                            text: "$" + model.price.toFixed(2) // 价格格式化
                            width: parent.width * 0.2
                        }
    
                        Button {
                            text: "添加到购物车"
                            onClicked: {
                                // 调用C++的方法将商品添加到购物车
                                dbManager.addToCart(model.id)
                            }
                        }
                    }
                }
            }
        }
    
        // 加载商品数据
        Component.onCompleted: {
            loadProducts();
        }
    
        function loadProducts() {
            var products = dbManager.loadProducts(); // 调用C++方法获取商品列表
            productModel.clear(); // 清空现有模型数据
    
            // 遍历加载的商品数据并添加到ListView模型中
            for (var i = 0; i < products.length; i++) {
                productModel.append({
                    id: products[i].id,
                    name: products[i].name,
                    price: products[i].price
                });
            }
        }
    }
    

    代码说明

    1. ListView:用于展示商品列表,model设置为productModel,这是一个自定义的QML ListModel,用于存储商品信息。

    2. delegate:每个商品的显示结构,包括商品名称、价格和“添加到购物车”按钮。每个按钮的onClicked信号连接到C++方法addToCart(model.id),用于将商品添加到购物车。

    3. Component.onCompleted:当组件完成加载时,调用loadProducts()函数来加载商品数据。

    4. loadProducts():从dbManager(C++中的数据库管理对象)获取商品数据。该函数首先清空现有的productModel,然后遍历从数据库加载的商品数据,并将其添加到ListView模型中。

    5. 数据库表结构

    为了确保我们的应用程序正常工作,我们需要在SQLite数据库中设置相应的表结构。以下是创建商品和购物车表的SQL语句:

    CREATE TABLE products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        price REAL NOT NULL
    );
    
    CREATE TABLE cart (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        product_id INTEGER NOT NULL,
        FOREIGN KEY (product_id) REFERENCES products(id)
    );
    

    五、项目总结

    通过以上步骤,我们成功开发了一个用于零售环境中的自助服务终端界面。项目的主要功能包括:

    • 使用 QML 创建用户友好的界面,允许用户浏览商品、查看购物车和进行用户登录

    • 使用 C++ 和 Qt SQL 模块与 SQLite 数据库进行交互,实现商品数据的加载和购物车管理。

    • 将数据库管理器对象暴露给 QML,使得界面和数据库操作能够无缝配合。

    • 通过适当的错误处理,确保应用程序在数据库连接或操作失败时能够给出反馈。

    本项目可以进一步扩展,例如增加用户登录功能、支付模块、商品搜索功能等,提高自助服务终端的实用性和用户体验。希望这一系列的实现能够为读者提供清晰的理解和实用的参考。

  • 相关阅读:
    MySQL数据库 -- 入门篇
    openGauss数据库客户端连接工具之Datastudio安装
    人工智能 框架 paddlepaddle 飞桨 使用指南& 使用例子 线性回归模型demo 详解
    Java如何使用for each遍历LinkedList链表集合中的元素呢?
    基于 StarRocks 的风控实时特征探索和实践
    COSCon'22 第七届中国开源年会火热报名中,喜迎新一波赞助伙伴
    .NET关于 跳过SSL中遇到的问题
    java毕业生设计超市货品进销存系统后台计算机源码+系统+mysql+调试部署+lw
    STC/MLLT--学习笔记
    使用Webpack设置TS引用模块,解决Module not found: Error: Can‘t resolve ‘./m1‘ in ...问题
  • 原文地址:https://blog.csdn.net/qq_40431685/article/details/141065854