Java新手项目之第一个项目(一)2016.5.16-5.22

Java学生选课教务系统

作为学习Java的新手,之前学过点Java的基础,后来又看了看网易云课堂的java,总共差不多两个月的时间吧,陆陆续续跟着书和视频编了一些程序。马上也要毕业,现在开始,希望能够写一些新手,进阶,高级项目经历。一方面,是对自己实践的一个总结反思学习的过程,另一方面,也是对自己职业的一个管理。

经验现在明显不足。有很多没有考虑到的地方,嘛嘛,总是要从入门到放弃的嘛,留在这,供高手娱乐消遣,供自己回忆吐槽:-D
无论如何,程序员这一行算是准备开始了/(ㄒoㄒ)/~~少年,迈上不归之路吧!Let’s go! All in!

界面设计以及功能分析

写在分析前

因为赶上毕业,所以希望能马上完事,照着实现最简单的功能来,争取一周完事。说易行难,一看网上的各种分析,立马畏难情绪上来了,这各种各样的类,界面,功能,我完全无从下手啊。啊啊啊啊,这怎么办啊,虽然之前也做过小的项目,也知道甭管难不难,先去下手做就行,碰到问题,就解决问题呗。可这次问题是,我不知道从哪入手。这不就无语凝噎了吗?刷了刷新闻,哎,又被Unix的发明者的故事给虐了,你说人家20出头的时候已经能干出这么前无古人,很有可能后无来者的牛逼的事来,而逗逼如我,以临近毕业之势,刚刚开始学习java,这还有啥好奋斗的?大晚上的从实验室出来,简直是生无可恋有木有~。

伟大的某个伟人说过,想不通的时候要么吃饭,要么睡觉。一觉醒来,挫败感少了,头脑也清醒许多了,想了想,管他呢,就从如果我是用户,我要选课的流程是啥,首先干啥,接着怎么了(有没有产品设计的赶脚。。。),那我就从这个入手,按照用户操作来,需要啥写啥。需要啥,就打包到类里,提供统一面向外部的接口,然后打包到包里。。。不知道这样想对不对,反正这么一顿遇到问题解决问题下来,也整了个系统出来。好坏不说,自己设计的第一个独立的小系统,还是有成就感的。所以还是记录下来,若干年后,再来自打脸。。。

第一个项目为了打基础,会写的详细一些,以后会简写。(ps. 第一次用markdown写,文字都在一行了,后来发现,是不要随便敲空格啊,实在不行,复制一下最开始使用时跳出来的那个介绍markdown的界面作为模板,然后就知道咋回事了。。。原谅我这笨拙的人生吧。。)

  • 深深体会到不知道的太多
  • 要时刻网上查阅
  • 还有下载一个jdk API文档
  • 以及熟练使用alt+/辅助输入
  • 以及Ctrl+待查看的类和方法

界面设计,功能分析

好,扯淡够了,言归正传。平台采用从Eclipse官网里下载的eclipse for java软件平台,然后配置了一下jre 用的是jre 1.7。说到这里,也是之前很困惑,然后上网查阅。

写java程序,不用专门的eclipse,而是下载jdk软件包,然后配置classpath,再调用javac编译,java来运行。这种情况下,jdk软件包包含jre和一些开发工具,主要是javac和java(调用虚拟机)。jre是java运行引擎,是用户安装使用,它包含库lib以及java,用来调用用户的java虚拟机,运行java程序。而jdk是开发人员使用,它包含javac等用来开发的工具。而java虚拟机在jre中,因为java是跨平台运行在各系统中,它需要一个虚拟机帮助实现这个。至于配置classpath,则是可以实现在计算机任何位置都能调用javac和java的作用。而eclipse for java 有自己的编译器,直接下载安装,然后在build path 里选择jre 1.7(或者其他)即可使用。另外有些方法是不适合较早版本的编译器的,因此,我经常直接把编译器改成1.7版本的。接下来继续说项目吧。

主界面–学生选课系统登录界面

首先学生选课系统主界面,应该是一个登录系统,和大部分你见过的一样,直接上图(丑陋style,用的是swing)
Java新手项目之第一个项目(一)2016.5.16-5.22_第1张图片
好了,可以看到,首先我们要设计一个MyFrame继承JFrame类,把图中相应的Component对象设计好(刚开始把密码框弄成了JTextFiled类了,应该是JPasswordFiled类,专门为密码输入提供的,还有用户名框不要用JTextArea类,这是一大块文本输入域,用JTextFiled类,一行即可)。

