Qt项目-安防监控系统(欢迎登录注册)

目录

一:开机动画

1.myItem.h .cpp

2.myView.h .cpp 

二:登录+注册

3.loginWidget.h .cpp

4.RegisterWidget.h .cpp

三:MVC设计模式-用户信息

5.SingelDB.h .cpp

6.UserControl.h .cpp

7.UserModel.h .cpp


一:开机动画

1.myItem.h .cpp

#ifndef MYITEM_H
#define MYITEM_H

#include <QObject>//触发信号槽机制
#include<QGraphicsItem>//图元

class myItem : public QObject,public QGraphicsItem//多继承 派生出自己的图元类
{
    Q_OBJECT
public:
    explicit myItem(QObject *parent = 0);
    //自定义图元的带参构造 - 重载
    //参数:图片名字 图元类型 图元状态
    myItem(QString filename,int iType,bool isStatus);
    //碰撞检测函数 虚函数函数字体是斜体字 返回的是一个矩形边框-碰撞检测
    QRectF boundingRect() const;
    //图元绘制函数 虚函数函数字体是斜体字
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QPixmap image;//2D图元样式 - QPixmap
    int iType;//图元类型 根据类型来控制某个图元的运动
    bool isStatus;//图元状态 判断是否发生碰撞 bool类型判断状态
signals:

public slots:
    //控制图元的移动
    void advance(int phase);//纯虚函数 -- 需要自己实现
};

#endif // MYITEM_H
#include "myitem.h"
#include<QPainter>//图元绘制头文件
#include<QDebug>//测试定时器信号槽是否成功触发

myItem::myItem(QObject *parent) : QObject(parent)
{
}

myItem::myItem(QString filename, int iType, bool isStatus)
{
    image.load(filename);//加载图片 - 传入图片名
    this->iType = iType;//图元类型
    this->isStatus = isStatus;//图元状态
}

//碰撞 特效 需要的类
//返回值:一个矩形 - 矩形边框 - 碰撞检测
QRectF myItem::boundingRect() const
{
    //参数:坐标系xy 宽高尺寸
    return QRectF(0-image.width()/2,0-image.height()/2,image.width(),image.height());
}

void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    //图元绘制方法
    //参数:坐标系xy 宽高尺寸 图元
    painter->drawPixmap(0-image.width()/2,0-image.height()/2,image.width(),image.height(),image);
}

//图元移动的相关操作 控制图元的移动 坐标偏移setPos
void myItem::advance(int phase)
{
    //根据图元的类型来对不同的图元进行不同的控制
    if(this->iType ==1)
    {
        this->setPos(mapToScene(2,0));//-2负号向左移动
        //碰撞会将图元加到链表 - collidingItems的返回值是一个链表 链表数量大于0就是发生碰撞了
        if(collidingItems().count()>0)
        {
            //发生碰撞之后 - 需要改变图元的状态
            this->isStatus = true;//有发生碰撞 true
        }
    }
    if(this->iType ==2)
    {
        this->setPos(mapToScene(-2,0));//2正号向右移动
    }
}

2.myView.h .cpp 

#ifndef MYVIEW_H
#define MYVIEW_H

#include <QObject>         //触发信号槽机制
#include<QGraphicsView>    //视图
#include<QGraphicsScene>   //场景
#include"myitem.h"         //图元
#include<QTimer>           //定时器 - 图元移动

class myView : public QGraphicsView//派生出自己的视图类
{
    Q_OBJECT
public:
    explicit myView();//视图中创建场景 场景中放置图元
    QGraphicsScene *myScene;//视图中放置场景
    myItem *item1,*item2;//场景中放置图元
    QTimer *timer,*timer2;//定时器 图元的移动  再定义一个定时器 图元状态检测
signals:

public slots:
    void checkItemstatusSlot();//检测图元状态
};

#endif // MYVIEW_H
#include "myview.h"
#include<QDebug>//测试定时器信号槽是否成功触发
#include"setwidget.h"//设置界面

