目录
一:开机动画
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
#ifndef MYITEM_H
#define MYITEM_H
#include //触发信号槽机制
#include//图元
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//图元绘制头文件
#include//测试定时器信号槽是否成功触发
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正号向右移动
}
}
#ifndef MYVIEW_H
#define MYVIEW_H
#include //触发信号槽机制
#include //视图
#include //场景
#include"myitem.h" //图元
#include //定时器 - 图元移动
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//测试定时器信号槽是否成功触发
#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();
}
}
#ifndef LOGINWIDGET_H
#define LOGINWIDGET_H
#include "setcontrol.h"
#include
#include //标签文本
#include //按钮
#include //编辑框
#include //定时器
#include //对话框
#include //绘图
#include //可缩放图标
#include //消息框
#include//调试
#include //重绘事件
#include //生成密码散列
#include "usercontrol.h"//控制层
#include "registerwidget.h"//注册界面
#include//动态图
//#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
#include
#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(temp + qrand()%26);
} else if(num == 2)
{
//小写字母
int temp = 'a';
getcode += static_cast(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;
}
#ifndef REGISTERWIDGET_H
#define REGISTERWIDGET_H
#include
#include //标签文本
#include //按钮
#include //编辑框
#include //对话框
#include //绘图
#include //消息框
#include //按键事件
#include //正则
#include //生成密码散列
#include//动态图
#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
#include//分辨率
#include//消息框
//注册界面构造函数
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;
}
#ifndef SINGELDB_H
#define SINGELDB_H
#include "sqlite3.h"//数据库
#include
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<
#ifndef USERCONTROL_H
#define USERCONTROL_H
#include
#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()
{
}
#ifndef USERMODEL_H
#define USERMODEL_H
#include //字符串
#include //调试
#include "singeldb.h"//数据库
#include
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);
}