基于【C/S模式】、【MySQL数据库】以及【GUI图形用户界面】实现学生成绩管理系统

目录

阅读建议:

摘  要

1 需求分析

2 概要设计

2.1 设计概述

2.2 模块划分

2.2.1 用户界面模块

2.2.2 服务器模块

2.2.3 数据库模块

2.2.4 通信模块

2.3 主要的类

2.3.1 客户端类 (Client)

2.3.2 服务端类 (Server)

2.3.3 数据库连接类 (DatabaseConnection)

2.3.4 图形用户界面类 (GUI)

2.3.5 多线程管理类 (MultiThreadManager)

2.3.6 通信模块类 (CommunicationModule)

3 详细设计

3.1 类定义的细节描述

3.1.1 Server类(服务端)

3.1.2 StudentGradesDatabase(数据库)

3.1.3 Client(客户端)

3.2 算法流程

3.2.1 查询成绩功能

3.2.2 添加修改功能

4 调试分析

4.1 客户端只能进行一次操作

4.2 GUI 图形界面布局

4.3 服务端如何区分客户端发来的不同请求

5 程序代码

5.1 服务端关键代码

5.1.1 Server.java

5.1.2 StudentGradesDatabase.java

5.2 客户端关键代码

5.2.1 Client.java

6 测试结果(截屏)

7 总结

7.1 程序的不足

7.2 心得体会

参考文献


阅读建议:

1.实验的软硬件环境要求:

(1)硬件环境要求:PC机
(2)软件环境要求:Windows 环境下的 lntelliJ IDEA

2.该实验采用了MySQL数据库存储学生成绩信息,因此还需要搭建对应的数据库才可以使用。


摘  要

        本应用基于C/S模式,通过网络管理服务器端存储的学生成绩。提供图形用户界面(GUI)以便直观操作,用户可通过菜单选择功能。采用Java TCP Socket技术实现多客户端与服务器端的交互,多线程处理支持多个客户端同时操作。学生成绩数据存储在MySQL数据库中。主要功能包括:初始输入学生信息和成绩、新增学生记录、修改学生成绩、按姓名或学号查询学生成绩及平均分,以及查询所有学生的各科平均分、最高分和最低分,最后能输出完整的学生成绩表。

        关键词:C/S模式;图形用户界面(GUI);MySQL数据库;学生成绩


1 需求分析

        用户的需求有学生成绩的查询、更新、添加。通过系统功能分析,针对学生成绩管理系统,应有如下功能需求:

        1.按照学号或者姓名查询该生所有的成绩;

        2.能够输出各科的平均分、最高分、最低分,以及所有学生的成绩表;

        3.可以添加新的学生,可以修改某学生的各科成绩。


2 概要设计

2.1 设计概述

        本课程设计旨在实现一个基于C/S模式的学生成绩管理系统,如图2.1 学生成绩管理系统概述图。该系统将使用MySQL数据库来存储和访问学生成绩信息,通过服务端进行管理。客户端将提供图形用户界面(GUI),允许用户通过多线程技术同时操作多个客户端。服务端将使用多线程技术处理并发连接,并提供用户权限控制和错误处理机制。客户端和服务器之间的通信将通过Socket实现。整体设计将注重代码的可读性、可维护性和可扩展性,以确保系统的稳定性和长期使用。

图2.1 学生成绩管理系统概述图

2.2 模块划分

2.2.1 用户界面模块

        负责提供图形用户界面,包括输入框、按钮等控件,供用户进行操作和交互,同时将用户的请求发送给服务器模块进行处理。

2.2.2 服务器模块

        接收到用户请求后,会根据请求类型和内容与数据库模块进行交互,获取或更新学生成绩信息。然后将处理结果返回给通信模块,再由通信模块通过Socket将结果发送给客户端。

2.2.3 数据库模块

        负责存储和管理学生成绩信息,包括学生的基本信息、各门课程的成绩和平均分等。