myView::myView()
{ 
    this->resize(400,400);//视图进行尺寸的设置
    setWindowFlags(Qt::FramelessWindowHint);//无边框
    //自己设置背景图片
    QPixmap pixmap(":/image/0508006.jpg");
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    setPalette(palette);
    //新建出一个场景
    QGraphicsScene *myScene = new QGraphicsScene;
    //视图中添加场景
    this->setScene(myScene);
    //新建两个图元 - 场景中放置图元      图元类型来控制不同的图元的运动
    item1 = new myItem(":/image/mao1.png",1,false);//图元1类型 false未碰撞
    item2 = new myItem(":/image/yu.png",2,false);  //图元2类型 false未碰撞
    //设置好图元的起始的位置 - 进行图元的显示
    item1->setPos(100,this->height()/2);
    item2->setPos(300,this->height()/2);
    //在场景中放置图元
    myScene->addItem(item1);
    myScene->addItem(item2);
    //图元的移动使用到定时器
    timer = new QTimer(this);
    //connect(timer,SIGNAL(timeout()),this,SLOT(timeSlot()));
    //让场景中的图元得到控制
    //      定时器   超时启动      让场景中的图元得到控制
    connect(timer,SIGNAL(timeout()),myScene,SLOT(advance()));
    timer->start(1000);//启动定时器
    //再使用一个定时器检测图元的状态
    timer2 = new QTimer(this);
    //      定时器   超时启动      让视图中的图元得到检测
    connect(timer2,SIGNAL(timeout()),this,SLOT(checkItemstatusSlot()));
    timer2->start(1000);//启动定时器
}

//检测图元状态 - 开机动画结束后跳转设置界面
void myView::checkItemstatusSlot()
{
    if(item1->isStatus == true)//图元状态为碰撞时停止 -- 两个定时器都停止
    {
        qDebug()<<"你已成功开机!";
        //碰撞过后,图元的状态需要复位
        timer->stop();//图元移动定时器停止
        item1->isStatus = false;//图元状态的复位
        timer2->stop();//图元检测定时器停止
        //开机动画结束后(发生碰撞之后) 跳转到登录界面
        SetWidget *setWidget = new SetWidget;
        setWidget->show();
        this->hide();
    }
}

二:登录+注册

3.loginWidget.h .cpp

#ifndef LOGINWIDGET_H
#define LOGINWIDGET_H

#include "setcontrol.h"
#include <QWidget>
#include <QLabel>//标签文本
#include <QPushButton>//按钮
#include <QLineEdit>//编辑框
#include <QTime>//定时器
#include <QDialog>//对话框
#include <QPainter>//绘图
#include <QIcon>//可缩放图标
#include <QMessageBox>//消息框
#include<QDebug>//调试
#include <QPaintEvent>//重绘事件
#include <QCryptographicHash>//生成密码散列
#include "usercontrol.h"//控制层
#include "registerwidget.h"//注册界面
#include<QMovie>//动态图
//#include"main_widget.h"//注意:两个类相互引用出现报错找了好久-头疼

class loginWidget : public QWidget
{
    Q_OBJECT
public:
    explicit loginWidget(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);//验证码干扰元素函数
    void init_UI();//UI界面窗口
    void init_control();//控件布局设计
    void init_connect();//按钮-信号槽
    QString getcode();//获取随机验证码
    void mousePressEvent(QMouseEvent *event);//鼠标点击事件--重写鼠标点击事件,每次点击一次就随机生成新的验证码
    ~loginWidget();//析构
    int mark;//标志位-明文密文
signals:

public slots:
    void login();//登录验证方法实现
    void toreg();//跳转到注册界面
    void backlog();//返回到登录界面
    void PlainAndCipher();//明文密文显示函数
    QString GetMd5(const QString &value);//加密
private:
    QLabel *user_label,*password_label,*code_label;//标签
    QLabel *gif_label;//放置动态图文本
    QLabel *gif1_label;//放置动态图文本
    QMovie *movie;//动态图
    QLabel *login_label;//登录界面文本
    QPushButton *login_btn,*qsc_btn,*register_btn,*eye_btn;//按钮
    QLineEdit *user_edit,*password_edit,*Vericode_edit;//编辑框
    QString code;//验证码
    RegisterWidget *regWin;//登录窗口
};

