李臻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
相关推荐
可怜的Tom被玩弄于股掌之中7 分钟前
BUUCTF——ReadlezPHP
安全·web安全·网络安全·网络攻击模型·安全架构
你好我是小美16 分钟前
信息收集+初步漏洞打点
安全·web安全·网络安全
卡戎-caryon1 小时前
【MySQL】02.数据库基础
linux·网络·数据库·mysql·存储引擎
weixin_473894771 小时前
Web安全核心内容与常见漏洞总结
安全·web安全
小楠小楠小楠1 小时前
Redis的主从架构
数据库·redis·架构
数据库幼崽2 小时前
MySQL 8.0 OCP 1Z0-908 101-110题
数据库·mysql·ocp
码农捻旧2 小时前
Node.js中MongoDB连接的进阶模块化封装
数据库·mongodb·node.js
数据库幼崽2 小时前
MySQL 8.0 OCP 1Z0-908 111-120题
数据库·mysql·ocp
BuLingLings2 小时前
vue3_flask实现mysql数据库对比功能
数据库·mysql·flask·vue
未来影子2 小时前
面试中的线程题
java·数据库·面试