基于QT的商场线上购物管理系统之客户端

一:前言

作为自己的练习项目,项目内容可能并不符合业务逻辑,但是涉及到的QT知识运用比较全面。作为新手阶段性练手的项目。

二:项目介绍

本项目的主要功能实验在线购物,咨询客服,实时监控,销售记录,广告视频播放等功能。


基于QT的商场线上购物管理系统之客户端_第1张图片
基于QT的商场线上购物管理系统之客户端_第2张图片

三:开发工具

  • 操作系统:window10
  • IDE :Qt Creator 3.1.2 Based on Qt 5.3.1 (MSVC 2010, 32 bit)
  • 数据库:Mysql

四:源程序

程序文件名:
基于QT的商场线上购物管理系统之客户端_第3张图片
userwidget.ui
基于QT的商场线上购物管理系统之客户端_第4张图片
consult.ui
基于QT的商场线上购物管理系统之客户端_第5张图片

Client.pro文件

QT       += core gui sql
QT       += multimedia
QT       += multimediawidgets
QT       += network
CONFIG += c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Client
TEMPLATE = app


SOURCES += main.cpp \
    userwidget.cpp \
    consult.cpp

HEADERS  += \
    userwidget.h \
    consult.h

FORMS    += \
    userwidget.ui \
    consult.ui

OTHER_FILES +=

RESOURCES +=

userwidget.h

#ifndef WIDGET_H
#define WIDGET_H
using namespace std;
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//数据库头文件
#include 
#include 
#include 
#include 
#include 
#include 
//consult类
#include "consult.h"
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void connectDB(); //连接数据库
    void initData();
    void setgoodslist();
private slots:
    bool on_pushButton_register_clicked();

    bool on_pushButton_login_clicked();

    bool on_pushButton_quit_clicked();

    void on_pushButton_search_clicked();

    void on_comboBox_currentIndexChanged(const QString &arg1);

    void on_comboBox_2_currentIndexChanged(const QString &arg1);



    bool on_pushButton_addgoods_clicked();

    void on_tabWidget_tabBarClicked();

    bool on_pushButton_pay_clicked();

    void on_pushButton_3_clicked();

    void on_tableWidget_shoopCart_cellClicked(int row, int column);


    void on_pushButton_consult_clicked();

private:
    Ui::Widget *ui;
    QCamera *camera;
    QVideoWidget *showlabel;
    //QTimer *mytimer;
    QMediaPlayer *player;
    QVideoWidget *videoWidget;
    QMediaPlaylist *medialist;
    QSqlTableModel *model;
    consult *consult_subwidget;
    int menu_high;//QTableWidget增加行
    int cur_row;//购物车选中行
    int cur_column;//购物车选中列
    //tcp
    QTcpSocket *clientSocket;

};

#endif // WIDGET_H

userwidget.cpp

#include "userwidget.h"
#include "ui_userwidget.h"
#include 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("客户端界面");
    menu_high=0;
    consult_subwidget=new consult;
    ///*******接收子窗口的信号********/
    connect(consult_subwidget,&consult::mySignal,
            [=]()
    {
        this->show();
        consult_subwidget->hide();
    }
            );
    /*********************摄像头调用*********************/

    camera=new QCamera;
    showlabel=new QVideoWidget(ui->label);
    showlabel->resize(ui->label->size());
    camera->setViewfinder(showlabel); //设置取景部件

    // QCameraImageCapture *imageCapture;
    //imageCapture =new QCameraImageCapture(camera);
    //camera->setCaptureMode(QCamera::CaptureStillImage);//设置采集模式(采集为图片)
    camera->start();                           //开启摄像头
///

    /*********************更新当前日期时间*******************************/
    QTimer *mytimer=new QTimer;
    mytimer->start(1000);
    connect(mytimer,&QTimer::timeout,
            [=]()
    {
        ui->label_time->setText(QTime::currentTime().toString());
        ui->label_date->setText(QDate::currentDate().toString("yyyy年MM月dd号 "));
    }

    );
    /*******************广告轮播视频************************/
    player=new QMediaPlayer ;
    videoWidget=new QVideoWidget(ui->label_ad);
    medialist=new QMediaPlaylist;