#endif // LOGINWIDGET_H
#include "loginwidget.h"
#include<QDebug>
#include<QDesktopWidget>
#include "main_widget.h"

//构造
loginWidget::loginWidget(QWidget *parent) : QWidget(parent)
{
    this->mark=0;//标志位-明文密文
    init_UI();//窗口界面
    init_control();//控件
    init_connect();//按钮-信号槽
    this->code = this->getcode();//验证码
}

//验证码干扰元素函数
void loginWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen;

    painter.drawPixmap(this->rect(),QPixmap(":image/pt.jpg"));

    //画点
    for(int i = 0;i < 100;++i)
    {
        pen = QPen(QColor(qrand()%256,qrand()%256,qrand()%256));
        painter.setPen(pen);
        painter.drawPoint(300+qrand()%150,245+qrand()%50);//画点--位置设计
    }
    //画线
    for(int i = 0;i < 10;++i)
    {
        painter.drawLine(300+qrand()%150,245+qrand()%50,
                         300+qrand()%150,245+qrand()%50);//画线--位置设计
    }
    pen = QPen(QColor(255,0,0,100));
    QFont font("楷体",25,QFont::Bold,true);
    painter.setFont(font);
    painter.setPen(pen);
    //绘画字
    for(int i = 0;i < 4;++i)
    {
        painter.drawText(300+30*i,245,30,40,Qt::AlignCenter,QString(code[i]));//绘画字--位置设计
    }
}

//界面窗口设置
void loginWidget::init_UI()
{
    this->setWindowTitle("LoginWin");//窗口标题
    this->setFixedSize(500,400);
    this->regWin = new RegisterWidget();
    setWindowFlags(Qt::FramelessWindowHint);//无边框
    //setAttribute(Qt::WA_TranslucentBackground);//背景透明
    //自己设置背景图片
    QPixmap pixmap(":/image/0508006.jpg");
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    setPalette(palette);
}

//界面控件设置
void loginWidget::init_control()
{
    //文本
    this->user_label = new QLabel("用户名:",this);
    this->user_label->setGeometry(150,150,80,30);
    this->password_label = new QLabel("密码:",this);
    this->password_label->setGeometry(150,200,80,30);
    this->code_label = new QLabel("验证码:",this);
    this->code_label->setGeometry(150,250,80,30);
    this->gif_label = new QLabel(this);
    this->gif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
    this->movie = new QMovie(":/image/0505.gif");//创建对象-动态图选择
    this->gif_label->setMovie(movie);//放置动态图
    this->movie->start();//动态图显示
    this->gif1_label = new QLabel(this);
    this->gif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
    this->movie = new QMovie(":/image/0508002.gif");//创建对象-动态图选择
    this->gif1_label->setMovie(movie);//放置动态图
    this->movie->start();//动态图显示
    this->login_label = new QLabel(this);
    this->login_label->setGeometry(185,5,200,100);
    this->login_label->setPixmap(QPixmap(":/image/dl1.png").scaled(login_label->size()));
    //编辑框
    this->user_edit = new QLineEdit(this);
    this->user_edit->setGeometry(210,150,150,30);
    this->user_edit->setPlaceholderText(tr("请您输入用户名!"));
    this->user_edit->setMaxLength(10);
    this->user_edit->installEventFilter(this);//事件过滤器-监控目标对象事件
    this->password_edit = new QLineEdit(this);
    this->password_edit->setGeometry(210,200,150,30);
    this->password_edit->setPlaceholderText(tr("请您输入密码!"));
    this->password_edit->setMaxLength(10);
    this->password_edit->setEchoMode(QLineEdit::Password);
    this->Vericode_edit = new QLineEdit(this);
    this->Vericode_edit->setGeometry(210,250,80,30);
    this->Vericode_edit->setPlaceholderText(tr("验证码"));
    //按钮
    this->login_btn = new QPushButton("登录",this);
    this->login_btn->setGeometry(150,290,80,30);
    this->register_btn = new QPushButton("注册",this);
    this->register_btn->setGeometry(250,290,80,30);
    this->eye_btn = new QPushButton("..",this);
    this->eye_btn->setGeometry(370,200,30,30);
    this->qsc_btn = new QPushButton("退出",this);
    this->qsc_btn->setGeometry(350,290,80,30);
}

