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

news2024/11/15 21:55:00

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.coloradmin.cn/o/1920422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python+Flask+MySQL的新冠疫情可视化系统

基于PythonFlaskMySQL的新冠疫情可视化系统 FlaskMySQL 基于PythonFlaskMySQL的新冠疫情可视化系统 项目主要依赖前端&#xff1a;layui&#xff0c;Echart&#xff0c;后端主要是Flask&#xff0c;系统的主要支持登录注册&#xff0c;Ecahrt构建可视化图&#xff0c;可更换主…

Qt 统计图编程

学习目标&#xff1a;Qt 折线图&#xff0c;柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…

数据结构——查找算法

文章目录 1. 查找算法 2. 顺序查找 2. 二分查找 1. 查找算法 查找算法是用于在数据集中定位特定元素的位置的算法。查找是计算机科学中一项基本操作&#xff0c;几乎在所有应用程序中都需要使用。例如&#xff0c;数据库查询、信息检索、字典查找等都涉及到查找操作。查找算…

【Mutilism数字电路实现32进制5线32译码器】2022-5-7

缘由3-8译码器到74HC138-编程语言-CSDN问答 2片16004非门2个组成8进制和4进制实现。 按138逻辑表把E3也接入置零&#xff0c;同时把E1也接入反向使得切换时138保持高电平输出&#xff0c;就看不到转换时第一个出现短暂低电平&#xff0c;是最完美的解决方案&#xff0c;二级反向…

分布式I/O从站的认知

为什么需要分布式I/O从站&#xff1f; 当PLC与控制机构距离过远时&#xff0c;远距离会带来信号干扰&#xff0c;分布式I/O从站只需要一个网络线缆连接。 ET200分布式I/O从站家族 体积紧凑、功能强大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通讯协议…

yarn底层原理详解:(第33天)

系列文章目录 一、yarn总体架构 二、yarn核心组件及功能 三、yarn资源分配与调度 四、yarn提交和执行流程 五、yarn调度算法 六、yarn安全性与容错性 文章目录 系列文章目录前言一、总体架构二、核心组件及功能1. ResourceManager&#xff08;RM&#xff09;2. NodeManager&am…

达梦数据库dm8安装步骤及迁移

目录 前言: 一、安装部署 1、下载 2、创建用户及安装目录 3、挂载下载的镜像 4、环境配置 5、安装 二、基本使用 1、DM工具使用 2、兼容性配置 2.1 兼容GBK字符集编码 2.2 兼容UTF-8字符集编码 3、创建用户和密码,表空间 4、整理数据库配置 5、启动脚本设置 …

13、Python之函数:简单的参数默认值其实并不简单

目录 引言 日志打印的问题 返回参数默认值的问题 问题产生的原因 关于参数默认值的最佳实践 总结 引言 在前一篇关于Python函数的文章中&#xff0c;我们介绍了函数的基本使用、函数的默认参数、lambda函数的用法&#xff0c;相当于对Python中的函数有了一个入门的介绍。…

动态规划之数字三角形模型+最长上升子序列模型

首先&#xff0c;我们从集合角度重新看待DP&#xff1a; 直接看题&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取纸条的原题&#xff0c;我们令f[i1,j1,i2,j2]表示从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的max i1j1i2j2&#xff0c;于是我们可以把状…

ESP32的芯片有几种

ESP32系列 ESP32芯片截止到24年7月有5个系列&#xff1a; ESP32-C3 ESP32由ESP32-P 系列、ESP32-S 系列、ESP32-C 系列、ESP32-H 系列、ESP32 系列构成。其中ESP32-S分为S3和S2两个小系列&#xff1b;ESP32-C系列分为C6、C5、C3、C2四个小系列&#xff0c;具体如下。 说明&am…

合宙 Air780E模块 AT 指令 MQTT连接

固件说明 重启模块 //tx ATRESET//rx ATRESETOK ^boot.romv!\n RDY^MODE: 17,17E_UTRAN ServiceCGEV: ME PDN ACT 1NITZ: 2024/07/10,08:33:440,0查询模块版本信息 //tx ATCGMR//rx ATCGMRCGMR: "AirM2M_780E_V1161_LTE_AT"OK基本流程 4G模块支持MQTT和MQTT SSl协…

5 MySql

5 MySql 一、简介二、SQL语言2.1 导入外部SQL文件2.2 显示表结构2.3 与创建数据库相关的语句2.4 与表相关的语句2.5 操作表中的数据2.6 7种基本的sql查询 三、SQL的注意点3.1 与集合函数相关3.2 SQL语句的书写与执行过程 四、约束 constraint4.1 作用4.2 功能分类4.3 自增 五、…

读人工智能全传10深度思维

1. 深度思维 1.1. DeepMind 1.1.1. 深度思维 1.1.2. 2014年的员工不足25人 1.1.3. 深度思维公司公开宣称其任务是解决智能问题 1.1.4. 2014年谷歌收购DeepMind&#xff0c;人工智能突然成了新闻热点&#xff0c;以及商业热点 1.1.4.1. 收购报价高达4亿英镑 1.1.4.2. 深度…

差分约束——AcWing 362. 区间

差分约束 定义 差分约束系统是一种在计算机科学和运筹学中用于解决特定类型优化问题的工具。它主要用于处理一类线性不等式组&#xff0c;这些不等式描述了变量之间的相对大小关系&#xff0c;而不是直接的绝对值大小。差分约束系统通常用于路径寻找、调度、资源分配等问题。…

maven私有镜像仓库nexus部署使用

maven私有镜像仓库nexus部署使用 1、Nexus部署 #查找镜像 docker search sonatype/nexus3 #拉取镜像 docker pull sonatype/nexus3 #持久化目录 mkdir -p /data/nexus/data chmod 777 -R /data/nexus/data #启动服务 docker run -d --name nexus3 -p 8081:8081 --restart alw…

javaweb基础知识入门

javaweb 1.基本概念 1.1前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com 静态web html&#xff0c;css 提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝...等几乎是所有的网站 提供给所有人看的数据始终会发生变化&#…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

头歌资源库(27)特别的数

一、 问题描述 编程输出一个特别的数&#xff0c;该数是一个由1~9组成的9位数&#xff0c;每个数字只能出现一次&#xff0c;且这个9位数由高位到低位前i位能被i整除。 二、算法思想 创建一个长度为9的数组&#xff0c;用于存放1~9这9个数字。使用回溯算法&#xff0c;从第…

Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)

2024.07.11 测试有效 最近需要用一下 opencv 处理图像&#xff0c;简单配置了一下Cmake下的 opencv 库。 没有编译 opencv &#xff0c;也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…

在分布式环境中,怎样保证 PostgreSQL 数据的一致性和完整性?

文章目录 在分布式环境中保证 PostgreSQL 数据的一致性和完整性一、数据一致性和完整性的重要性二、分布式环境对数据一致性和完整性的挑战&#xff08;一&#xff09;网络延迟和故障&#xff08;二&#xff09;并发操作&#xff08;三&#xff09;数据分区和复制 三、保证 Pos…