//    QVBoxLayout *layout = new QVBoxLayout;  //用于指定视频播放的位置
    videoWidget->resize(ui->label_ad->size());

//    layout->addWidget(videoWidget);
//    ui->label_ad->setLayout(layout);
    player->setVideoOutput(videoWidget);//设置播放输出
    medialist->addMedia(QUrl::fromLocalFile("E:\\360MoveData\\Users\\jill\\Desktop\\Client\\iphone11.mp4")); // \为转义字符,将视频放入容器
    medialist->addMedia(QUrl::fromLocalFile("E:/360MoveData/Users/jill/Desktop/Client/mv.mp4"));
    player->setPlaylist(medialist);//设置播放容器
    medialist->setPlaybackMode(QMediaPlaylist::Loop);//设置播放模式
    videoWidget->show();//窗体显示
    player->play();      //播放
    /****************更新商品类别*********************/
    connectDB();//连接数据库
    initData();//更新商品类别
    ui->pushButton_addgoods->setEnabled(false);//登陆前加入购物车不可用
    ui->pushButton_quit->setEnabled(false);//登陆前退出登录不可用
    ui->pushButton_pay->setEnabled(false);//登陆前结算按钮不可用



}

Widget::~Widget()
{
    delete camera;
    delete showlabel;
    //delete mytimer;
    delete player;
    delete videoWidget;
    delete medialist;
    delete consult_subwidget;
    //delete querymodel;

}
/****************数据库连接***************/
void Widget::connectDB()
{
    //添加数据库
    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setUserName("root");
    db.setPassword("4218");
    db.setDatabaseName("mall");
    //打开数据库
    if(!db.open())
    {
        QMessageBox::warning(this, "数据库打开失败", db.lastError().text());
        return;
    }
}
/****************将数据库内容初始化到选择框***********/
void Widget::initData()
{
    QSqlQueryModel *querymodel=new QSqlQueryModel(this);//新建模型
    querymodel->setQuery("select item from category");
    ui->comboBox->setModel(querymodel);//选择框设置sql模型
}

/*********会员注册登录退出**************/
bool Widget::on_pushButton_register_clicked()//注册
{

    if(ui->lineEdit_name->text().isEmpty()||ui->lineEdit_password->text().isEmpty()||ui->lineEdit_name->text().isEmpty())
    {
        QMessageBox::information(this,"注册提示","请填写注册信息");
        return false;

    }
    else
    {
            QString name= ui->lineEdit_name->text();
            QString sex;
            if (ui->radioButton_man->isChecked())
                 sex="男";
            else if(ui->radioButton_girl->isChecked())
                 sex="女";
            else
                sex="null";
            QString member_name=ui->lineEdit_account->text();
            QString password=ui->lineEdit_password->text();
            qDebug()<<name<<sex<<member_name<<password;
            //插入数据库
            QSqlQuery query;

            QSqlDatabase::database().transaction(); // 记录插入前的状态
            QString sql = QString("insert into register (name,sex,member_name,password) values ('%1','%2','%3','%4')").arg(name).arg(sex).arg(member_name).arg(password);
            bool b1 = query.exec(sql);
            if(b1){
                QSqlDatabase::database().commit();
                QMessageBox::information(this,"注册提示","注册成功!");
            }
            else
            {
                QSqlDatabase::database().rollback();
                QMessageBox::information(this,"注册提示","注册未成功!");
            }
            //service->socket.write(temp.toUtf8());
        }
        ui->radioButton_girl->setChecked(false);
        ui->radioButton_man->setChecked(false);
        ui->lineEdit_name->clear();
        ui->lineEdit_password->clear();
        ui->lineEdit_name->clear();
        return true;
    }