2.2.4 通信模块

        负责在客户端和服务端之间建立Socket连接,实现数据传输和通信,其功能实现如图2.2。

图2.2 模块划分图

2.3 主要的类

2.3.1 客户端类 (Client)

        属性:客户端地址、端口号、连接管理等

        方法:连接服务器、发送请求、接收结果等

2.3.2 服务端类 (Server)

        属性:服务器地址、端口号、连接管理等

        方法:接收客户端连接、处理客户端请求、返回结果等

2.3.3 数据库连接类 (DatabaseConnection)

        属性:数据库连接信息(如主机名、用户名、密码等)

        方法:连接数据库、执行查询或更新操作等

2.3.4 图形用户界面类 (GUI)

        属性:界面元素(如按钮、文本框等)

        方法:处理用户界面事件(如点击按钮、输入文本等)

2.3.5 多线程管理类 (MultiThreadManager)

        属性:线程池、任务队列等

        方法:创建新线程、管理线程池、任务调度等

2.3.6 通信模块类 (CommunicationModule)

        属性:Socket连接信息(如IP地址、端口号等)

        方法:建立Socket连接、发送数据、接收数据等


3 详细设计

3.1 类定义的细节描述

3.1.1 Server类(服务端)

        public class Server {

            public static void main(String[] args) throws IOException {

                ServerSocket serverSocket=new ServerSocket(4852);

                Socket socket=null;

                while(true){

                    new ServerThread(serverSocket.accept()).start();

                }

            }

        }

1.属性:

   (1)serverSocket:这是一个ServerSocket对象,用于监听客户端的连接请求。

   (2)socket:这是一个Socket对象,代表与客户端的连接。

2.方法:

   (1)main(String[] args): 这是程序的入口点,用于启动服务器。该方法接受一个字符串数组作为参数,并抛出IOException异常。

   (2)ServerSocket(int port): 这是一个构造函数,用于创建一个新的ServerSocket对象,监听指定的端口。

   (3)accept(): 该方法用于接受来自客户端的连接请求,并返回一个Socket对象,代表与客户端的连接。

   (4)start(): 该方法用于启动一个新的ServerThread线程,处理与客户端的连接。

3.异常处理:

        IOException异常可能会在创建ServerSocket对象或接受连接请求时抛出。在这种情况下,程序需要捕获和处理这个异常,以防止程序崩溃或数据丢失。