//按钮--信号槽连接
void loginWidget::init_connect()
{
    //到注册界面
    connect(this->register_btn,SIGNAL(clicked()),this,SLOT(toreg()));
    //登录验证方法实现
    connect(this->login_btn,SIGNAL(clicked()),this,SLOT(login()));
    //返回到登录界面
    connect(this->regWin,SIGNAL(back()),this,SLOT(backlog()));
    //明密文切换实现
    connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));
    //关闭按钮关闭窗口
    connect(this->qsc_btn,SIGNAL(clicked(bool)),this,SLOT(close()));
}

//生成验证码方法实现
QString loginWidget::getcode()
{
    update();
    //code为QString类型变量
    QString getcode;
    //随机数字
    for(int i = 0;i < 4;++i)
    {
        int num = qrand()%3;
        if(num == 0)
        {
            //数字
            getcode += QString::number(qrand()%10);
        }
        else if(num == 1)
        {
            //大写字母
            int temp = 'A';
            getcode += static_cast<QChar>(temp + qrand()%26);
        } else if(num == 2)
        {
            //小写字母
            int temp = 'a';
            getcode += static_cast<QChar>(temp + qrand()%26);
        }
    }
    return getcode;
}

//重写鼠标点击事件,每次点击一次就随机生成新的验证码
void loginWidget::mousePressEvent(QMouseEvent *event)
{
    //验证码区域做重写鼠标点击事件
    int x = event->x();
    int y = event->y();
    if(x>300 && x<450 && y>235 && y<285)//位置设计-鼠标在相应位置上点击才做出反应
    {
        this->code = this->getcode();
    }
}

loginWidget::~loginWidget()
{
}

//登录验证方法实现
void loginWidget::login()
{
    //获得user_edit输入框的文本:user_edit->text();
    //trimmed()--去掉前后空格
    //tr()函数--防止设置中文时乱码
    int res=UserControl::getInstance()->doLogin(this->user_edit->text().trimmed(),GetMd5(this->password_edit->text().trimmed()));
    QString captcha = this->Vericode_edit->text();//验证码编辑框
    if(res==0)//账号密码判断
    {
        if(captcha.toLower() == this->code.toLower())//验证码判断
        {
            QMessageBox::warning(this, tr("提示!"),tr("登录成功!"),QMessageBox::Yes);
            Main_Widget::status = 1;
            user_edit->clear();
            password_edit->clear();
            Vericode_edit->clear();
            this->code = this->getcode();
            this->close();
            return;
        }
        else
        {
            QMessageBox::warning(this, tr("警告!"),tr("验证码错误!"),QMessageBox::Yes);
        }
    }
    else
    {                               //标题              内容                OK按钮
        QMessageBox::warning(this, tr("警告!"),tr("用户名或密码错误!"),QMessageBox::Yes);
    }
    // 清空输入框内容
    user_edit->clear();
    password_edit->clear();
    Vericode_edit->clear();
    this->code = this->getcode();//获取新验证码
}

//跳转到注册
void loginWidget::toreg()
{
    this->hide();
    this->regWin->show();
}

//返回到登录
void loginWidget::backlog()
{
    this->regWin->close();
    this->show();
}

//明文密文显示函数
void loginWidget::PlainAndCipher()
{
    //0是密文 1是明文
    if(this->mark==0)
    {
        this->password_edit->setEchoMode(QLineEdit::Normal);
        this->mark=1;
    }
    else if(this->mark==1)
    {
        this->password_edit->setEchoMode(QLineEdit::Password);
        this->mark=0;
    }
}

//MD5加密设置
QString loginWidget::GetMd5(const QString &value)
{
    QString md5;
    QByteArray bb;//相当于是QChar的一个vector<>
    bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
    md5.append(bb.toHex());
    return md5;
}

4.RegisterWidget.h .cpp

