李臻20242817_安全文件传输系统项目报告_第12周

安全文件传输系统项目报告(第 9 周)

1. 代码链接

Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file

代码结构说明:

plaintext 复制代码
project-root/
 ├── src/ # 源代码目录
 │ ├── main.c # 主程序入口
 │ ├── db/ # 数据库操作
 │ ├── gui/ # 图形界面
 │ └── utils/ # 工具函数模块
 ├── include/ # 头文件
 ├── lib/ # 动态库静态库
 ├── docs/ # 文档目录
 ├── Makefile # 自动编译
 └── README.md # 项目说明

1、完成用户登录注册界面

  • 注册功能
    用户首次进行注册时,会显示注册成功信息

当用户名存在时,系统会提示注册失败,当前用户已存在。

  • 登录功能
    输入注册成功的用户名密码,和数据库中的数据匹配后会显示登录成功。

    数据库文件在项目的Debug文件中

    由于使用的是SQlite,不需要安装和配置服务器。SQLite 是一个嵌入式数据库,它直接将数据库存储在一个单独的磁盘文件中,不需要运行独立的服务器进程。

database.h

csharp 复制代码
#ifndef DATABASE_H
#define DATABASE_H

#include <QString>
#include <QSqlDatabase>

class Database {
public:
    static Database& instance();

    bool registerUser(const QString &username, const QString &password);
    bool verifyUser(const QString &username, const QString &password);

private:
    Database();
    QSqlDatabase db;
};

#endif // DATABASE_H

database.cpp

csharp 复制代码
#include "database.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QDebug>

Database::Database() {
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("user.db");

    if (!db.open()) {
        qDebug() << "无法打开数据库:" << db.lastError();
    }

    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS users ("
               "id INTEGER PRIMARY KEY AUTOINCREMENT, "
               "username TEXT UNIQUE, "
               "password TEXT)");
}

Database& Database::instance() {
    static Database instance;
    return instance;
}

bool Database::registerUser(const QString &username, const QString &password) {
    QSqlQuery query;
    query.prepare("INSERT INTO users (username, password) VALUES (?, ?)");
    query.addBindValue(username);
    query.addBindValue(password);
    return query.exec();
}

bool Database::verifyUser(const QString &username, const QString &password) {
    QSqlQuery query;
    query.prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    query.addBindValue(username);
    query.addBindValue(password);
    query.exec();
    return query.next();
}

mainwindow.h

csharp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void login();
    void registerUser();

private:
    QLineEdit *userLineEdit;
    QLineEdit *passLineEdit;
};

#endif // MAINWINDOW_H

mainwindow.cpp

csharp 复制代码
#include "mainwindow.h"
#include "database.h"
#include "mainpage.h"
#include <QVBoxLayout>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
    userLineEdit = new QLineEdit(this);
    passLineEdit = new QLineEdit(this);
    passLineEdit->setEchoMode(QLineEdit::Password);
    QPushButton *loginBtn = new QPushButton("登录", this);
    QPushButton *registerBtn = new QPushButton("注册", this);

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(userLineEdit);
    layout->addWidget(passLineEdit);
    layout->addWidget(loginBtn);
    layout->addWidget(registerBtn);

    connect(loginBtn, &QPushButton::clicked, this, &MainWindow::login);
    connect(registerBtn, &QPushButton::clicked, this, &MainWindow::registerUser);

    Database::instance();  // 初始化数据库
}

void MainWindow::login() {
    QString username = userLineEdit->text();
    QString password = passLineEdit->text();
    if (Database::instance().verifyUser(username, password)) {
        QMessageBox::information(this, "登录成功", "欢迎," + username);
        this->hide();
        MainPage *page = new MainPage();
        page->show();
    } else {
        QMessageBox::warning(this, "登录失败", "用户名或密码错误!");
    }
}

void MainWindow::registerUser() {
    QString username = userLineEdit->text();
    QString password = passLineEdit->text();
    if (Database::instance().registerUser(username, password)) {
        QMessageBox::information(this, "注册成功", "可以登录了!");
    } else {
        QMessageBox::warning(this, "注册失败", "用户名已存在!");
    }
}

2、用户登录界面

用户登陆成功后,可在主界面进行文件管理,上传或下载文件。

mainpage.h

csharp 复制代码
#ifndef MAINPAGE_H
#define MAINPAGE_H

#include <QWidget>

