精华内容
下载资源
问答
  • 基于jsp(java)高校学生考勤管理系统设计与实现

    万次阅读 多人点赞 2019-04-18 23:06:56
    获取项目源文件,学习交流联系Q:1415736481,可指导毕设,课设 本系统主要针对目前高校学生在线请假以及学生上课出勤管理而设计的...本高校学生考勤管理系统用JSP+SQL Server 2000开发,开发过程中运用了页面模块化...

    获取项目源文件,学习交流联系Q:1415736481,可指导毕设,课设

    本系统主要针对目前高校学生在线请假以及学生上课出勤管理而设计的信息系统。本系统总体上由三大功能模块:请假系统模块、考勤系统模块、后台管理模块组成。系统涉及到高校六大类用户:学生、任课老师、班主任、院系领导、学校领导、系统管理员。

    本高校学生考勤管理系统用JSP+SQL Server 2000开发,开发过程中运用了页面模块化、信息发布的动态生成、静态页面显示等技术开发。本论文重点介绍本系统的请假系统、考勤系统两大功能模块设计,完成学生、任课老师、班主任、院系领导、学校领导五类用户功能的设计与实现。

     

    关键词:考勤管理;在线请假;JSP

     

     

    ABSTRACT

    The system is an information system designed for asking for leave on line  for students and managing  attendance of undergraduate.It is generally divided into three main modules: the module for asking for on-line leave , the module for managing attendance of undergraduate and  the module  for backstage management. There are different customers  in the university  operating  the system,such as  student, teacher,  a teacher in charge of a class,department leader, school leader, administrator.

    The system is developed with the help of Jcreator,JSP(java、javascript、html)and SQL Server 2000. The key techniques used in the process of development are: the page modularization, dynamic generating and static page showing of information, etc. And the thesis focuses on the introduction of the system’s attendance management and the management of asking for leave online.And it develops the function of student, teacher, a teacher in charge of a class,department leader, school leader on the whole.

    Key word: attendance management;online ask for leave; JSP

     

    第1章 问题定义

    1.1 引言

    问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”, 在此阶段中,主要是弄清本课题需要解决的问题根本所在,以及此课题所需的资源等。

    1.2开发背景

    目前高校校园信息化逐步完善,高校师生借助校园网有效的提高了办事效率。各大高校针对师生的成绩查询系统、教务管理系统、招生就业系统、BBS、校园网站等系统在各大高校纷纷出现,对全校师生的学习、生活、管理、办公带来了便利。

    目前高校学生上课考勤管理都是以任课老师上课点名,记录学生上课出勤情况,学期末根据上课出勤表及作业登记表对学生平时成绩打分,然后把数据上交到各院系。学生请假以传统的写请假条的形式向各自班主任请假,时间长的请假,要班主任、院系领导都批准方能生效。这种的模式在目前高校管理中暴露出了许多弊端:一是学生请假不方便;二是学生请假对任课老师不透明,造成对学生上课出勤误记的情况;三是学生上课出勤表对班主任不透明,班主任很难知道本班学生上课的出勤情况,不便于与学生及时有效的沟通;四是学生对自己整个学期的上课出勤情况没有整体的统计信息。五是院系领导、学校领导更加把握不住学生上课的出勤情况。

    1.3问题描述

    上述所说高校对学生考勤和请假面临的问题涉及多类用户,系统使用范围是在全校校园网内,由于用户分布广泛,且存在很大差异,如:知识结构的差异、计算机硬件配置的差异、操作系统的差异等。因此本系统设计应当采用典型的B/S(浏览器/服务器)的构架进行设计,操作简单直观,对硬件要求低,最好能实现跨平台。跨平台一是指客户端用户操作的跨平台,二是指服务器端的跨平台,即可以将服务器部署在所有操作平台上。系统应当有很好的扩展性,与当前高校中现有的系统很好集成。

    目前随着IT技术的不断创新与发展,新的技术不断推出,各种企业实现信息化的解决方案不断成熟。面向对象程序设计语言的广泛使用,各种成熟关系数据库的不断完善与推出,再加上面向对象的软件开发过程广泛应用,软件开发过程变得越来越容易,开发出的系统变得越来越实用,许多企业使用信息系统后,明显提高了办事效率,带来了很大的经济收入。目前流行的基于B/S结构的解决方案主要有ASP,JSP,PHP等技术。本系统选用JSP技术开发,使用当前流行的SQL Server 2000数据库管理系统来存储数据,主要解决学生在线请假、在线考勤管理以及后台数据的维护与更新。

     

     

    第2章  可行性分析

    2.1 引言

    这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决方法吗?”为了回答这个问题,需要一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决方法。

    2.2 目的和意义

    开发本系统的目的,就是要解决目前高校中关于学生请假与上课出勤管理中所面临的一系列问题。

    开发出高校学生考勤管理系统能有效地提高高校办事效率,解决目前高校学生请假及上课出勤管理问题,实现学生请假及上课出勤信息对任课教师、班主任、院系领导、学校领导透明,使班主任、院系领导及时把握学生的学习情况,及时与学生沟通,提高教学质量。

    2.3 可行性分析

    技术可行性:高校学生考勤管理系统在目前的高校中使用还不普遍,但也有许多类似的成功案例:如教务管理系统、排课系统等。本系统采用JSP,JavaScript脚本语言、html标识语言及SQL Server 2000数据库技术综合开发。JSP是一种安全稳定的动态网页技术,目前国内各企业的电子商务系统,ERP系统,银行信息系统等基本上都用JSP开发的。Microsoft SQL Server(基于结构化查询语言的数据库服务器)是基于客户/服务器结构的数据库管理系统,用户通过使用客户系统从服务器检索信息并进行本地操作,服务器关注数据库进程,而客户则关注信息的表示。为了使客户端能够从服务器中访问数据,服务器必须具备以下两个关键特征:一、对在数据库中的数据提供单点访问。二、将处理和操作在客户端和服务器间进行分配。SQL Server使用Transact-SQL语言来维护、实现和访问数据库,Transact-SQL是SQL(Structured Query Language)的一个子集标准。SQL Server有多种实用程序允许用户来访问它的服务,用户可用这些实用程序对SQL Server进行本地管理或远程管理。

    经济可行性:本系统使用B/S架构设计,使用市场上流行的动态网页技术,开发简单,使用度方便,不需要耗费大量的人力物力就能很快的开发出来,系统部署对软硬件要求不高,用户操作简单,几乎不需要对用户进行专业培训就可使用本系统,所以从经济上讲是可行的。

    法律可行性:本系统拥有自主知识产权,没有使用任何违法的软件也没有交易任何非法的商品,所以在法律上是可行的。

    操作可行性:本系统操作简单方便,只要懂得上网都能方便操作本系统,所以在操作上也是可行的。

    分析结果从以上的分析可知,高校学生考勤管理系统的解决方案无论在技术,经济还是法律以及操作上都是可行的,且开发本系统具有一定的经济价值和实用价值。

     

     

    第3章  需求分析

    3.1 引言

    这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。

    3.2 用户需求描述

    用户是系统的最终使用者,开发系统的目的是要用户最终很好的使用系统,最终为用户带来各种便利。本系统要解决高校学在线请假以及上课考勤管理两大问题,通过对高校的实际调查分析,本系统应当包括学生、班主任、任课老师、院系领导、学校领导、系统管理员六类用户,这六类用户对系统的需求简要概括如下:

    3.2.1学生用户需求描述

    学生对本系统的主要需求是:在线请假以及查看在校期间所有的上课出勤信息。

    在线请假需求:学生在网上填写好请假的起止日期,请假原因后,就可以向本学期本班班主任提出请假申请,超过三天的请假,由班主任审批后,再由院系领导审批。在在线请假的全过程当中,学生可以随时查看请假的详细进展情况。

    查看出勤信息需求:学生可以查看在校期间所有学期上课出勤的详细信息,如:查看“高等数学”这门课程在整个学期请假、旷课、迟到、早退了多少次,以及具体的时间、任课老师姓名、第几节课等详细信息。

    其它需求:查看本人的基本信息,如本人的所属的院系、年级、专业、班级、学号、姓名、性别等,以及修改个人用户密码,查看本班课表安排。

    3.2.2任课老师用户需求描述

    任课老师对系统的主要需求是:管理所教班级学生的上课出勤信息以及查看所教班级学生的上课出勤信息。

    管理学生上课出勤需求:根据学校安排的课表,随着时间的变化,自动列出还没有在网上公布的学生上课出勤信息,系统自动根据学生请假系统,决定学生上课出勤的最终结果。

    查看学生出勤信息需求:查看所教班级学生整个学期上出勤统计信息及详细信息。

    其它需求:查看上课课表,本人基本信息以及修改个人用户密码。

    3.2.3班主任用户需求描述

    班主任对本系统的主要需求是:审批本班学生本学期的在线请假以及查看本班学生本学期所有课程的上课出勤信息。

    审批学生请假需求:本班学生本学期在线请假申请后,自动提示班主任有等待审批的请假信息,班主任针对请假申请信息进行学生请假审批,以及对请假信息回复。

    查看学生上课出勤信息需求:查看本班学生整个学期有关课程的上出勤统计信息及详细信息。

    其它需求:查看本班学生的基本信息、修改个人用户密码等。

    3.2.4院(系)领导用户需求描述

    院系领导对系统的主要需求是:审批本院系学生超过三天的请假以及查看本院系学生上课出勤信息。

    审批请假需求:当学生请超过三天的假,经班主任审批同意后,系统自动提交给任何一个最先进入系统的院系领导审批请假,以及针对请假回复。

    查看本院系学生出勤信息需求:输入查询条件后,系统根据查询条件列出本院系学生相关的上课出勤信息。

    其它需求:查看本院系有关基本信息以及修改个人用户密码等。

    3.2.5学校领导用户需求描述

    学校领导对系统的主要需求是:查看全校学生上课出勤信息。

    查看出勤信息需求:输入查询条件后,系统根据查询条件列出本校学生相关的上课出勤信息。

    其它需求:查看有关全校的基本信息以信修改个人用户密码等。

    3.2.6系统管理员用户需求描述

    系统管理员有系统的最高权限,负责系统所需所有数据的动态同步更新以及维护,根据系统针对各用户的设计,基本功能需求如下:

    1、管理学校各院系、年级、专业、班级的添加、删除、修改等。

    2、管理每个学期每个班级的课程安排及指定班主任和任课老师。

    3、管理系统所有用户。

    4、管理全校课表安排。

    5、管理全校每学年开学的起止时间。

    6、管理系统的请假、考勤信息。

    3.3功能需求描述

    根据各类用户的需求描述,系统应当具备请假系统、考勤管理系统、后台管理系统这三大主要功能。

    请假系统功能需求:通过实际调查分析得出,目前高校中的请假流程是学生若要请假,必须先写好请假条先由本学年班主任审批,超过四天的请假,还要等待院系领导审批通过后才能生效。请假最长时间不能超过1个月,特殊情况除外。

    考勤管理功能需求:任课老师通过考勤管理系统,对学生上课出勤信息进行公开,但由于任课老师忙于教学,为了能及时准确无误的对学生出勤情况公开,要求系统能自动提示任课老师对上完课了,但还没公布的出勤信息进行网上公布。

    后台管理功能需求:后来管理主要是用来管理系统操作的数据,因为高校每学年的学生都在变化,有新生入学,也有学生毕业。请假系统要借助班主任安排才能完成,考勤管理系统要借助请假系统、班级课表安排才能完成,然而每学年课表都在变化,班主任安排也有在变化,学生也在变化,因此必须要求后台管理系统能根据系统需求,动态的、准确的更新系统数据。

    3.4系统开发工具

    根据各用户的需求,以及系统各大功能的需求,经过大量的调查分析,针对本高校学生考勤管理系统选择以下开发工具进行开发:

    系统结构:B/S (浏览器/服务器)

    开发语言:JAVA/JSP

    数据库:SQL Server 2000

    开发工具:JDK 1.5  Dreamweaver   Jcreator

    服务器端容器:Tomcat 5.5

    3.5相关开发工具简介

    3.5.1 B/S(浏览器/服务器)简介

    B/S(Browser/Server,浏览器/服务器)模式又称B/S结构。它是随着Internet技术的兴起,对C/S模式应用的扩展。在这种结构下,用户工作界面是通过IE浏览器来实现的。B/S模式最大的好处是运行维护比较简便,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据;最大的缺点是对网络环境依赖性太强,由于各种原因引起网络中断都会造成系统瘫痪。

    3.5.2 JAVA/JSP简介

    JAVA是SUN公司推出的完全面向对象的语言,它有很好的跨平台性、安全性、重用性等特点。

    JSP的全称是Java Servlet Pages,它是SUN推出的一种动态网页技术标准。它在传统的静态页面文件(*.html,*htm)中加入Java程序片段和JSP标记,就构成了JSP页面。由Web服务器上的JSP引擎来处理JSP元素,生成调用Bean,并用JDBC访问数据库(或文件),最后以HTML或XML的形式返回浏览器。JSP在Servlet类中编译,编译一次后存入内存,以后再调用时,不用再编译,所以速度很快。

    3.6 系统功能划分

    根据系统用户的需求,将本系统按功能划分成三大功能模块:请假系统、考勤系统、后台管理模块,涉及到六大类用户:学生、任课教师、班主任、院系领导、学校领导、系统管理员。

    1. 请假系统模块

    本模块的功能是在线请假的实现及管理,主要涉及三大类用户:学生、班主任及院系领导用户,学生通过此功能模块进行在线请假及查看请假记录信息;班主任在线审批学生请假及查看请假记录信息;院系领导在线审批学生长时间的请假及查看请假记录信息。

    1. 考勤系统模块

    本模块的功能是学生考勤信息统计的实现、查看及管理,涉及六大类用户中的所有用户。学生在线查看自己所有学年的出勤信息;任课老师在线管理学生出勤信息;班主任、院系领导、学校领导查看不同的范围的学生出勤信息。

    1. 后台管理管理

    本模块的功能实现整个系统数据的同步更新及维护,只涉及系统管理员用户。系统管理员动态的管理学生信息、课表安排、学年安排等信息,是整个系统实现的基础。

    3.7 数据字典

    数据词典,既用于描述数据流和数据存储的详细逻辑内容,也可用于描述外部项和处理逻辑的某些数据特性。数据词典把数据的最小组成单位看作数据元素,若干个数据元素组成数据结构。它通过对数据元素和数据结构的定义,来描述数据流和数据存储的逻辑内容。它相当于字典的作用,当用户或软件人员想了解某一数据的含义时,查查字典就可以了。

     

       
     

    名字:学生信息表

    别名:学生

    定义:学生基本详细信息

    描述:学生=stu_number+stu_name+stu_sex+stu_password+class_id

    位置:用户登录

     
     

    名字:任课老师信息表

    别名:任课老师

    定义:任课老师基本详细信息

    描述:任课老师=teacher_id+teacher_name+teacher_password+college_id

    位置:用户登录

     

     

     

     

     

     

     

     

     

     

     

     

     

         
     

    名字:班主任信息表

    别名:班主任

    定义:班主任基本详细信息

    描述:班主任=class_teacher_id+class_teacher_name+class_teacher_password+

    college_id

    位置:用户登录

     
     

    名字:院系领导信息表

    别名:院系领导

    定义:院系领导基本详细信息

    描述:院系领导=college_leader_id+college_leader_name+

    college_leader_password+college_id

    位置:用户登录

     
     

    名字:学校领导信息表

    别名:学校领导

    定义:学校领导基本详细信息

    描述:学校领导=school_id+school_name+school_password

    位置:用户登录

     
     

    名字:上课考勤登记信息表

    别名:考勤登记

    定义:任课老师对所教课程的登记情况

    描述:考勤登记= id+record_time+sk_time

    位置:任课老师考勤管理页面

     
     

    名字:请假信息表

    别名:请假

    定义:学生请假详细信息

    描述:请假= class_id+year_id+stu_number+qingjia_yuanyin+start_time+

    end_time+day_number+qingjia_time+class_teacher_status+class_teacher_sp_time+class_teacher_restore+college_leader_status+college_leader_id+

    college_leader_sp_time+college_leader_restore

    位置:学生、班主任、院系领导请假系统

     
     

    名字:学生上课出勤息表

    别名:出勤

    定义:学生上课的出勤情况。

    描述:出勤= id+sk_time+stu_number+stu_status

    位置:学生、任课老师、班主任、院系领导、学校领导考勤系统

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3.8 数据流图

    数据流程图是结构化系统分析的工具。它既可以表达数据在系统内部的逻辑流向及存储,又可以表达系统的逻辑功能和数据的逻辑变换。数据流程图既能表达现行人工系统的数据流程和逻辑处理功能,也能表达自动化系统的数据流程和逻辑处理功能。

     

    图3-1请假系统数据流图

    Fig3-1 the system’s of asking for leave dataflow pursueing

    学生请假

    班主任审批

    院系领导审批

    请假成功

    请假失败

    请假记录

    同意

    同意

    不同意

    同意

    不同意

    图3-2考勤系统数据流图

    Fig3-2 attendance system’s dataflow pursueing

     

    任课老师

    请假系统

    数据处理

    请假

    旷课

    迟到

    早退

    出勤记录

    请假记录

     

           
     
     
       

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3.9运行需求

    3.9.1 最低配置

    服务器端

    1)硬件需求:处理器  Intel Pentium III  内存 128M  硬盘  40G

    2)软件需求:Windows 98  Microsoft Internet Explorer 4.01  JDK 1.5

    SQL Server 2000 数据库    Tomcat 5.0

    客户端

    1)硬件需求: 处理器  Intel奔腾133或相当的处理器 内存 64M 硬盘 10G

    2)软件需求: Windows 98  Microsoft Internet Explorer 4.01

    3.9.2 建议配置

    服务器端

    1)硬件需求:处理器  Intel Pentium IV 2.8G 内存 256M 硬盘  80G

    2)软件需求:Microsoft Windows 2000/XP  JDK 1.5   Tomcat 5.5

    SQL Server2000 数据库 Microsoft Internet Explorer 6.0

    客户端

    1)硬件需求:处理器  Intel Pentium IV 1.8或相当的处理

                内存128M 硬盘 20G

    2)软件需求: Windows 2000/XP  Microsoft Internet Explorer 6.0

     

     

    第4章  总体设计

    4.1 引言

    经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在是决定“怎样做”的时候。

    4.2 系统布局设计

    系统页面采用框架来设计,不同的用户有不同的功能菜单,但都有统一的风格,这给页面的使用和维护都带来了很大的便利,特别是在代码重用方面起了很大作用。本系统各用户的页面设计如图4-1所示:

     

    页面主体

    功能菜单

    Banner

    Bottom

    图4-1 系统布局图

    Fig4-1 System’s layout map

     

     

     
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    1.Banner区——可以在此展示系统标识、页面归属等信息。

    2.功能菜单区——提供系统可供操作的功能列表。

    4.页面主体区——显示页面格式化数据页面主体区显示的内容,将依据页面在系统中的作用而定。

    5.Bottom区——可设计为显示系统所有权等信息。

    4.3 总体结构图

    根据系统功能的要求,高校学生考勤管理系统各个模块之间的层次结构如图4-2所示:

     

    高校学生考勤管理系统

    请假系统

    考勤系统

    后台管理

    图4-2  系统功能结构示意图

    Fig.4-2  Structure sketch map of the system’s function

     

     
     

     

     

     

     

     

     

     

     

     

     

    按用户划分,系统结构图如图4-3所示:

     

    高校学生考勤管理系统

    学生

    班主任

    任课老师

    院系领导

    学校领导

    管理员

    图4-3  系统用户结构示意图

    Fig.4-3 Structure sketch map of the System’s user

     

     
     

     

     

     

     

     

     

     

     

     

    请假系统子功能模块层次结构图如图4-4所示:

     

    请假系统子模块

    学生在线请假模块

    班主任审批模块

    院系领导审批模块

    图4-4  请假系统结构示意图

    Fig.4-4 Structure sketch map of the system asking for leave

     

     

     

     

     

     

     

    考勤系统子功能模块的层次结构如图4-5所示:

     

     

    考勤管理子模块

    任课老师提交数据

    各用户查询考勤数据

    图4-5  考勤系统结构示意图

    Fig.4-5 Structure sketch map of the system checking attendance

     

     
     

     

     

     

     

     

     

    4.4 本人主要工作任务

    本高校学生考勤管理系统分成三大功能模块来实现,本人主要负责:请假系统、考勤系统两大功能模块,涉及前五大类用户:学生、班主任、任课老师、院系领导、学校领导。后台管理功能模块,即系统管理员的功能由同组的同学来实现。

     

     

    第5章  详细设计

    5.1 引言

    总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计是软件开发时期的第三个阶段,也是软件设计的第二步。其任务就是把解法具体化,也就是回答下面这个关键的问题:“应该怎样具体地实现这个系统呢?”,通过详细设计应该得出对目标系统的精确描述,给出各个模块的详细过程性描述。从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。

    5.2 系统功能流程图

    1)主功能流程:

     

    图5-1  主界面流程图

    Fig.5-1 main pages’s flow diagram

    开始

    用户登陆

    学生

    班主任

    任课老师

    院系领导

    学校领导

    在线请假

    查看考勤信息

    查看考勤信息

    提交考勤信息

    查看考勤信息

    审批请假

    审批请假

    查看考勤信息

    查看考勤信息

    退出系统

    结束

     

     
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    5.3系统目录结构设计

    index.jsp      系统首页

    WEB-INF        系统配置目录

    public         公共目录

    image          图片目录

    student        学生目录

    teacher        任课老师目录

    class_teacher  班主任目录

    college_leader 院系领导目录

    school_leader  学校领导目录

    admin          系统管理员目录

    account_manager       账号管理目录

    class_teacher         班主任指定目录

    college_manager       院系管理目录

    admin子目录         course_manager        课表安排目录

                           kecheng_manager       课程管理目录

                           kaoqin_manager        考勤管理目录

    qingjia               请假管理目录

                            year_manager         学年安排目录

    5.4 数据库设计与实现

    5.4.1 实体模型

     

    老师提交记录

    记录ID

    提交时间

    上课时间

    图5-1任课老师提交记录实体图

    Fig5-2 entity chart of the records submited to by teacher

    图5-3 请假记录属性模型

    Fig5-3 attribute model of the record asking for leave

    院系领导姓名

    请假记录

    班级代号

    学年代号

    学生学号

    请假原因

    请假天数

    开始时间

    结束时间

    申请时间

    班主任审批状态

    班主任审批时间

    班主任回复

    院系回复

    院系审批状态

    院系审批时间

     

           
       
     
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    图5-4学生出勤记录属性模型

    Fig5-4 attribute model of the record going on duty

    学生出勤记录

    出勤ID

    上课时间

    学号

    出勤情况

     

     

     

     

     

     

     

     

     

     

    5.4.2 E-R模型

     

    学生

    请假记录

    1

    n

    请假

    图5-5 学生-请假记录E-R模型

    Fig5-5 the E-R model of the records asking for leave

    1

    1

    出勤记录

    学生

    出勤

    图5-6 学生—出勤记录E-R模型

    Fig5-6 E-R model of the records going on duty

     

     
     

     

     

     

     

     

     

     

     

     

    5.4.3 数据库的逻辑设计

    根据系统功能设计的要求以及功能模块的划分,对于系统数据库,可以列出以下数据项和数据结构:

    考勤登记表:课程安排代号、记载时间、上课时间。

    学生上课出勤信息表:上课时间代号、上课时间、学号、出勤状态。

    请假信息表:请假代号、班级代号、学年代号、学号、请假原因、开始时间、结束时间、请假天数、申请时间、班主任审批状态、班主任审批时间、班主任回复、院系领导审批状态、院系领导代号、院系领导审批时间、院系领导回复

    5.4.4 数据库表的创建

    根据数据库需求的分析,建立如下3个基本数据表。

    表5-1 请假信息表(qingjia)

    列名

    数据类型

    是否为空

    说明

    id

    Int(4)

    否(主键)(自动生成)

    请假代号

    class_id

    varchar(10)

    班级代号

    year_id

    varchar(20)

    学期代号

    stu_number

    varchar(20)

    学生学号

    qingjia_yuanyin

    varchar(200)

    请假原因

    start_time

    datetime

    开始时间

    end_time

    datetime

    结束时间

    day_number

    Int(4)

    否(默认0)

    请假天数

    qingjia_time

    datetime

    申请请假时间

    class_teacher_status

    Int(4)

    否(默认值:0)

    班主任审批状态

    class_teacher_sp_time

    datetime

    班主任审批时间

    class_teacher_restore

    varchar(200)

    班主任回复

    college_leader_status

    Int(4)

    否(默认值:0)

    院系领导审批状态

    college_leader_id

    varchar(20)

    院系领导代号

    college_leader_sp_time

    datetime

    院系领导审批时间

    college_leader_restore

    varchar(200)

    院系领导回复

    备注:status 表示审批状态:0为等待审批,1为同意请假,2为不同意请假。

    表5-2 任课老师提交出勤信息记录表(record)

    列名

    数据类型

    是否为空

    说明

    record_id

    Int(4)

    否(自动生成)

    代号

    id

    Int(4)

    与表course_time中id关联

    record_time

    datetime

    老师考勤记载时间

    sk_time

    datetime

    上课时间

    表5-3 学生上课出勤记录表(kaoqin_record)

    列名

    数据类型

    是否为空

    说明

    kaoqin_id

    Int(4)

    否(自动生成)

    代号

    id

    Int(4)

    与表course_time中id关联

    sk_time

    datetime

    上课时间

    Stu_number

    Varchar(20)

    学生学号

    Stu_status

    Varchar(1)

    学生上课考勤状态

    说明:stu_status的值为:“2”表示旷课。“3”表示迟到。“4”表示早退。“5”表示请假。

    5.4.5 数据库的建立

    打开SQL Server2000下面的[企业管理器],登录之后,选择[新建数据库]命令,给数据库起名为kaoqin。然后通过设计器创建数据表,刚才已经说明了需要不同的数据表来分管,它们分别是“qingjia”,“kaoqin_record”,“record”等,有关这些数据表的信息见上图。

    5.5 前端操作页面设计

    5.5.1 系统登陆设计

    当不同的用户使用系统时,都要事先进行身份验证。用户在“用户名”处输入系统管理员分配的用户,选择正确的用户类型,最后输入正确密码后方能进行系统,用户名、用户类型、密码任一一个输入有误,系统都将拒绝用户使用此系统,若用户忘记了用户名或密码,请与管理员联系,本系统不支持在线找回密码功能。学生用户的用户名为学生本人的学号,密码也是学号,其它用户的用户名、密码由系统管理员指定。

    本系统在设计时,严格考虑好了系统的安全性,不允许用户不经登陆直接使用系统的任何一个网页,用户也不能绕过身份验证,即:假如一个学生用户用正确的用户名和密码进行系统后,就算他知道管理用户或其它用户的某个网页地址,也是不能打开,进行操作的,系统将自动提示没权限的错误信息。

    5.5.2 学生用户功能设计

    根据学生用户的需求,系统实现了在线请假、查看上课出勤信息、查看个人基本信息这三大主要功能。系统针对学生用户设计如下功能菜单:基本信息、请假系统、考勤信息、查看课表、修改密码、安全退出、帮助。在基本信息功能菜单中,学生可以查看自己的学号、姓名、性别、院系、年级、专业、班级号信息。在请假系统功能菜单中,实现了在线请假申请功能,以及查看等待审批的请假信息、请假成功的请假信息、请假失败的请假信息。在考勤信息菜单下,学生可以查看本学年以及历史学年上课出勤的统计信息及详细信息。在查看课表功能菜单中,学生可以查看当前学期的课表安排,以及历年的课表安排。修改密码功能菜单,学生可以修改自己的密码。本系统还自带帮助文件,方便用户在使用过程中随时查阅。

    学生用户的在线请假,在班主任或院系领导还没批假之前可以由学生自行删除,若班主任审批了请假,则学生不能删除申请记录,学生不能重复请假,因此学生请假时应当慎重。

    根据学生用户请假的需求,学生三天内的请假(包括三天)只需班主任批准后就可生效,四天(包括四天)以上的请假,必须先由班主任同意,然后学校同意,请假方能生效,超过30天的请假不能在线请假。请假开始时间必须在请假结束时间之前,否则系统自动提示出错信息,且请假时,必须指定请假开始时间,请假结束时间,以及请假原因,请假时不必要指定班主任,系统会自动根据本学期的班级与班主任安排,找到班主任,并将信息自动交给对应班主任进行审批处理,超过四天的请假还将自动交给任何一个院系领导审批处理。系统还约定学生网上请假只能提前一个星期。

    请假开始时间与结束时间的约定:请假时间学生可自动选择,也可自己输入日期,但是必须输入正确的日期格式,否则系统将出错,建议学生选择日期还不手动输入,以免出错。假若学生只请一天假,则开始时间与结束时间都选择要请假的那一天,如:一个学生2006年5月30日要请假,则开始时间、结束时间都选择2006-05-30,系统在进行处理时,自动把请假的时间设为从2006-05-30 00:00:00开始,2006-05-30 23:00:00结束。同样,请超过一天的假也是以这种方式处理的。

    在请假的详细记录中,有学生请假有关所有详细信息,包括学生请假的申请时间、开始时间、结束时间、天数、原因、审批时间、回复、请假成功与否等所有有关请假的信息,学生可以随时查看请假进展情况。

    5.5.3 任课老师用户功能设计

    根据任课老师用户需求,系统实现了任课老师在线公布学生上课出勤信息、查看学生考勤信息两大基本功能。系统针任课老师用户设计以下功能菜单:

    查看课表、考勤管理、考勤信息、修改密码、安全退出、帮助。在查看课表功能菜单下,任课老师可以查看本学期自己所带课程的上课时间以及所教班级的一些基本信息。在考勤管理功能菜单中,系统比较智能的根据当前日期自动提示当前学年还没登记的学生上课出勤表。在考勤信息功能菜单中,任课老师可以查看已经记录的学生上课出勤信息,既可以查看学生上课出勤统计信息,也可以考勤学生上课出勤统计信息,还可以做适当的修改。

    考勤管理功能是任课老师用户最主要的功能,任课老师上完课后,将传统的学生上课出勤情况在网上进行公布,使学生上课出勤信息及时准备对对班主任、院系领导、学校领导透明。根据任课老师用户的需求,系统实现了自动提示任课老师提交数据的功。根据课表安排,将本学期上完课的,还没提交数据的学生出勤情况自动提示任课老师提交数据,实现了智能化管理。比如说一个老师在2006-5-30进入了系统,那么这个老师在本学期,也就是2006-5-30之前上过的课,但还没提交数据出勤登记信息自动显示出来,等待任课老师提交数据,且任课老师在提交数据时,若学生在上课的那天请了假,且请假成功了,那么系统自动将学生出勤记录记为请假,任课老师无法记载学生为旷课等情况。

    任课老师在考勤信息当中,可以查看所教过的学生上课出勤的详细信息及统计信息,从而到了学期末,可以方便任课老师根据上课出勤情况对学生平时成绩打分。

    5.5.4 班主任用户功能设计

    根据班主任用户功能的需求,系统实现了游览班级信息、审批本班学生在线请假、及上课考勤信息三大基本功能。系统针对班主任用户设计如下功能菜单:班级信息、请假系统、考勤信息、修改密码、安全退出、帮助。在班级信息功能菜单中,班主任用户可以查看本班学生的基本信息如:年级、专业、班级、学生学号、姓名、性别。在请假系统功能菜单中,班主任可以审批本班学生的在线请假,以及查看审批学生请假的历史记录,如:同意的请假记录和不同意的请假记录。在考勤信息功能菜单中,班主任用户可以查看本班学生所有课程的上课出勤信息,包括出勤详细信息及出勤统计信息。

    班主任用户在整个系统中是学生请假的决策者,学生请假必须经班主任同意后,才能提交给院系领导审批请假。班主任在审批学生请假时,可以对学生的请假返回反馈意见,以对学生说明不同意请假的原因,或向院系领导说明情况的真实性以更好的方便学生请假。班主任另外一大功能是查看本班学生本学期的所有考勤信息,包括详细信息和统计信息,这样班主任可以及时有效的与本班同学沟通,提高办事效率,提高学生的学习成绩。

    5.5.5 院系领导用户功能设计

    根据院系领导的用户需求,系统实现了查看本院系信息、审批本院系学生请假、查看考勤信息三大基本功能。系统针对院系领导用户设计如下功能菜单:院系信息、请假系统、考勤统计、班主任信息、任课老师信息、班主任安排信息、院系课表、修改密码、安全退出、帮助。在院系信息功能菜单中,院系领导可以查看本院系的专业信息、班级信息、学生信息。在请假系统功能菜单中,院系领导可以审批经班主任同意的长时间请假,并可查看审批请假的历史记录。在考勤统计功能菜单中,院系领导可以查看本院系各班级考勤统计数据、查寻学生请假信息、考勤信息等。另外在班主任信息、任课老师信息中院系领导可以查看本院系班主任、任课老师的一些基本信息。在院系课表中可以查看本院系当前学年或历年课表安排。

    院系领导用户的主要功能是查询本院系学生上课的考勤信息及审批学生请假。院系领导可以查询本院系某个班的考勤信息,也可以查询本院系某个人的考勤信息,在查询个人考勤统计信息时,是一个模糊查询,可以根据一个完整学号,唯一的查出一个学生考勤信息,也可输入部分学号、姓名列出所有相关的考勤记录。院系领导还可查看本院系的一些基本信息,如:专业、班级、任课老师、班主任等一些基本信息。

    5.5.6 学校领导用户功能设计

    根据学样领导用户的功能,本系统实现了查看全校基本信息及学生考勤信息这两在基本功能。针对院系领导用户设计如下功能菜单:学校信息、考勤信息、院系领导信息、班主任信息、任课老师信息、班主任安排信息、全校课表、修改密码、安全退出、帮助。在学校信息功能菜单下,学校领导可以查看有关本校的一些基本信息,包括:院系信息、专业信息、班级信息、学生信息等。在考勤统计功能菜单下,学校领导可以分院系,班级查看学生考勤统计数据也可以查寻学生上课出勤信息。

    学校领导用户的功能与院系领导用户的功能基本上相同,只是查看信息的范围不一样,院系领导只能查看本院系的信息,而学校领导可以查看全校学生、任课老师、班主任等所有相关信息。由于与院系领导设计基本上一致,不再重复。

     

     

    第6章  编码

    6.1用户操作页面编码

    6.1.1 系统登陆编码

    用户登陆时操作页面如图6-1所示:

     

     
     

    图6-1 用户登陆页面

    Fig 6-1 the page of debarkation by user

     

     

    部分代号:

    chuser.jsp

    ……

    <%

    request.setCharacterEncoding("GBK");

    username=request.getParameter("username");

    password=request.getParameter("password");

    Type=(String)request.getParameter("type");

    char userType=Type.charAt(0);

    if(username==null || password==null || username.equals("") ||password.equals("")){

           out.println("<center>");

           out.println("<h1>用户名或密码输入非法!请返回重新输入!</h1><br><br>");

           out.println("<a href=javascript:history.back()>返回</a>");

           out.println("</center>");

           return;

        }

    switch(userType){

     case '1' : {sql="select * from stu_user where stu_id='"+username;

             sql+="' and stu_password='"+password+"'";

             rs=conn.executeQuery(sql);

             if(rs.next()){

               session.setAttribute("userType",Type);

               session.setAttribute("userName",username);

               session.setMaxInactiveInterval(60*60*24);

               response.sendRedirect("/kaoqin/student/student.jsp");

            }else{

               out.println("<center>");

               out.println("<h1>用户名或密码不正确</h1><br><br>");

               out.println("<a href=javascript:history.back()>返回</a>");

               out.println("</center>");

             }

             conn.close();

            break;

           }

     …………

     %>

     各页面身份验证代码:如check_stu.jsp

    <%

        if(session.getAttribute("userType")!=null && !session.getAttribute("userType").equals("")){

           String userType=(String)session.getAttribute("userType");

           if(!userType.equals("1"))

              response.sendRedirect("/kaoqin/public/error_user.jsp");

        }else{

         response.sendRedirect("/kaoqin/public/error_log.jsp");

         }

     %>

    只要在所有的学生用户页面中加入上面的代码后,用户必须先登陆后才能打开网页,且不能绕过身份验证。同样的页面对应各用户还有check_class_teacher.jsp等

    6.1.2 学生用户功能编码

    根据系统详细设计,学生用户操作页面如图6-2所示:

     

    图6-2 学生请假系统页面

    Fig 6-2 The page of the system asking for leave

     

     

    请假功能的实现的程序流程图如图6-3所示:

     

     

     

     

     

     

     

     

     

     

     

     

     

    图6-3请假系统流程图

    Fig 6-3the flow chart of the system asking for leave

    等待班主任审批

    学生请假记录

    N

    班主任审批请假

    T=0 C=0 N=?

    T=1 C=0 N=?

    T=2 C=0 N=?

    N>=4等待院系审批

    请假失败

    N<4 请假成功

    院系审批请假

    T=1 C=0 N>=4

    T=1 C=1 N>=4

    T=1 C=2 N>=4

    请假失败

    请假成功

    T=0 C=0 N=?

     

     
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    说明:T 表示班主任对请假审批结果。默认值:0

    C 表示院系领导对请假审批结果。默认值:0

    N 表示学生请假天数。默认值:0

    T、C的值为:0、等待审批。 1、同意请假。2、不同意请假。

    功能实现部分代码:

    package qingjia;

    public class QJ_Record{

              public int day_number=0;

              public int class_teacher_status=0;

              public int college_leader_status=0;

              public QJ_Record(int T,int C,int N){

                 this.class_teacher_status=T;

                 this.college_leader_status=C;

                 this.day_number=N;

              }

    }

    package qingjia;

    public class QingJia{

              public int judge(QJ_Record record){       //对请假记录进行判断,返回值为1:请假成功;

                  int T=record.class_teacher_status;    //返回值为0:等审批的请假。返回值为-1:失败的请假

                  int C=record.college_leader_status;

                  int N=record.day_number;

                  int result=0;

                  if(T==0&&C==0)

                     result=0;

                  if(T==2&&C==0)

                     result=-1;

                  if(T==1&&C==0)

                    if(N>=1&&N<4)

                       result=1;

                  if(T==1&&N>=4)

                      if(C==0)

                         result=0;

                      else if(C==1)

                               result=1;

                           else

                               result=-1;

                  return result;

              }

    }

    6.1.3 任课老师用户功能编码

    根据任课老师详细设计的要求,设计任课老师操作页面如图6-4所示:

     

     
     

    图6-4任课老师考勤管理页面

    Fig 6-4 the page of attendance management of teacher

     

     

    部分代码:

    kq_manager_m.jsp

        ……

    <%

        format=new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        String cur_time_2=format.format(cur_time);

        String sql_t="select * from year where year_id='"+year_id+"'";

        ResultSet rs_t=conn.executeQuery(sql_t);

        if(rs_t.next()){

           year_id=rs_t.getString("year_id");

           year_name=rs_t.getString("year_name");

           year_start=rs_t.getTimestamp("year_start");

           year_end=rs_t.getTimestamp("year_end");

        }

        conn.close();

        java.util.Calendar calendar=new java.util.GregorianCalendar();

        calendar.setTime(cur_time);

       calendar.set(calendar.DATE,calendar.get(calendar.DATE)-1); //限置任课老师不能管理当天学生的出勤

        java.util.Calendar calendar_1=new java.util.GregorianCalendar();

        java.util.Calendar calendar_2=new java.util.GregorianCalendar();

        calendar_1.setTime(year_start);

        calendar_2.setTime(year_end);

        ResultSet _rs=null;

        String _sql="";

        String week_name="";

        format_1=new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

       format_2=new java.text.SimpleDateFormat("yyyy/MM/dd");

        format_3=new java.text.SimpleDateFormat("yyyy/MM/dd");

        String grade_name="";

        String sp_name="";

        String class_number_name="";

        String kecheng_name="";

        _sql="select distinct kecheng_name,sp_name,grade_name,class_number_name from course_info where year_id='"+year_id+"' and teacher_id='"+teacher_id+"' and kecheng_id='"+kecheng_id+"' and class_id='"+class_id+"'";

        _rs=conn.executeQuery(_sql);

        if(_rs.next()){

           grade_name=_rs.getString("grade_name");

           sp_name=_rs.getString("sp_name");

           class_number_name=_rs.getString("class_number_name");

           kecheng_name=_rs.getString("kecheng_name");

        }

        conn.close();

        %>

        <center>

        <h3><%= year_name %><%= kecheng_name %></h3>

        <h3><%= grade_name %>级 <%= sp_name %> <%= class_number_name %>班 等待登记的上课考勤信息</h3>

           <table width="60%" border="1" cellspacing="0">

           <tr bgcolor="#0099FF">

              <td>上课时间</td>

              <td>星期</td>

              <td>第几周</td>

              <td>课时</td>

              <td><div align="center">登记</div></td>

           </tr>      

           <%

           int subDate=date.subDate(calendar_1,calendar);

           do{

              String before_time=format_1.format(calendar.getTime());

              String before_time_2=format_2.format(calendar.getTime());

              String before_time_3=format_3.format(calendar.getTime());

              int zhou=subDate/7+1;

              int day_of_week=calendar.get(calendar_1.DAY_OF_WEEK);

              switch(day_of_week){

                   case 1: week_name="星期日";break;

                   case 2: week_name="星期一";break;

                   case 3: week_name="星期二";break;

                   case 4: week_name="星期三";break;

                   case 5: week_name="星期四";break;

                   case 6: week_name="星期五";break;

                   case 7: week_name="星期六";break;

              }

              _sql="select * from course_info where class_id='"+class_id+"' and year_id='"+year_id+"' and teacher_id='"+teacher_id+"' and week_name='"+week_name+"' and kecheng_id='"+kecheng_id+"'";

              _rs=conn.executeQuery(_sql);

             if(_rs.next()){

               do{

                  String status=_rs.getString("status");

                 int pd=zhou%2;

                 if(status.equals("1")&&pd==0)

                     continue;

                 if(status.equals("2")&&pd==1)

                     continue;

                 int id_2=_rs.getInt("id");      //检查是否以经登记

                 String sql_2="select * from record where id='"+id_2+"' and sk_time='"+before_time_3+"'";

                 ResultSet rs_2=conn.executeQuery(sql_2);

                 if(rs_2.next())

                   continue;

            %>

          <tr>

             <td><%= before_time_2 %></td>

             <td><%= week_name %></td>

             <td>第<%= zhou %>周</td>

             <td><%=_rs.getString("lesson_name") %></td>

             <td><div align="center"><a href="record.jsp?id=<%=_rs.getInt("id")%>&time=<%=before_time_3%>">登记</a></div></td>

          </tr>

           <%

                 conn.close();

                 }while(_rs.next());

               conn.close();

             }

             calendar.set(calendar.DATE,calendar.get(calendar.DATE)-1);

             subDate--;

           }while(calendar.after(calendar_1)&&calendar.before(calendar_2));

           conn.close();

    %>

    ……

    6.1.4 班主任用户功能编码

    根据班主任用户的详细设计要求,设计班主任用户操作页面如图6-5所示:

     

    图6-5班主任审批请假操作页面

    Fig 6-5 the page of the leave examined and approved by teacher in charge of a class

     

     

    部分代码:

    ……

    <%

    format=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

      String sp_time=format.format(cur_time);

      sql="update qingjia set class_teacher_status='"+qj_sp+"',class_teacher_restore='"+restore+"',class_teacher_sp_time='"+sp_time+"' where id='"+id+"'";

      conn.executeUpdate(sql);

      conn.close();

      response.sendRedirect("qingjia_manager.jsp");

     %>

    ……

    6.1.5 院系领导用户功能编码

    根据院系领导用户详细设计的需求,设计院系领导用户操作页面如图6-6所示:

     

     
     

    图6-6院系领导查询学生考勤信息页面

    Fig6-6 the page of attendance information checked by college leader

     

     

    部分代码:

    select_stu.jsp

    ……

    <%

       request.setCharacterEncoding("GBK");

       sql="select * from student_c_s_c where college_id='"+college_id+"' and";

       String sql_2="";

       stu_number=request.getParameter("stu_number");

       stu_name=request.getParameter("stu_name");

       if(stu_number.equals("")&&!stu_name.equals("")){

          sql_2=sql+"  stu_name like '%"+stu_name+"%'";

       }else if(!stu_number.equals("")&&stu_name.equals("")){

                  sql_2=sql+" stu_number like '%"+stu_number+"%'";

             }else{

                     sql_2=sql+" stu_name like '%"+stu_name+"%' and stu_number like '%"+stu_number+"%'";

                  }

     %>

    <html>

      <head>

        <title>考勤统计首页</title>

        <link rel="stylesheet" href="../public/style.css">

      </head>

      <body class="ss">

      <a href="kq_tongji.jsp" class="a">全院考勤统计信息</a>&nbsp;&nbsp;

      <a href="kq_select.jsp" class="a">查询</a>&nbsp;&nbsp;

      <a href="javascript:window.location.reload();" class="a">刷新</a>&nbsp;&nbsp;

      <a href="javascript:history.back();" class="a">返回</a>

      <hr></hr>

      <center>

        <h3>查询学生考勤统计信息</h3>

        <form action="select_stu.jsp" method="post" οnsubmit="return formCheck(this)">

        <table width="70%">

          <tr>

             <td>学号:</td>

             <td><input type="text" name="stu_number" size="20"></td>

             <td>姓名:</td>

             <td><input type="text" name="stu_name" size="20"></td>

             <td><input type="submit" value="查询"></td>

          </tr>

        </table>

        </form>

        <hr width="70%"></hr>

        <table width="70%" border="1" cellspacing="0">

           <tr bgcolor="#0099FF">

              <td>学号</td>

              <td>姓名</td>

              <td>性别</td>

              <td>年级</td>

              <td>专业</td>

              <td>班级</td>

              <td><div align="center">考勤详细信息</div></td>

          </tr>

           <%

               ResultSet rs_stu=null;

               rs_stu=conn.executeQuery(sql_2);

               if(rs_stu.next()){

                  do{

            %>

            <tr>

               <td><%= rs_stu.getString("stu_number") %></td>

               <td><%= rs_stu.getString("stu_name") %></td>

               <td><%= rs_stu.getString("stu_sex") %></td>

               <td><%= rs_stu.getString("grade_name") %> 级</td>

               <td><%= rs_stu.getString("sp_name") %></td>

               <td><%= rs_stu.getString("class_number_name") %> 班</td>

               <td><div align="center"><a href="stu_kq_info.jsp?stu_number=<%= rs_stu.getString("stu_number") %>">查看</a></div></td>

            </tr>

            <%

                    }while(rs_stu.next());

               }else{

             %>

            <tr>

               <td colspan="7"><center>没有此学生记录!</center></td>

            </tr>

            <%

                }

             %>

    ……

    6.2 数据库连接池编码

    6.2.1数据库连接池程序编码

    /*  SQL Server 2000 连接池对数据库的所有操作  */

    package SQLBean;

    import javax.naming.*;

    import javax.sql.*;

    import java.sql.*;

    public class DBConn{

              public Context ctx=null;

              public Connection cnn=null;

              Statement stmt=null;

              ResultSet rs=null;

              DataSource ds=null;

    public DBConn(){                //构造函数,查找连接池资源

                 try{

                    ctx=new InitialContext();

                    if(ctx==null)

                      throw new Exception("not environment");

               ds=(DataSource)ctx.lookup("java:comp/env/jdbc/kaoqin");

                     if(ds==null)

                       throw new Exception("not find dataBase");

                 }catch(Exception e){

                    System.err.println(e.getMessage());

                 }

              }    

    //执行所有的查寻操作

              public ResultSet executeQuery(String sql){

                 try{

              cnn=ds.getConnection();       stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

                rs=stmt.executeQuery(sql);      

                 }catch(SQLException e){

                    System.err.println(e.getMessage());

                 }

                 return rs;

              }

           //执行所有的删除,修改、添加操作

              public int executeUpdate(String sql){      

              int result=0;

                 try{

                  cnn=ds.getConnection();          stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

                result=stmt.executeUpdate(sql);       

                 }catch(SQLException e){

                    System.err.println(e.getMessage());

                 }

                 return result;

              }

    //关闭与数据库的连接

              public void close() throws SQLException{                 try{

              if(rs!=null){

                 rs.close();

              }

              if(stmt!=null){

                 stmt.close();

              }

              if(cnn!=null){

                 stmt.close();

              }

              if(ctx!=null){

                 ctx.close();

              }

                 }catch(Exception e){

                      System.err.println(e.getMessage());

                 }

              }

    }

    6.2.2 连接池配置文件

    server.xml配置文件:(注:针对Tomcat 5.5)

       <Resource

        name="jdbc/kaoqin"

        type="javax.sql.DataSource"

        removeAbandoned="true"

        removeAbandonedTimeout="15"

        maxActive="200"

        maxIdle="40"

        maxWait="5000"

        username="sa"

        password="8482134"

        driverClassName="net.sourceforge.jtds.jdbc.Driver"

        url="jdbc:jtds:sqlserver://127.0.0.1:1433/kaoqin"

        />

    kaoqin.xml配置文件 (注:针对Tomcat 5.5)

    <?xml version="1.0" encoding="UTF-8"?>

    <Context>

       <Resource

        name="jdbc/kaoqin"

        type="javax.sql.DataSource"

        removeAbandoned="true"

        removeAbandonedTimeout="15"

        maxActive="200"

        maxIdle="40"

        maxWait="5000"

        username="sa"

        password="8482134"

        driverClassName="net.sourceforge.jtds.jdbc.Driver"

        url="jdbc:jtds:sqlserver://127.0.0.1:1433/kaoqin"

        />

    </Context>

     

    第7章  软件测试

    7.1 引言

    在开发软件的过程中,人们使用了许多保证软件质量的方法分析、设计和实现软件,但难免还会在工作中犯错误。这样,在软件产品中就会隐藏许多错误和缺陷,尤其是对规模大、复杂性高的软件更是如此。所以,必须进行认真、计划、彻底的软件测试。

    7.2 测试方案

    7.2.1 黑盒测试

    黑盒测试,又称为功能测试。对于软件测试而言,黑盒测试把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。该测试方案的设计技术主要有:等价划分、边界值分析以及错误推测法等。

    7.2.2 白盒测试

    白盒测试的前提是可以把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否能按预定要求正确工作。故白盒测试又被称为是结构测试。该测试方案的设计技术主要有逻辑覆盖法等。

    7.2.3 其它测试方案

    除了以上两种测试方案外,还有其它的测试方案。包含所有可能情况的测试称为穷尽测试。对于实际程序而言,穷尽测试通常是不可能做到的。因为不可能对每一种可能的情况都进行测试。

    7.2.4 本系统所采用测试方案

    基于以上测试方法,本人选取的是模块测试和系统测试,模块测试部分由本人程序设计过程中自主完成,系统测试部分由同学模拟各种用户登录代为完成。

    7.3 测试过程

    7.3.1 用户登陆测试

    用户登陆测试是测试系统访问的安全性,以及各个页面的设计的安全性,测试方案如下(表6-1)所示:

    表 6-1

    用户类型

    用户名

    密码

    空密码

    错误密码/用户名

    错误类型

    学生

    2002162122

    2002162122

    任课老师

    041002

    123456

    班主任

    048001

    123456

    院系领导

    xinxi_02

    123456

    学校领导

    school

    123456

    说明:上表中的“否”表示拒绝访问,没有通过系统的身份验证。“是” 表示可以访问系统。

    通过上表反复测试黑盒测试可知,系统用户在登陆安全方面不存在问题,用户必须选择正确的类型,使用正确的用户名、密码方能使用此系统。

    7.3.2 页面使用安全测试

    此测试过程主要是测试系统各个页面的安全性,即在用户没有登录的情况直接在浏览器地址中输入要打开的用户页面,或者用户以正确的用户名和密码进入系统后,直接在浏览器地址中输入别的用户的页面,测试各页面是否不需要用户登录就可使用,或者是否可以绕过身份验证。

    第一步:在用户没登陆系统的情况下,直接在浏览器中输入http://127.0.0.1/kaoqin/student/student.jsp 此地址是学生用户首页的完全地址,看是否能打开操作。测试结果:提示用户还没登陆的错误信息。依次测试别的页面,别的用户,测试结果都是:提示用户还没登陆的错误信息。

    第二步:以学生正确的用户我和密码进入学生系统后,在浏览器中输入任课老师首页地址:http://127.0.0.1/kaoqin/teacher/teacher.jsp 看是否能绕过身份验证,打开别的用户的页面。测试结果:提示没有权限的错误信息。用同样的方法测试别的页面,别的用户都得到了同样的测试结果:提示没有权限的错误信息。

    测试结果:通过以上测试可知,系统各个页都有很好的安全性,每个页面都不允许用户在没有登陆的前提下访问,用户在登陆后,也不充许用户访问别的用户类型的页面,即不能绕过身份验证。

    7.3.3学生用户测试

    • 请假系统测试

    请假系统是学生用户的核心功能,由于涉及的用户比较多,此部分的测试是在几个同学的配合下完成,主要完成以下几个测试:

    1. 空值测试:在请假开始时间、结束时间、请假原因都为空或部分为空的情况下,直接点提交数据在线请假。测试结果:系统拒绝提交数据,并能正确的做出相应的提示,如**不能为空的错误信息。
    2. 错误的时间选择测试:在开始时间与结束时间选择的时间,把结束时间选择一个开始时间以前的时间,然后提交数据。测试结果:提示时间选择错误的提示信息。
    3. 超前请假测试:开始时间选择一个与当前时间相差一个大于7天的日期请假。测试结果:提示只能提前7天请假的错误信息。
    4. 超后请假测试:在开始时间中选择一个当前系统时间以前开始日期请假。测试结果:提示不能请过去时间的假的错误信息。
    5. 超长时间请假测试:在开始时间与结束时间中,选择一个相差30的日期请假。测试结果:提示不能请大于30天的请假。
    6. 重复请假测试:先申请一条当天日期的请假,申请成功后,再申请一条今天到明天两天的请假。测试结果:提示不能重复请假的错误信息。
    7. 小于4天的请假测试:开始时间与结束时间之差小于四天的请假测试。测试结果:提交数据后,在等待审批的请假记录中出现一条新的记录,并显示了申请时间,班主任审批处显示了“等待批假”的提示信息,而院系审批处没有显示“等待批假”的提示信息。
    8. 大于4天的请假测试:开始时间与结束时间之差大于四天的请假测试:测试结果:提交数据后,在等待审批的请假记录中,班主任审批处以及院系领导审批处都提示“等待批假“的提示信息。
    9. 班主任批假测试:班主任进入系统后,测试审批学生请假。测试结果:小于四天的请假,班主任若同意了请假,则学生记录成功记录中出现了请假成功的记录。班主任同意的请假中同时也出现了此条记录。若不同意请假,则提示此学生请假失败。大于四天的请假,班主任若同意了请假,则出现等待院系审批的提示信息。
    10. 院系批假测试:院系领导进入系统后,大于四天的记录,且班主任同意请假的记录出现在了等待审批的请假记录中。测试结果:同意请假,则学生、班主任、院系领导用户中同时出现请假成功信息,不同意请假,则学生、班主任、院系领导同时出现请假失败的信息。

    二、修改密码测试

    1. 空值测试:在不输入原始密码、新密码、确认密码或部分为空的情况下,直接点击修改密码。测试结果:提示请输入原始密码的错误信息。
    2. 错误原始密码测试:输入错误原始密码,新密码、确认密码一致的测试。测试结果:提示原始密码不正确的错误信息。
    3. 确认密码不正确的测试:输入正确的原始密码,而确认密码不正确的测试。测试结果:提示确认密码不正确的错误信息。

    7.3.4任课老师用户测试

    一、考勤管理测试

    1. 正确提示登记测试:进入指定的登记页面,修改系统日期看是否能根据系统日间的变化,显示出上过课,但学没登记的提示信息。测试结果:若当前日期为2005-05-30,则本学期在2005-05-30前的所有不没登记的考勤信息自动列出来,而且能自动识别课表安排的单/双周。更换时间,都能得到正确的结果。
    2. 考勤登记测试:进入指定页面后,一个学生在当天上课时已经请假成功了,任课老师提交数据时选择此学生旷课。测试结果:在考勤统计信息和详细信息中,出现了此学生请假的出勤信息。

    7.3.5班主任用户测试

    1.班级信息测试

    测试一个班主任是否可以同时带多个班级、每个学期带不同的班。测试结果:班主任能同时带多个班级,每学期可带不同的班级。

    2.考勤信息测试:

    测试班主任是否可以查看本班学生本学期考勤统计信息及详细信息。测试结果:班主任能查看本班学生本学期考勤统计信息及详细信息。

    7.3.6院系领导/学校领导用户测试

    一、考勤信息测试

    1. 空值查询测试:在查询学生考勤信息页面中,不输入查询条件进行查询测试。测试结果:提示必须有一个查询件的错误信息。
    2. 单条件下查询测试:查询条件在只有学号或姓名的情况下进行查询。测试结果:系统列出了所有相关记录,如姓名中只有一个“王”字,那么全院/全校所有姓名中有“王”字的学生信息都全部列出来,并都可以查看详细考勤信息

     

    总 

    通过几个月的努力,高校学生考勤管理系统中的两大功能模块:请假系统和考勤系统在指导老师的全心指导下,在同学的积极配合与帮助下,基本功能顺利完成。在数据库的开发方面,我学到了不少关于JSP和SQL Server 2000的知识。开发时遇到了许多的困难,但是通过自己的努力,还有老师同学们的帮助,最终还是迎刃而解了。

    这次毕业设计完全是按照软件工程学的方法来进行设计和开发的。在开发过程中,认真调查分析了用户的需求,及时准备了详细的文档资料,这让我在开发过程中少走了许多弯路。本次设计开发的系统较为庞大,涉及的用户较多,数据库设计比较复杂,使我深刻地体会到软件开发是一项集体项目,单靠一个人就想解决所有的问题是不太实际的。在本次毕业设计中,我和同学共同实现了高校学生考勤管理系统的全部功能,很好的锻炼了我的团队协作意识,这对我以后的学习、工作有很大的帮助。

    同时,在这次设计中,我也发现了自己的很多不足。首先,对JSP的掌握还不是很全面,对于数据库管理系统的操作运用也不够熟练,以至于在系统开发过程中经常碰到一些疑难问题不能快速的解决。其次,就是在准备系统设计文档时,没有反复推敲、验证,以至于在开发过程中出现几次由于数据库设计不合理,修改数据库,而几乎修改所有程序代码的情况。再者,是对整个软件开发的把握能力有待于进一步提高,以及对网页设计的诸多方面知识也待进一步学习,这些都是我今后应该注意和提高的。

     

     

    参考文献

    参考的资料有以下:

    [1] 肖金秀 JSP程序设计教程 北京:冶金工业出版社

    [2] 孙晓龙 JSP动态网站技术入门与提高 北京:人民邮电出版社

    [3] 杨学瑜 JSP入门与提高 北京:清华大学出版社

    [4] 鲁晓东 JSP软件工程案例精解 北京:电子工业出版社

    [5] 印旻 Java 语言与面向对象程序设计 北京:清华大学出版社

    [6] 皮德常 Java 2简明教程 北京:清华大学出版社

    [7] 萨师煊 王珊编著,《数据库系统概论》,高等教育出版社

    [8] 张海藩 编著 《软件工程导论》,清华大学出版社

    [9] 赛奎春 JSP工程应用与项目实践 北京:机械工业出版社

    [10] 汪孝宜 JSP数据库开发实例精粹 北京:电子工业出版社

    [11] 魏茂军 JSP案例开发 北京:中国水利水电出版社

    [12] 黄明 JSP信息系统设计与开发实例 北京:机械工业出版社

    [13] 屈辉立 JSP网站编程教程 北京:北京希望电子出版社

    [14] 孙卫琴 Tomcat与Java Web开发技术详解 北京:电子工业出版社

    [15] 张桂元 Struts开发入门与项日实践 北京:人民邮电出版社

    参考网站:

    一、http://java.sun.com     java官方网站

    二、http://www.apache.org  Tomcat官方网站

     

    致 

    在这段日子里,指导教师黄华,以及身边的同学给了我很多的帮助及耐心的教导。在此,对所有给我支持与帮助的老师与同学衷心的道一声“谢谢”!如果没有你们的帮助,我的课题肯定不能如此顺利迅速的完成。

     

    附 

    附录一:文献资料

    原文

    J2EE WEB应用架构分析

    1、架构概述

    J2EE体系包括java server pages(JSP) ,java SERVLET, enterprise bean,WEB service等技术。这些技术的出现给电子商务时代的WEB应用程序的开发提供了一个非常有竞争力的选择。怎样把这些技术组合起来形成一个适应项目需要的稳定架构是项目开发过程中一个非常重要的步骤。完成这个步骤可以形成一个主要里程碑基线。形成这个基线有很多好处:

    各种因数初步确定:为了形成架构基线,架构设计师要对平台(体系)中的技术进行筛选,各种利弊的权衡。往往架构设计师在这个过程中要阅读大量的技术资料,听取项目组成员的建议,考虑领域专家的需求,考虑赞助商成本(包括开发成本和运行维护成本)限额。一旦架构设计经过评审,这些因数初步地就有了在整个项目过程中的对项目起多大作用的定位。

    定向技术培训:一旦架构师设计的架构得到了批准形成了基线,项目开发和运行所采用的技术基本确定下来了。众多的项目经理都会对预备项目组成员的技术功底感到担心;他们需要培训部门提供培训,但就架构师面对的技术海洋,项目经理根本就提不出明确的技术培训需求。怎不能够对体系中所有技术都进行培训吧!有了架构里程碑基线,项目经理能确定这个项目开发会采用什么技术,这是提出培训需求应该是最精确的。不过在实际项目开发中,技术培训可以在基线确定之前与架构设计并发进行。

    角色分工:有了一个好的架构蓝图,我们就能准确划分工作。如网页设计,JSP 标签处理类设计,SERVLET 设计,session bean设计,还有各种实现。这些任务在架构蓝图上都可以清晰地标出位置,使得项目组成员能很好地定位自己的任务。一个好的架构蓝图同时也能规范化任务,能很好地把任务划分为几类,在同一类中的任务的工作量和性质相同或相似。这样工作量估计起来有一个非常好的基础。

    运行维护:前面说过各个任务在架构图上都有比较好的定位。任何人能借助它很快地熟悉整个项目的运行情况,错误出现时能比较快速地定位错误点。另外,有了清晰的架构图,项目版本管理也有很好的版本树躯干。

    扩展性:架构犹如一颗参天大树的躯干,只要躯干根系牢,树干粗,长一些旁支,加一些树叶轻而易举无疑。同样,有一个稳定的经得起考验的架构,增加一两个业务组件是非常快速和容易的。

    大家都知道这些好处,一心想形成一个这样的J2EE应用程序架构(就像在windows平台中的MFC)。在这个路程中经历了两个大的阶段:

    模型1

    模型1其实不是一个什么稳定架构,甚至谈不上形成了架构。模型1的基础是JSP文件。它从HTTP的请求中提取参数,调用相应的业务逻辑,处理HTTP会话,最后生成HTTP文档。一系列这样的JSP文件形成一个完整的模型1应用,当然可能会有其他辅助类或文件。早期的ASP 和 PHP 技术就属于这个情况。

    总的看来,这个模型的好处是简单,但是它把业务逻辑和表现混在一块,对大应用来说,这个缺点是令人容忍不了的。

    模型2

    在经过一番实践,并广泛借鉴和总结经验教训之后,J2EE应用程序终于迎来了MVC(模型-视图-控制)模式。MVC模式并不是J2EE行业人士标新立异的,所以前面我谈到广发借鉴。MVC的核心就是做到三层甚至多层的松散耦合。这对基于组件的,所覆盖的技术不断膨胀的J2EE体系来说真是福音和救星。

    它在浏览器(本文对客户代理都称浏览器)和JSP或SERVLET之间插入一个控制组件。这个控制组件集中了处理浏览器发过来的HTTP请求的分发逻辑,也就是说,它会根据HTTP请求的URL,输入参数,和目前应用的内部状态,把请求分发给相应的WEB 层的JSP 或SERVLET。

    另外它也负责选择下一个视图(在J2EE中,JSP,SERVLET会生成回给浏览器的html从而形成视图)。集中的控制组件也有利于安全验证,日志纪录,有时也封装请求数据给下面的WEB tier层。这一套逻辑的实现形成了一个像MFC的应用框架。

    2、候选方案

    目前,实现模型2的框架也在不断的涌现,下面列出比较有名的框架。

    2.1、Apache Struts

    Struts是一个免费的开源的WEB层的应用框架,apache软件基金致力于struts的开发。Struts具是高可配置的性,和有一个不断增长的特性列表。一个前端控制组件,一系列动作类,动作映射,处理XML的实用工具类,服务器端java bean 的自动填充,支持验证的WEB 表单,国际化支持,生成HTML,实现表现逻辑和模版组成了struts的灵魂。

    模型:模型以一个或几个java bean的形式存在。这些bean分为三种:Form beans(表单Beans),它保存了HTTP post请求传来的数据,在Struts里,所有的Form beans都是 ActionFrom 类的子类。业务逻辑beans,专门用来处理业务逻辑。系统状态beans,它保存了跨越多个HTTP 请求的单个客户的会话信息,还有系统状态。

    视图:控制组件续传HTTP请求给实现了视图的JSP文件。JSP能访问beans 并生成结果文档反馈到客户。Struts提供JSP 标签库: Html,Bean,Logic,Template等来达到这个目的,并有利于分开表现逻辑和程序逻辑。

    2.2、JATO

    JATO应用程序框架是iPlanet 应用程序框架的旧名。它是一个成熟的、强大的,基于J2EE标准的面向于开发WEB应用程序的应用框架。结合了显示字段、应用程序事件、组件层次和以页面为中心的开发方法、以及MVC和服务到工作者service-to-workers的设计模式等概念。

    JATO可适用于中、大、超大规模的WEB应用。但是它也不是一个企业层的应用框架,也就是说它不会直接提供创建EJB, WEB services等企业层组件的方法,但用它可以构造出访问企业层组件的客户应用。

    这个框架功能主要有三部分组成:iPlanet应用框架核心;iPlanet应用框架组件;iPlanet应用框架扩展。

    译文

    Analysis of J2EE WEB application  construction

    1、the  outline of the construction

    J2EE system includes many technologies such as  java server pages (JSP), java SERVLET, enterprise bean, WEB service and so on. These technologies appeared have provided an extremely competitive choice to the development of WEB application of electronic commerce . How these technologies are combined to form the stable construction which an adaptabl project needs is an importable step in the project development. Completing this step may form a main milestone baseline. It is a advantage to form this baseline.

    Many factors determine it initially.In order to form the construction baseline, the construction designer must choose the center technology in the platform and measure each kind of advantages. Often the construction designer has to check the massive technical datas in this process, listen to the suggestion of members in the component project, consider the domain expert's demand and consider the sponsor’s cost quota (including development cost and movement maintenance cost). Once the construction designer appraises, these factors will initially be localizated to the project playing the major role in the entire project process.

    Directional technology training: Once the construction of the construction designer is approved to form the baseline, the technology which the project development and the movement use  has basically determined. Multitudinous project managers may worry about basic skills of  the component members’ prepared in the project.They need to be trained in  the department  providing training.But to the technical sea which the construction designer faces on, project manager cannot propose the explicit technical training demand. It is impossible to carry on training to all technologies in the system ! Having the construction milestone baseline, project manager is able to determine what this project development could use any technology.At the time proposing the training demand should be most precise. But in the actual project development, technical training may be carried on before the baseline determined concurrently.

    Division of labor: Having  a good construction blueprint, we can accurately divide the work such as  homepage design, JSP label processing class design, SERVLET design, session bean design and  many kinds of realizations. These all duties may be located  clearly  on the construction blueprint, enabling the project component member to locate own duty well. At the same time a good construction blueprint can also standardize the duty,  divide well the duty into several kinds in the same kind of which work load and the nature is identical or similar.Such work load estimated has an extremely good foundation.

    Movement maintenance: each duty has  quite good localization in a composition. Anyone can is familiar with the movement in the entire project with the help of it quickly and locate  fast where wrong is when the mistake appears. Moreover, having  the clear frame composition, the project edition management also has  good edition tree torso.

    Extension: The construction  likes the torso of a towering big tree.so long as torso root system jail, bough thick, the long some collateral branches, add some leaves to be easy without doubt. Similarly, having stable construction standing  the test, it is extremely fast and easy to increase 12 service modules.

    Everybody knows these advantage and wants to  form a such J2EE application construction as it  (like MFC in windows platform). It has experienced two big stages in this process:

    model 1

    Actually model 1 is not  stable  construction, even  far from the construction formed. The foundation of model 1 is  JSP document. It withdraws the parameter from the HTTP request, transfers the corresponding service logic, processes the HTTP conversation and finally produces the HTTP documents. A series of such JSP document forms a complete model 1 application, certainly possibly having other assistances kind or the document. The earlier ASP and the PHP technology belongs to this situation.

    To the summary, the advantage of this model is simple, but it mixes the service logic with the performance in the same place. To the big application, this shortcoming is able to be tolerated.

    model 2

    Through practice, after summarying lesson, the J2EE application has finally welcomed the MVC (model - view pneumatic-control) pattern. The MVC pattern is not something new and different which the J2EE professioner proposes.Therefore in the front I talked about profiting widely. The core of the MVC is to achieve three or even multi-layered loose couplings. To the J2EE system which has  to based on the module and which covered the technology inflates unceasingly,it really is the gospel and the liberator.

    It inserts a control module between in the browser ( in this article all the customer proxys are called browser) and JSP or SERVLET. This control module concentrates HTTP request distribution logic which is sent by the browser processed.In other words, it could  input parameter according to HTTP request URL,with the present application internal condition, giving the request to distribute the JSP or SERVLET of the corresponding WEB level.

    Moreover, it also is responsible for  choicing next view (in J2EE, JSP and SERVLET can produce html for browser to form the view). The centralism control module is also advantageous to the safety certification, the diary record and sometimes also seals the request data to give the following WEB tier level. This set of logical realization forms one application frame like MFC.

    2、candidate plan

    At present, the realization frames of the model 2 also emerge unceasingly. list some famous frames as follows.

    2.1、Apache Struts

    Struts is a free and open application frame of the source WEB level.And the apache software fund devotes to the development of the struts. Struts has the nature which is highly disposed and  has the characteristic tabulation which grows unceasingly.  The front controlling  module, a series of movements class, the movement mapping, the practical tool class processing XML, the automatic packing of the server carries java bean, the WEB form supporting confirmation , the international support, the produced HTML , realization performance logic and the pattern plate has composed the soul of

    the struts.

    Model: Model exists as one or  several java beans. These beans are divided into three kinds. Form beans (form Beans), it has preserved the data which the HTTP post requests to transmit. In Struts, all of the Form beans are  the subclass of the ActionFrom class. Service logic beans is to be used to process the service logic specially. System mode beans preserve the conversation information of single customer who surmountes many HTTP requests and  the system mode.

    View: Continue to pass the HTTP by the Controlled module request   realizes the JSP document of view. JSP can visit beans and produce the result documents to feed back to the customer. Struts provides the JSP label storehouse to achieve this goal such as Html, Bean, Logic, Template and so on. And  it is advantageous in separating the performance logic and procedure logic.

    2.2、JATO

    The JATO application frame is  old name of the iPlanet application frame. It is one mature, formidable application frame which faces to  develope WEB application based on the J2EE standard. It unified the demonstration field, the application event, the module level ,the methods of exploitation taking the page as the center, as well as MVC and designing pattern with service-to-workers concepts and so on.

    JATO is suitable  for  big, ultra large-scale WEB application. But it is not application frame of the enterprise level.In other words, it cannot provide directly the methods of Enterprise level module such as founding EJB and WEB services. But it may struct the customer application which can visit the enterprise level module.

    The function of this frame is mainly composed of three parts:the core of iPlanet application frame; the module of iPlanet application frame; the expansion of iPlanet application frame.

    附录二、系统部署及使用手册

    开发工具的安装与配置

    本系统是跨平台的,可以在Windows、Linux、Unix等所有操作系统下,不需要做任何修改就能运行,由于Windows平台运用最为广泛,在这里只介绍系统在Windows平台下的部署,别的平台部署自己查阅相关资料。本系统采用B/S结构,因此客户端几乎不需要做任何安装,以下主要介绍服务器端的部署。

    • JDK的安装及配置

    1)简介

       JDK(Java Development Kit )是一切java应用程序的基础,可以说,所有的java应用程序是构建在这个之上的。它是一组API,也可以说是一些java Class。目前已经正式发布的最新版本是JDK1.5。目前大多数都是在MS系统下,所以,在这里以在win2000下安装为例进行介绍。

    2)下载与安装

       下载地址为JAVA官方站点:http://java.sun.com 。 Windows下,直接运行.exe文件,安装到一个目录,我这里用C:\ jdk1.5.0_06为例子。

    3)配置

    桌面上选择“我的电脑”(右键) 选择“高级”---> “环境变量”-->“用户变量”-->“新建”在变量名中输入:CLASSPATH,变量值中输入:“.;C:\ jdk1.5.0_06\LIB\dt.JAR;C:\ jdk1.5.0_06\LIB\TOOLS.JAR;”然后确定;注意:“.;”不能少,代表当前路径。

    桌面上选择“我的电脑”(右键) 选择“高级”---> “环境变量”--->“系统变量”,选择path选项,点“编辑” 在变量值中增加“C:\jdk1.5.0_06\bin;”。

    配置完了,要重新启动计算机后,环境变量才能有效。

    • Tomcat的安装及配置

    1)简介

    自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet。Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。目前最新版本是 tomcat-5.5.16。

    2)下载与安装

    下载地址是官方网站http://jakarta.apache.org 。用户可选择下载原代码或已经编译好的压缩包。

    在安装Tomcat前,你的Win2000下应该已经安装了JDK,并且你应该已经能大致了解JDK、Tomcat在系统中的地位和相互关系。如果你还没有安装好JDK,你可以参阅JDK的安装及配置。Tomcat不需要安装,下载解压后就可直接使用,且可在各种平台下使用。

    3)配置

    在桌面上选择“我的电脑”,右键点出菜单,选择属性,弹出对话框“系统特性”,选择“高级”选项页,然后点“环境变量”,就可以编辑系统的环境变量。

    在用户变量中选择“新建”选项,变量名为JAVA_HOME,值为:“C:\jdk1.5.0_06”,同样新建另外一个变量名为:TOMCAT_HOME,变量值为:“C:\Tomcat 5.5”。

    接下来就可以执行startup.bat。测试一下Tomcat是否运行正常。当Tomcat能正常启动后,打开浏览器,在浏览器中输入“http://localhost:8080”,若能显示Tomcat的欢迎首页,Tomcat已经成功安装好了。

    三、SQL Server 2000的安装及配置

    1)简介

    SQL Server 2000是Microsoft 公司开发出来的大型关系数据系统,其可靠性、高全性等卓越的性能得到用户一致的好评。

    2)安装

    将安装光盘放入光驱就可根据提示自动安装,这里不再重述。

    3)配置

    安装好SQL Server 2000后,几乎不需要做什么配置,但有一个非常要注意的地方是,检查一下默认的端口1433是否打开了,若没打开,应用程序将无法连接到数据库。检验方法:支命令提示下运行:netstat –an 检查端口是否打开。若没打开,就要安装SP3以上的补丁。

    系统部署

    高校学生考勤管理系统用JSP+SQL Server 2000设计,数据库连接使用当前流行的连接池来实现,在部署系统时,请按以下步骤来完成。注意:前提是您以经正确安装好了JDK、Tomcat、SQL Server 2000,若还没安装好,请参考附录一。

    • 将打包文件kaoqin.war 放到Tomact安装目录下的webapps子目录中,在您重启Tomcat的时候,Tomcat会自动解压。
    • 在SQL Server 2000中新名kaoqin的数据库,将数据库备份kaoqin.bak还原到kaoqin数据库,并将sa用户的密码设为:8482134。
    • 将jtds-1.2.jar文件考%Tomcat_home%\common\lib目录下。
    • 将server.xml文件覆盖%Tomcat_home%\conf目录下的server.xml文件。
    • 将kaoqin.xml文件拷贝到%Tomcat_home%\conf\Catalina\localhost目录下。
    • 重新启动Tomact,在浏览器中输入http://localhost:8080/kaoqin

    用户操作手册

    一、学生操作手册

    1.在线请假

    学生“首页”——“请假系统”——“在线请假” 进入请假申请操作页面,填写好请假开始时间、结束时间、请假原因后,点击“提交”按钮就完成了请假申请。随后您可以在“等待审批的请假”中看到请假审批的进展情况,同时在“成功的请假记录”和“失败的请假记录”中看到请假历史记录。注意:只请假一天的话,开始时间与结束时间填写同一天,依此类推。

    2.查看考勤信息

    学生“首页”——“考勤信息”进入当前学年本人所有课程的考勤统计信息,同时可以查看有关课程的详细信息,学生在“历年考勤信息”中可以查看历年的考勤信息。

    二、班主任操作手册

    1.审批学生请假

    班主任“首页”——“请假系统”——“审批请假” 若有本班学生请假,则列出了相关链接,点击相关“审批”链接,进入审批学生请假页面,此页面列出了有关学生请假的详细信息,班主任认真审批后,选择“同意”或“不同意”来审批学生请假。

    2.查看考勤信息

    班主任“首页”——“考勤信息”页面列出所带班级的信息,点击相关“查看”链接就可相关班级所有课程学生考勤的统计信息及详细信息。

    三、任课老师操作手册

    1.发布学生上课出勤信息

    任课老师“首页”——“考勤管理”页面列出了本学年所教班级以及所教课程的相关信息,点击相关“管理“链接”就进入相关的考勤管理页面,页面自动提示到当前日期为止,还没有发布的出勤信息的链接。进入相关链接就可以发布学生上课出勤信息。

    2.查看/修改学生出勤信息

    任课老师:“首页”——“考勤信息”页面中列出了所教班级所教课程的基本相关信息,点击相关“查看”链接就可看到有关的学生出勤统计信息及详细信息,在个人的出勤详细中,可以适当的修改,如删除某条学生出勤记录。

    四、院系领导操作手册

    1.审批学生请假

    院系领导“首页”——“请假系统”——“审批请假” 若有本班学生请假,则列出了相关链接,点击相关“审批”链接,进入审批学生请假页面,此页面列出了有关学生请假的详细信息,班主任认真审批后,选择“同意”或“不同意”来审批学生请假。

    2.查看班级、学生上课出勤信息

    院系领导“首页”——“考勤统计”页面,在“全院考勤统计”页面中可以分班级查看学生上课出勤的统计信息及详细信息。在“查询”页面中,可以根据“学号”或“姓名”两者或两都之一对学生上课出勤信息进行详细查询。

    3.查看本院系相关信息

    在“院系信息“、”班主任信息“、”教师信息“、”班主任安排“中可以查看本院系的一些相关信息。

    五、学校领导操作手册

    1.查看全校班级、学生上课出勤信息

    学校领导“首页”——“考勤统计”页面,在“全校考勤统计”页面中可以分班级查看学生上课出勤的统计信息及详细信息。在“查询”页面中,可以根据“学号”或“姓名”两者或两都之一对学生上课出勤信息进行详细查询。

    2.查看本校相关信息

    在“学校信息”、“院系信息“、”班主任信息“、”教师信息“、”班主任安排“、“全校课表”中可以查看本校的一些相关信息。

    展开全文
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

    前言

      我知道有很多人都写过,以即我之前做系统的时候也看过不少,但是还是错误百出,有的是版本不一致,有的是语法更新突然改了,所以这里我再写一篇,仅用于自我学习,如果对你有帮助我会感到很高兴。
      这里说明一下我用的mongo版本是3.4.4。

    第二章可以不看

    mongo3.4.4下载链接如此链接:
    https://pan.baidu.com/s/1o22QRYFZb1gC6QQW_x5USw 提取码:alax

    Chapter 1. 安装简要

    第一节 下载安装mongo

    https://www.mongodb.com/download-center/community
    在这里插入图片描述
    在这里插入图片描述

    第二节 配置mongo

    在你想安置数据库数据的地方创建文件夹,我这里用的位置是E盘下的Study文件夹下的MongoDB文件夹,创建logs、ect、data三个文件夹
    在这里插入图片描述
    在logs文件夹下新建mongo.log文件(新建文本文档改后缀)
    在这里插入图片描述
    Data专门存放数据库文件

    在这里插入图片描述

    新建并修改ect文件夹下的配置文件mongo.conf

    #数据库路径
    
    dbpath=E:\Study\MongoDB\data\
    #日志输出文件路径
    
    logpath=E:\Study\MongoDB\logs\mongodb.log
    #错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
    
    logappend=true
    #启用日志文件,默认启用
    
    journal=true
    #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    quiet=true
    
    #端口号 默认为27017
    port=27017
    storageEngine=mmapv1
    #http配置
    httpinterface=true
    

    在这里插入图片描述
    打开mongo安装后的根目录,复制这个路径,添加环境变量,简化cmd步骤
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    打开cmd,把mongo添加进服务

    mongod --config E:\Study\MongoDB\etc\mongo.conf --install --serviceName "MongoDB"
    

    在这里插入图片描述
    执行mongo,可以直接开启数据库了
    在这里插入图片描述

    浏览器访问localhost:27017,说明启动成功
    在这里插入图片描述

    第三节 安装mongoVue

    mongoVue哪都能下到(如果我链接掉了的话),
    一路next安装
    在这里插入图片描述
    点击绿色加号新建连接,名字随便起,Server写127.0.0.1,port写27017
    在这里插入图片描述
    这样就完事了
    在这里插入图片描述

    Chapter 2. 数据库语法简要

    本章节来自于当初自学的时候留下的笔记,有些地方可能忘了,非重点,可以不看本章
    查看数据库
    show dbs
    创建(使用)数据库
    use demo
    创建一个user集合(表)
    db.createCollection("demo")
    往users表里插入一条数据
    db.users.insert({id:100,name:"names"})

    在这里插入图片描述
    查看集合(表)
    show collections
    删集合(貌似是删所有集合?时间太久忘了)
    db.dropDatabase()
    删user集合
    db.user.drop()
    在这里插入图片描述
    往user集合里插入一条数据
    db.user.insert({id:100,name:"names",class:{name:"baidu",id:100}})
    在这里插入图片描述
    查看user集合下数据
    db.user.find()
    格式化查看user集合下数据
    db.user.find().pretty()
    在这里插入图片描述
    查看user集合下第一条数据
    db.user.findOne()
    更改user集合下id为100的数据
    db.user.update({id:100},{$set:{name:"lala"}})
    在这里插入图片描述
    查找user集合下id为100的数据
    db.user.find({id:100})
    查找user集合下id大于102的数据
    db.user.find({id:{$gt:102}})
    查找user集合下id小于102的数据
    db.user.find({id:{$lt:102}})
    查找user集合下id等于100的数据
    db.user.find({id:{$eq:100}})
    查找user集合下id大于等于102的数据
    db.user.find({id:{$gte:102}})
    在这里插入图片描述
    删除user集合下等于105的数据
    db.user.remove({id:105})
    在这里插入图片描述

    Chapter 3. pymongo语法详细

    # coding=UTF-8 #字符集为UTF-8
    from pymongo import MongoClient #导入pymongo
    import datetime #导入时间模块
    
    client = MongoClient('localhost', 27017)  # 地址与接口
    database = client.get_database('test')  # 数据库名
    collection = database.get_collection('ttest')  # 表名
    

    以下内容展示的前提就是我们已经访问了数据库并且拿到一个叫collection的集合,请在测试学习的同学改成自己的数据库名和表名

    第一节 增

     首先我们想在程序里建立单个学生的数据结构如下

    doc = {
        '_id': studentID,#字符串
        '姓名': name,#字符串
        '性别': sex,#字符串
        '年龄': age,#数字
        '课程': Projects,#字符串
        '级别': great,#数字
        '班级': classes,#字符串
        '教师': teacher,#字符串
        '上课时间': time,#字符串
        '总课时': int(num),#数字
        '当前课时': int(sum),#数字
        '提醒日志': awake,#数字
        '学员考勤': []#list
    }
    

    我们给所有变量赋值后放到数据库里

    第1.1节 增加项

    doc = {
        '_id': "10010130",
        '姓名': "seven的小孩",
        '性别': "男",
        '年龄': 19,
        '课程': "Python",
        '级别': 1,
        '班级': "Python",
        '教师': "Seven",
        '上课时间': "10月1",
        '总课时': 10,
        '当前课时': 0,
        '提醒日志': 1,
        '学员考勤': []
    }
    
    def insert(document):
        result = collection.insert_one(document)
        return result
    

    那么这里我们调用一下insert(),return出来的东西是<class ‘pymongo.results.InsertOneResult’>,这个类有两个重要属性
    在这里插入图片描述
    .inserted_id的值是成功插入后获取的唯一_id值,
    .acknowledged的值是True或False(是否成功插入,如果_id重复就是False),

    doc = {
        '_id': "10010130",
        '姓名': "seven",
        '性别': "男",
        '年龄': 19,
        '课程': "Python",
        '级别': 1,
        '班级': "Python",
        '教师': "Seven",
        '上课时间': "10月1",
        '总课时': 10,
        '当前课时': 0,
        '提醒日志': 1,
        '学员考勤': []
    }
    def insert(document):
        result = collection.insert_one(document)
        return result
    re=insert(doc)
    print(re.acknowledged)   #True
    print(re.inserted_id)    #10010129
    

    程序执行后我们观察mongoVue,已经新增了一个学生项目
    在这里插入图片描述

    第1.2节 列表增加项计算增加

    def Onekaoqin(studentID,text):#传入学生id键值和当天考勤备注(str)
        count = collection.count_documents({'_id': studentID})#先查询id的数量是否存在,不存在返回False
        if count == 0:
            return False
        else:
            filter = {'_id': studentID}#把id做成筛选器
            date = datetime.datetime.now()#获取当前时间
            # print(type(date))
            collection.update_one(
                filter,#筛选出指定id的项
                {"$push": {"学员考勤": [date,text]}}#增加的方法添加时间和备注
            )
            collection.update_one(
                filter,#筛选出指定id的项
                {'$inc': {'当前课时': 1}}#算数的方法当前课时+1,前提是当前课时必须是数字(int)
            )
            return True
    Onekaoqin("10010130","测试呀")
    

    collection.count_documents会根据传入的值统计数量,这个会在后面讲到,因为这个功能是老师给学生上课备注使用的,所以在考勤之前,检查传入的学号是否存在,存在,则继续后面的程序,不存在则return False

    collection.update_one(筛选器,{"修改器名": {键:值})
    

    这里的修改器我简单介绍,

    • $ push : 相当于 list.append() 方法,针对list类型
    • $ inc: 可以对当前值进行算数增(减怎么办?尝试增加-1)
    • $ set :对当前字典满足筛选器的项进行修改,如果键名不存在则创建键值对

    如果以上的修改器满足不了你,我还找到一个大佬做的blog,欢迎研究: MongoDB 之 $关键字 及 $修改器.
    以上代码执行之后我们观察一下数据库
    在这里插入图片描述
    在学员考勤列表里多了一个列表,且第一个时间的格式为datetime,这就是pymongo的好处了!

    第1.3节 复杂结构

    在【学员考勤】的列表里添加一个字典,字典的键值为当前【学员考勤】列表的长度+1,值为一个列表,列表的第一个值为当前时间,列表的第二个值为备注text,当前课时+1

    def Onekaoqin(studentID, text):
        count = collection.count_documents({'_id': studentID})
        countK=collection.find_one({'_id': studentID})#当前id学生的所有信息都在里面
        print(countK)
        lens=len(countK["学员考勤"])
        if count == 0:
            return False
        else:
            filter = {'_id': studentID}
            date = datetime.datetime.now()
            collection.update_one(
                filter,
                {"$push": {"学员考勤": {f"{lens+1}":[date, text]}}}
            )
            collection.update_one(
                filter,
                {'$inc': {'当前课时': 1}}
            )
            return True
    

    第二节 删

    在本节开始之前请大家用咱们的inset()方法多添加几个学生项目,注意主键“_id”绝对不能重复

    第2.1节 删除项

    def deleteOne(id):
        result = collection.delete_one(id)
        return result.acknowledged
    delete({"_id":"10010131"})
    

    那么删除很简单了,自定义一个函数叫deleteOne,有一个参数,作为删除的依据,他是一个小字典(筛选器),把他作为参数传进delete_one()即可删除一项,同理还有删除多项的语法

    第2.2节 删除多项

    def delete(filter):
    	#filter(筛选器)
        result = collection.delete_one(filter)
        print(result.acknowledged)
    
    delete({"姓名":"同名的人"})
    

    第三节 改

    修改方法为update_one(),筛选条件为id值,用set方法修正,这里我为了方便测试带了默认值,但是实际使用请多斟酌,另外,对于1.3节提到的复杂结构,也最好就用set修改

    需要一提的是,"_id"是mongo认定唯一键值,不允许修改,如果需要更改学号就只能删了重建

    def updateOne(id, name, school="鑫乐汇", sex="女", age="5", projects="Python", great=1, classes="C2", teacher="seven",
                  onclass="周二", num=100, sum=0, rizhi=2):
        result = collection.update_one(
            {'_id': id},
            {'$set': {
                '校区': school,
                '姓名': name,
                '性别': sex,
                '年龄': age,
                '课程': projects,
                '级别': great,
                '班级': classes,
                '教师': teacher,
                '上课时间': onclass,
                '总课时': num,
                '当前课时': sum,
                '提醒日志': rizhi
            }
            }
        )
        return result.acknowledged
    
    updateOne("10010131","lalalalala")
    

    数据库样子
    在这里插入图片描述

    第四节 查

    第4.1节 无条件统计数量

    def getCount():
        # 获取学员总数
        return collection.count_documents({})
    print(getCount())
    

    从当前表执行count_documents()方法,参数为一个空值字典,意思为没有条件,当前代码结果为当前表的所有学员总数

    第4.2节 有条件统计数量

    def getCountPro(Projects):
        return collection.count_documents({'课程': Projects})
    print(getCountPro("大颗粒"))
    

    从当前表执行count_documents()方法,参数为一个字典键值对,意思是查询存在这个键值对的项,当前代码结果为存在关键字的所有学员总数

    第4.3节 有条件查询项目具体详细

    def chaXun(txtName, name):
        # 查询一个人的信息
        result = collection.find({txtName: name}).sort("_id")
        return result
    print(type(chaXun("课程","大颗粒")))#<class 'pymongo.cursor.Cursor'>
    a=chaXun("课程","大颗粒")
    for i in a:
        print(i)
    

    .find()方法返回的是一个Cursor,相当于迭代器,跟列表还不一样,但是我们可以用for …in…的方法遍历他,结果是

    {'_id': '10010131', '姓名': 'lalalalala', '性别': '女', '年龄': '5', '课程': 'Python', '级别': 1, '班级': 'C2', '教师': 'seven', '上课时间': '周二', '总课时': 100, '当前课时': 0, '提醒日志': 2, '学员考勤': [[datetime.datetime(2020, 10, 22, 19, 59, 38, 364000), 'ceccccc1'], [datetime.datetime(2020, 10, 22, 19, 59, 49, 804000), 'ceccccc2'], {'1': [datetime.datetime(2020, 10, 22, 22, 16, 38, 121000), 'ceccccc3']}, {'2': [datetime.datetime(2020, 10, 22, 22, 17, 34, 398000), 'ceccccc3']}, {'2': [datetime.datetime(2020, 10, 22, 22, 22, 52, 330000), 'ceccccc3']}, {'5': [datetime.datetime(2020, 10, 22, 22, 25, 18, 146000), 'ceccccc3']}, {'7': [datetime.datetime(2020, 10, 22, 22, 26, 14, 531000), 'ceccccc3']}], '校区': '鑫乐汇'}
    

    所有的项目都出来了(因为数据库只有一个叫lalalalala的,大家可以尝试多条有相同条件的),.sort("_id")不是必须,作用是按学号从小到大重新排列这个Cursor

    我们发现有时候我们并不需要那么多的信息,比如我们只需要id、姓名、课程,那么我们就要在查询数据库的时候增加一个筛选器,这个筛选器的作用为简化提取出来的数据

    def chaXun2(txtName, name):
        # 查询一个人的信息
        filter = {
            '_id': 1,
            '姓名': 1,
            '课程': 1
        }
        result = collection.find({txtName: name},filter).sort("_id")
        return result
    a=chaXun2("课程","Python")
    for i in a:
        print(i)
    

    当前代码的结果为

    {'_id': '10010130', '姓名': 'seven', '课程': 'Python'}
    {'_id': '10010131', '姓名': 'lalalalala', '课程': 'Python'}
    

    这样就精炼了很多

    在思考之后,发现i就是一个字典,所以我们可以按照字典的方法把每一项单独拿出来

    def chaXun2(txtName, name):
        # 查询一个人的信息
        filter = {
            '_id': 1,
            '姓名': 1,
            '课程': 1
        }
        result = collection.find({txtName: name},filter).sort("_id")
        return result
    a=chaXun2("课程","Python")
    for i in a:
        print(i['_id'],i['姓名'],i['课程'])
    

    当前代码的结果为

    10010130 seven Python
    10010131 lalalalala Python
    
    展开全文
  • 功能:学生信息管理、包括学生信息的新增、编辑、查看、删除,班级信息管理、包括班级信息的新增、编辑、查看、删除,教师信息管理、包括教师信息的新增、编辑、查看、删除,其中学生、教师、管理员都有自己的密码...

    本系统用到的知识点有:jsp+servlet+mysql+jquery+ajax,前端采用的是当下最流行的easyui管理框架,全部采用面向接口的MVC三层设计模式,是大家学习Java web实战项目不可多得的入门项目教程,这里把这四个阶段的系统打个包,这里简单介绍下四个阶段。
    第一阶段:
    功能:学生信息管理、包括学生信息的新增、编辑、查看、删除,班级信息管理、包括班级信息的新增、编辑、查看、删除,教师信息管理、包括教师信息的新增、编辑、查看、删除,其中学生、教师、管理员都有自己的密码用来登录系统,且各个角色权限不一样,管理员有所有权限、教师只有班级管理和学生管理权限、学生只能查看和修改自己信息。
    第二阶段:
    功能:课程的添加、编辑、查看、删除,学生选课、修改选课、退课,教师查看学生选课,编辑学生选课,管理员有所有权限,学生只能查看自己选的课程、选课、退课,教师只能查看和编辑他的课程被选的信息,不能查看所有的课程。
    第三阶段:
    功能:学生实现签到请假功能,只能签到他所选的课程,只能查看和编辑自己的请假信息,教师和管理员可以查看和编辑审核签到信息和请假信息,请假信息只有未审核的请假单老师和管理员才可以审核,学生只能修改未审核的自己发起的请假单。。
    第四阶段:
    功能:学生成绩查询,只能查询自己所选课程的成绩,教师对学生成绩进行查看、编辑、删除等,教师和管理员可查看所有课程的成绩。成绩信息提供批量导入导出Excel文件功能。成绩统计信息,可通过课程来统计课程成绩信息,如最高分、平均分、最低分等,也可根据分数区间来统计展示。

    第一阶段教程目录
    第一讲项目基本介绍及基础环境配置登录页面实现
    第二讲配置文件讲解及验证码实现原理介绍
    第三讲验证码功能实现及登录逻辑设计
    第四讲数据库连接功能及基础操作封装mp4
    第五讲实现管理员登录验证功能
    第六讲实现登录状态拦截器功能
    第七讲管理员登录成功后的主界面设计
    第八讲注销登录功能实现及班级信息列表设计
    第九讲班级信息实体设计数据库查询列表实现
    第十讲分页类封装及班级信息查询列表实现
    第十一讲班级信息模糊查询列表功能完善
    第十二讲班级信息添加删除功能实现
    第十三讲班级信息修改共嗯完成
    第十四讲学生列表页面设计及实体类设计
    第十五讲学生信息添加界面及功能设计
    第十六讲学生信息添加功能实现
    第十七讲文件流的形式读取图片并显示在页面
    第十八讲学生信息列表查询功能设计实现
    第十九讲学生信息模糊查询和精确查询
    第二十讲学生信息修改功能实现
    第二十一讲学生头像图片上传功能设计实现
    第二十二讲图片上传功能完善学生信息删除功能实现
    第二十三讲教师信息管理界面设计
    第二十四讲实现教师信息添加功能及列表信息查询功能
    第二十五讲教师信息修改功能实现及模糊查询
    第二十六讲教师信息删除功能实现及教师头像上传修改功能实现
    第二十七讲用户修改密码功能实现
    第二十八讲菜单权限设置及学生教师登录功能实现
    第二十九讲学生教师分权限显示查询信息
    第三十讲第一阶段完整系统导入配置运行演示
    第一阶段完整的源码、视频教程、用到的jar包、课堂笔记文档等

    第二阶段教程目录
    第一讲项目整体介绍及课程信息数据库设计
    第二讲课程信息添加界面设计及功能完成
    第三讲课程信息查询列表页面设计及数据库查询实现
    第四讲课程信息模糊查询及修改界面设计
    第五讲课程信息编辑功能完成
    第六讲课程信息批量删除功能完成选课功能初步设计
    第七讲选课信息界面设计及查询功能实现
    第八讲课程信息功能完善及选课添加功能设计
    第九讲选课录入信息界面设计及功能设计
    第十讲选课信息添加功能及查询功能完成
    第十一讲选课信息退选完成及学生选课权限设置
    第十二讲项目导入运行配置教程
    第二阶段完整的源码、视频教程、用到的jar包、课堂笔记文档等

    第三阶段教程目录
    第一讲项目基本介绍及考勤表实体设计
    第二讲考勒信息列表及添加页面设计实现
    第三讲考勒信息添加功能设计并实现
    第四讲考勤信息添加功能继续完善实现
    第五讲考勤信息列表分页查询功能设计实现
    第六讲考勤信息删除功能实现及查询条件完善
    第七讲请假信息实体数据表设计及列表页面设计
    第八讲请假信息添加功能列表分页查询功能实现
    第九讲请假信息编辑修改功能设计实现及查询功能的完善
    第十讲请假单审核功能设计实现
    第十一讲删除功能实现及角色分权限功能实现
    第十二讲如何快速导入运行项目
    第三阶段完整的源码、视频教程、用到的jar包、课堂笔记文档等

    第四阶段教程目录
    第一讲项目基本介绍及成绩实体表设计成绩添加页面设计
    第二讲成绩录入查询功能设计实现
    第三讲成绩信息修改删除功能设计实现
    第四讲成绩信息导入页面设计及上传文件功能实现
    第五讲读取上传的excel文件内容并组装数据
    第六讲读取excel内容并验证录入数据库功能设计实现
    第七讲导出成绩信息功能页面及功能设计
    第八讲成绩信息查询导出到excel功能完善
    第九讲成绩统计功能页面设计及echarts引入
    第十讲成绩统计数据查询并组装成特定的图表要求格式
    第十一讲统计信息查询及图表展示功能完善
    第十二讲统计功能添加分类统计及角色权限设置
    第十三讲学生成绩管理系统介绍及导入运行教程
    第四阶段完整的源码、视频教程、用到的jar包、课堂笔记文档等
    全部的源码、视频教程、用到的jar包、课堂笔记文档等

    展开全文
  • OA系统-考勤模块

    千次阅读 2019-09-03 21:06:45
    1.考勤管理-签到-前台代码实现 (1)jQuery代码,页面初始化绑定事件,怎么实现? $(function(){ $("#signin").click(function(){ } }) 2.考勤管理-签到-全部功能实现 (1)简述签到功能的逻辑? 对签到按钮绑定单击...

    1.考勤管理-签到-前台代码实现

    (1)jQuery代码,页面初始化绑定事件,怎么实现?

    $(function(){
    	$("#signin").click(function(){
    }
    })
    

    2.考勤管理-签到-全部功能实现

    (1)简述签到功能的逻辑?
    对签到按钮绑定单击事件,我们点击按钮时,向servlet发送签到请求,servlet将我调用服务层根据id进行调用Dao层签到方法,Dao层访问数据库,首先调用查询方法,查看是否已经签到,然后在决定接下来是否进行存入一些签到信息,,然后返回不同的值,代表签到成功,失败,已经签过
    (2)ajax实现的步骤?

    <script type="text/javascript">
    	    $(function(){
    	    	//签到
    	    	$("#signin").click(function(){
    	    		//发送ajax请求
    	    	/* 	$.ajax({
    					url:"servlet/SignInOut?method=signIn",
    					type:"POST",
    					dataType:"text",
    					success:function(data){ //0 1  2
    						//显示签到的结果
    						if(data==0){
    							$("#result").html("签到失败");
    						}else if(data ==1){
    							$("#result").html("签到成功");
    						}else {
    							$("#result").html("已经签到,不能重复签到");
    						}
    					}
    				}); */
    

    3.签退-全部功能实现

    (1)简述签退逻辑。
    对签退按钮绑定单击事件,我们点击按钮时,向servlet发送签到请求,servlet将我调用服务层的签退方法,在服务层先调用查询方法,根据返回值判断是否签退,如果没有查到就提示尚未签退,然后进行数据更新签退时间,最后返回签退失败,签退成功。

    4.通过Ajax获取查询条件之部门列表

    (1)进入考勤管理页面之后,如何加载所属部门下拉列表?

    //发送ajax请求,获取部门
    			$.ajax({
    				url:"servlet/SignInOutServlet?method=selAllDept",
    				type:"POST",
    				success:function(jsonStr){
    					eval("var depts="+jsonStr);
    					var str="<option value='0'>--全部--</option>";
    					for (var i = 0; i < depts.length; i++) {
    						
    						str+='<option value="'+depts[i].deptno+'">'+depts[i].deptName+'</option>';
    					}
    					//写入到列表中
    					$("#deptno").html(str);
    				}
    			});
    

    (2)点击查询后,显示所有签到信息,如何利用ajax实现,简述过程?
    当我们点击查询时,向服务器发送ajax请求,servlet处理请求,调用服务层查询签到信息的方法,服务层再调用Dao层查询方法,访问数据库,返回list集合,在调用gson将集合转为json格式的数据返回,ajax对数据遍历,拼接,显示在页面。

    5.考勤管理-使用Ajax查询考勤信息

    (1)按照条件查询,可以有两种方式,第一种:点击查询按钮之后,请求后台servlet,然后从servlet中跳转到考勤管理页面,还有一种方式:利用ajax查询,请问这两种方式哪一种比较好?优点是什么呢?
    Ajax比较好,当我们调用第一种方法时,因为是覆盖页面式,所以我们还要返回进行查询的条件的记忆功能,而ajax方法只是局部刷新,这样便可以省却我们记忆功能 的实现,相对而言,我觉得ajax比较简单,逻辑简单,代码量少

    6.使用Ajax查询考勤信息2

    (1)如何拼接考勤信息列表字符串?

    	success:function(data){
    						//将其转为json对象
    						eval("var list="+data);
    						
    						//字符串的拼接
    						var str="";
    						for (var i = 0; i < list.length; i++) {
    							str+=
    							'<tr>'
    							+'<td>'
    							+'<input name="" type="checkbox" value="" />'
    							+'</td>'
    							+'<td>'+list[i].empId+'</td>'
    							+'<td>'+list[i].emp.realName+'</td>'
    							+'<td>'+list[i].emp.dept.deptName+'</td>'
    							+'<td>'+list[i].dtDate+'</td>'
    							+'<td>'+list[i].signinDate+'</td>'
    							+'<td>'+list[i].signoutDate+'</td>'
    						+'</tr>';
    						}
    						
    						
    						//将其加到tbody中
    						$("#data").html(str);
    						
    					}
    

    7.考勤管理-使用Ajax查询考勤信息3

    (1)如何在后台sql中进行条件的拼接?

    	//创建SQL命令
    					StringBuilder sql=new StringBuilder("select dt.*,e.realname,d.deptname,"
    							+ "d.deptno,e.empid from duty dt "
    							+ "join employee e on dt.emprid=e.empid"
    							+ " join dept d on e.deptno=d.deptno where 1=1");
    				if (empId!=null & !"".equals(empId)) {
    					sql.append("and dt.emprid='"+empId+"'");
    				}
    				if (deptno!=0) {
    					sql.append("and d.deptno="+deptno);
    				}
    				if (dtDate!=null) {
    					DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    					String sdtDate = sdf.format(dtDate);
    					sql.append("and dt.dtDate="+sdtDate);
    				}
    
    

    8.考勤管理-使用POI导出考勤数据到xls1

    (1)POI干嘛的?
    POI提供API给Java程序对Microsoft Office格式档案读和写的功能
    (2)POI和JXL的区别?
    一、jxl
    优点:
    Jxl对中文支持非常好,操作简单,方法看名知意。
    Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
    支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
    生成Excel 2000标准格式
    支持字体、数字、日期操作
    能够修饰单元格属性
    支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
    缺点:效率低,图片支持不完善,对格式的支持不如POI强大
    二、POI
    优点:
    效率高
    支持公式,宏,一些企业应用上会非常实用
    能够修饰单元格属性
    支持字体、数字、日期操作
    缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG(最近的项目中也是遇到了一些bug,不过目前没有查出来是代码的问题还是POI的问题,总之问题很诡异,数据替代参数总有失败的。关于不能跨平台这一说,我也没有试验过,不过Java不是跨平台吗?POI是JAVA的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)

    9.考勤管理-使用POI导出考勤数据到xls2

    (1)如何使用POI,简述步骤?
    1、导入jar包,
    编写java类,新建一个实体类,比如我们要导出数据库的学生的信息,那么就建一个Student实体类。
    新建一个写入excel的方法。
    创建操作Excel的HSSFWorkbook对象
    创建HSSFSheet对象
    创建第一行标题信息的HSSFRow对象
    创建标题行中的HSSFCell数组
    创建标题数据,并通过HSSFCell对象的setCellValue()方法对每个单元格进行赋值
    (2)如何将后台查到的考勤数据,弄到前台客户端下载为excel,代码如何实现呢?
    通过后台查询的考勤数据,调用导出表的方法,把查出来的数据按照给定的语法格式写到Excel表里。然后再响应下载。

    //调用方法
    		createExcel(list,response);
    	
    	}
    	private static void createExcel(List<Duty> list,HttpServletResponse response) {
            // 创建一个Excel文件
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 创建一个工作表
            HSSFSheet sheet = workbook.createSheet("考勤信息表");
            
            CellRangeAddress region = new CellRangeAddress(0, // first row
                    0, // last row
                    0, // first column
                    5 // last column
            );
            sheet.addMergedRegion(region);
            
            HSSFRow hssfRow = sheet.createRow(0);
            HSSFCell headCell = hssfRow.createCell(0);
            headCell.setCellValue("考勤信息表");
            
            // 设置单元格格式居中
            HSSFCellStyle cellStyle = workbook.createCellStyle();
        	cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            /*
           
            cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
           // cellStyle.setFillBackgroundColor(HSSFColor.GREEN.index);
            cellStyle.setFillForegroundColor(HSSFColor.GREEN.index);
           
            HSSFFont font = workbook.createFont();
            font.setFontName("楷体"); //字体
            font.setFontHeightInPoints((short)30); //字体大小
            font.setColor(HSSFColor.RED.index);//颜色
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
            font.setItalic(true); //倾斜
            cellStyle.setFont(font);
            */
            headCell.setCellStyle(cellStyle);
            
            
            // 添加表头行
            hssfRow = sheet.createRow(1);
            // 添加表头内容
            headCell = hssfRow.createCell(0);
            headCell.setCellValue("用户名");
            headCell.setCellStyle(cellStyle);
    
            headCell = hssfRow.createCell(1);
            headCell.setCellValue("真实姓名");
            headCell.setCellStyle(cellStyle);
    
            headCell = hssfRow.createCell(2);
            headCell.setCellValue("所属部门");
            headCell.setCellStyle(cellStyle);
            
            headCell = hssfRow.createCell(3);
            headCell.setCellValue("出勤日期");
            headCell.setCellStyle(cellStyle);
    
            headCell = hssfRow.createCell(4);
            headCell.setCellValue("签到时间");
            headCell.setCellStyle(cellStyle);
    
            headCell = hssfRow.createCell(5);
            headCell.setCellValue("签退时间");
            headCell.setCellStyle(cellStyle);
    
            // 添加数据内容
            for (int i = 0; i < list.size(); i++) {
                hssfRow = sheet.createRow((int) i + 2);
                Duty duty = list.get(i);
    
                // 创建单元格,并设置值
                HSSFCell cell = hssfRow.createCell(0);
                cell.setCellValue(duty.getEmpId());
                cell.setCellStyle(cellStyle);
    
                cell = hssfRow.createCell(1);
                cell.setCellValue(duty.getEmp().getRealName());
                cell.setCellStyle(cellStyle);
    
                cell = hssfRow.createCell(2);
                cell.setCellValue(duty.getEmp().getDept().getDeptName());
                cell.setCellStyle(cellStyle);
                
                cell = hssfRow.createCell(3);
                cell.setCellValue(duty.getDtDate());
                cell.setCellStyle(cellStyle);
    
                cell = hssfRow.createCell(4);
                cell.setCellValue(duty.getSigninDate());
                cell.setCellStyle(cellStyle);
    
                cell = hssfRow.createCell(5);
                cell.setCellValue(duty.getSignoutDate());
                cell.setCellStyle(cellStyle);
            }
    
            // 保存Excel文件
            try {
            	response.setContentType("application/vnd.ms-excel");
            	response.setHeader("Content-disposition", "attachment;filename=duty.xls");//附件形式下载,文件名字叫duty.xls
            /*    OutputStream outputStream = new FileOutputStream("D:/students.xls");*///写在服务器本地
                ServletOutputStream outputStream = response.getOutputStream();
                workbook.write(outputStream);
                outputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    

    (3)简述给出的OperateExcelUtil.java的功能含义?
    导出poi工具类,通过查询信息传过来的参数信息,由此工具类接收,根据给定的语法信息,进行excel表的操作,然后进行响应输出到客户端下载此表。

    10.报销管理-理解数据库表和创建实体类

    (1)简述系统中表之间的关系:
    报销单审核表–>报销单表,报销单表–>保险单明细表,报销单表–>支出表。

    11.报销管理-添加报销单-视图层

    (1)在完成视图层操作中,有哪些注意事项?
    报销人、审核人自动获取、不需要输入
    • 报销时间、报销总额自动计算和获取
    • 报销单明细类型采用静态类型,可以增加报销单明细类型表

    (2)在页面中,如何利用jQuery完成添加报销项操作?

    var content = $('<tr>'+
    				'<td><div class="vocation"><select class="select1" name="type">'+
    				'<option value="1">通信费用</option><option  value="2">办公室耗材</option><option  value="3">住宿费用</option><option  value="4">房租水电</option><option value="5">其他</option>'+
    				'</select></div></td>'+
    				'<td><input name="amount" type="text" class="dfinput" /><i></i></td>'+
    				'<td><input name="itemDesc" type="text" class="dfinput" /><i></i></td>'+
    				'<td><input type="button"  class="btn"  value="删除" onclick="removeCurrItem(this)"/></td></tr>');
    

    在页面中,如何利用jQuery完成添加图片操作?

    function addPhoto(){ //获取上传图片li var li = $("#uploadphoto"); //console.info(li); //准备添加的dom对象 var content=$(" "+ ""); //加入到指定位置 li.append(content); }
    
    

    12.报销管理-添加报销单-控制层

    (1)页面中假如添加了多个报销项,那么在控制层接收数据的思路是什么呢?怎么接收数据呢?
    把同一字段放到同一数组里,然后把把他们放到集合里。
    (2)为什么在数据库中有状态码字段,这个字段的作用是什么?缺少这个字段可以吗?
    为下面审核报销单做准备,不可以缺少,因为不知道状态就无法审核

    展开全文
  • 《百度AI人脸识别与检测》专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统;主要用到的技术有百度开放平台中的人脸检测、人脸识别、Python图形界面开发PyQt5、线程的管理、以及通过python调用百度...
  • 那么有没有一种方法可以通过一堆考勤记录和一个学生名单直接导出成为一个总的考勤记录表格呢? 研究背景 以腾讯课堂为例子 根据线上课程的经验,在腾讯课堂进行上课的课程居多,因此本文考虑的考勤记录都是基于...
  • 已经好久没有更新技术...可以选择日期,按月份分别查看应出勤数、已出勤数、迟到数、早退数,用特殊标记标出某天是迟到还是早退等等,选中某天,直接加载该天的所有考勤记录,看上去挺简单的功能,要我写js估计可以...
  • 采集人脸:收集需要录入的学生信息,开启摄像头收集截取对应的人脸图片; 训练人脸数据模型:根据收集和整合好的人脸图片数据训练成人脸数据模型; 人脸识别打卡:打开摄像头,截取一帧帧的人脸图片与训练好的人脸...
  • 一、简介 这个人脸识别考勤签到系统是基于大佬的人脸识别...该系统实现了从学生信息输入、人脸数据录入、人脸数据训练,学生信息多条件搜索、修改,多选删除,人脸数据训练,人脸识别、追踪、签到等完整流程的各项功能
  • 人脸识别考勤系统安卓APP(手把手教学-手动滑稽)

    万次阅读 多人点赞 2019-02-28 22:07:29
    人脸识别考勤:通过人脸识别,每个学生考勤考勤统计及数据查询:制定查询条件(按学生、按时间),输出统计结果。 注:请自行研究人脸识别 API 及各种接口。 实验内容 3.1百度SDK的使用 首先进入百度的人脸...
  • 1.考勤管理-签到-前台代码实现 (1)jQuery代码,页面初始化绑定事件,怎么实现? $(function(){ $("#signin").click(function(){ } }) 2.考勤管理-签到-全部功能实现 (1)简述签到功能的逻辑? 对签到按钮绑定单击...
  • 添加新用户 所属部门 学生信息管理 功 能 描 述 录入用户的基本资料信息,包括姓名、学号、班级信息(选择输入)、学院信息(选择输入)、年龄(选择输入)、性别(选择输入)、以及用户组的信息、人脸图片信息...
  • 《百度AI人脸识别与检测》专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统;主要用到的技术有百度开放平台中的人脸检测、人脸识别、Python图形界面开发PyQt5、线程的管理、以及通过python调用百度...
  • android安卓源码海量项目合集打包-1

    万次阅读 多人点赞 2019-06-11 16:16:24
    │ │ 该Demo主要实现了读取手机中的联系人,并且以字母索引的形式显示,类似于微信中的手机通讯一样的字母索引.rar │ │ 通讯录按首字母排列,关键字查找.rar │ │ 鱼眼索引控件详解之二 —— 快速索引雏形...
  • 我的程序员之路----2012在匍匐中前进

    千次阅读 2013-01-27 06:34:13
    期盼的寒假从今天就要开始了(其实自己并没有感觉到自己有一点儿高兴,只是因为学校的生活太格式化了)。昨天自己考完大三上学期的最后一门课-《编译原理》。对于这门课来说,自己在学习的过程中,并没有收获太多的...
  • 《当程序员的那些狗日日子》三

    千次阅读 2012-10-25 20:19:37
    《当程序员的那些狗日日子》(二十一)加班,加班 每天继续正常地上班下班。然而不久后却传来了我曾祖母去世的消息。因工作关系,我却未能及时赶回家去见我曾祖母最后一面。我的心里十分悲痛。...
  • 《疯狂的程序员》二

    千次阅读 2012-10-25 20:34:58
    其实他们心眼里也鄙视这样的老师,很简单像《微机原理》这样的鸡肋课本来大家就抱着可上可不上的态度,但老师他们非要一再强调这课对于XXXX有多么重大的意义,并且还坚持考勤布置作业,好像这课过不了大学就毕不了业...
  • 微信公众平台开发模式 微信 公众平台 图片识别 人脸识别  作者:方倍工作室[QQ:1354386063] 原文:http://www.cnblogs.com/txw1958/archive/2013/02/05/weixin-if20-face-recognition.html    一、前言 ...
  • Mysql

    2020-09-21 15:49:12
    1.初识Mysql ...通过表和表之间,行和列之间的关系进行数据的储存 学院信息表,考勤表 非关系型数据库:(not only sql) Redis,MongDB 非关系型数据库,对象存储,通过对象自身的属性来决定。 DBMS(数据
  • 数据库(MySQL)

    2021-02-24 17:28:19
    数据库(MySQL) 1.数据库的简介 ...通过表和表之间,列和行之间的进行数据存储(学院信息表,考勤表…) 非关系型数据库:(NoSQL) 如Redis,momgDB 以对象的形式存储数据,通过对象自身的属性来决定
  • MySQL(自用)

    2021-06-01 10:19:23
    通过表和表之间,行和列之间的关系进行数据的存储 例如:学院信息表,考勤表 非关系型数据库: Redis,MongDB 非关系型数据库,对象存储,通过对象自身的属性来决定 列如:自身的定位信息 DBMS(数据管理系统) 数据库的...
  • Java基础--学习笔记(零起点打开java世界的大门)--博客汇总【附:视频、资料、详细笔记】 java零基础入门到精通(2019版)【黑马程序员】
  • 实例163 将图片文件以二进制格式存储到数据库中 实例164 读取数据库中上传图片名称并显示图片 实例165 读取并显示数据库中以二进制方式存储的图片 实例166 智能验证会员注册信息(Ajax) 实例167 顺手牵羊——...
  • 实例163 将图片文件以二进制格式存储到数据库中 实例164 读取数据库中上传图片名称并显示图片 实例165 读取并显示数据库中以二进制方式存储的图片 实例166 智能验证会员注册信息(Ajax) 实例167 顺手牵羊——...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 242
精华内容 96
关键字:

学生考勤表格式图片