3.1.2 StudentGradesDatabase(数据库)

        public class StudentGradesDatabase {

            public static void main(String[] args) {

                String url = "jdbc:mysql://localhost:3306/StudentGrades?        serverTimezone=GMT%2B8&useSSL=False";

                String username = "root";

                String password = "CX1994cl2004all@";

                try {

                    Class.forName("com.mysql.cj.jdbc.Driver");

                    Connection conn = DriverManager.getConnection(url, username, password);

                    Statement stmt = conn.createStatement();

                    String selectSQL = "SELECT * FROM StudentsTable";

                    ResultSet rs = stmt.executeQuery(selectSQL);

                    rs.close();

                    stmt.close();

                    conn.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }

1.属性:

   (1)程序首先加载MySQL的JDBC驱动,然后使用这些连接信息建立到数据库(如表3.1)的连接。

   (2)连接建立后,程序创建一个Statement对象并执行一个SQL查询,以从“StudentsTable”表(如表3.2)中检索所有学生的信息。

2.方法:

   (1)printStudentInfoByIDAsString ()

   (2)printStudentInfoByNameAsString ()

   (3)printAverageGradesAsString ()

   (4)printMaxGradesAsString ()

   (5)printMinGradesAsString ()

   (6)printAllStudentInfoAsString ()

   (7)addStudentInfo ()

   (8)updateStudentInfo ()

Field

Type

Null

Key

Default

Extra

学号

int

NO

PRI

NULL

姓名

varchar(10)

YES

NULL

语文成绩

int

YES

NULL

数学成绩

int

YES

NULL

英语成绩

int

YES

NULL

表3.1 数据库结构

学号

姓名

语文成绩

数学成绩

英语成绩

1

张三

75

85

84

2

李四

85

68

65

3

王五

96

76

74

表3.2 表格内容

3.1.3 Client(客户端)

1.成员变量:

   (1)Socket、DataInputStream 和 DataOutputStream:这些是用于与服务器进行通信的输入输出流。它们被初始化为连接到本地主机(localhost)的特定端口(4852)的Socket连接。

   (2)JFrame、JPanel 和 JLabel 等 GUI 组件:这些是Java Swing库中的组件,用于构建图形用户界面。它们被初始化为各种标签、文本框和按钮等,用于显示信息和接收用户输入。

2.构造函数:

        首先创建了与服务器进行通信的Socket连接和输入输出流。然后,创建了GUI的基本框架和一些基本组件。

3.2 算法流程

3.2.1 查询成绩功能

图3.1 查询成绩功能流程图

3.2.2 添加修改功能

图3.2 添加修改功能流程图


4 调试分析

4.1 客户端只能进行一次操作

        问题:java.net.SocketException: 你的主机中的软件中止了一个已建立的连接。

        分析解决:通过试错改进,为了建立长连接(即客户端和服务器之间的连接不会在每次通信后关闭,而是会一直保持打开状态,以便于后续的持续访问),在服务端使用了 While 循环,可以保持与服务器的连接并处理来自客户端的请求,从而解决了这个问题。

4.2 GUI 图形界面布局

        问题:使用GridLayout(网格布局)后,虽然简单易操作,但没有办法自动调整像素大小,导致每个组件大小一模一样。这样的图形界面很丑且不适宜。

        分析解决:根据自己的想法,如图4.1所示,我采用了BorderLayout(边界布局),这个可以将组件添加到容器的各个区域,例如NORTH、SOUTH、EAST、WEST和CENTER。

图4.1 手工绘制GUI界面

        但是每一块区域的具体布局还是有问题,在这样的情况下,我找到了GridBagLayout(网袋布局),这是一个灵活的布局管理器,可以指定组件的位置、大小和填充方式等。通过具体数值的设置便完成了整个GUI界面的设计。

4.3 服务端如何区分客户端发来的不同请求

        问题:由于GUI图形化界面是自学内容,在准备编写按钮监听代码时突然想到服务端该怎么区分客户端的请求,一下子却没有办法。

        分析解决:如何区分?就能联想到“唯一标识”,那么在C/S模式中又该怎样设置?在GUI界面中的按钮组件又该怎样设置?之后我开始阅读之前写过的C/S模式的代码(如图4.2),在接收到客户端的数据后,通过之前预定的间隔方式将其分割,然后第一个单元就是判断请求类型的数据。

图4.2 C/S模式服务端代码片段

        同理,在发送数据时添加一个“唯一标识符”即可在服务端进行判断执行。


5 程序代码

5.1 服务端关键代码

5.1.1 Server.java

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket=new ServerSocket(4852);

        Socket socket=null;

        while(true){

            new ServerThread(serverSocket.accept()).start();

        }

    }

}



class ServerThread extends Thread{

    Socket socket;

    ServerThread(Socket socket){

        this.socket=socket;

    }

