Qt学生管理系统(付源码)

Qt学生管理系统

  • 一、前言
    • 1.1 项目介绍
    • 1.2 项目目标
  • 2、需求说明
    • 2.1 功能性说明
    • 2.2 非功能性说明
  • 三、UX设计
    • 3.1 登录界面
    • 3.2 学生数据展示
    • 3.3 信息插入和更新
  • 三、架构说明
    • 3.1 客户端结构如下
    • 3.2 数据流程图
      • 3.2.1 数据管理
      • 3.2.2 管理员登录
  • 四、 设计说明
    • 3.1 数据库设计
    • 3.2 结构设计
      • 3.2.1 通用结构
        • 3.2.1.1 student结构
        • 3.2.1.2 usr 结构
        • 3.2.1.3 audit_logs 结构
    • 3.2 接口结构
      • 3.2.1 StudentListRequest 学生信息列表请求
      • 3.2.2 StudentListRequest 学生信息列表响应
      • 3.2.3 LoginRequest 登录请求
      • 3.2.4 LoginResponse 登录响应
      • 3.2.5 AuditLogsRequest 审计请求
    • 3.3 接口说明
      • 3.3.1 学生相关接口
        • 3.3.1 添加用学生信息
        • 3.3.2 删除学生信息
        • 3.3.3 更新学生信息
        • 3.3.4 查询
      • 3.3.2 登录相关
        • 3.3.2.1 登录请求
      • 3.3.3 审计相关
        • 3.3.31 添加审计日志
  • 四、部署
    • 4.1 部署概述
    • 4.2 部署步骤
  • 五、源码地址:

一、前言

1.1 项目介绍

随着教育信息化的推进,学生管理系统成为学校管理的重要工具。传统的学生管理方式效率低、易出错,且难以满足现代化教育的需求。基于此,开发了一款基于 Qt 和 MySQL 的学生管理系统,以提高学校管理的效率和准确性。

1.2 项目目标

学生管理系统旨在为学校提供一个高效、可靠的学生信息管理平台,主要目标包括:

  • 提高学生信息管理的效率
  • 实现学生数据的安全存储和便捷访问
  • 提供多样化的查询和统计功能
  • 支持用户权限管理,确保数据安全

2、需求说明

2.1 功能性说明

  • 1.1 管理员登陆

    • 提供管理员登陆界面,登陆成功后才允许管理学生信息。
    • 账号输入框:输入最大长度为16,,只能输入字母和数字。
    • 密码输入框:密码长度小于6时提示错误,输入最大长度16。
  • 1.2 学生添加

    • 添加用学生信息,学生信息包括以下内容:
    • 名字、性别、电话、身份证、地址、微信号、QQ号
  • 1.3 学生展示

    • 以列表形式展示学生信息,展示学生的学号,性别,名字电话。
    • 支持翻页,每页展示10条数据,支持上一页/下一页,直接跳转指定页码,展示总页数和当前页。
  • 1.4 学生查询

    • 根据学生学号
    • 根据学生名字模糊查询
    • 根据学生性别查询
    • 根据学生生日范围查询
    • 根据学生电话号码查询
  • 1.5 学生信息修改

    • 可以修改除学号外的任何信息
  • 1.6 删除学生信息

    • 使用软删除
  • 1.7 审计日志

    • 记录添加用户信息,操作

2.2 非功能性说明

  • 输入框:做sql过滤,防止SQL注入获取用户账号密码。
  • 数据库存储密码时,使用安全存储,sha256(密码+安全码)
  • 数据库信息通过文件配置方式,可以使得程序部署方便。

三、UX设计

3.1 登录界面

在这里插入图片描述
密码框在输入的使用应该隐藏数据输入内容。

3.2 学生数据展示

在这里插入图片描述

3.3 信息插入和更新

在这里插入图片描述

三、架构说明

3.1 客户端结构如下

  • 客户端采用经典的MVC架构。
    • M:数据模型层,用于访问Mysql数据库
    • V:试图层,用于界面的展示。
    • C:控制层,用于业务处理(这里是完整项目,项目比较简单其实这个层会体现不出来。)
      在这里插入图片描述