#ifndef REGISTERWIDGET_H
#define REGISTERWIDGET_H

#include <QWidget>
#include <QLabel>//标签文本
#include <QPushButton>//按钮
#include <QLineEdit>//编辑框
#include <QDialog>//对话框
#include <QPainter>//绘图
#include <QMessageBox>//消息框
#include <QKeyEvent>//按键事件
#include <QRegExpValidator>//正则
#include <QCryptographicHash>//生成密码散列
#include<QMovie>//动态图
#include "usercontrol.h"//用户控制层

class RegisterWidget : public QWidget
{
    Q_OBJECT
public:
    explicit RegisterWidget(QWidget *parent = 0);
    void keyPressEvent(QKeyEvent *event);//按键事件
    void init_UI();//界面窗口
    void init_control();//控件布局
    void init_connect();//按钮-信号槽机制
    int mark;//标志位-明文密文显示
private:
    QLabel *account_label,*user_label,*password_label,*password_label2;//标签
    QPushButton *register_btn,*qsc_btn,*eye_btn;//按钮
    QLineEdit *account_edit,*user_edit,*password_edit,*password_edit2;//编辑框
    QLabel *addgif_label;//放置动态图文本
    QLabel *addgif1_label;//放置动态图文本
    QLabel *register_label;//注册界面文本
    QMovie *movie;//动态图

signals:
    void back();

public slots:
    void regist();//注册
    void PlainAndCipher();//明文密文的切换显示
    QString GetMd5(const QString &value);//MD5加密处理
};

#endif // REGISTERWIDGET_H
#include "registerwidget.h"
#include<QDebug>
#include<QDesktopWidget>//分辨率
#include<QMessageBox>//消息框

//注册界面构造函数
RegisterWidget::RegisterWidget(QWidget *parent) : QWidget(parent)
{
    this->mark = 0;//明文密文标志位
    init_UI();//UI窗口
    init_control();//控件布局
    init_connect();//按钮-信号槽机制
}

//回车键来确定注册
void RegisterWidget::keyPressEvent(QKeyEvent *event)
{
    if(event->key() ==Qt::Key_Return)
    {
        regist();
    }
}

//注册界面窗口设置函数
void RegisterWidget::init_UI()
{
    this->setFixedSize(500,400);//尺寸设计
    setWindowFlags(Qt::FramelessWindowHint);//无边框
    //自己设置背景图片
    QPixmap pixmap(":/image/0508007.jpg");
    QPalette palette;
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    setPalette(palette);
}