    public void run(){

        try{

            // getInputStream 从Socket中获取输入流,以便读取从客户端发送来的数据

            // 基本数据类型

            DataInputStream dis=new DataInputStream(socket.getInputStream());

            DataOutputStream dos=new DataOutputStream(socket.getOutputStream());



            while (true){

                String url = "jdbc:mysql://localhost:3306/StudentGrades?serverTimezone=GMT%2B8&useSSL=False";

                String username = "root";

                String password = "CX1994cl2004all@";



                String value=dis.readUTF();

                String[] parts=value.split(" ");

                String type=parts[0];  // 标识码

                String param1=parts[1];  // 参数

                String param2=parts[2];

                int param3= Integer.parseInt(parts[3]);

                int param4= Integer.parseInt(parts[4]);

                int param5= Integer.parseInt(parts[5]);

                // 按学号查询某学生的各门课成绩、平均成绩

                if(type.equals("1")){

                    try (Connection conn = DriverManager.getConnection(url, username, password)) {

                        dos.writeUTF(StudentGradesDatabase.printStudentInfoByIDAsString(conn, param1));

                    } catch (SQLException e) {

                        throw new RuntimeException(e);

                    }

                } catch(IOException e){}

    }

}

5.1.2 StudentGradesDatabase.java

public class StudentGradesDatabase {

    public static void main(String[] args) {

        String url = "jdbc:mysql://localhost:3306/StudentGrades?serverTimezone=GMT%2B8&useSSL=False";

        String username = "root";

        String password = "CX1994cl2004all@";



        try {

            Class.forName("com.mysql.cj.jdbc.Driver");



            Connection conn = DriverManager.getConnection(url, username, password);



            Statement stmt = conn.createStatement();



            String selectSQL = "SELECT * FROM StudentsTable";

            ResultSet rs = stmt.executeQuery(selectSQL);



            rs.close();

            stmt.close();

            conn.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static String printStudentInfoByIDAsString(Connection conn, String studentID) throws SQLException {

        String sql = "SELECT * FROM StudentsTable WHERE 学号 = ?";

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setString(1, studentID);

        ResultSet rs = stmt.executeQuery();



        if (rs.next()) {

            int chinese = rs.getInt("语文成绩");

            int math = rs.getInt("数学成绩");

            int english = rs.getInt("英语成绩");

            double average = (chinese + math + english) / 3.0;

            DecimalFormat decimalFormat = new DecimalFormat("#.##");

            String formattedAverage = decimalFormat.format(average);

            String studentInfo = "学号: " + rs.getString("学号") + ", 姓名: " + rs.getString("姓名") + ", 语文: " + rs.getInt("语文成绩") + ", 数学: " + rs.getInt("数学成绩") + ", 英语: " + rs.getInt("英语成绩") +", 平均成绩: " + formattedAverage;

            rs.close();

            stmt.close();

            return studentInfo;

        } else {

            rs.close();

            stmt.close();

            return "没有找到该学生的信息";

        }

    }

}

5.2 客户端关键代码

5.2.1 Client.java

public class Client {

    // C/S模式

    private Socket socket;

    private DataInputStream dis;

    private DataOutputStream dos;



    // GUI组件

    private JFrame frame;

    private JPanel panelHead, panelLeft, panelRight,panelCenter;

    private JLabel labelTitle,labelBody,labelSearchId,labelSearchName,labelName,labelId,labelChinese,labelMath,labelEnglish ;

    private JTextField inputFieldSearchId, inputFieldSearchName, inputFieldName, inputFieldId,inputFieldChinese,inputFieldMath,inputFieldEnglish;

    private JButton buttonSearchId, buttonSearchName, buttonAver, buttonMax, buttonMin, buttonAll,buttonAdd,buttonRevise;



    public Client() throws IOException {

        // 初始化C/S

        socket = new Socket("localhost", 4852);

        dis = new DataInputStream(socket.getInputStream());

        dos = new DataOutputStream(socket.getOutputStream());



        // 初始化GUI

        frame = new JFrame("超级管理员");

        frame.setSize(800, 500);

        frame.setLocationRelativeTo(null);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//        frame.pack();

        frame.setVisible(true);



        GridBagConstraints constraints = new GridBagConstraints();



        labelTitle = new JLabel("欢迎使用学生成绩管理系统");

        labelTitle.setFont(new Font("楷体", Font.BOLD, 24));

        labelTitle.setHorizontalAlignment(JLabel.CENTER);

        panelHead = new JPanel(new GridBagLayout());

        panelHead.setPreferredSize(new Dimension(800, 100));

        constraints.gridx = 0;

        constraints.gridy = 0;

        constraints.anchor = GridBagConstraints.CENTER;

        panelHead.add(labelTitle,constraints);

        frame.getContentPane().add(BorderLayout.NORTH, panelHead);

}

buttonSearchId.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                // 处理按学号查询的逻辑

                // 获取输入的学号

                String Id = inputFieldSearchId.getText();

                // 检查输入是否为空

                if (Id == null || Id.trim().isEmpty()) {

                    JOptionPane.showMessageDialog(frame, "请输入有效的学号!");

                    return;

                }

                try {

                    // 发送学号到服务器进行查询

                    sendNumberToServer("1 "+Id+" 0 0 0 0");

                    // 从服务器获取查询结果

                    DataInputStream dataInputStream = getDataInputStream();

                    String result = dataInputStream.readUTF();

                    // 显示查询结果

                    labelBody.setText(result);

                } catch (IOException ex) {

                    JOptionPane.showMessageDialog(frame, "查询失败,请检查网络连接或服务器状态!");

                    ex.printStackTrace();

                }

            }

        });

public void sendNumberToServer(String text) throws IOException {

        dos.writeUTF(text);

        dos.flush();

    }



    public DataInputStream getDataInputStream() {

        return dis;

    }



    public void closeResources() throws IOException {

        if (dis != null) {

            dis.close();

        }

        if (dos != null) {

            dos.close();

        }

        if (socket != null) {

            socket.close();

        }

    }

}


6 测试结果(截屏)

图6.1 测试结果截屏


7 总结

7.1 程序的不足

