数据库课程设计——学生信息管理系统

0 前言

评论区自取,谢谢点赞

0.1效果演示

演示视频

0.2 开发工具

  • 开发语言:Java 、Java GUI、MySQL
  • 开发工具:IDEA、Navicat

0.3 创新点

  • 采用MD5文本摘要算法对用户账号和密码进行加密存储
  • 使用exe4j对系统代码进行打包成exe可执行文件

1.系统需求分析

学校每年都有新生入学、老生毕业,还有其他各种人事变动。如何有效地管理这些学生的信息,帮助学校和老师掌握学生的情况,这就是学生信息管理系统需要完成的功能。

1.1 系统功能分析

  • 本系统主要的功能是收集学生的个人信息,以便向教师提供每个学生在校的情况。系统的主要功能有:
  • 学生个人信息输入,包括:姓名、性别、院系、生日、籍贯、生源所在地等。
  • 学生流动情况的输入,包括:转系、休学、复学、退学、毕业。
  • 奖惩情况的输入。
  • 学生个人情况查询和修改,包括流动情况和奖罚情况。

1.2 系统功能模块设计(划分)

根据系统功能要求可以将系统分解成几个模块来分别设计应用程序界面,如图1 所示。

在这里插入图片描述
在这里插入图片描述

1.3 与其它系统的关系

学生信息管理系统是校园信息管理系统的一个组成部分。它为其它系统,如班级信息管理系统、

教学管理系统、成绩单系统、宿舍分配系统等,提供学生的基本情况。同时需要其他系统提供的班级设置和院系设置等情况。这些系统可以使用同一个数据库,直接相互调用所需的数据。

1.4 数据流程图

学生信息管理系统的数据流程如图 2 所示。

在这里插入图片描述

2.数据库设计

2.1 数据库需求分析

  • 根据上一节的数据流程图,可以列出以下记录学生信息所需的数据项和数据结构:
  • 学生:学号、姓名、性别、生日、籍贯、所在院系、所在班级。
  • 处罚记录:记录号、级别、处罚对象、记录时间、详细描述、是否生效。
  • 奖励记录:记录号、级别、奖励对象、记录时间、详细描述。
  • 学籍变更记录:记录号、变更情况、记录对象、记录时间、详细描述。

所需的外部数据支持:

  • 班级:班级编号、班级名称、所属院系。
  • 院系:代码、名称。

2.2 数据库概念结构设计

图 3 是本系统所需数据的E-R 模型图。

在这里插入图片描述

2.3数据库逻辑结构设计

根据系统 E-R 图,需要设计 4 个数据表来存放学生的信息。为了系统的完整,系统中包括了应用程序设计中所需的 2 个外部数据表。为了优化数据表结构,部分字段采用代码形

式,因此需要附加 3 个代码表。这 9 个数据表的结构如表 1 到表 9 所示。

表 1 STUDENT 学生个人信息表

字段名数据类型是否可空说明
STUDENTID学号(主关键字)
NAME姓名
SEX性别(M、F)
CLASS班级编号(外部关键字)
DEPARTMENT所属院系编号(外部关键字)
BIRTHDAY生日
NATIVE_PLACE籍贯

表 2 CHANGE 学籍变更信息表

字段名数据类型是否可空说明
ID记录号(主关键字)
STUDENTID学号(外部关键字)
CHANGE变更代码(外部关键字)
REC_TIMEDATE记录时间
DESCRIPTION描述

表 3 REWARD 奖励记录信息表

字段名数据类型是否可空说明
ID记录号(主关键字)
STUDENTID学号(外部关键字)
LEVELS级别代码(外部关键字)
REC_TIME记录时间
DESCRIPTION描述

表 4 PUNISHMENT 处罚记录信息表

字段名数据类型是否可空说明
ID记录号(主关键字)
STUDENTID学号(外部关键字)
LEVELS级别代码(外部关键字)
REC_TIME记录时间
ENABLE是否生效(T、F)
DESCRIPTION描述