bool Widget::on_pushButton_login_clicked()//登录
{
    if(ui->lineEdit_password->text().isEmpty()||ui->lineEdit_account->text().isEmpty())

    {
        QMessageBox::warning(this,"登录提示","登录失败,需填完整的账号及密码");
        return false;
    }
    else
    {
        QString account=ui->lineEdit_account->text();
        QString pass_word = ui->lineEdit_password->text();
        QString sex;
        if(ui->radioButton_girl->isChecked())
            sex="女";
        else if(ui->radioButton_man->isChecked())
            sex="男";
        else
            sex="null";
        //对比数据库
        QSqlQuery query;
        QString sql = QString("select sex,member_name,password from register where sex='%1' and member_name='%2' and password='%3'")
                               .arg(sex).arg(account).arg(pass_word);
        query.exec(sql);
        if( query.next())//判断有无查询记录
        {
            //有记录
            QMessageBox::information(this,"登录提示","登录成功!");
            //登录成功后不准注册
            ui->radioButton_girl->setChecked(false);
            ui->radioButton_man->setChecked(false);
            ui->lineEdit_account->clear();
            ui->lineEdit_password->clear();
            ui->lineEdit_name->clear();
            ui->pushButton_addgoods->setEnabled(true);//打开加入购物车使能
            ui->pushButton_quit->setEnabled(true);
        }
        else
        {
            //无记录
            QMessageBox::information(this,"登录提示","不存在此用户,请重新登录!");
            return false;
        }

        return true;
    }
}