3.2 数据流程图

3.2.1 数据管理

以下图数据流程图,通过这个图我们可以知道数据从界面到数据库,以及数据库数据到界面的整体流程

view层 contoller层 model层 DB 请求数据 参数判断,基本逻辑错里 参数错误 界面显示参数错误 数据请求 数据业务管理 数据库请求 返回数据 返回结果 业务处理 数据返回 展示数据 view层 contoller层 model层 DB

3.2.2 管理员登录

管理员的登录流程,也是上面2.3.1中的流程的具体使用,整体框架都是对标2.3.1

登录界面(view) 管理员控制器(controller) 管理员数据模型(model) 提交用户账户密码 根据用户名称查询用户的信息 返回查询结果 对比用户输入密码和数据查询密码是否一致 返回查询结果 登录界面(view) 管理员控制器(controller) 管理员数据模型(model)

四、 设计说明

3.1 数据库设计

表名:student

字段类型是否必填备注
idint学生学生号,主键
namevarchar(255)学生名字
sexvarchar(10)性别,男OR女
sfzvarchar(20)身份证,唯一值
telvarchar(20)电话号码
addressvarchar(255)学生地址
weixinvarchar(255)微信号
QQvarchar(255)qq号
statusvarchar(100)默认状态为active, active
create_timeTIMESTAMP创建时间,使用时间戳记录
create_byvarchar(100)创建用户
update_timeTIMESTAMP更新时间,使用时间戳记录
update_byvarchar(100)更新学生信息的用户
CREATE TABLE IF  NOT EXISTS student(id INT  NOT NULl PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL COMMENT  "学生名字",sex VARCHAR(10) NOT NULL COMMENT  "学生性别",sfz VARCHAR(20)  NOT NULL UNIQUE COMMENT  "身份证",tel VARCHAR(20) NOT NULL COMMENT  "电话号码",address VARCHAR(20) NOT NULl COMMENT  "学生地址",weixin VARCHAR(255)   COMMENT  "微信号",QQ VARCHAR(255) COMMENT  "qq号",status VARCHAR(100) NOT NULl COMMENT  "qq号",create_time  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL  COMMENT  "创建时间",create_by VARCHAR(100) NOT NULL  COMMENT  "创建用户",update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  COMMENT  "创建时间",update_by VARCHAR(100) NOT NULL  COMMENT  "创建用户"
) ENGINE=InnoDB;

表名:manager

字段类型是否必填备注
idint管理员ID,主键
uservarchar(100)登陆账户
pwvarchar(100)密码
safety_codevarchar(10)安全码
CREATE TABLE IF NOT EXISTS manager(id INT  NOT NULl PRIMARY KEY AUTO_INCREMENT,user  VARCHAR(100) NOT NULL  COMMENT "登陆账户",pw  VARCHAR(100) NOT NULL  COMMENT "密码",safety_code  VARCHAR(10) NOT NULL  COMMENT "安全码"
)ENGINE=InnoDB;

表名:audit_logs 审计记录

字段类型是否必填备注
idint管理员ID,主键
optionvarchar(100)操作类型,update,delete,insert
detailvarchar(1024)操作日志
create_byvarchar(100)操作管理员名称
create_timeTIMESTAMP创建时间
CREATE TABLE IF NOT EXISTS audit_logs(id INT  NOT NULl PRIMARY KEY AUTO_INCREMENT,option VARCHAR(100) NOT NULL  COMMENT "操作类型",detail VARCHAR(1024) NOT NULL  COMMENT "操作管理员名称",create_by  VARCHAR(100) NOT NULL  COMMENT "登陆账户",create_time  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL  COMMENT  "创建时间"
)ENGINE=InnoDB;

3.2 结构设计

3.2.1 通用结构

3.2.1.1 student结构
stuct Student{int id,QString name,QString sex,QString sfz,QString tel,QStrnig address,QString weixin,QString qq,QString status,QString create_time,QString create_by,QString update_time,QString update_by
};
3.2.1.2 usr 结构
stuct User{int id,QString user,QString pw;QString safety_code
} ;
3.2.1.3 audit_logs 结构
struct AuditLogs{int id ,    QString option, QString detail,QString create_by,QString create_time
}