class MainPage : public QWidget {
    Q_OBJECT

public:
    MainPage(QWidget *parent = nullptr);

private slots:
    void uploadFile();
    void downloadFile();
};

#endif // MAINPAGE_H

mainpage.cpp

csharp 复制代码
#include "mainwindow.h"
#include "database.h"
#include "mainpage.h"
#include <QVBoxLayout>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) : QWidget(parent) {
    userLineEdit = new QLineEdit(this);
    passLineEdit = new QLineEdit(this);
    passLineEdit->setEchoMode(QLineEdit::Password);
    QPushButton *loginBtn = new QPushButton("登录", this);
    QPushButton *registerBtn = new QPushButton("注册", this);

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(userLineEdit);
    layout->addWidget(passLineEdit);
    layout->addWidget(loginBtn);
    layout->addWidget(registerBtn);

    connect(loginBtn, &QPushButton::clicked, this, &MainWindow::login);
    connect(registerBtn, &QPushButton::clicked, this, &MainWindow::registerUser);

    Database::instance();  // 初始化数据库
}

void MainWindow::login() {
    QString username = userLineEdit->text();
    QString password = passLineEdit->text();
    if (Database::instance().verifyUser(username, password)) {
        QMessageBox::information(this, "登录成功", "欢迎," + username);
        this->hide();
        MainPage *page = new MainPage();
        page->show();
    } else {
        QMessageBox::warning(this, "登录失败", "用户名或密码错误!");
    }
}

void MainWindow::registerUser() {
    QString username = userLineEdit->text();
    QString password = passLineEdit->text();
    if (Database::instance().registerUser(username, password)) {
        QMessageBox::information(this, "注册成功", "可以登录了!");
    } else {
        QMessageBox::warning(this, "注册失败", "用户名已存在!");
    }
}

3、遇到的问题

问题1:识别不到内嵌UI文件

  • 现象:在QT程序中,无法识别内嵌的UI文件,无法启动UI
  • 原因:QT配置资源文件和路径名不匹配
  • 解决:确保UI文件的路径和名称在代码中正确引用。如果使用了资源文件(.qrc),检查资源文件的路径和前缀是否正确。例如,如果资源文件中定义了prefix="/icons",则在代码中引用资源时需要使用":/icons/yourfile.png"

问题2:SQlite在Ubuntu中无法使用

  • 现象:sqlite在qt中无法使用
  • 原因:没有加载SQlite插件
  • 解决
    通过下面命令安装插件
csharp 复制代码
sudo apt-get install libqt5sql5-sqlite

在Qt项目文件(.pro文件)中,确保添加了SQL模块:

csharp 复制代码
QT += sql

将qsqlite插件文件复制到应用程序的运行目录或sqldrivers目录下。

csharp 复制代码
cp /path/to/qt/plugins/sqldrivers/libqsqlite.so /path/to/your/application/sqldrivers/

清理并重新构建项目

csharp 复制代码
qmake
make clean
make

5. 提交报告文档要求

Markdown 文档

  • 本报告使用 Markdown 编写,文件名为 姓名学号_项目名称_第 XX 周.md
  • 包含代码块、图片链接、列表等标准语法。

转换为 PDF

  • 工具:使用 VS Code 插件 Markdown PDF 或在线工具 Pandoc。

  • 步骤

    bash 复制代码
    # 命令行转换示例
    pandoc project-report.md -o project-report.pdf --pdf-engine=xelatex
相关推荐
SPC的存折10 分钟前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql
运维行者_11 分钟前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
quxuexi39 分钟前
网络通信安全与可靠传输:从加密到认证,从状态码到可靠传输
java·安全·web
dashizhi20151 小时前
共享文件禁止拖动本地磁盘、共享文件禁止另存为、禁止打印共享文件、禁止复制共享文件的方法
运维·服务器·网络·安全·电脑
网教盟人才服务平台2 小时前
AI 全面重塑网络攻防生态,智能安全进入深度对抗时代
网络·人工智能·安全
炸炸鱼.2 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
softshow10262 小时前
Etsy 把 1000 个 MySQL 分片迁进 Vitess
数据库·mysql
Ronaldinho Gaúch2 小时前
MySQL基础
数据库·mysql
不剪发的Tony老师3 小时前
Noir:一款键盘驱动的现代化数据库管理工具
数据库·sql
qq_260241233 小时前
将盾CDN:网络安全人才培养的困境与破局之道
安全·web安全