//注册界面控件布局
void RegisterWidget::init_control()
{
    //validator为限制输入字符类型,只允许输入大小写、数字和下划线
    QRegExp account_regx("[a-zA-Z0-9_]+$");
    QValidator *validator = new QRegExpValidator(account_regx, this);
    //文本
    this->account_label = new QLabel("账号:",this);
    this->account_label->setGeometry(180,140,80,30);
    this->user_label = new QLabel("用户名:",this);
    this->user_label->setGeometry(164,190,80,30);
    this->password_label = new QLabel("密码:",this);
    this->password_label->setGeometry(176,240,80,30);
    this->password_label2 = new QLabel("确认密码:",this);
    this->password_label2->setGeometry(150,290,80,30);
    //编辑框
    this->account_edit = new QLineEdit(this);
    this->account_edit->setGeometry(220,140,150,30);
    this->account_edit->setPlaceholderText(tr("账号长度为6-10位"));
    this->account_edit->setValidator(validator);
    this->account_edit->setMaxLength(10);
    this->user_edit = new QLineEdit(this);
    this->user_edit->setGeometry(220,190,150,30);
    this->user_edit->setPlaceholderText(tr("用户名长度为6-10位"));
    this->user_edit->setValidator(validator);
    this->user_edit->setMaxLength(10);
    this->password_edit = new QLineEdit(this);
    this->password_edit->setGeometry(220,240,150,30);
    this->password_edit->setPlaceholderText(tr("密码长度为6-10位"));
    this->password_edit->setMaxLength(10);
    this->password_edit->setEchoMode(QLineEdit::Password);
    this->password_edit->setValidator(validator);
    this->password_edit2 = new QLineEdit(this);
    this->password_edit2->setGeometry(220,290,150,30);
    this->password_edit2->setPlaceholderText(tr("请再次确认密码!"));
    this->password_edit2->setMaxLength(10);
    this->password_edit2->setEchoMode(QLineEdit::Password);
    this->password_edit2->setValidator(validator);
    //按钮
    this->eye_btn =new QPushButton("...",this);
    this->eye_btn->setGeometry(370,240,30,30);
    this->register_btn = new QPushButton("注册",this);
    this->register_btn->setGeometry(210,330,80,30);
    this->qsc_btn = new QPushButton("取消",this);
    this->qsc_btn->setGeometry(290,330,80,30);

    this->addgif_label = new QLabel(this);
    this->addgif1_label = new QLabel(this);
    this->addgif_label->setGeometry(30,55,150,150);//动态图文本的位置和大小
    this->movie = new QMovie("image/0508001.gif");//创建对象-动态图选择
    this->addgif_label->setMovie(movie);//放置动态图
    this->movie->start();//动态图显示
    this->addgif1_label->setGeometry(30,195,150,150);//动态图文本的位置和大小
    this->movie = new QMovie("image/0508003.gif");//创建对象-动态图选择
    this->addgif1_label->setMovie(movie);//放置动态图
    this->movie->start();//动态图显示
    this->register_label = new QLabel(this);
    this->register_label->setGeometry(185,5,200,100);
    this->register_label->setPixmap(QPixmap(":/image/zhuce.png").scaled(register_label->size()));
}

//按钮--信号槽机制
void RegisterWidget::init_connect()
{
    connect(this->qsc_btn,SIGNAL(clicked()),this,SIGNAL(back()));//返回到登录界面
    connect(this->register_btn,SIGNAL(clicked()),this,SLOT(regist()));//注册功能实现
    connect(this->eye_btn,SIGNAL(clicked()),this,SLOT(PlainAndCipher()));//明文密文的切换设置
}

//注册功能实现函数
void RegisterWidget::regist()
{
    //如果编辑框为空,就提示
    if(this->user_edit->text().trimmed() == tr("") || this->password_edit->text() == tr("")
            ||this->password_edit2->text() == tr("") )
    {
        QMessageBox::warning(this, tr("提示!"),tr("内容不能为空!"),QMessageBox::Yes);
        // 清空输入框内容
        user_edit->clear();
        password_edit->clear();
        password_edit2->clear();
        //光标定位起始输入位置
        user_edit->setFocus();
    }
    else
    {
        //如果长度大于6就继续判断
        if(this->account_edit->text().length()>5 && this->user_edit->text().length()>5 &&
                this->password_edit->text().length()>5 && this->password_edit2->text().length()>5)
        {
            //如果密码和二次输入的密码一致就继续判断
            if(this->password_edit->text() == this->password_edit2->text())
            {
                //数据库查询是否存在该账号
                int res=UserControl::getInstance()->doReister(this->account_edit->text().trimmed(),this->user_edit->text().trimmed(),
                                                              GetMd5(this->password_edit->text().trimmed()));
                //res为0就代表的是注册成功
                if(res==0)
                {
                    QMessageBox::warning(this, tr("提示!"),tr("注册成功!"),QMessageBox::Yes);
                    //清空输入编辑框中的内容
                    user_edit->clear();
                    password_edit->clear();
                    password_edit2->clear();
                    //注册成功后就发送信号跳到登录
                    back();
                }
                //res为1就注册失败,该用户存在
                else if(res==1)
                {
                    QMessageBox::warning(this, tr("提示!"),tr("该用户已经存在!"),QMessageBox::Yes);
                    //清空输入编辑框中的内容
                    account_edit->clear();
                    user_edit->clear();
                    password_edit->clear();
                    password_edit2->clear();
                }
            }
            else
            {
                QMessageBox::warning(this, tr("提示!"),tr("密码不一致!"),QMessageBox::Yes);
                //清空输入编辑框中的内容
                account_edit->clear();
                user_edit->clear();
                password_edit->clear();
                password_edit2->clear();
                //光标定位
                user_edit->setFocus();
            }
        }
        else
        {
            if(this->account_edit->text().length()<6)
            {
                QMessageBox::warning(this, tr("提示!"),tr("账号长度为6-10位!"),QMessageBox::Yes);
            }
            else if (this->user_edit->text().length()<6)
            {
                QMessageBox::warning(this, tr("提示!"),tr("用户名长度为6-10位!"),QMessageBox::Yes);
            }
            else if (this->password_edit->text().length()<6)
            {
                QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
            }
            else if (this->password_edit2->text().length()<6)
            {
                QMessageBox::warning(this, tr("提示!"),tr("密码长度为6-10位!"),QMessageBox::Yes);
            }
            //清空输入编辑框中的内容
            account_edit->clear();
            user_edit->clear();
            password_edit->clear();
            password_edit2->clear();
            //光标定位
            user_edit->setFocus();
        }
    }
}