表 5 DEPARTMENT 院系信息表

字段名数据类型是否可空说明
ID编号(主关键字)
NAME全称

表 6 CLASS 班级信息表

字段名数据类型是否可空说明
ID编号(主关键字)
NAME全称
MONITOR班长学号(外部关键字)

表 7 CHANGE_CODE 学籍变动代码表

字段名数据类型是否可空说明
CODE代码(主关键字)
DESCRIPTION描述

表 8 REWARD_LEVELS 奖励等级代码表

字段名数据类型是否可空说明
CODE代码(主关键字)
DESCRIPTION描述

表 9 PUNISH_LEVELS 处罚等级代码表

字段名数据类型是否可空说明
CODE代码(主关键字)
DESCRIPTION描述

2.4 数据库的建立

2.4.1 数据库的建立(请设计者完成)

2.4.2 初始数据的输入

数据表创建成功后,数据库中还没有实际的数据。为了保证外部键能使用,数据需要提前输入,如院系编号、班级编号、学籍变更代码和奖惩级别等等。

学籍变更代码和奖惩级别的主关键字 CODE 从 0 开始用阿拉伯数字依次编号,便于程序设计时,采用单选按钮来选择。

本系统中所用到的学籍变更和奖惩级别代码如表 10 至表 12 所示(请设计者完成这些数据表的逻辑结构)。

表10 学籍变更代码表

代码说明
0转系
1休学
2复学
3退学
4毕业

表11 奖励级别代码

代码说明
0校特等奖学金
1校一等奖学金
2校二等奖学金
3校三等奖学金
4系一等奖学金
5系二等奖学金
6系三等奖学金

表12 处罚级别代码

代码说明
0警告
1严重警告
2记过
3记大过
4开除

(以下各部分请设计者完成)。

3.各功能模块的设计与实现

3.1 功能说明

1、学生个人信息输入

2、学籍变更情况的输入

3、奖励情况的输入

4、处罚情况的输入

5、学生个人情况查询和修改

3.2 用户界面设计

完成数据库创建和功能说明以后,我们可以进行下一步工作,即设计用户界面。由于本系统管理内容比较简单,且为校园管理信息系统的一部分,因此使用一个窗体不同的标签页来完成系统要求的 5 项功能。

我们把学生信息管理系统的窗体分成____个主要部分,如图____所示。

1、应用程序主窗体的创建

2、学生个人信息输入界面

3、学籍变更情况输入界面

4、奖励情况输入界面

5、处罚情况输入界面

6、学生个人情况查询和修改界面

3.3 各功能模块的实现

1、学生个人信息输入

2、学籍变更情况输入

3、奖励情况输入

4、处罚情况输入

5、学生个人情况查询和修改

4.系统实现

4.0 数据库表的建立

