182 lines
5.3 KiB
C++
182 lines
5.3 KiB
C++
#include "loginDialog.h"
|
||
|
||
#include <QLabel>
|
||
#include <QLineEdit>
|
||
#include <QPushButton>
|
||
#include <QMessageBox>
|
||
|
||
#include<QDebug>
|
||
|
||
LoginDialog::LoginDialog(QWidget *parent):QDialog(parent)
|
||
{
|
||
|
||
this->setFixedSize(380, 300);
|
||
userLabel = new QLabel(this);
|
||
userLabel->move(70, 80);
|
||
userLabel->setText(tr("用户名"));
|
||
|
||
userEditLine = new QLineEdit(this);
|
||
userEditLine->move(150, 80);
|
||
userEditLine->setPlaceholderText(tr("请输入用户名"));
|
||
|
||
pwdLabel = new QLabel(this);
|
||
pwdLabel->move(70, 130);
|
||
pwdLabel->setText(tr("密码"));
|
||
|
||
pwdEditLine = new QLineEdit(this);
|
||
pwdEditLine->move(150, 130);
|
||
pwdEditLine->setPlaceholderText(tr("请输入密码"));
|
||
pwdEditLine->setEchoMode(QLineEdit::Password);
|
||
|
||
loginBtn = new QPushButton(this);
|
||
loginBtn->move(60, 200);
|
||
loginBtn->setText(tr("登录"));
|
||
|
||
exitBtn = new QPushButton(this);
|
||
exitBtn->move(220, 200);
|
||
exitBtn->setText(tr("退出"));
|
||
|
||
connect(loginBtn, &QPushButton::clicked, this, &LoginDialog::login);
|
||
connect(exitBtn, &QPushButton::clicked, this, &LoginDialog::close);
|
||
|
||
// 待解锁的组件名称
|
||
setting_name = {"cloud_topic", "laser_topic", "open_file", "bag_progress", "fixd_frame_topic"};
|
||
// 账号路径
|
||
user_file_name = "../PointVisual/src/point_visual/sources/user/user.txt";
|
||
|
||
// 创建用户表存下
|
||
createUser();
|
||
// userPasswords["root"] = hashPassword("root123");
|
||
// userPasswords["wbw"] = hashPassword("123");
|
||
}
|
||
|
||
|
||
void LoginDialog::createUser(){
|
||
std::ifstream inputFile(user_file_name);
|
||
// 第一次读写user.txt将user加密后,建立userPasswords
|
||
if(inputFile.is_open()){
|
||
std::string line;
|
||
while(std::getline(inputFile, line)){
|
||
std::istringstream iss(line);
|
||
std::string username, pwd;
|
||
if(iss>> username && iss>> pwd){
|
||
if(pwd.size() <= 8){
|
||
// 根据长度判断是否已经被加密
|
||
pwd = hashPassword(pwd);
|
||
}
|
||
// 创建map/用户表
|
||
userPasswords[QString::fromStdString(username)] = QString::fromStdString(pwd);
|
||
}
|
||
}
|
||
inputFile.close();
|
||
}else{
|
||
qDebug() << "Unable to open the user.txt.";
|
||
}
|
||
writeHash(userPasswords);
|
||
}
|
||
|
||
// 加密后的账户密码写入user.txt
|
||
void LoginDialog::writeHash(const std::map<QString, QString> user){
|
||
std::ofstream file(user_file_name);
|
||
|
||
if(file.is_open()){
|
||
for(auto iter = user.begin(); iter != user.end() ; iter++){
|
||
file << (iter->first).toStdString() << " ";
|
||
file << (iter->second).toStdString() << std::endl;
|
||
}
|
||
file.close();
|
||
}else{
|
||
qDebug()<<"Unable to write hashcode!!!";
|
||
}
|
||
}
|
||
|
||
|
||
// hash加密函数
|
||
QString LoginDialog::hashPassword(const QString& pwd) {
|
||
std::string password = pwd.toStdString();
|
||
unsigned char hash[SHA256_DIGEST_LENGTH];
|
||
SHA256_CTX sha256;
|
||
SHA256_Init(&sha256);
|
||
SHA256_Update(&sha256, password.c_str(), password.size());
|
||
SHA256_Final(hash, &sha256);
|
||
|
||
std::string hashedPassword;
|
||
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
|
||
hashedPassword += hash[i];
|
||
}
|
||
return QString(hashedPassword.c_str());
|
||
}
|
||
|
||
// 重载加密函数
|
||
std::string LoginDialog::hashPassword(const std::string& password) {
|
||
// std::string password = pwd.toStdString();
|
||
unsigned char hash[SHA256_DIGEST_LENGTH];
|
||
SHA256_CTX sha256;
|
||
SHA256_Init(&sha256);
|
||
SHA256_Update(&sha256, password.c_str(), password.size());
|
||
SHA256_Final(hash, &sha256);
|
||
|
||
std::string hashedPassword;
|
||
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {
|
||
hashedPassword += hash[i];
|
||
}
|
||
return hashedPassword;
|
||
}
|
||
|
||
|
||
// 判断用户账号返回不同code
|
||
int LoginDialog::checkUser(const QString username, const QString pwd){
|
||
auto iter = userPasswords.find(username);
|
||
if(iter != userPasswords.end()){
|
||
if(pwd.size() > 8) { return 1; }
|
||
if(iter->second == hashPassword(pwd)){
|
||
// 用户密码都对
|
||
return 2;
|
||
}else{
|
||
// 用户对,密码不对
|
||
return 1;
|
||
}
|
||
}else {
|
||
// 用户不对
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
// 槽函数
|
||
void LoginDialog::login()
|
||
{
|
||
int flag = checkUser(userEditLine->text().trimmed(), pwdEditLine->text());
|
||
switch(flag){
|
||
case 0: {
|
||
QMessageBox::warning(this, tr("登录失败"), tr("用户名错误"), QMessageBox::Ok);
|
||
break;
|
||
}
|
||
case 1: {
|
||
QMessageBox::warning(this, tr("登录失败"), tr("密码错误"), QMessageBox::Ok);
|
||
break;
|
||
}
|
||
case 2:{
|
||
for(int i=0 ; i<setting_name.size(); i++){
|
||
QWidget *foundChild = parent()->findChild<QWidget*>(setting_name[i]);
|
||
if (foundChild) {
|
||
// 找到了指定的子组件 在这里可以对子组件进行操作
|
||
foundChild->setEnabled(true);
|
||
}else{
|
||
qDebug()<<"第" << i+1 <<"组件未找到" ;
|
||
}
|
||
}
|
||
QMessageBox::information(this, tr("登录成功"), tr("已解锁"), QMessageBox::Ok);
|
||
accept();
|
||
}
|
||
}
|
||
userEditLine->clear();
|
||
pwdEditLine->clear();
|
||
userEditLine->setFocus();
|
||
}
|
||
|
||
|
||
LoginDialog::~LoginDialog()
|
||
{
|
||
|
||
}
|