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

一、前言

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

字段 类型 是否必填 备注
id int 学生学生号,主键
name varchar(255) 学生名字
sex varchar(10) 性别,男OR女
sfz varchar(20) 身份证,唯一值
tel varchar(20) 电话号码
address varchar(255) 学生地址
weixin varchar(255) 微信号
QQ varchar(255) qq号
status varchar(100) 默认状态为active, active
create_time TIMESTAMP 创建时间,使用时间戳记录
create_by varchar(100) 创建用户
update_time TIMESTAMP 更新时间,使用时间戳记录
update_by varchar(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

字段 类型 是否必填 备注
id int 管理员ID,主键
user varchar(100) 登陆账户
pw varchar(100) 密码
safety_code varchar(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 审计记录

字段 类型 是否必填 备注
id int 管理员ID,主键
option varchar(100) 操作类型,update,delete,insert
detail varchar(1024) 操作日志
create_by varchar(100) 操作管理员名称
create_time TIMESTAMP 创建时间
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

相关推荐

  1. Qt学生信息管理系统Qt+DataBase)

    2024-07-12 13:06:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 13:06:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 13:06:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 13:06:01       58 阅读
  4. Python语言-面向对象

    2024-07-12 13:06:01       69 阅读

热门阅读

  1. js 移动数组元素的几个方法

    2024-07-12 13:06:01       18 阅读
  2. 使用C# 实现期望最大化算法

    2024-07-12 13:06:01       19 阅读
  3. [NLP Begin] Classical NLP Methods - HMM

    2024-07-12 13:06:01       25 阅读
  4. 【ELK】filebeat 和logstash区别

    2024-07-12 13:06:01       17 阅读
  5. 行为模式9.策略模式------促销活动设计方案

    2024-07-12 13:06:01       21 阅读
  6. Vim 编辑文件时中文乱码的解决方法

    2024-07-12 13:06:01       18 阅读
  7. vim删除多行

    2024-07-12 13:06:01       25 阅读
  8. 嵌入式裸机开发与 Linux 开发

    2024-07-12 13:06:01       21 阅读
  9. 机器学习-分类器-总结

    2024-07-12 13:06:01       18 阅读
  10. Git-如何基于某个tag创建一个新分支

    2024-07-12 13:06:01       27 阅读
  11. 【Linux】Vim 使用教程

    2024-07-12 13:06:01       17 阅读