bool Widget::on_pushButton_quit_clicked()//退出
{
    QMessageBox::information(this,"退出提示","退出成功");
    ui->pushButton_addgoods->setEnabled(false);
    ui->pushButton_quit->setEnabled(false);
    return true;
}
/***************查找商品*****************/
void Widget::on_pushButton_search_clicked()
{
    ui->textBrowser_searchGoods->clear();
    QString tmp;
    tmp=ui->lineEdit_searchgoods->text();
    qDebug()<<tmp;
    if(tmp.isEmpty())
    {
        QMessageBox::information(this,"查找商品","输入文本不能为空");
    }
    else
    {
        int flag=0;//商品查询标志
        QSqlQuery query;

        QString sql=QString("select goods,price,last from goods where goods like '%%1%'").arg(tmp);
        if(query.exec(sql))
        {

            while(query.next())
            {
                QString goods=query.value(0).toString();
                QString price=query.value(1).toString();
                QString last =query.value(2).toString();
                ui->textBrowser_searchGoods->append("商品名:"+goods+"\t价格:"+price+"\t剩余"+last+"\n");
                flag=1;
                ui->lineEdit_searchgoods->clear();
            }
        }
        else
            QMessageBox::warning(this, "查询失败", query.lastError().text());
        if(flag==0)
        {
            QMessageBox::information(this,"查找商品","未找到相关商品");
        }
                ui->lineEdit_searchgoods->clear();
    }

}
/**********商品类别改变槽信号***********/
void Widget::on_comboBox_currentIndexChanged(const QString &arg1)
{
    ui->comboBox_2->clear();
    ui->spinBox->setValue(1);
    if(arg1=="请选择商品")
    {
        ui->pushButton_addgoods->setEnabled(false);
        ui->lineEdit_price->clear();
        ui->lineEdit_last->clear();
    }
    else
    {
        ui->comboBox_2->clear();
        QSqlQuery query;
        QString sql=QString("select goods,price,last from goods where item='%1'").arg(arg1);
        //执行sql语句
        query.exec(sql);
        while(query.next())
        {
            QString goods= query.value(0).toString();
            ui->comboBox_2->addItem(goods);
//            QString price=query.value(1).toString();
//            ui->lineEdit_price ->setText(price);
//            QString last=query.value(2).toString();
//            ui->lineEdit_last->setText(last);
        }
    }

}
/*************商品改变槽信号***********/
void Widget::on_comboBox_2_currentIndexChanged(const QString &arg1)
{
    QSqlQuery query;
    QString sql=QString("select price,last from goods where item='%1' and goods='%2'").
            arg(ui->comboBox->currentText()).arg(arg1);
    //执行sql语句
    query.exec(sql);
    while(query.next())
    {
        QString price=query.value(0).toString();
        ui->lineEdit_price ->setText(price);
        QString last=query.value(1).toString();
        ui->lineEdit_last->setText(last);
    }
}
/******************显示商品列表************************/
void Widget::setgoodslist()
{
    model=new QSqlTableModel(this);//设置模型
    model->setTable("goods");//指定表
    ui->tableView_list->setModel(model);//把mode放到view
    model->select();//显示model里的数据
    //改表头
    model->setHeaderData(0,Qt::Horizontal,"商品号");
    model->setHeaderData(1,Qt::Horizontal,"类目");
    model->setHeaderData(2,Qt::Horizontal,"商品");
    model->setHeaderData(3,Qt::Horizontal,"价钱");
    model->setHeaderData(4,Qt::Horizontal,"余量");
    //设置view编辑触发条件 不设置可修改view
    ui->tableView_list->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置提交策略(手动提交)

}
/*********加入购物车*********/
bool Widget::on_pushButton_addgoods_clicked()
{

    //判断库存
    int last=ui->lineEdit_last->text().toInt()-ui->spinBox->text().toInt();//加购物车后剩余
    if(last<=0)
    {
        QMessageBox::information(ui->tableWidget_shoopCart,"添加商品提示","对不起库存不足");
        return false;
    }
    //库存充足,购物车显示
    QString item =ui->comboBox->currentText();
    QString goods =ui->comboBox_2->currentText();
    QString count =QString::number(ui->spinBox->value());//int->Qstring
    QString single_goods_total = QString::number((ui->spinBox->value()*ui->lineEdit_price->text().toInt()));
    //结算总价=第一次总价+后面的单价
    ui->textBrowser_total->setText(QString::number(ui->textBrowser_total->toPlainText().toInt()+single_goods_total.toInt()));
    //QTableWidget显示
    ui->tableWidget_shoopCart->setRowCount(menu_high+1);
    ui->tableWidget_shoopCart->setItem(menu_high,0,new QTableWidgetItem(goods));
    ui->tableWidget_shoopCart->setItem(menu_high,1,new QTableWidgetItem(item));
    ui->tableWidget_shoopCart->setItem(menu_high,2,new QTableWidgetItem(count));
    ui->tableWidget_shoopCart->setItem(menu_high,3,new QTableWidgetItem(single_goods_total));
    menu_high++;
    ui->lineEdit_last->setText(QString::number(last));
    ui->spinBox->setValue(1);
    ui->pushButton_pay->setEnabled(true);
    QMessageBox::information(ui->tableWidget_shoopCart,"添加商品提示","添加成功.可去购物菜单查看");
    return true;
}
/*************商品列表显示*************/
void Widget::on_tabWidget_tabBarClicked()
{
    setgoodslist();//显示商品列表
}
/************结算***************/
bool Widget::on_pushButton_pay_clicked()
{
    //写交易记录文件
    QFile file("./trading_record.txt");
    bool fp=file.open(QIODevice::Append);
    //1.更新数据库
    //获取tableWidget_shoopCart的信息
    int i=0;
    for(i=0;i<ui->tableWidget_shoopCart->rowCount();i++)
    {
        QString goods_name=ui->tableWidget_shoopCart->item(i,0)->text();
        QString items=ui->tableWidget_shoopCart->item(i,1)->text();
        int number=ui->tableWidget_shoopCart->item(i,2)->text().toInt();
        QString total=ui->tableWidget_shoopCart->item(i,3)->text();

        //更新数据库
        QSqlQuery query;
        QSqlDatabase::database().transaction(); // 记录更新前的状态
        QString sql = QString("update goods set last=last-'%1' where item='%2' and goods='%3'")
                .arg(number)
                .arg(items).arg(goods_name);
        bool b1 = query.exec(sql);
        if(b1){
            QSqlDatabase::database().commit();
        }
        else
        {
            QSqlDatabase::database().rollback();
        }
        //3.写文件交易记录

        if(fp)
        {
            QString str=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")+
                    "\t商品:"+goods_name+"\t所属类目:"+items+
                    "\t成交数量:"+QString::number(number)+"\t总计:"+total+"\n";
            file.write(str.toLocal8Bit());

        }
        else
        {
            qDebug()<<"文件写入失败";
        }

    }
    QMessageBox::information(this,"结算提示","结算成功");
    file.write("*******************************\n");
    //2.清空购物车
    int row=ui->tableWidget_shoopCart->rowCount();
    for (int var = 0; var < row; var++)
    {
        ui->tableWidget_shoopCart->removeRow(0);
    }
    menu_high=0;//购物车行数清零
    //4.结算使能关闭
    ui->pushButton_pay->setEnabled(false);
    ui->textBrowser_total->clear();
    return true;
}
/*****************购物车删除******************/
void Widget::on_pushButton_3_clicked()
{
    //选中行大于购物车的总行数或则
    if(cur_row > ui->tableWidget_shoopCart->currentRow()||ui->tableWidget_shoopCart->currentRow()<0||cur_row==-1)
    {
        QMessageBox::information(ui->tableWidget_shoopCart,"删除商品提示","删除失败");
    }
    else
    {
        //总加减去删除的商品数
        ui->textBrowser_total->setText(QString::number(
                        (ui->textBrowser_total->toPlainText().toDouble()-ui->tableWidget_shoopCart->item(cur_row,3)->text().toDouble())));
        ui->tableWidget_shoopCart->removeRow(cur_row);
        menu_high--;
    }
}
/********购物车选中槽函数cellClicked*********/
void Widget::on_tableWidget_shoopCart_cellClicked(int row, int column)
{
    cur_row=row;
    cur_column=column;
}