/*
 Navicat Premium Data Transfer

 Source Server         : conn-local
 Source Server Type    : MySQL
 Source Server Version : 80025
 Source Host           : localhost:3306
 Source Schema         : mydb7

 Target Server Type    : MySQL
 Target Server Version : 80025
 File Encoding         : 65001

 Date: 02/12/2022 17:45:57
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for change_code
-- ----------------------------
DROP TABLE IF EXISTS `change_code`;
CREATE TABLE `change_code`  (
  `code` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学籍变动代码(主键)',
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`code`) USING BTREE,
  INDEX `desc`(`desc`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of change_code
-- ----------------------------
INSERT INTO `change_code` VALUES ('1', '休学');
INSERT INTO `change_code` VALUES ('2', '复学');
INSERT INTO `change_code` VALUES ('4', '毕业');
INSERT INTO `change_code` VALUES ('0', '转系');
INSERT INTO `change_code` VALUES ('3', '退学');

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`  (
  `class_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '编号(主关键字)',
  `class_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班级名称',
  `monitor_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班长学号',
  PRIMARY KEY (`class_id`) USING BTREE,
  INDEX `class_ibfk_1`(`monitor_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('11', '计科一班', '');
INSERT INTO `class` VALUES ('12', '计科二班', NULL);
INSERT INTO `class` VALUES ('21', '计科三班', NULL);
INSERT INTO `class` VALUES ('22', '计科四班', '');
INSERT INTO `class` VALUES ('31', '计科五班', NULL);
INSERT INTO `class` VALUES ('32', '计科智能一班', '');
INSERT INTO `class` VALUES ('41', '计科智能二班', NULL);
INSERT INTO `class` VALUES ('42', '计科智能三班', NULL);
INSERT INTO `class` VALUES ('43', '大数据一班', '');
INSERT INTO `class` VALUES ('51', '大数据二班', '');
INSERT INTO `class` VALUES ('52', '大数据三班', NULL);
INSERT INTO `class` VALUES ('53', '软件一班', NULL);

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `dept_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '编号(主关键字)',
  `dept_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业名称',
  PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('1', '计科');
INSERT INTO `dept` VALUES ('2', '软件');
INSERT INTO `dept` VALUES ('3', '信安');
INSERT INTO `dept` VALUES ('4', '物联网');
INSERT INTO `dept` VALUES ('5', '大数据');

-- ----------------------------
-- Table structure for punish
-- ----------------------------
DROP TABLE IF EXISTS `punish`;
CREATE TABLE `punish`  (
  `rec_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '记录号(主关键字)',
  `stu_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学号(外部关键字)',
  `levels` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '级别代码(外部关键字)',
  `rec_time` datetime(6) NULL DEFAULT NULL COMMENT '记录时间',
  `enable` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否生效(T、F)',
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`rec_id`) USING BTREE,
  INDEX `punish_ibfk_1`(`stu_id`) USING BTREE,
  INDEX `punish_ibfk_2`(`levels`) USING BTREE,
  CONSTRAINT `punish_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `student` (`stu_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `punish_ibfk_2` FOREIGN KEY (`levels`) REFERENCES `punish_levels` (`punish_code`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of punish
-- ----------------------------
INSERT INTO `punish` VALUES ('1', '44201', '0', '2022-06-01 00:00:00.000000', 'T', NULL);
INSERT INTO `punish` VALUES ('2', '55101', '1', '2022-06-01 00:00:00.000000', 'T', NULL);

-- ----------------------------
-- Table structure for punish_levels
-- ----------------------------
DROP TABLE IF EXISTS `punish_levels`;
CREATE TABLE `punish_levels`  (
  `punish_code` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`punish_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of punish_levels
-- ----------------------------
INSERT INTO `punish_levels` VALUES ('0', '警告');
INSERT INTO `punish_levels` VALUES ('1', '严重警告');
INSERT INTO `punish_levels` VALUES ('2', '记过');
INSERT INTO `punish_levels` VALUES ('3', '记大过');
INSERT INTO `punish_levels` VALUES ('4', '开除');

-- ----------------------------
-- Table structure for reward
-- ----------------------------
DROP TABLE IF EXISTS `reward`;
CREATE TABLE `reward`  (
  `rec_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '记录号(主关键字)',
  `stu_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学号(外部关键字)',
  `levels` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '级别代码(外部关键字)',
  `rec_time` datetime(6) NULL DEFAULT NULL COMMENT '记录时间',
  `enable` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否生效(T、F)',
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`rec_id`) USING BTREE,
  INDEX `reward_ibfk_1`(`stu_id`) USING BTREE,
  INDEX `reward_ibfk_2`(`levels`) USING BTREE,
  CONSTRAINT `reward_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `student` (`stu_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `reward_ibfk_2` FOREIGN KEY (`levels`) REFERENCES `reward_levels` (`reward_code`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of reward
-- ----------------------------
INSERT INTO `reward` VALUES ('1', '11101', '0', '2022-05-13 00:00:00.000000', 'T', NULL);
INSERT INTO `reward` VALUES ('2', '33201', '6', '2022-05-13 00:00:00.000000', 'T', NULL);

-- ----------------------------
-- Table structure for reward_levels
-- ----------------------------
DROP TABLE IF EXISTS `reward_levels`;
CREATE TABLE `reward_levels`  (
  `reward_code` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`reward_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of reward_levels
-- ----------------------------
INSERT INTO `reward_levels` VALUES ('0', '校特等奖学金');
INSERT INTO `reward_levels` VALUES ('1', '校一等奖学金');
INSERT INTO `reward_levels` VALUES ('2', '校二等奖学金');
INSERT INTO `reward_levels` VALUES ('3', '校三等奖学金');
INSERT INTO `reward_levels` VALUES ('4', '系一等奖学金');
INSERT INTO `reward_levels` VALUES ('5', '系二等奖学金');
INSERT INTO `reward_levels` VALUES ('6', '系三等奖学金');

-- ----------------------------
-- Table structure for stu_change
-- ----------------------------
DROP TABLE IF EXISTS `stu_change`;
CREATE TABLE `stu_change`  (
  `rec_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '记录号(主关键字)',
  `stu_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学号(外部关键字)',
  `achange` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '变更代码(外部关键字)',
  `rec_time` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '记录时间',
  `desc` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`rec_id`) USING BTREE,
  INDEX `stu_id`(`stu_id`) USING BTREE,
  INDEX `change`(`achange`) USING BTREE,
  CONSTRAINT `stu_change_ibfk_1` FOREIGN KEY (`stu_id`) REFERENCES `student` (`stu_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `stu_change_ibfk_2` FOREIGN KEY (`achange`) REFERENCES `change_code` (`code`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of stu_change
-- ----------------------------
INSERT INTO `stu_change` VALUES ('1', '33201', '1', '2002-5-24', '');
INSERT INTO `stu_change` VALUES ('2', '55101', '3', '2002-7-9', '');
INSERT INTO `stu_change` VALUES ('3', '11101', '2', '2022-6-19', '');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `stu_id` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学号(主键)',
  `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  `sex` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性别',
  `class` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班级编号(外键)',
  `dept` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '系部编号(外键)',
  `birth` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生日',
  `home_place` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '籍贯',
  PRIMARY KEY (`stu_id`) USING BTREE,
  INDEX `student_ibfk_1`(`class`) USING BTREE,
  INDEX `student_ibfk_2`(`dept`) USING BTREE,
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`) REFERENCES `class` (`class_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `student_ibfk_2` FOREIGN KEY (`dept`) REFERENCES `dept` (`dept_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('11101', '鲁班', '男', '11', '1', '2001-1-14', '湖南衡阳');
INSERT INTO `student` VALUES ('33201', '王昭君', '女', '32', '3', '2001-1-3', '湖南长沙');
INSERT INTO `student` VALUES ('44201', '马超', '男', '42', '4', '2001-1-9', '湖南湘西');
INSERT INTO `student` VALUES ('55101', '花木兰', '女', '51', '5', '2005-2-2', '湖南怀化');
INSERT INTO `student` VALUES ('55102', '镜', '女', '51', '5', '2001-1-2', '湖北武汉');
INSERT INTO `student` VALUES ('55103', '凯', '男', '51', '5', '2001-5-9', '湖北武昌');
INSERT INTO `student` VALUES ('55104', '关羽', '男', '51', '5', '1000-5-9', '湖北襄阳');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('3da0b84a100c87800f4a19f305df23cd', 'e10adc3949ba59abbe56e057f20f883e');

SET FOREIGN_KEY_CHECKS = 1;

4.1数据库连接池和数据操作模块

package com.exception.demo.DB;

import java.sql.*;

public class DbProcess{
    Connection connection = null;
    ResultSet rs = null;
    Statement statement = null;
    //mysql数据库url

    String urlMySql ="jdbc:mysql://localhost:3306/mydb7?useSSL=false&serverTimezone=UTC";

    public DbProcess() {
        try {

            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("mysql数据库驱动加载成功");

        }
        catch(java.lang.ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    public void connect(){
        try{
            //mysql数据库
            connection = DriverManager.getConnection(urlMySql,"root","123456");

            //sqlserver数据库
            //connection = DriverManager.getConnection(urlSqlServer);

            if(connection!=null){
                System.out.println("数据库连接成功");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    public void disconnect(){
        try{
            if(connection != null){
                connection.close();
                connection = null;
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }


    public ResultSet executeQuery(String sql) {
        try {
            System.out.println("executeQuery(). sql = " + sql);

            PreparedStatement pstm = connection.prepareStatement(sql);
            // 执行查询
            rs = pstm.executeQuery();
        }
        catch(SQLException ex) {
            ex.printStackTrace();
        }
        return rs;
    }

    //插入
    //executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。
    //executeUpdate用于执行 INSERT、UPDATE 或 DELETE 语句
    //以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。

    //执行增、删、改语句的方法
    public int executeUpdate(String sql) {
        int count = 0;
        connect();
        try {
            Statement stmt = connection.createStatement();
            count = stmt.executeUpdate(sql);
        }
        catch(SQLException ex) {
            System.err.println(ex.getMessage());
        }
        disconnect();
        return count;
    }

}

4.2 MD5加密模块

package com.exception.demo.utils;

//import org.springframework.util.DigestUtils;
import java.security.MessageDigest;

public class MD5Util {
    /***
     * MD5加码 生成32位md5码
     */
    public static String getMD5Code(String message) {
            String md5Str = "";
            try {
                //创建MD5算法消息摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                //生成的哈希值的字节数组
                byte[] md5Bytes = md.digest(message.getBytes());
                md5Str = bytes2Hex(md5Bytes);
            }catch(Exception e) {
                e.printStackTrace();
            }
            return md5Str;
        }

        // 2进制转16进制
        public static String bytes2Hex(byte[] bytes) {
            StringBuffer result = new StringBuffer();
            int temp;
            try {
                for (int i = 0; i < bytes.length; i++) {
                    temp = bytes[i];
                    if(temp < 0) {
                        temp += 256;
                    }
                    if (temp < 16) {
                        result.append("0");
                    }
                    result.append(Integer.toHexString(temp));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result.toString();
        }
    /**
     * 加密解密算法 执行一次加密,两次解密
     */
    public static String convertMD5(String inStr) {

        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++) {
            a[i] = (char) (a[i] ^ 't');
        }
        String s = new String(a);
        return s;

    }

    // 测试主函数
//    public static void main(String args[]) {
//        String username = "易霭珞";
//        System.out.println("原始:" + username);
//        System.out.println("MD5后:" + getMD5Code(username));
//        System.out.println("加密的:" + convertMD5(username));
//        System.out.println("解密的:" + convertMD5(convertMD5(username)));
//        String passowrd = "123456";
//        System.out.println("原始:" + passowrd);
//        System.out.println("MD5后:" + getMD5Code(passowrd));
//        System.out.println("加密的:" + convertMD5(passowrd));
//        System.out.println("解密的:" + convertMD5(convertMD5(passowrd)));
//    }
}