3.2 接口结构

3.2.1 StudentListRequest 学生信息列表请求

struct StudentListRequest{int page,       // 当前页码             必填int size,       // 每一页的数量         必填QString id,     // 查询请求的id         非必填QString name,   // 查询请求用户名       非必填QString sex,    // 查询请求用户性别     非必填QString sfz,    // 查询请求身份证       非必填QString weixin, // 查询请求微信号       非必填QString qq      // 查询请求QQ号         非必填
};

3.2.2 StudentListRequest 学生信息列表响应

struct StudentListResponse{int msg_code,                // 请求状态,0表示成功,其他表示错误QString msg,                 // 请求错误信息int current,                 // 当前页int total,                   // 请求数据的总数vector<Student> vecStudent   // 学生数据
};

3.2.3 LoginRequest 登录请求

struct LoginRequest{QString user;       // 用户账号 必填QString pw;         // 用户名称
};

3.2.4 LoginResponse 登录响应

struct LoginResponse{int msg_code,QString msg,QString user,QString loginTime
};

3.2.5 AuditLogsRequest 审计请求

struct AuditLogsRequest{QString option,QString detail,QString createBy
};

3.3 接口说明

接口表示view层与controller层的对接接口,view层只需要通过controller层的接口调用获取数据,剩下展示的内容有view层进行展示。

3.3.1 学生相关接口

view和controller对接的接口

3.3.1 添加用学生信息

bool addStudentInfo(Student info);

 QString sql = QString("insert into student (name,sex,sfz,tel,address,weixin,qq,status,create_by) ""values ('%0','%1','%2','%3','%4','%5','%6','%7','%8');").arg(info.name).arg(info.sex).arg(info.tel).arg(info.address).arg(info.weixin).arg(info.qq).arg(QString::number(1)).arg("test");QSqlQuery query;if(!query.exec(sql)){qInfo()<<"init db data failed!"<<query.lastError()<< ":" << query.lastQuery();return Result(0,"");}return Result(0,"");
3.3.2 删除学生信息

bool deleteStudentInfo(int id);

3.3.3 更新学生信息

bool updateStudentInfo(int id,Student newInfo);

3.3.4 查询

StudentListResponse selectStudentList(StudentListRequest studentListRequest);

 StudentListResponse res;QString where  = getStudentListRequestWhere(studentListRequest);// 获取数据总数res.total = getCountSelectStudentList(studentListRequest);res.current = studentListRequest.page;res.msg_code = 0;QSqlQuery query;QString currentOffset = QString::number(studentListRequest.page * studentListRequest.size);QString strSize = QString::number(studentListRequest.size);QString sql = "select * from student " +where +"limit "+ currentOffset +","+ strSize;if(!query.exec(sql)){res.msg_code = -1;res.msg = query.lastError().text();return res;}qInfo()<<"last:" << query.lastQuery();// 处理查询结果while (query.next()) {Student stu;stu.id = query.value(0).toString();stu.name = query.value(1).toString();stu.sex = query.value(2).toString();stu.sfz  = query.value(3).toString();stu.tel =  query.value(4).toString();stu.address = query.value(5).toString();stu.weixin = query.value(6).toString();stu.qq  = query.value(7).toString();res.vecStudent.push_back(stu);}return res;

3.3.2 登录相关

3.3.2.1 登录请求

LoginResponse userLogin(LoginResponse loginResponse);

if(pw.isNull() || pw.isEmpty()){return Result(LOGIN_ERROR_PASSWORD_EMPTY,LOGIN_ERROR_PASSWORD_EMPTY_MSG);}Result res(0,"");QSqlQuery query;query.clear();QString sql = QString("SELECT * FROM manager WHERE user = '%1'").arg(user);query.prepare(sql);qInfo() << query.lastQuery();if (!query.exec()) {qDebug() << "Error: Failed to insert student." << query.lastError();return res;}QString spw;while (query.next()) {int id = query.value("id").toInt();spw = query.value("pw").toString();}if(pw  == spw){return Result(LOGIN_OK,LOGIN_OK_MSG);}return Result(LOGIN_ERROR_PASSWORD,LOGIN_ERROR_PASSWORD_MSG);

