目錄
1.注冊賬號
2.服務器ip地址和端口號設置
3. 登錄功能
4.讀取配置文件
5.顯示主界面
1.注冊賬號
1.點擊注冊頁面,將數(shù)據(jù) 輸入 到?用戶名,昵稱,密碼,確認密碼,手機,郵箱 的輸入框中,
點擊確定,觸發(fā)槽函數(shù)?on_reg_but_clicked。
2.on_reg_but_clicked 會校驗 各個輸入框中數(shù)據(jù)格式 的合法性,比如說手機號只能由數(shù)字組成。
使用正則表達式進行檢驗
3.如果數(shù)據(jù)沒問題,則客戶端發(fā)送一個http請求給服務器:
POST http://119.23.41.13:80/register HTTP/1.1
Content-Type: application/json
{
"email": "sjp3250506022@qq.com", //郵箱
"firstPwd": "e10adc3949ba59abbe56e057f20f883e",//密碼,用md5值進行加密
"nickName": "lisi", //昵稱
"phone": "13727989171", //電話號碼
"userName": "lisi" //用戶名
}
服務器響應:
"code": "002" //賬號注冊成功
"code": "003" //用戶已經(jīng)存在
"code": "004" //賬號注冊失敗
?實現(xiàn):
//注冊框的流程
void Dialog::on_reg_but_clicked()
{
/*
1.獲取輸入框中的數(shù)據(jù)
2.校驗數(shù)據(jù)格式是否正確
3.封裝http請求,發(fā)送http請求
4.接收http響應,處理http響應
*/
QString usr=ui->usr_edit->text();
QString nickname=ui->nickname_edit->text();
QString password=ui->pasword_edit2->text();
QString confirmpassword=ui->confirm_edit->text();
QString mail=ui->mailbox_edit->text();
QString phone=ui->phone_edit->text();
QRegExp reg(USER_REG);
//校驗賬號的規(guī)則
if(!reg.exactMatch(usr))
{
//校驗失敗
QMessageBox::warning(this,"警告","輸入的賬號格式有誤");
return;
}
reg.setPattern(PASSWD_REG);
if(!reg.exactMatch(password)){
QMessageBox::warning(this,"警告","輸入的密碼格式有誤");
return;
}
reg.setPattern(EMAIL_REG);
if(!reg.exactMatch(mail)){
QMessageBox::warning(this,"警告","輸入的郵箱格式有誤");
return;
}
reg.setPattern(PHONE_REG);
if(!reg.exactMatch(phone)){
QMessageBox::warning(this,"警告","輸入的手機號碼格式有誤");
return;
}
if(confirmpassword!=password){
QMessageBox::warning(this,"警告","確認密碼不匹配");
return;
}
//
QNetworkAccessManager* manger=new QNetworkAccessManager();
//封裝http請求
QNetworkRequest request;
//從配置文件中獲取到ip地址和port端口號
QString ip=Common::getInstant()->getConfValue("web_server","ip");
QString port=Common::getInstant()->getConfValue("web_server","port");
QString url=QString("http://%1:%2/register").arg(ip).arg(port);
request.setUrl(QUrl(url));
//設置文件類型
request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
//將data數(shù)據(jù)以QJson的格式發(fā)送給服務器
QJsonObject object;
object.insert("email", mail);//郵箱
object.insert("userName", usr);//賬號
object.insert("phone", phone);
object.insert("nickName", nickname);
object.insert("firstPwd", m_common->getStrMd5(password));
QJsonDocument doc(object);
QByteArray data=doc.toJson();
//發(fā)送數(shù)據(jù)
QNetworkReply* rely=manger->post(request,data);
connect(rely,&QNetworkReply::readyRead,this,[=]{
//響應到達,讀取所有的數(shù)據(jù)
QByteArray s=rely->readAll();
qDebug() << "服務器返回數(shù)據(jù):" << QString(s);
//將s數(shù)據(jù)轉換為Json對象
QJsonParseError err;
QJsonDocument document=QJsonDocument::fromJson(s,&err);
if(err.error!=QJsonParseError::NoError){
qDebug()<<"QJson格式錯誤";
return;
}
//將QJson字符串轉換為QJson對象
QJsonObject object1;
object1=document.object();
//獲取狀態(tài)碼
QString value1=object1["code"].toString();
if(value1=="002"){
QMessageBox::information(this,"提示","賬號注冊成功");
}
if(value1=="003"){
QMessageBox::warning(this,"警告","該賬號已經(jīng)存在");
}
if(value1=="004"){
QMessageBox::critical(this,"注冊失敗","注冊失敗");
}
rely->deleteLater();
});
}
2.服務器ip地址和端口號設置
?文章來源地址http://www.zghlxwxcb.cn/news/detail-614377.html
1.點擊 確定 按鈕,獲取服務器 ip 和端口號的 信息
2.驗證服務器 和 端口號的格式,如果驗證成功,將 服務器的 ip地址和 端口號寫入到 cfg.json 配置文件中。
?
//點擊服務器設置頁的按鈕,將ip地址和端口寫入到配置文件中
void Dialog::on_ok_button_clicked()
{
QString ip=ui->ip_edit->text();
QString port=ui->port_eidt->text();
QRegExp reg(IP_REG);
//校驗賬號的規(guī)則
if(!reg.exactMatch(ip))
{
//校驗失敗
QMessageBox::warning(this,"警告","輸入的IP地址有誤");
return;
}
reg.setPattern(PORT_REG);
//校驗賬號的規(guī)則
if(!reg.exactMatch(port))
{
//校驗失敗
QMessageBox::warning(this,"警告","輸入的端口號有誤");
return;
}
m_common->writeWebInfo(ip,port);
QMessageBox::warning(this,"提示","配置成功");
ui->stackedWidget->setCurrentWidget(ui->login_page);
return;
}
// 將服務器的ip和port寫入到配置文件
void Common::writeWebInfo(QString ip, QString port, QString path)
{
QMap<QString,QVariant> web_server;
web_server.insert("ip",ip);
web_server.insert("port",port);
QString usr_base64=getConfValue("login","user");
QString pwd_base64=getConfValue("login","pwd");
QString remember=getConfValue("login","remember");
QMap<QString,QVariant> login;
login.insert("user",usr_base64);
login.insert("pwd",pwd_base64);
login.insert("remember",remember);
QMap<QString, QVariant> json;
json.insert("web_server", web_server);
json.insert("login", login);
QJsonDocument jsonDocument = QJsonDocument::fromVariant(json);
if ( jsonDocument.isNull() == true)
{
qDebug() << "QJsonDocument::fromVariant錯誤";
return;
}
QFile file(CONF_FILE);
if(!file.open(QFile::WriteOnly)!=0)
{
qDebug()<<"打開文件失敗";
return;
}
file.write(jsonDocument.toJson());
file.close();
qDebug()<<"配置成功";
}
?
3. 登錄功能
?1.點擊登錄,獲取用戶名和密碼
2.驗證 用戶名 和密碼 格式的 合法性,如果 合法,則發(fā)送一個http請求給服務器:
POST http://119.23.41.13:80/login HTTP/1.1
Content-Type: application/json
{
"pwd": "e10adc3949ba59abbe56e057f20f883e", //密碼,用md5進行加密
"user": "zhangsan" //用戶名
}
http響應:
//登錄成功的響應
HTTP/1.1 200 OK
{
"code": "000",
"token": "86569b8a537abf45acbb811f0244a69e"
}
//登錄失敗的響應
HTTP/1.1 200 OK
{
"code": "001",
}
登錄成功后:
1.客戶端需要保存token,因為客戶端接下來訪問服務器 都需要 加上token來驗證身份
2.創(chuàng)建一個 logininfoinstance 實例對象,將 用戶名 ,token,服務器ip 和 端口號保存到logininfoinstance中,方便后續(xù)進行讀取
3..需要?將用戶的?用戶名 和密碼?寫入到?cfg.json文件?中。為了防止泄密,需要對用戶名和密碼進行二次加密,先進行desc加密,然后再進行base64加密?
4.創(chuàng)建主界面,顯示主界面?
代碼實現(xiàn):?
//登錄按鈕
void Dialog::on_login_toolButton_clicked()
{
qDebug()<<"登錄";
//獲取賬號密碼
QString account=ui->account_edit->text();
QString password=ui->password_edit->text();
//
QRegExp reg(USER_REG);
//校驗賬號的規(guī)則
if(!reg.exactMatch(account))
{
//校驗失敗
QMessageBox::warning(this,"警告","輸入的賬號格式有誤");
return;
}
reg.setPattern(PASSWD_REG);
if(!reg.exactMatch(password)){
QMessageBox::warning(this,"警告","輸入的密碼格式有誤");
return;
}
//封裝http請求
QNetworkRequest request;
//從配置文件中獲取到ip地址和port端口號
QString ip=Common::getInstant()->getConfValue("web_server","ip");
QString port=Common::getInstant()->getConfValue("web_server","port");
QString url=QString("http://%1:%2/login").arg(ip).arg(port);//設置登錄的url
request.setUrl(QUrl(url));
//設置文件類型
request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
//將data數(shù)據(jù)以QJson的格式發(fā)送給服務器
QJsonObject object;
object.insert("user", account);
object.insert("pwd", m_common->getStrMd5(password));
QJsonDocument doc(object);
QByteArray data=doc.toJson();
//發(fā)送數(shù)據(jù)
QNetworkReply* rely=manger->post(request,data);
connect(rely,&QNetworkReply::readyRead,this,[=]{
//響應到達,讀取所有的數(shù)據(jù)
QByteArray s=rely->readAll();
qDebug() << "服務器返回數(shù)據(jù):" << QString(s);
//將s數(shù)據(jù)轉換為Json對象
QJsonParseError err;
QJsonDocument document=QJsonDocument::fromJson(s,&err);
if(err.error!=QJsonParseError::NoError){
qDebug()<<"QJson格式錯誤";
return;
}
//將QJson字符串轉換為QJson對象
QJsonObject object1;
object1=document.object();
//獲取狀態(tài)碼
QString value1=object1["code"].toString();
if(value1=="000"){
//登錄成功
//0.獲取token,將用戶信息寫入到logininstant中。
//1.判斷有沒有記住密碼,如果有記住密碼,獲取記住密碼的狀態(tài)
//2.將賬號和密碼信息記錄到配置文件中
//3.顯示登錄成功頁面(主頁面)
//獲取token
QString token=object1["token"].toString();
qDebug()<<"token:"<<token;
//獲取token,將用戶信息寫入到logininstant中。
saveLoginInfoData(account,token,ip,port);
// QMessageBox::information(this,"登錄成功","賬號登錄成功");
//判斷有沒有記住密碼
bool checkBox=ui->rember_checkBox->isChecked();
if(checkBox==false)
{
//沒有記住密碼直接清除密碼框
ui->password_edit->clear();
}
//將賬號密碼保存到配置文件中
m_common->writeLoginInfo(account,password,checkBox);
//獲取
showMainWindow(account);
}
if(value1=="001"){
QMessageBox::warning(this,"警告","登錄");
}
});
}
?
//common.h文件:
//將用戶信息 寫入到配置文件
void writeLoginInfo(QString user, QString pwd, bool isRemeber, QString path=CONF_FILE);
// 服務器信息寫入到配置文件
void writeWebInfo(QString ip, QString port, QString path=CONF_FILE);
?相關接口(接口實現(xiàn)自行跳轉項目鏈接去查看)?
4.讀取配置文件
- 當?shù)卿浗缑鎰?chuàng)建的時候,程序會先去讀取conf.json文件內容.將賬號和密碼,服務器ip,端口號寫入到登錄界面中。
-
- 由于賬號和密碼在寫入配置文件是加密的,讀取賬號和密碼需要 先后進行 base64解密 和 desc解密,才顯示到登錄界面。
- desc加解密,需要在項目中添加des.c文件和des.h文件
//讀取配置文件信息,將賬號密碼,服務器端口號寫到界面中
void Dialog::readConf()
{
QString user_base64=m_common->getConfValue("login","user");
QString pwd_base64=m_common->getConfValue("login","pwd");
QString remember=m_common->getConfValue("login","remember");
//對賬號進行base64解密和desc解密
QByteArray usr_des=QByteArray::fromBase64(user_base64.toLocal8Bit());
unsigned char usr[1024]={0};
int usr_len;
//進行desc解密
if(DesDec((unsigned char*)usr_des.data(),usr_des.length(),usr,&usr_len)!=0){
qDebug()<<"desc解密失敗";
}
//賬號解密成功,將賬號顯示到登錄窗口
QString s=QString::fromLocal8Bit((const char*)usr,usr_len);
ui->account_edit->setText(s);
if(remember=="yes")
{
ui->rember_checkBox->setCheckState(Qt::Checked);
//記住密碼,將密碼顯示到密碼框上
QByteArray pwd_des=QByteArray::fromBase64(pwd_base64.toLocal8Bit());
unsigned char pwd[1024]={0};
int pwd_len=0;
//進行desc解密
if(DesDec((unsigned char*)pwd_des.data(),pwd_des.length(),pwd,&pwd_len)!=0){
qDebug()<<"密碼解密失敗";
}
//賬號解密成功,將賬號顯示到登錄窗口
QString s1=QString::fromLocal8Bit((const char*)pwd,pwd_len);
ui->password_edit->setText(s1);
}
//將ip地址和端口號顯示到服務器設置頁面
QString ip=m_common->getConfValue("web_server","ip");
QString port=m_common->getConfValue("web_server","port");
ui->ip_edit->setText(ip);
ui->port_eidt->setText(port);
}
5.顯示主界面
登錄成功,顯示主頁面:
文章來源:http://www.zghlxwxcb.cn/news/detail-614377.html
?
//創(chuàng)建主界面,并顯示主界面
void Dialog::showMainWindow(QString account)
{
//獲取主頁面
mainwindow=MainWindow::getinstant();
mainwindow->setUser(account);//將用戶名顯示到主頁面上
mainwindow->show();//顯示主頁面
this->hide();//隱藏主頁面
connect(mainwindow,&MainWindow::switchUser,this,[=](){
mainwindow->hide();
this->show();
});
}
到了這里,關于【QT 網(wǎng)絡云盤客戶端】——登錄界面功能的實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!