2.功能函数
(1)登录
客户端创建login设计师类,登录功能函数在所有功能函数中为最复杂,因为登录是初始界面,需要连接服务器,需要发送数据给服务器,让服务器连接上数据库,并判断账号密码是否有效,然后执行接下来的所有功能都建立在这和连接套接字上。
login.h
#ifndef LOGIN_H
#define LOGIN_H
#include
#include "cilent.h"
namespace Ui {
class Login;
}
class Login : public QWidget //登录用QWidegt就可以了因为用不到子窗口的exec功能所以不要用QDialog类
{
Q_OBJECT
public:
explicit Login(QWidget *parent = 0);
~Login();
QThread *thread;
private slots:
void on_LoginButton_clicked(); //登录
void on_registerButton_clicked(); //注册
private:
Ui::Login *ui;
Cilent *client;
char temp[100];
bool LoginSure;
Register* Reg; //注册函数
};
#endif // LOGIN_H
login.cpp
#include "login.h"
#include "share.h"
#include "ui_login.h"
#include
#include
#include
#include //容器,用来存在登录过得账号信息
#include
QString username; //定义登录的管理员用户名为全局变量
Cilent *MyClient; //定义连接上的客户端套接字为全局变量
Login::Login(QWidget *parent) :
QWidget(parent),
ui(new Ui::Login)
{
ui->setupUi(this);
ui->lineAccout->setTextMargins(5,2,2,2);//设置间隙
ui->linePswd->setEchoMode(QLineEdit::Password);//设置密码的显示方式为密码显示方式(用黑点代替显示)
this->client = new Cilent(this); //构造新的Cilent用来连接到服务器,用this作为parents是因为其能跟随它的show而show,它的析构而析构
MyClient = new Cilent(client); //拷贝构造,把已经连接上的cilent拷贝一份作为全局变量,以便其他功能函数调用(在不同的cpp文件中)
}
Login::~Login()
{
delete ui;
}
void Login::on_LoginButton_clicked() //登录按钮,login核心的按钮
{
QString accountStr = ui->lineAccout->text();
QString pswdStr = ui->linePswd->text(); //读取账号和密码信息
QStringList list;
list << accountStr;
QCompleter *com = new QCompleter(list,this);
com->setCaseSensitivity(Qt::CaseInsensitive);//不区分大小写
ui->lineAccout->setCompleter(com); //用completer容器来记录已经输入过得账号信息,以便下次登录
QString Str = QString("1,%1,%2").arg(accountStr).arg(pswdStr); //打包账号密码信息,登录功能的功能标志位为1
client->TCPwrite(Str); //发送数据
connect(client,client->Continue, //接收到服务器返回的数据后TCPread函数才发送continue信号,让login来继续执行判断
[=]()
{
QMessageBox::about(this,"银行管理系统",client->getData().toUtf8().data());
qDebug()<<"the Data is"<<client->getData();
qDebug()<<"the Siganl is"<<client->getSign();
if (client->getSign()=="1")//标志位1为登录成功 ,解包读取包内的标志位,(发包解包都用section功能函数,特别好用)
{
username = accountStr;
this->hide();
client->show();
client->exec();
this->show();
}
});
}
void Login::on_registerButton_clicked() //注册功能函数启动
{
Reg= new Register(this);
this->hide();
Reg->show();
Reg->exec();
this->show();
}
//下面附上登录的ui界面一张
服务器端收到后用处理
case
1:
Login();
break;
//收到后功能函数标志位为1
...................................
void
MyServerWindow
::
Login
()
{
section1
=
Bag
.
section
(
","
,
1
,
1
);
//解包,两部分,账号和密码
section2
=
Bag
.
section
(
","
,
2
,
2
);
QString
TempStr
=
QString
(
"账号%1,密码%2"
).
arg
(
section1
).
arg
(
section2
);
ui
->
ReadEdit
->
append
(
TempStr
);
if
(
mysql
->
loginSure
(
section1
,
section2
))
//传参传到数据库函数处理,返回bool类型告知是否成功
{
ServerWrite
(
"登录成功,1"
);
}
else
{
ServerWrite
(
"登录失败,0"
);
}
}
...........................
bool
Banksql
::
loginSure
(
QString
name
,
QString
pswd
)
{
QString
str
=
QString
(
"select
*
from
manager
where
username='%1'
and
passwd='%2'"
).
arg
(
name
).
arg
(
pswd
);
qDebug
()<<
str
;
QSqlQuery
query
;
query
.
exec
(
str
);
while
(
query
.
next
()) //如果有这个账号密码,则next遍历的时候会进入,返回true,否则遍历完也没有进入返回false
{
return
true
;
}
return
false
;
}