3.3.3 审计相关

3.3.31 添加审计日志

void addAuditLogs(AuditLogsRequest auditLogsRequest);

四、部署

4.1 部署概述

该学生管理系统由 Qt 前端应用程序和 MySQL 数据库组成。Qt 应用程序通过读取配置文件 my.xml 连接到位于服务器上的 MySQL 数据库。

4.2 部署步骤

    1. 安装mysql数据库
    1. 导入初始化表init.sql
    1. 配置my.xml,配置文件需要和程序放在同一个目录中

五、源码地址:

https://gitcode.net/arv002/database/-/tree/master/StudentManagementSystem/StudentManagementSystem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/375197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式要卷成下一个Java了吗?

嵌入式系统与Java的关系在技术发展和市场需求的影响下在逐步演变&#xff0c;但尚未达到完全替代的阶段。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&…

system V共享内存【Linux】

文章目录 原理shmgetftokshmat(share memory attach)shmdt&#xff0c;去关联&#xff08;share memory delete attach&#xff09;shmctl ,删除共享内存共享内存与管道 原理 共享内存本质让不同进程看到同一份资源。 申请共享内存&#xff1a; 1、操作系统在物理内存当中申请…

【鸿蒙学习笔记】通过用户首选项实现数据持久化

官方文档&#xff1a;通过用户首选项实现数据持久化 目录标题 使用场景第1步&#xff1a;源码第2步&#xff1a;启动模拟器第3步&#xff1a;启动entry第6步&#xff1a;操作样例2 使用场景 Preferences会将该数据缓存在内存中&#xff0c;当用户读取的时候&#xff0c;能够快…

从2024上半年《人工智能现状报告》看GPU前世今生

前不久&#xff0c;全球领先的低代码平台Retool发布了最新的2024上半年《人工智能现状报告》&#xff0c;这份报告收集了约750名技术人员的意见&#xff0c;包括开发者、数据团队和各行业的领导者。报告通过调研人们对AI产生的情绪变化、AI应用现状、AI使用率等等几个方面总结了…

上海慕尼黑电子展开展,启明智显携物联网前沿方案亮相

随着科技创新的浪潮不断涌来&#xff0c;上海慕尼黑电子展在万众瞩目中盛大开幕。本次展会汇聚了全球顶尖的电子产品与技术解决方案&#xff0c;成为业界瞩目的焦点。启明智显作为物联网彩屏显示领域的佼佼者携产品亮相展会&#xff0c;为参展者带来了RTOS、LINUX全系列方案及A…

HTML 基础

文章目录 HTML 结构认识 HTML 标签HTML 文件基本结构快速生成代码框架 HTML 常见标签注释标签标题标签: h1-h6段落标签: p换行标签: br格式化标签图片标签: img超链接标签: a表格标签列表标签表单标签form 标签input 标签 label 标签select 标签textarea 标签无语义标签: div &…

浏览器书签助手mTab

本文软件由网友 P家单推人 推荐 什么是 mTab ? mTab 是免费无广告的浏览器书签助手&#xff0c;多端同步、美观易用的在线导航和书签工具&#xff0c;可以用 mTab 书签收藏并自定义常用网站的图标样式&#xff0c;帮助您高效管理网页和应用&#xff0c;提升在线体验。 官方提供…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行&#xff0c;可能是因为DNS不稳定吧&#xff0c;因为yum安装时会从三个”repo源“&#xff08;base&#xff0c;extras&#xff0c;updates&#xff09;随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时&#xff0c;比…

【开源项目的机遇与挑战】探索、贡献与应对

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一&#xff1a;开源项目的发展趋势 &#x1f343;开源项目的蓬勃发展现状 &#x1f343;开…

ubuntu16.04安装低版本cmake(安装cmake安装)

文章目录 ubuntu16.04安装低版本cmake&#xff08;安装cmake安装&#xff09;1. **下载并解压CMake压缩文件**&#xff1a;- 首先&#xff0c;你需要从CMake的官方网站或其他可靠来源下载cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在终端中使用以下命令解压文件&#xff1a; 2…