        1.GUI界面还不够美观,目前只是对基本操作的组件进行了布局,这样的界面没有潜力,即很难继续扩充其他的操作。

        2.通过C/S模式发送数据时还不够安全,即数据的安全性还不足。

        3.客户端与服务端之间的数据传输过于简单,且不够严谨。一旦传输的数据发生了改变,该程序将直接崩溃。同时,数据的处理也不够好,比如要在GUI界面输出所有同学的成绩表,应该打印一个表格,但我的显示方式是逐条输出。

7.2 心得体会

        通过此次的课程设计,我深刻体会到了在开发过程中不断学习和实践的重要性。在Java GUI编程中,布局管理器是关键的一部分,它们决定了界面的外观和组件的布局方式。使用GridLayout时,我发现了它无法自动调整组件大小的问题,这使我开始寻找其他更合适的布局管理器。最终,我选择了GridBagLayout,它更加灵活,可以指定组件的位置、大小和填充方式,从而创建出更美观的界面。

        同时,我也明白了在C/S模式中,服务端需要区分来自不同客户端的请求。通过在发送和接收数据时添加“唯一标识符”,服务端可以根据标识符来识别请求的类型并执行相应的操作。这个过程中,我意识到了预先规划好数据格式和约定的重要性,它能帮助我们在开发过程中避免混淆和错误。

        总的来说,这个项目让我更深入地理解了Java GUI编程和C/S模式的实现方式。我不仅学到了如何使用不同的布局管理器来设计界面,还掌握了如何在服务端处理来自不同客户端的请求。这个过程中,我遇到了许多困难和挑战,但通过不断学习和实践,我成功解决了这些问题,并获得了宝贵的经验。


参考文献

[1] 张思民.Java语言程序设计(第3版)[M] .北京:清华大学出版社,2015年12月.

[2] [美]Bruce Eckel.Java编程思想第四版[M] .北京:机械工业出版社,2010年2月.

[3] 郎波.Java语言程序设计(第3版)[M].北京:清华大学出版社,2016年8月.

[4] 关东升.Java从小白到大牛(第4版)[M].北京:清华大学出版社,2021年03月.

[5] 黑马程序员.Java基础入门[M].北京:清华大学出版社,2018年12月.

[6] 孙卫琴.Java面向对象编程(第2版).北京:电子工业出版社,2017年1月.


        完整代码链接:https://download.csdn.net/download/weixin_73286497/88757267

        希望大家可以在该篇课程设计中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!