4.3 登录模块

在这里插入图片描述

package com.exception.demo.view;
import javax.swing.*;
import java.awt.*;

public class Login extends JFrame {

    JLabel nameLabel = new JLabel("学生信息管理系统",JLabel.CENTER);
    SpringLayout springLayout = new SpringLayout();
    JPanel centerPanel = new JPanel(springLayout);
    JLabel userNameLabel = new JLabel("用户名");
    JTextField userText = new JTextField();
    JLabel powLabel = new JLabel("密码");
    JPasswordField powField = new JPasswordField();
    JButton loginBtn = new JButton("登录");
    JButton reseBtn = new JButton("取消");
    verify verify;
    public Login(){
        super("管理员登录页");
       verify = new verify(this);
        Container contentPane = getContentPane();

        nameLabel.setFont(new Font("黑体",Font.PLAIN,40));
        nameLabel.setPreferredSize(new Dimension(0,80));
        Font centerFont = new Font("楷体",Font.PLAIN,20);
        userNameLabel.setFont(centerFont);
        userText.setPreferredSize(new Dimension(200,30));
        powLabel.setFont(centerFont);
        powField.setPreferredSize(new Dimension(200,30));
        loginBtn.setFont(centerFont);
        reseBtn.setFont(centerFont);
        centerPanel.add(userNameLabel);
        centerPanel.add(userText);
        centerPanel.add(powLabel);
        centerPanel.add(powField);
        loginBtn.addActionListener(verify);
        centerPanel.add(loginBtn);
        reseBtn.addActionListener(verify);
        centerPanel.add(reseBtn);
        layoutCenter();

        contentPane.add(nameLabel,BorderLayout.NORTH);
        contentPane.add(centerPanel,BorderLayout.CENTER);

        setSize(600,400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    private void layoutCenter() {
        //弹簧布局
        Spring childWidth = Spring.sum(Spring.sum(Spring.width(userNameLabel),Spring.width(userText)),Spring.constant(20));
        int offsetX = childWidth.getValue()/2;
        springLayout.putConstraint(SpringLayout.WEST,userNameLabel,-offsetX,SpringLayout.HORIZONTAL_CENTER,centerPanel);
        springLayout.putConstraint(SpringLayout.NORTH,userNameLabel,20,SpringLayout.NORTH,centerPanel);
        //userText
        springLayout.putConstraint(SpringLayout.WEST,userText,20,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,userText,0,SpringLayout.NORTH,userNameLabel);

        //powLabel
        springLayout.putConstraint(SpringLayout.EAST,powLabel,0,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,powLabel,20,SpringLayout.SOUTH,userNameLabel);
        //powFiled
        springLayout.putConstraint(SpringLayout.WEST,powField,20,SpringLayout.EAST,powLabel);
        springLayout.putConstraint(SpringLayout.NORTH,powField,0,SpringLayout.NORTH,powLabel);
        //loginBtn
        springLayout.putConstraint(SpringLayout.WEST,loginBtn,50,SpringLayout.WEST,powLabel);
        springLayout.putConstraint(SpringLayout.NORTH,loginBtn,20,SpringLayout.SOUTH,powLabel);
        //reseBtn
        springLayout.putConstraint(SpringLayout.WEST,reseBtn,50,SpringLayout.EAST,loginBtn);
        springLayout.putConstraint(SpringLayout.NORTH,reseBtn,0,SpringLayout.NORTH,loginBtn);
    }
    public JTextField getUserText() {
        return userText;
    }
    public JPasswordField getPowField() {
        return powField;
    }
}

4.4 验证模块

package com.exception.demo.view;

import com.exception.demo.DB.DbProcess;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import static com.exception.demo.utils.MD5Util.getMD5Code;

public class verify implements ActionListener {
        private Login login;
        public verify(Login login){
            this.login = login;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton jButton = (JButton)e.getSource();
            String text = jButton.getText();
            if("重置".equals(text))
            {
                login.getUserText().setText("");
                login.getPowField().setText("");
            }
            else if("登录".equals(text))
            {
                String user = login.getUserText().getText();//输入框
                char[] chars = login.getPowField().getPassword();
                String pwd = new String(chars);//输入框
                String username = queryProcess().subList(0,1).toString();//数据库
                String password = queryProcess().subList(1,2).toString();//数据库
                String userName = username.substring(1,username.length()-1);
                String passWord = password.substring(1,password.length()-1);
                if(getMD5Code(user).equals(userName)&&getMD5Code(pwd).equals(passWord)){
                    JOptionPane.showMessageDialog(null,"欢迎管理员进入系统!");
                    new MyDesign();
                    login.dispose();
                }else if(!getMD5Code(user).equals(userName)){
                    JOptionPane.showMessageDialog(null,"用户不存在!!!");
                }
                else if(!getMD5Code(pwd).equals(passWord)){
                    JOptionPane.showMessageDialog(null,"密码错误!!!");
                }
            }
        }
    public ArrayList queryProcess() {
        ArrayList<String> list1 = new ArrayList<String>();
        try {
            // 建立查询条件
            String sql = "select * from user;";

            System.out.println("queryProcess(). sql = " + sql);
            DbProcess dbProcess = new DbProcess();
            dbProcess.connect();
            ResultSet rs = dbProcess.executeQuery(sql);
            // 将查询获得的记录数据,转换成适合生成JTable的数据形式
            while (rs.next()) {
                list1.add(rs.getString("username"));
                list1.add(rs.getString("password"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list1;
    }

    }

4.5 学生个人信息输入模块

4.6学籍变更情况输入

4.7 奖励情况输入

4.8 处罚情况输入

4.9 学生个人情况查询和修改

5.0 后序

由于4.5-4.9模块实现的代码篇幅过长,需要完整代码请点赞,并评论区留言

  • 144
    点赞
  • 401
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 97
    评论
数据库课程设计——健康档案管理系统 数据库 课程设计报告 课 题: 健康档案管理系统 目 录 课程设计的目的和意义…………………………………2 课程设计的目的 …………………………………………2 课程设计的意义 …………………………………………2 需求分析…………………………………………………3 2.1、数据流图……………………………………………………4 2.2、数据字典……………………………………………………7 三、概要结构设计……………………………………………10 四、逻辑结构设计……………………………………………13 五、物理结构设计……………………………………………13 总结 …………………………………………………………15 数据库课程设计——健康档案管理系统全文共35页,当前为第1页。参考文献 ……………………………………………………16 一、课程设计的目的和意义 数据库课程设计——健康档案管理系统全文共35页,当前为第1页。 1.1、课程设计的目的 数据库课程设计数据库原理及应用实践环节极为重要的一部分,其目的主要是为了加强学生对数据库基本概念、原理和技术的掌握,结合实际的操作和设计,巩固课堂教学内容,将理论与实际相结合,强化学生的实践意识,从而提高学生的实际动手能力和创新能力。通过课程设计,可以培养学生分析问题、解决问题以及自学能力,提高和加强学生的计算机应用与软件开发能力,使学生熟练掌握数据库设计工具的使用,提高从事数据库系统建设和管理工作的基本技能和能力。 课程设计的意义 课程设计是学完基础知识后必须进行的一个实践环节。进行课程设计: 有利于基础知识的理解,学生可以掌握一些信息时代生存与发展必需的信息技术基础知识和基本技能,具备了在日常生活与学习中应用信息技术解决问题的基本态度与基本能力; 有利于逻辑思维的锻炼 ,在许多常规学科的日常教学中,我们不难发现这样一个现象,不少学生的思维常常处于混乱的状态。写起文来前言不搭后语,解题步骤混乱,这些都是缺乏思维训练的结果。程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养; 有利于与其他学科的整合 ,在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。在信息技术课中整合其它学科的知识,发挥信息技术的优势; 数据库课程设计——健康档案管理系统全文共35页,当前为第2页。有利于治学态度的培养, 程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不能通过,程序无法正常运行。程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。这当中就能培养严谨治学、不怕失败、百折不挠的科学精神和态度。 数据库课程设计——健康档案管理系统全文共35页,当前为第2页。 二、 需求分析 任务:设计一个健康档案管理系统 1、功能要求: 该系统的健康文件包括病历文件和体检文件。 登记 将学生的健康信息插入健康文件; 修改 修改一个学生的健康档案记录; 删除 删除学生的健康档案记录; 查询 可以组合各种条件进行查询,显示学生健康信息并打印健康文件报表; 统计 对学生的基本健康状况进行各种必要的统计和分析,由一般统计和动态分析两种。一般统计包括计数和求平均值;动态分析由健康历史求出平均年增长值和年增长率。 2、数据要求: 体检文件:学号、姓名、性别、系别、年龄、身高、体重、胸围、日期 病历文件:学号、姓名、性别、系别、 诊断、日期 数据库课程设计——健康档案管理系统全文共35页,当前为第3页。在这次的课程设计中,用户要求我们对该系统的健康文件实现学生信息登记、修改、删除、查询、统计等操作,其中健康文件还包含病历文件和体检文件。在病历文件中的数据要求有学号、姓名、性别、系别、 诊断、日期,而体检文件中的数据要求有学号、姓名、性别、系别、年龄、身高、体重、胸围、日期。而为了使这个健康档案管理系统的设计能够更加接近现实生活,并充分考虑到今后可能的扩充和改变,我们在里面加了一些相应的东西,比如我们将病历文件和体检文件都看成是很多学生的分类,每个学生都有一份相应的病历文件和体检文件,文件中是他们不同时期的病历表和体检表,而病历表的属性不止包括学号、姓名、性别、系别、 诊断、日期,还有医疗记录和是否住院等,体检表中又包含体检项目,而身高、体重、胸围等均包含在项目名称中。 数据库课程设计——健康档案管理系统全
功能简介: 1.根据题目的描述,既然这个系统有教师和学生的管理,那这个系统不仅是毕业设计管理系统,而是有教师和学生的信息查询维护的教务管理系统的一部分。 本系统是一个专门用于毕业设计管理的系统,每个准备毕业设计的学生和每个指导老师都拥有一个账号。该系统的账号可能是从教务管理系统导入进来的。 2.鉴于审批需要,该系统共有四种角色,分别为教师、学生、系主任、管理员。不同的用户登录到这个系统中要有不同的界面,不同的功能。 3.学生界面内有“选题”功能,在选择题目并经导师和系主任批准后,将开题并可以在“上传进度”中实时查看自己的进度,随时补充最新进展。 4.系统管理员具有增删用户和决定用户权限的功能,但系统管理员不能涉及选题与审核环节,要修改选题与审核等环节的内容,需要管理员为自己创建具有系主任权限的教师账号。 5.没有系主任权限的教师只能指导学生和开题,不能进入系主任审批界面。而具有系主任权限的教师可以进入系主任审批界面,也可以指导学生和开题。(值得一提的是,系主任可以审批自己指导的学生进行的毕业设计。) 逻辑结构设计:(加粗表示主键) 用户表(统一ID,密码,用户类别) 学生表(统一ID,姓名,性别,专业,班级,电话,邮箱,备注) 教师表(统一ID,姓名,性别,职称,方向,电话,邮箱,是否系主任) 题目表(题目编号,题目名称,题目专业,命题导师,内容简介) 选题表(题目编号,学生ID,教师ID,毕设进程) 开发所用技术与环境: 架构:native 语言:C++ 数据库:sqlite 3.31.1 使用的库:EasyX_20200520(beta) 开发系统:Windows 10.0 Build 18362 开发工具:Visual Studio 2017 Community 支持的系统:Windows 7/10 AnyCPU(指能跑Windows的) 需要说明的内容: 需要说明,本次管理系统对学生的毕设进程进行了简化 分为0,1,2,3,4,5共计6个阶段 其中,系主任开题审批只针对0阶段 教师的审核(中期检查和导师意见)仅针对1,2阶段 系主任的审批(系主任审批和毕业答辩)仅针对3,4阶段 第5阶段为顺利毕业。 安全性考虑: 在登陆过程中对于是否为管理员采用的是预先与储存好的匹配而不是直接进行查询语句,避免了在用户登录过程中被SQL注入的风险,如admin'#这样的常见SQL注入点被避免。 而诸如''or 1=1#或username' AND 1=1—hack这样的注入方式,或者更为恶劣的username;DROP TABLE user—hack的攻击,采用对请求的字符串预处理的形式,过滤其中可提供多语句执行的;和=两个常见字符,在尽可能减少对用户自由性损失的同时,防范SQL注入的攻击。 非常遗憾因为时间关系,密码没能采用加盐后HASH,然后将HASH后数据进行比对的较为安全的方式进行处理,而是直接将明文送入查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 97
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易霭珞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值