/*********在线咨询按钮**************/
void Widget::on_pushButton_consult_clicked()
{

    consult_subwidget->TCP_Connect();
    this->hide();
    consult_subwidget->show();
}

consult.h

#ifndef CONSULT_H
#define CONSULT_H

#include 
#include 
#include 
#include 
namespace Ui {
class consult;
}

class consult : public QWidget
{
    Q_OBJECT

public:
    explicit consult(QWidget *parent = 0);
    ~consult();

private:
    Ui::consult *ui;
public:
    QTcpSocket *clientSocket;
    void TCP_Connect();
protected:
    void keyPressEvent(QKeyEvent *event);//键盘按下事件
private slots:

    void on_pushButton_Return_clicked();

    void on_pushButton_Send_clicked();

    void on_pushButton_ClearInput_clicked();

    void on_pushButton_ClearDisplay_clicked();

signals:
    void mySignal();
};

#endif // CONSULT_H

consult.cpp

#include "consult.h"
#include "ui_consult.h"

consult::consult(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::consult)
{
    ui->setupUi(this);
    clientSocket=NULL;
    this->setWindowTitle("咨询客服界面");
    TCP_Connect();
}

consult::~consult()
{
    delete ui;
    delete clientSocket;
}

void consult::TCP_Connect()
{
    clientSocket=new QTcpSocket(this);
    //获取服务端地址和端口,主动和服务器建立连接
    clientSocket->connectToHost("127.0.0.1",10000);
    connect(clientSocket,&QTcpSocket::connected,  //连接
            [=]()
    {
        ui->textBrowser->setText("客服:你好,请问你有什么帮助吗!");
        connect(clientSocket,&QTcpSocket::readyRead,  //等待接收
                [=]()
        {
            QByteArray array=clientSocket->readAll(); //字节数组接收
            ui->textBrowser->append("客服:"+array);  //显示
        }

        );
    }
    );
}



void consult::on_pushButton_Return_clicked()
{
    emit mySignal();//发信号
    //返回主界面关闭socket连接
    if(clientSocket==NULL)
    {
        return;
    }
    clientSocket->disconnectFromHost();
    clientSocket->close();

}

void consult::on_pushButton_Send_clicked()
{
    if(clientSocket==NULL)
    {
        return;
    }
    //获取编辑区内容
    QString str=ui->textEdit->toPlainText();
    if(str.isEmpty())//若编辑区为空返回
    {
        return;
    }
    //给对方发送数据
    clientSocket->write(str.toUtf8().data());
    QString tmp="我:"+str;
    ui->textBrowser->append(tmp);
    ui->textEdit->clear();
}
//enter按下事件
void consult::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Enter||event->key()==Qt::Key_Return)//Ctrl+Enter响应,可通过事件过滤器实现在textEdit按下enter发送
    {
        on_pushButton_Send_clicked();
    }
//    switch (event->key()) {
//    case Qt::Key_Return:
//        on_pushButton_Send_clicked();

//        break;
//    default:
//        break;
//    }
}
//输入框清空
void consult::on_pushButton_ClearInput_clicked()
{
    ui->textEdit->clear();
}
//显示框清空
void consult::on_pushButton_ClearDisplay_clicked()
{
    ui->textBrowser->clear();
}

你可能感兴趣的:(QT,mysql,qt)