当前位置: 首页 > news >正文

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

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

1. 代码链接

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

代码结构说明:

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

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

  • 注册功能
    用户首次进行注册时,会显示注册成功信息
    在这里插入图片描述

在这里插入图片描述
当用户名存在时,系统会提示注册失败,当前用户已存在。
在这里插入图片描述

  • 登录功能
    输入注册成功的用户名密码,和数据库中的数据匹配后会显示登录成功。
    在这里插入图片描述
    数据库文件在项目的Debug文件中
    在这里插入图片描述
    由于使用的是SQlite,不需要安装和配置服务器。SQLite 是一个嵌入式数据库,它直接将数据库存储在一个单独的磁盘文件中,不需要运行独立的服务器进程。

database.h

#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

#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

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QWidget>
#include <QLineEdit>
#include <QPushButton>class MainWindow : public QWidget {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);private slots:void login();void registerUser();private:QLineEdit *userLineEdit;QLineEdit *passLineEdit;
};#endif // MAINWINDOW_H

mainwindow.cpp

#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

#ifndef MAINPAGE_H
#define MAINPAGE_H#include <QWidget>class MainPage : public QWidget {Q_OBJECTpublic:MainPage(QWidget *parent = nullptr);private slots:void uploadFile();void downloadFile();
};#endif // MAINPAGE_H

mainpage.cpp

#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插件
  • 解决
    通过下面命令安装插件
sudo apt-get install libqt5sql5-sqlite

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

QT += sql

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

cp /path/to/qt/plugins/sqldrivers/libqsqlite.so /path/to/your/application/sqldrivers/

清理并重新构建项目

qmake
make clean
make

5. 提交报告文档要求

Markdown 文档

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

转换为 PDF

  • 工具:使用 VS Code 插件 Markdown PDF 或在线工具 Pandoc。
  • 步骤
    # 命令行转换示例
    pandoc project-report.md -o project-report.pdf --pdf-engine=xelatex
    

相关文章:

  • 【Java ee初阶】jvm(3)
  • ARM A64 STR指令
  • Java大厂面试:从Web框架到微服务技术的场景化提问与解析
  • Java基础知识总结(超详细整理)
  • 发布时将多个bpl 打包成一个bpl的方法,或者说:不需要vcl60.bpl情况下 18.5K的exe 照常可以运行。
  • c++学习之--- list
  • Nordic 的RTC(Real-time counter)的介绍
  • 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系
  • IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 VSCode + IoT Link 插件
  • SQL脚本规范
  • 【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理
  • 2025.5.12-2025.5.18:开始练习英语口语
  • httpx[http2] 和 httpx 的核心区别及使用场景如下
  • 01 Nginx安装及基本配置
  • PostGIS实现矢量数据转栅格数据【ST_AsRaster】
  • pnpm项目内网迁移
  • minicom串口调试助手
  • Linux云计算训练营笔记day10(MySQL数据库)
  • MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
  • 十大券商看后市|A股指数有望进一步缓步推高,淡化短期波动
  • 武康大楼再开发:一栋楼火还不够,要带火街区“朋友圈”
  • “80后”萍乡市安源区区长邱伟,拟任县(区)委书记
  • 牛市早报|持续推进城市更新行动意见印发,证监会强化上市公司募资监管
  • 农行回应“病重老人被要求亲自取钱在银行去世”:全力配合公安机关调查
  • 中日东三省问题的源起——《1905年东三省事宜谈判笔记》解题