//明文密文切换函数
void RegisterWidget::PlainAndCipher()
{
    //0是密文 1是明文
    if(this->mark==0)
    {
        this->password_edit->setEchoMode(QLineEdit::Normal);
        this->password_edit2->setEchoMode(QLineEdit::Normal);
        this->mark=1;
    }
    else if(this->mark==1)
    {
        this->password_edit->setEchoMode(QLineEdit::Password);
        this->password_edit2->setEchoMode(QLineEdit::Password);
        this->mark=0;
    }
}

//MD5加密处理
QString RegisterWidget::GetMd5(const QString &value)
{
    QString md5;
    QByteArray bb;
    bb = QCryptographicHash::hash(value.toUtf8(), QCryptographicHash::Md5);
    md5.append(bb.toHex());
    return md5;
}

三:MVC设计模式-用户信息

5.SingelDB.h .cpp

#ifndef SINGELDB_H
#define SINGELDB_H
#include "sqlite3.h"//数据库
#include <iostream>
using namespace std;

class SingelDB
{
public:
//  SingelDB();
    ~SingelDB();//析构
    static SingelDB *getInstance();//外部公共接口--获取model对象
    int dosql(char *sql,char **&result,int &row, int &col);//数据库执行
    void openDataBase(const char *dbPath);//打开数据库
    void closeDataBase();//关闭数据库
private:
    SingelDB();//构造函数私有化
    static SingelDB *myDB;//静态私成员变量
    sqlite3 *sqldb;//数据库
    char *errmsg;//用来存储错误信息字符串
};

#endif // SINGELDB_H
#include "singeldb.h"

SingelDB *SingelDB::myDB=nullptr;

//单例打开数据库路径
SingelDB::SingelDB()
{
    this->openDataBase("../data/video.db");//打开数据库
}

//外部公共接口--获取单例对象
SingelDB *SingelDB::getInstance()
{
    if(SingelDB::myDB==nullptr)
    {
        SingelDB::myDB=new SingelDB();
    }
    return SingelDB::myDB;
}

//数据库执行-查找数据
int SingelDB::dosql(char *sql, char **&result, int &row, int &col)
{
    int res =sqlite3_get_table(sqldb, sql, &result, &row, &col, &errmsg);
    if(res!=SQLITE_OK)
    {
        cout<<sqlite3_errmsg(sqldb)<<endl;
        return res;
    }
    return 0;
}

//打开数据库
void SingelDB::openDataBase(const char *dbPath)
{
    int res = sqlite3_open(dbPath, &sqldb);
    if(res != SQLITE_OK)
    {
        cout<<sqlite3_errmsg(sqldb)<<endl;
        cout<<sqlite3_errcode(sqldb)<<endl;
    }
}

//关闭数据库
void SingelDB::closeDataBase()
{
    int res = sqlite3_close(sqldb);
    if(res != SQLITE_OK)
    {
        cout<<sqlite3_errmsg(sqldb)<<endl;
        cout<<sqlite3_errcode (sqldb) <<endl;
    }
}


6.UserControl.h .cpp

#ifndef USERCONTROL_H
#define USERCONTROL_H