C++相关概念和易错语法(18)(array、模板)

1.array &#xff08;1&#xff09;普通数组的劣势 当我们直接越界修改值时&#xff0c;一般会在编译时就被拦截 但是越界访问&#xff0c;只要访问距离不算特别大&#xff0c;那么也可以越界访问 当我们不直接越界修改或访问&#xff0c;间接去访问和修改能越界非常远 这里的…

FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

目录 创建工程创建 HDL 代码仿真添加管脚约束添加时序约束生成 bit 文件下载ILA 在线调试 创建工程 型号选择&#xff1a;以 AXU9EG 开发板为例&#xff0c;芯片选择 xczu9eg-ffvb1156-2-i 创建 HDL 代码 注意&#xff1a;由于输入时钟为 200MHz 的差分时钟&#xff0c;因此…

嵌入式开发过程中,常见报错以及解决方法

编写不易&#xff0c;仅供学习&#xff0c;参考谢谢&#xff0c;还望理解。 #常见报错 文件最后一行没有新行 翻译&#xff1a;文件的最后一行结束时没有新行 解决方法&#xff1a;定位到&#xff0c;提示报错的 .h 文件 报错行 &#xff0c;加上一个新行 函数定义时与官方提…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现&#xff0c;包括文档编辑器、在线思维导图、在线流程图等&#xff0c;前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文&#xff0c;分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

Python酷库之旅-第三方库Pandas(017)

目录 一、用法精讲 41、pandas.melt函数 41-1、语法 41-2、参数 41-3、功能 41-4、返回值 41-5、说明 41-5-1、宽格式数据(Wide Format) 41-5-2、长格式数据(Long Format) 41-6、用法 41-6-1、数据准备 41-6-2、代码示例 41-6-3、结果输出 42、pandas.pivot函数 …

休息时间c++

题目描述 小杨计划在某个时刻开始学习&#xff0c;并决定在学习k秒后开始休息。 小杨想知道自己开始休息的时刻是多少。 输入 前三行每行包含一个整数&#xff0c;分别表示小杨开始学习时刻的时h、分m、秒s(h&#xff0c;m&#xff0c;s的值符合1≤h≤12,0≤m≤59,0≤s≤59)…

SpringBoot新手快速入门系列教程七:基于一个低配centoos服务器,如何通过宝塔面板部署一个SpringBoot项目

1&#xff0c;如何打包一个项目 通过IDEA自带的命令行&#xff0c;执行 ./gradlew clean build 2&#xff0c;检查生成的JAR文件 进入 build/libs 目录&#xff0c;你应该会看到一个类似 helloredis-0.0.1-SNAPSHOT.jar 的文件。 3&#xff1a;运行生成的JAR文件 你可以在…

JupyterNotebook中导出当前环境,并存储为requirements.txt

​使用Anaconda管理Python环境时&#xff0c;可以轻松地导出环境配置&#xff0c;以便在其他机器或环境中重新创建相同的环境。可以通过生成一个environment.yml文件实现的&#xff0c;该文件包含了环境中安装的所有包及其版本。但是&#xff0c;常常在一些课程中JupyterNotebo…

韦东山嵌入式linux系列-LED驱动程序

之前学习STM32F103C8T6的时候&#xff0c;学习过对应GPIO的输出&#xff1a; 操作STM32的GPIO需要3个步骤&#xff1a; 使用RCC开启GPIO的时钟、使用GPIO_Init函数初始化GPIO、使用输入/输出函数控制GPIO口。 【STM32】GPIO输出-CSDN博客 这里再看看STM32MP157的GPIO引脚使用…

逻辑回归中的损失函数

目录 一、损失函数介绍&#xff1a;二、简化上述损失函数&#xff1a; 一、损失函数介绍&#xff1a; 与回归问题成本函数不同的是&#xff0c;逻辑回归模型&#xff08;解决分类问题&#xff09;的成本函数在获得损失J的时候不再用真实值y与预测值y^的差值计算损失&#xff0…