接着就是放置这些组件到MyFrame里了,在放置的时候,需要注意布局,通常我会采用在主JPanel类对象里,采用GridLayout布局,然后在每一行的JPanel类对象里,默认使用FlowLayout布局(可以设置放在左右位置),把主JPanel放置在MyFrame(默认BorderLayout的CENTER位置上)
可以在函数ini()里实现,然后是注册组件的事件监听器,我用到的一般是按钮(JButton)的addActionlistener(new Acitonlistener(){//在这里面实现处理事件};)在register()函数里实现,接着将这两个函数放到MyFrame构造函数里,最后在构造函数里将窗口的visible(),置为true;

接着,我们分析用户登录流程,当用户还没点击登录的时候,要在界面显示如上图,那首先得实现产生验证码的功能,Java是面向对象的嘛,在我理解就是能打包成一个类的弄成一个类,提供类面向外部的接口,因此可以把这个产生验证码的功能放在Tools类中实现;

当用户点击登录的时候,也就是要实现登录按钮的注册事件,首先获取用户输入的信息,然后接下来就是连接数据库,查询用户名和密码的正确性。所以需要一个数据库,库里有user表,含有用户名,密码,用户权限(设定1对应管理员,2对应教师,3对应学生,这是为了登陆后弹出相应的界面),也应该有student,teacher这些用户,以及course表。相应的在Java里要设计类,有User类,然后是继承User类的Student类和Teacher类,和数据库中的表相对应。同时有一个Course类,用来记录课程,选课的老师,以及选课的学生。

接着登录功能来说,在登录注册事件里,需要接收用户输入,验证登录正确性。验证正确性,可以在UserManage这个操作User类中实现,即实现login方法,提供用户输入的信息,在login里应该实现连接数据库,获取Connection对象,使用PreparedStatement,发送sql语句,获取ResultSet,然后验证输入的正确性。

选数据库的时候,最开始选了SQLite数据库,适合嵌入,后面对多用户并发读写支持不好,可能是我没弄好,所以弃了,选择了SQL Server数据库,这个数据库使用,首先要在配置管理器里启动sql server服务,切记切记。

Java的jdbc可以通过下载的数据库驱动包,实现对各类数据库的统一调用方法,包括Class.forName(“驱动”),Connection DriverManager.getConnection(“协议+路径”)。因此选择好数据库,然后下载相应的驱动文件包(.jar),然后将其build path进Libarary中,就可以直接调用以上方法了。而这两个函数里所需的字符串,可以通过解析xml文件实现,将解析过程设为MyFrame的静态代码块,只执行一次。xml解析也有两种,考虑到解析较小文件和提高效率,选用了DOM解析,先读进内存,再遍历树。在login里实现连接。然后就是发送sql语句了。Statement类不能使用参数,因此使用PreparedStatement,用?代替参数,如

String str="select * from user where uname=?"
PreparedStatement ps=conn.getPreparedStatement(str);
ps.setString(1,name)

将这个发送过程,放进Tools里去实现PreparedStatement sqlBuilder(String str,Object obj[])。接着利用返回的ps,得到ResultSet rs,然后就是利用rs的next()函数,获取从数据库中得到的查询的值,然后判断用户名与密码的正确性。若正确,就要考虑写登录日志了,记录登录时间和用户,放在Record类里,登出时间,在某个用户登出后记录,然后是通过I/O将Record对象写入/读出文件中。写对象,用ObjectOutputStream。

这个MyFrame作为gui,可以将放在com.my.gui包里。具体public class MyFrame{},Tools类,User类,Student类,Teacher类,Course类,UserManage类,实现在文末统一给出。其实,很多类都是基本定了,然后缺啥补啥。。

最后,注意一些使用的友好性,在登录时,对某些用户的一些操作,如输入为空,点击叉号等,要及时弹出对话框,因此要设计一个MyDialog类继承JDialog类,实现对话功能。然后就是验证码输入不对,重输之前,要清零等一些友好设计,想象一下,作为用户的你,面对一些不友好设计时的各种吐槽吧~

接下来,就是分别设计管理员系统界面,学生系统界面,教师系统界面,以及数据库的设计了。
程序附录
主界面MyFrame;
有些编写,本文未提到的,后面会介绍

package com.my.gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import com.my.beans.Record;
import com.my.beans.Student;
import com.my.beans.Teacher;
import com.my.beans.User;
import com.my.manage.UserManage;
import com.my.util.Tools;

public class MyFrame extends JFrame{
    private Container pn;

    private JPanel pn_name,pn_pwd,pn_code,pn_login;
    private JLabel label,label_name,label_pwd,label_code;
    private JTextField filed_name,filed_code,field_code_play;
    private JPasswordField pwd;
    private JButton login;

    private String uname;
    private String upwd;
    private String code;
    private String codePlay;

    private UserManage um=null;

    private Record record=null;
    private Date inTime;
    private Date outTime;

    private User user=null;


    private AdmisterGUI agui=null;
    private TeacherGUI tgui=null;
    private StudentGUI sgui=null;


    public UserManage getUm() {
        return um;
    }
    public MyFrame()
    {
        ini();
        register();
        this.setVisible(true);
    }
    public void ini()
    {
        this.setSize(400,300);
        this.setTitle("学生选课教务系统");
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        pn=new Container();
        pn_name=new JPanel();
        pn_pwd=new JPanel();
        pn_code=new JPanel();
        pn_login=new JPanel(new FlowLayout(FlowLayout.RIGHT));

        label=new JLabel("登录");
        label_name=new JLabel("账户", JLabel.CENTER);
        label_pwd=new JLabel("密码", JLabel.CENTER);
        label_code=new JLabel("验证码", JLabel.CENTER);

        filed_name=new JTextField(20);
        field_code_play = new JTextField(9);
        filed_code=new JTextField(9);

        pwd=new JPasswordField(20);
        login=new JButton("登录");
        //窗体居中
        Toolkit kit=Toolkit.getDefaultToolkit();
        Dimension dm=kit.getScreenSize();
        this.setLocation((dm.width-this.getWidth())/2, (dm.height-this.getHeight())/2);
        //放置

        pn_name.add(label_name);
        pn_name.add(filed_name);
        pn_pwd.add(label_pwd);
        pn_pwd.add(pwd);
        pn_code.add(label_code);
        pn_code.add(filed_code);
        //调用tools类产生验证码,并显示在界面上
        codePlay=Tools.codeGen();
        field_code_play.setText(codePlay);
        field_code_play.setHorizontalAlignment(JTextField.CENTER);


        pn_code.add(field_code_play);

        pn_login.add(login);

        pn.setLayout(new GridLayout(4, 1));
        this.add(label,BorderLayout.NORTH);

        pn.add(pn_name);
        pn.add(pn_pwd);
        pn.add(pn_code);
         pn.add(pn_login);
        this.add(pn,BorderLayout.CENTER);


    }
    public void register()
    {
        login.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                um=new UserManage();
                uname=filed_name.getText();
                upwd=pwd.getText();
                code=filed_code.getText();
                if("".equals(uname)||"".equals(upwd))
                {
                    //自定义对话框 MyDialog 弹出提示
                    new MyDialog("账户和密码不能为空!");

                }
                else
                {

                    if("".equals(code)){
                        new MyDialog("验证码不能为空!");
                    }
                    else if(code.equalsIgnoreCase(codePlay))
                    {


                        //调用UserManage类 login方法

                        user=um.login( uname,upwd);
                        if(user==null){
                        new MyDialog("账户和密码不正确!");}
                        else
                        {
                            //重复登录 验证码清零
                            codePlay=Tools.codeGen();
                            field_code_play.setText(codePlay);
                            field_code_play.setHorizontalAlignment(JTextField.CENTER);
                            //清空输入
                            filed_code.setText("");

                            record=new Record();
                            record.setUser(user);

                            inTime=  new Date(Calendar.getInstance().getTimeInMillis());
                            record.setInTime(inTime);
                            //判断uright,调用管理员、教师、学生窗口
                            int uright=user.getUright();
                             if(uright==1)//管理员
                             {
                                 agui=new AdmisterGUI(record,MyFrame.this);////在里面实现 窗口退出 写登录日志

                             }
                             else
                                 if(uright==2)//教师
                                 {
                                     Teacher teacher=(Teacher)user;
                                     tgui=new TeacherGUI(record,MyFrame.this,teacher);////在里面实现 窗口退出 写登录日志
                                 }
                                 else
                                 {
                                     Student student=(Student)user;
                                     sgui=new StudentGUI(record,MyFrame.this,student);////在里面实现 窗口退出 写登录日志
                                 }
                            }

                    }
                    else
                    {
                        new MyDialog("验证码不正确!");
                        //调用tools类产生验证码,并显示在界面上
                        codePlay=Tools.codeGen();
                        field_code_play.setText(codePlay);
                        field_code_play.setHorizontalAlignment(JTextField.CENTER);
                        //清空输入
                        filed_code.setText("");
                    }
                }
            }
        });

            //主窗口正在关闭 释放资源  
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                if(um!=null){
                um.closeConnection();}
                ((MyFrame)e.getSource()).dispose();
                System.exit(0);

            }
            });     

    }
    //自定义对话框
    class MyDialog extends JDialog{
        private JLabel msg;
        private JButton ok;
        private JPanel pne;
        public MyDialog(String msg)
        {
            ini( msg);
            register();
            MyDialog.this.setVisible(true);
        }
        public void ini(String msg)
        {
            MyDialog.this.setSize(300,100);
            //窗体居中
            Toolkit kit=Toolkit.getDefaultToolkit();
            Dimension dm=kit.getScreenSize();
            MyDialog.this.setLocation((dm.width-MyDialog.this.getWidth())/2, (dm.height-MyDialog.this.getHeight())/2);
            pne=new JPanel();
            pne.setLayout(new GridLayout(2, 1));
            MyDialog.this.msg=new JLabel(msg, JLabel.CENTER);
            MyDialog.this.ok=new JButton("确定");
            pne.add(MyDialog.this.msg);
            pne.add(MyDialog.this.ok);

            MyDialog.this.add(pne,BorderLayout.CENTER);
        }
        public void register()
        {
            MyDialog.this.ok.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    MyDialog.this.dispose();
                }
            });
        }
    }
}

诸多琐事,没有时间细细讲解。直接上代码吧。

学生教务系统Java实现

你可能感兴趣的:(java新手项目)