一个有很大缺陷的小单机教务系统的简介
一、序言
本系统仅仅表面上能够实现最最基本的要求,甚至有些地方和我们的 OOAD过程的用
例图、用例模型等还有区别。真的是能力限制,改不动了,碍于时间关系不得不提交,希
望老师能够体谅学生。作为一个“伪程序员”,我遇到的问题可谓层出不穷而且大部分缺乏
技术含量,甚至环境上也不是出现致命错误。这个单机系统还好一点,SSH的那个网站,
我凭空建造一个,永远都没有成功过。只能在人家的上边改而且时好时坏,随机发生。真
的很沮丧,不过这是无关的话了。
说这些是希望老师在运行本系统的时候,严格按照本简介中指南部分操作,否则可能
发生意想不到的后果。再次致以歉意。
本系统开发过程中,网研院某师兄给予了大力支持,设计和插件选择得到了程老师的
指点。一并表示感谢,没有这些准备,是无法完成的。
系统开发人 全同学
二、实现准备
首先在 eclipse环境中选择 help->eclipse marketplace,搜索 window builder,然后找到
一个网页链接,复制该链接,在 help->install new software 中利用该链接就可以安装这个插
件了,重启 eclipse即可找到有关于 swing的东西。
原来我以为 SWING 和 SWT/JFACE 是一样的东西,图书馆里边找到一本书,《eclipse 从
入门到精通》(陈刚 编著,清华大学出版社出版,2006 年 12 月第五次印刷)。其中花了大
量篇幅讲的是 SWT/JFace。但在本系统中,这些知识似乎是完全没有用的。后来找了一个专
业 人 士 帮 我 作 指 导 , 看 了 网 上 的 视 频 , 仅 有 的 一 小 段 视 频
http://video.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&word=windowbuilder&ie=
utf-8。4分 38秒的时间,大致讲述了怎么开始使用 swing。至少能够获得起步上的指引。
最近在练习 SSH,所以有了一点点 mysql使用方面的基础知识。在本项目中,如果不用
数据库,无法得知如何实现功能。而理论上应该每个 user 角色建造一个表,而且课程也应
该有相应的表。但是我无法这么做,因为技术水平过低的原因,本项目中用来辅助的数据库
也仅仅是为了达到表面相似的效果。这一点我已经在序言中多次提及。数据库结构入下图:
图 2.1
具体的内容如图 2.2 , 2.3所示。我就不用文字赘述了。
图 2.2
图 2.3
我在提交的包中已经有了一个 sql文件是可以直接用的,导入的时候请先在你的数据
库中自建一个 jiaowu的数据库,字符改为 UTF-8,然后右键这个库,导入 sql文件。不能直
接拖拽或者直接在 localhost内导入。这个是操作方面我有必要提醒的地方。我所有的目
的,只是希望能够把我所走的弯路和遇到的错误解决方法能够简介明白的写在这里,方便
用户。
程序中需要导入一个数据库连接的 jar包,方法如图 2.4所示。右键点击工程,然后选
择属性即可出现如下界面。Jar需要先自行下载,网上很多。
图 2.4
图 2.5
整个工程的基本结构如上图 2.5 所示,不妨先把需要的 package 建造好,然后逐步添加
java文件。最先设计的当然是 login.java了。
还有一个不得不提的内容,就是注意在代码中更改你的数据库信息,如下图:
图 2.6
具体的实现代码,这里先不说,有重要的个别实现操作会在特别关注章节给出。现在先
看下需求:
图 2.6
图 2.6给出了课件上的基本需求,先前的介绍也给出了本系统原本需要实现的功能和基
本设计。介绍非常简单,所以本系统也就赶巧了,在尽最大努力的前提下还是只能做到这个
效果,我们深知,这个系统实际上是不能使用的。甚至是否能称之为一个真正意义上的简易
系统都很困难。这就是一个为了满足表象而创造的,有一定功能但是对用户来说极为不友好
的程序。软件行业的发展,以及产品设计,给我们带来了美的感受,给工作生活带来了便利,
我相信软件行业涉及面如此之广,我比较感兴趣的方面可能还有待进一步去探索。但是如果
是作为开发人员的话,我肯定是很愧疚的。
三、操作指南
再次友情提示一遍,请务必按照本指南严格操作,否则出现的效果可能不是本页面所展
示的,可能造成实际功能要求未完成的假象。迭代开发最初期并不要求很完善,但是根据我
得理解,我这个代码实现,走了弯路,肯定要被整体推翻的。我也知道这个设计没有可持续
使用的可能性。
首先点击工程包,按一次如图所指的按钮,即可弹出对话框。
图 3.1
有一种情况是你的 eclipse并没有运行过类似的 swing组件,那么请先左键点击 default
package中的 login.java,然后再按图 3.1的按钮,或者直接点击 login.Java,右键,run as java
application也是可以的。
图 3.2
依据代码里边存好的数据,我们暂时列在下边方便查阅和登陆:
图 3.3
先选择全教务 2登陆,用户名密码是一致的,都是 3002。如果不选定相应的角色,将
会出现以下错误:
图 3.4
正确登陆后我们选择输入课程如下:
图 3.5
点击保存。有一个问题就是,如果要删除课程,必须去数据库中进行删除。
而且我们默认在录入时间地点的时候,已经是考虑好不出现冲突的了,没有提供比较
的语句。
从数据库中删除神学:
图 3.6
图 3.7
再次用教务账号登陆后,发现已经没有这门课程了。
图 3.8
教务的工作已经完成。
学生登陆后打算选课,假设学生 1001是大四学生要选大四的课,先按年级检索课程,
发现有毛泽东思想可以学习,就点击勾选,选课即成功,但是不会给反馈。
图 3.9
假设他找到大 1的课想退选,则如果课程有分数就报错。
图 3.10
指定年级学生只能选相应年级的课程,否则报错。
图 3.11
接下来是老师登陆。老师要求只能查看他所授的课程,但是实际上他可以查看任何课
程,甚至可以改分数,这一点我自己也受不了,但是我不知道怎么改变。就靠道德暂时约
束一下吧,比如假设已经进入共产主义社会。
图 3.12
老师检索学生名单,得到学生。同时可以看到上课时间和地点。
假设要录入分数,那么,双击箭头所指位置,写入分数,回车,最后点击保存分数即
可。系统智能提示录入成功。
图 3.13
我们假设全同学 1去查一下自己的成绩。
图 3.14
全同学 1得分为 100分。恭喜他可以毕业了。
到这里,教务人员排课,老师查看选课人员和登分和上课时间地点,学生选课查分的
功能就全部完成了,每次退出都直接点击右上方的叉叉就可以了。而且在进行这些操作的
时候除非有界面需要更新,否则不需要推出,可以同时打开多个窗口。
以上就是整个操作过程。希望您能实验顺利。
四、特别关注
我希望在这里讲一讲代码方面的设计和实现。有些时候一小点问题能困惑很久,而等我
无论搜索或者请教别人,解决的时候几乎已经筋疲力尽,所以这个程序耗时长还做成这个样
子,我自己也不知道该说什么好。就把我认为一些比较新的、有意义的东西放在这里留作纪
念吧。我是一个技术很差的人,所以我觉得根据我的水平来写文档的话可能会有些啰嗦,然
而我认为这些啰嗦将为水平和我一样或者比我差的人(这样的人恐怕不多-_-!)提供便利。
建议
关于小区增设电动车充电建议给教师的建议PDF智慧城市建议书pdf给教师的36条建议下载税则修订调整建议表下载
使用 window builder editor打开.java文件,这样你就可以看到如下界面。方法是右
键点击 java文件,然后在 open with中选择。点击 design,能进入图形界面查看配置。
图 4.1
我们可以方便地拖拽一些组件,后台会生成代码,但是我们现在先不考虑代码,先看
组件。
图 4.2
图 4.2展示了如何拖拽(实际上是先点击 JComboBox然后再在平台上再点以下)得到
复选框,第二个箭头指向的是宽高调整。
提醒注意拖拽 password和 textfield文本框的时候不要弄错。
双击按钮,我们就可以快速从 design视图跳转到 source中的相应代码处。
Mysql在这个里边使用的时候,有些语句我发现和我在 SSH网站制作(又一个很挫的
设计)里边使用的方法大体一致,或者说有相通之处。
现在我按照开发很重要的顺序来进行代码叙述,并粘出图片。
这个类是用来定义的一
个基类,有最基本的内容,
包括使用人名字,角色,登
陆用的用户名和密码。
图 4.3
图 4.4
这个是对 user的继承,其中多加了一个 grade因为学生有这个必要进行区分。而教工
和教师没有必要,这是两个类最大的区别。其他两个我就不再粘出了。
Util.java里边我们定义了所有必要的信息,使用数组存储。因此列在下方:
package util;
public class Util {
public final static int ROLETYPES = 3;
public final static String[] ROLE_TYPESTR = {"学生","教师","教务人员"};
public final static int[] STU_LOGIN_IDS = {1001,1002,1003};
public final static String[] STU_LOGIN_NAMES = {"全同学 1","全同学 2","全同学 3"};
public final static String[] STU_PASSWORD_IDS = {"1001","1002","1003"};
public final static int[] STU_GRADE_IDS = {3,1,2};
public final static int[] TEA_LOGIN_IDS = {2001,2002,2003};
public final static String[] TEA_LOGIN_NAMES = {"全老师 1","全老师 2","全老师 3"};
public final static String[] TEA_PASSWORD_IDS = {"2001","2002","2003"};
//public final static int[] TEA_GRADE_IDS = {1,2,3};
public final static int[] JW_LOGIN_IDS = {3001,3002,3003};
public final static String[] JW_LOGIN_NAMES = {"全教务 1","全教务 2","全教务 3"};
public final static String[] JW_PASSWORD_IDS = {"3001","3002","3003"};
public final static String[] GRADES_STR = {"大一","大二","大三","大四"};
public final static String USERNAME_EMPTY = "请输入用户 ID";
public final static String PWD_EMPTY = "请输入用户密码";
public final static String COUSERNAME_EMPTY = "课程名称不可为空";
public final static String COURSEROOM_EMPTY = "课程地点不可为空";
public final static String COURSERDATE_EMPTY = "课程日期不可为空";
public final static String LOGIN_FAIL = "用户名或者密码错误,登录失败";
public final static String ADDNEWCOURSE_FAIL = "新增课程失败";
public final static String CANCELCOURSE_FAIL = "该课程已经评分不可取消!!";
public final static String CANCELCOURSE_FAIL2 = "该课程取消失败!!";
public final static String CHOOSEOURSE_FAIL = "选课失败!!";
public final static String SCORE_INPUT_ERR = "分数录入格式错误!";
public final static String SCORE_INPUT_SUCC = "分数录入完成!";
public final static String CHOOSEOURSE_UNMATCH = "只能选择本年级的课程!";
}
那些静态的 String是为了以后调用方便写在这里备选的。之所以先列出 util是因为几
乎在所有剩下的 java中都会涉及到。我们再看 usermanager这个技术含量高的类:
代码 代码阐述
package user;
import java.util.HashMap;
import util.Util;
public class UserManager {
public HashMap[] usercenter = new
HashMap[Util.ROLETYPES];
private static UserManager Instance = null;
private UserManager() {
// TODO Auto-generated constructor stub
loadUserInfo();
}
public static UserManager Instance()
{
if(Instance == null)
{
Instance = new UserManager();
}
return Instance;
}
public boolean loadUserInfo()
{
for(int i=0;i
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数是一个
private类型。和后边的
public static UserManager
Instance()配合使用。目的
是,整个工程中任何一个地
方都不需要重复地通过 new
的方式来创建这个
usermanager实例。
public static UserManager
Instance()是一个静态函数,
我也是首次遇到,可以通过
外部调用的方式来统一生成
实例。
LoadUserInfo是加载用户数
据。第一个 for是实例化三
个 hashmap。
StudentUser stuuser = new
StudentUser(name,id,pwd,gr
ade,role)它实例化了多个学
生,查找学生必须靠下列函
数。
usercenter[role].put(stu
user.userid,stuuser);前一个
关键字是 key,后一个是
value。函数功能是给用户以
TeacherUser teauser = new
TeacherUser(name,id,pwd,role);
usercenter[role].put(teauser.userid,teauser);
}
for(int i=0;i= usercenter.length)
{
return null;
}
if(usercenter[role] != null)
{
User finduser = (User) usercenter[role].get(id);
return finduser;
}
return null;
}
public User findStudent(int userid)
{
if(usercenter[0] != null)
{
User finduser = (User)
usercenter[0].get(userid);
return finduser;
}
return null;
}
}
自身 id为 key存储。这样能
方便快速查找到用户,后边
几个是一样的。
因为角色是复选框指定的,
一般不会越界。但是这里留
着保证其它函数不会越界。
这个是用来获取用户信息,
不需要验证。两个函数基本
相同。
图 4.5
图 4.6
以上两张图基本是类似那个 user的用法,一个定义基本类,另一个尽管也是基本类,
但是继承了老类,还加了 2个成员变量。以后会看到他们的用处。
我们看一下关键的 coursemanager.java:
代码 代码阐述
package course;
import java.util.ArrayList;
import java.util.HashMap;
import db.DBConn;
public class CourseManager {
private static CourseManager Instance = null;
private CourseManager()
{
}
public static CourseManager Instance()
{
if(Instance == null)
{
Instance = new CourseManager();
}
return Instance;
}
public HashMap getLearndCourseByGrade(int grade,int
userid)
{
这个也是单例模式的
类。单例模式是一种常
用的软件设计模式。在
它的核心结构中只包含
一个被称为单例类的特
殊类。通过单例模式可
以保证系统中一个类只
有一个实例而且该实例
易于外界访问,从而方
便对实例个数的控制并
节约系统资源。如果希
望在系统中某个类的对
象只能存在一个,单例
模式是最好的解决方
案。英文名是
Singleton pattern。更
加详细的信息,请参阅
http://baike.baidu.com/
view/1859857.htm
左边函数通过年纪 id,
HashMap rlist = new HashMap();
ArrayList tmprst=
DBConn.Instance().getStudentLearnCourses(userid);
for(int i=0;i 0)
{
stmt_add.close();
return 0;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 2;
}
public ArrayList getStudentsByCourseid(int courseid)
{
ArrayList rlist = new ArrayList();
if(con!=null)
{
try {
Statement stmt = con.createStatement() ;
ResultSet rs = stmt.executeQuery("SELECT *
FROM score,course where score.courseid = course.Id and
courseid="+courseid+" order by stuid") ;
while(rs.next())
{
String cname =
rs.getString("coursename") ;
String cr