#include <QString>
#include "usermodel.h"//用户模型层

class UserControl
{
public:
    static UserControl *getInstance();//外部公共接口 获取control对象
    int doLogin(QString account,QString pwd);//登录验证
    int doReister(QString account,QString user_name, QString pwd);//注册
private:
    UserControl();//构造私有化
    static UserControl *contorl;//静态私成员变量
};

#endif // USERCONTROL_H
#include "usercontrol.h"

UserControl *UserControl::contorl=nullptr;

//外部公共接口 获取control对象
UserControl *UserControl::getInstance()
{
    if(UserControl::contorl=nullptr)
    {
        UserControl::contorl=new UserControl();
    }
    return UserControl::contorl;
}

//登录验证,0表示验证成功,1表示验证失败
int UserControl::doLogin(QString account, QString pwd)
{
    return UserModel::getInstance()->getUserByNamePwd(account,pwd);
}

//注册
int UserControl::doReister(QString account,QString user_name, QString pwd)
{
    int res=UserModel::getInstance()->checkUserByNamePwd(account);
    //res为0说明用户存在
    if(res==1)
    {
        return UserModel::getInstance()->addUser(account,user_name,pwd);
    }
    //res为1说明用户不存在
    else
    {
        return -1;
    }
}

UserControl::UserControl()
{
}

7.UserModel.h .cpp

#ifndef USERMODEL_H
#define USERMODEL_H

#include <QString>//字符串
#include <QDebug>//调试
#include "singeldb.h"//数据库
#include <iostream>
using namespace std;

class UserModel
{
public:
    static UserModel *getInstance();//外部公共接口 获取model对象
    int getUserByNamePwd(QString account,QString pwd);//对用户的用户名密码进行验证
    int addUser(QString account,QString user_name,QString pwd);//添加用户数据信息
    int checkUserByNamePwd(QString account);//判断用户是否存在
private:
    UserModel();//构造函数私有化
    static UserModel *moder;//静态私成员变量
    sqlite3 *sqldb;//数据库
    char *errmsg;//用来存储错误信息字符串
};

#endif // USERMODEL_H
#include "usermodel.h"

UserModel *UserModel::moder =nullptr;

UserModel::UserModel(){}

//外部公共接口 获取model对象
UserModel *UserModel::getInstance()
{
    if(UserModel::moder==nullptr)
    {
        UserModel::moder=new UserModel;
    }
    return UserModel::moder;
}

//对用户的用户名密码进行验证
int UserModel::getUserByNamePwd(QString account, QString pwd)
{
    char sql[256];
    char **qres;
    int row,col;
    sprintf(sql,"select * from user where account='%s' AND password='%s';",
            account.toStdString().c_str(),pwd.toStdString().c_str());
    int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
    //res为查询成功
    if(res==0)
    {
        //如果row大于0说明验证成功
        if(row>0)
        {
            return 0;
        }
        //反之说明验证失败
        else
        {
            return 1;
        }
    }
    //查询失败
    else
    {
        return -1;
    }
}

//判断用户是否存在
int UserModel::checkUserByNamePwd(QString account)
{
    char sql[256];
    sprintf(sql,"select * from user where account='%s';",
            account.toStdString().c_str());
    char **qres;
    int row,col;
    int res = SingelDB::getInstance()->dosql(sql,qres,row,col);
    if(res==0)
    {
        //如果row大于0用户存在
        if(row>0)
        {
            return 0;
        }
        //反之说明用户不存在
        else
        {
            return 1;
        }
    }
    //查询失败
    else
    {
        return -1;
    }
}

//添加用户数据信息
int UserModel::addUser(QString account,QString user_name, QString pwd)
{
    char sql[256];
    sprintf(sql,"insert into user(account,user_name,password)values('%s','%s','%s');",
            account.toStdString().c_str(),user_name.toStdString().c_str(),pwd.toStdString().c_str());
    char **qres;
    int row,col;
    return SingelDB::getInstance()->dosql(sql,qres,row,col);
}

猜你喜欢

转载自blog.csdn.net/m0_56051805/article/details/125282373