  • 67
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
学生成绩管理系统数据库设计 [提要] 一个好的数据库,不但可以提高数据查询效率,而且还可以保证数据的完整性和一致性 。所以,数据库在信息管理系统中有着非常重要的作用。本文介绍如何使用SQL Server 2005完成学生成绩管理系统数据库设计。 关键词:SQL Server;成绩管理系统数据库设计 引入 因为各高校学生人数的增多以及学生成绩管理工作的复杂性,人工管理学生成绩信息 的效率越来越低。这种情况下,学生成绩管理系统就出现了。 一、需求分析 需求分析是整个数据库设计中重要的一步,在这个阶段要充分地与用户沟通交流,了 解与分析用户的需求。学生信息管理系统中涉及的主要人员有学生、教师、管理人员; 主要的部门有教务处、系部。在需求分析时可以通过问卷调查、谈话等方式,了解用户 的需求,最终绘制系统的数据流程图。 二、数据库表 关系数据库中所有的数据都存储在关系表中,通过需求分析,我们可以在学生成绩管 理系统中创建以下数据表(此处只列举主要的数据表)。(表1、表2、表3、表4、表5) 三、索引 索引是提高查询的主要方法,在图书管理系统中,因为图书数量的庞大,所以建立索 引是必不可少的。在为表中的主键建立索引以后,系统会自动地在主键上创建聚集索引 。除此之外,我们还可以为一些经常查询的字段上,创建非聚集索引。 索引创建以后会提高查询效率,但也会引起一些问题,如降低数据更新的速度、索引 建后需要维护。所以,在创建索引时,要综合考虑其优缺点。可以参考以下原则为表中 的列创建查询:(1)经常用于查询的列;(2)经常用于分组和排序的列;(3)在连接 中常用到的列。 按照以上原则,我们可以为以下列创建索引:Stu_Id、Stu_Name、Tea_Id、Tea_Nam e、speciality_Id、class_Id等。 四、存储过程 存储过程是T- SQL语句的集合,能够实现特定的功能。使用存储过程,可以大大减少网络传输流量,提 高应用程序性能,而且由于它只在第一次执行时被优化、编译。因此使用存储过程不仅 可以极大地降低应用程序的实现难度,而且还可以极大地提高系统的运行速度、效率。 SQL Server 2005中存储过程分为:系统存储过程、用户自定义存储过程、扩展存储过程三种。例如 :在该系统中,我们可以创建存储过程实现按照学生姓名查询成绩实现代码如下: CREATE PROCEDURE grade_by_name @name char(10) AS BEGIN SELECT*FROM grade WHERE Stu_Id=(SELECT Stu_Id FROM STUDENT WHERE Stu_Name=@name) END 五、触发器 触发器是在执行操作语句时自动执行的一种存储过程。触发器可以侦测到数据库内数 据的操作,并自动地级联影响到整个数据库的操作,从而保证数据库数据的完整性和一 致性。例如:在某一个学生退学删除学生基本信息以后,那么该学生相应的成绩信息也 应该被删除。可以以下代码完成该功能: CREATE TRIGGER STUDENT_DELETE ON Student FOR Delete As BEGIN Delete from grade Where stu_id=(Select stu_id from deleted) END 主要参考文献: [1]黄存东.数据库原理及应用.中国水利水电出版社,2011.1. [2](美)Peter Rob,Carlos Coronel.张瑜,张继萍等译.数据库系统设计、实现管理.清华大学出版社,2005. ----------------------- 学生成绩管理系统数据库设计全文共3页,当前为第1页。 学生成绩管理系统数据库设计全文共3页,当前为第2页。 学生成绩管理系统数据库设计全文共3页,当前为第3页。
学生成绩管理系统 1 问题描述 1.1 背景 1)某大学有学生若干万名,每个学生每学期必须学习若干门课程。 2)每个学生有学号、姓名、性别、班级、出生日期等基本信息。 3)每门课程有课程号,课程名称、任课教师、学分等信息。 4)学校需要对每个学生的基本信息、所学课程、成绩进行统一管理,以便于对信息进行 查询、浏览和修改。 1.2 数据需求 学生成绩管理系统主要用于学生成绩信息管理,据分析学生成绩管理系统的数据表可浓 缩为:学生基本信息表、课程基本信息表和学生成绩信息表。根据学校的情况,可按下 面的步骤来分析: 1) 确定学生所在的院系、所学的专业以及所在的班级。 2) 确定学生所在班级的课程以及该课程学生成绩;另外还需要知道学生所在班级、学 号和学期。 3) 分析学生的基本信息,如姓名、性别、出生年月、家庭住址、联系电话。 4) 用户信息分析,通常包括用户名和密码。 2 解决方案 ( 或数据库系统设计 ) 2.1 E-R 模型设计 根据E—R图,将其转化为如下数据实体,数据库学生成绩管理系统.dbc,包括如下的表 和视图: 1) 学生登记表——学生表.dbf。 字段名称 字段类型 字段宽度 xh 字符型 10 xm 字符型 6 xb 字符型 2 csrq 日期型 8 bj 字符型 4 2) 课程登记表——课程表.dbf。 字段名称 字段类型 字段宽度 kch 字符型 2 kcm 字符型 10 js 字符型 10 xf 字符型 10 3) 成绩登记表——成绩表.dbf 字段名称 字段类型 字段宽度 xh 字符型 10 kch 字符型 2 cj 数值型 3 4) 借书视图(lyxview)。 为了进行浏览总表的需要,需要设计了一个总表浏览视图,该视图从学生表.dbf等 3个表中提取了10个字段的数据: 学生表.xh 学生表.xm 学生表.xb 学生表.csrq 学生表.bj 课程表.kch 课程表.kcm 课程表.js 课程表.xf 成绩表.cj 其视图关系可由以下SQL语句定义: SELECT 学生表.*, 课程表.*, 成绩表.cj; FROM 学生成绩管理系统!学生表, 学生成绩管理系统!课程表,; 学生成绩管理系统!成绩表; WHERE 学生表.xh = 成绩表.xh; AND 课程表.kch = 成绩表.kch 所建数据库如下图所示: 2.2 数据表 本系统需要使用的数据如下: 3 系统实现 3.1 开发环境 本系统由SQL语言编写,在Visual Foxpro 6.0软件环境下可以正常运行 3.2 系统流程图 系统流程图模块主要由刘龙洋同学设计,而系统的功能设计主要由李江滨同学完成, 我主要负责程序主要功能界面的设计,下面是部分流程图: 、 3.3 程序主要功能界面 1、登录界面的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"登录"; 第三步:添加lable1,并设置其caption属性为"欢迎使用学生成绩管理系统!"; 第四步:添加lable2和text1并设置相关属性; 第五步:添加timer控件,并设置其Enabled属性为"真",用于设计窗口动画。 登录界面如下图所示: 2、修改密码表单的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"修改密码"; 第三步:添加label1 、label2、 label3,并设置其caption属性分别为"请输入旧密码"、"请输入新密码"、"请确认新密 码"; 第四步:添加text1、 text2、 text3,并设置相关属性; 第五步:添加command1和command2,并设置其caption属性分别为"确认"和"取消"; 修改密码表单如下图: 3、学生基本信息维护表单的设计: 第一步:创建表单,并保存为学生表.scx; 第二步:添加lable1~lable5,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text5,并设置相关属性; 第四步:添加"院系"、"专业"、"班级"和"学期"列表框; 第五步:添加类,并设置相关属性,用于增添和修改学生基本信息; 第六步:添加文本框text6,并设置相关属性; 第七步:添加command1~command10,并设置相关属性; 第八步:添加"返回"按钮,其功能是关闭此界面; 第九步:执行运行命令,并进行测试。 4、课程信息维护表单的设计: 第一步:创建表单,并保存为课程表.scx; 第二步:添加lable1~lable4,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text4,并设置
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸿·蒙

您的赞赏是我进步的燃料,感谢您

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

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

打赏作者

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

抵扣说明:

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

余额充值