安全文件传输系统项目报告(第 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