学生请假管理系统(需求说明+项目(部分代码))
一、需求说明书
软件需求说明书
1引言
1.1编写目的
开发本系统的目的,就是要解决目前我校关于学生请假和管理请假事务所面临的一系列问题。
1.2背景
说明:
- 计算机学院请假管理系统;
- 目前我校基本上是采用线下请假,学生先是向班主任说明情况,班主任再向辅导员进行报告,然后学生去辅导员那里申请请假并盖章,再到书记那边盖章,最后到学工处盖章,这才算是完成了一个完整的请假流程,离校时还需向宿管报备。这些流程不仅办事效率不高,而且需要老师和学生同时有时间才能完成请假,为了提高请假效率,请假管理系统能够解决线下请假所带来的麻烦。
1.3定义
无
1.4参考资料
无
2任务概述
2.1目标
该管理系统的用户可分为两大类,即学生用户和校方用户,实现管理的登录,学生用户可以填写请假信息并打印请假条,等待校方领导审核,还可以查看请假记录;校方用户可以对学生的请假情况进行审核、批准,完成学生的请假,还可以对学生请假信息进行增删改查的操作。
2.2用户的特点
学生用户:学生填写请假原因进行请假、打印请假条、查看请假记录。
校方用户:学生信息管理(增/删/改/查)、老师(含辅导员和院系领导)信息管理、对学生的请假申请进行审核、打印、和查看请假记录。
该管理系统面对我校全体师生,故使用频度很高,需要经常修改和维护。
2.3假定和约束
该管理管理系统仅限于我校学生请假和校方管理请假事务,不能用于其他方面。
3需求规定
3.1对功能的规定
基于我院采用的是线下请假,请假手续繁琐,还有诸多不确定因素,导致学生请假存在较多的问题。为了提高请假效率,请假管理系统能够解决线下请假所带来的麻烦。
顶层DFD如图3-1-1所示
图3-1-1
0层DFD如图3-1-2所示
图3-1-2
1层DFD如3-1-3所示
图3-1-3
|
数据字典:
|
|||
|
3.2输人输出要求
无
3.3数据管理能力要求
无
3.4故障处理要求
输入信息不符合要求的处理,会弹出警告信息。
3.5其他专门要求
- 系统健壮性:具有一定的容错能力,并且以友好的方式告知用户。
- 安全性:系统应自动备份数据库,防止意外操作或者恶意破坏造成数据的丢失和损坏。
4运行环境规定
4.1设备
1)内存:不小于512MHZ
2)硬盘:20G以上
4.2支持软件
1)操作系统:Windows 7/ Windows 8或Windows 10
2)数据库:MySQL
3)开发环境:Visual Studio 2019、Navicat Premium 15
4.3接口
IE浏览器、Ghrome浏览器等主流浏览器。
4.4控制
浏览器
5.数据需求
对系统中的实体及属性进行ER建模
ER图如图5-1-1所示
图5-1-1
以上内容均是自己所编写的,有缺陷有错误的地方还请指正。。。
二、项目(部分源码+运行截图)
1.实体
(1)学生
package com.leave.entity;import java.io.Serializable;public class Apply implements Serializable {private static final long serialVersionUID = 1L;private int aid;// IDprivate String l_s_card;// 学号private String s_username;// 姓名private String g_name;// 年级private String c_name;// 班级private String s_phone;// 联系电话private String l_begintime;// 请假开始时间private String l_endtime;// 请假结束时间private String l_address;// 请假去向private String l_cause;// 请假理由private int status;// 申请请假条状态 0:待审核 1:请假失败 3:未销假 4:已销假 2:表示由班主任审核通过到辅导员审批的标记符public int getAid() {return aid;}public void setAid(int aid) {this.aid = aid;}public String getL_s_card() {return l_s_card;}public void setL_s_card(String l_s_card) {this.l_s_card = l_s_card;}public String getS_username() {return s_username;}public void setS_username(String s_username) {this.s_username = s_username;}public String getG_name() {return g_name;}public void setG_name(String g_name) {this.g_name = g_name;}public String getC_name() {return c_name;}public void setC_name(String c_name) {this.c_name = c_name;}public String getS_phone() {return s_phone;}public void setS_phone(String s_phone) {this.s_phone = s_phone;}public String getL_begintime() {return l_begintime;}public void setL_begintime(String l_begintime) {this.l_begintime = l_begintime;}public String getL_endtime() {return l_endtime;}public void setL_endtime(String l_endtime) {this.l_endtime = l_endtime;}public String getL_address() {return l_address;}public void setL_address(String l_address) {this.l_address = l_address;}public String getL_cause() {return l_cause;}public void setL_cause(String l_cause) {this.l_cause = l_cause;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}}
(2)老师
package com.leave.entity;/*** 系统用户类**/
public class User {/*** 学生类型用户*/public static final int USER_STUDENT = 1;/*** 班主任类型用户*/public static final int USER_TEACHER = 2;/*** 辅导员类型用户*/public static final int USER_ADMIN = 3;private int id; // IDprivate String account; // 账户private String password = "######"; // 密码:默认'111111'private String username; // 用户姓名private int type = USER_STUDENT; // 账户类型:默认1为学生;1为学生,2为班主任,3为辅导员public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getType() {return type;}public void setType(int type) {this.type = type;}public User(){//无参构造函数}}
2.数据库(MySQL)
(1)配置连接池
package com.leave.util;import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;import org.apache.commons.beanutils.BeanUtils;public class JdbcUtils {private static DataSource dataSource;static {init();}// 每个线程都会自己的一份private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();/** 如果有事务,说明connectionHolder中存在Connection对象* 这个事务都用这个connection来完成*/public static void beginTransaction() throws SQLException {/** 如果已经开始了事务,就不能再次开启事务!*/Connection con = connectionHolder.get();if(con != null) {throw new SQLException("已经存在了事务,不能再次开启!");}// 获取连接con = dataSource.getConnection();// 设置为手动提交con.setAutoCommit(false);// 放到Holder中connectionHolder.set(con);}/** 提交事务了* 当前事务的连接在holder中* 从holder中获取连接,然后提交*/public static void commitTransaction() throws SQLException {Connection con = connectionHolder.get();// 如果holder中没有con,说明根本没有开启事务if(con == null) {throw new SQLException("没有事务可以提交!");}con.commit();//提交事务con.close();//关闭连接connectionHolder.remove();//从holder中移除连接对象}public static void rollbackTransaction() throws SQLException {Connection con = connectionHolder.get();// 如果holder中没有con,说明根本没有开启事务if(con == null) {throw new SQLException("没有事务可以回滚!");}con.rollback();//回滚事务con.close();//关闭连接connectionHolder.remove();//从holder中移除连接对象}// 在连接池没有初始化时,去初始化它// 然后再返回。public static DataSource getDataSource() {return dataSource;}// 给dataSource赋值private static void jndi(String jndiName) {try {Context cxt = new InitialContext();dataSource = (DataSource) cxt.lookup("java:/comp/env/" + jndiName);} catch (NamingException e) {throw new RuntimeException(e);}}// 给dataSource赋值private static void initDataSource(Properties prop) {/** 1获取连接池类名称 2通过反射他都连接池对象 3通过BeanUtils把属性注入*/String dataSourceClassName = prop.getProperty("dataSourceClassName");try {// 加载连接池的类型@SuppressWarnings("rawtypes")Class clazz = Class.forName(dataSourceClassName);// 通过反射创建连接池对象dataSource = (DataSource) clazz.newInstance();BeanUtils.populate(dataSource, prop);} catch (Exception e) {throw new RuntimeException("dataSourceClassName找不到:"+ dataSourceClassName, e);}}// 在dataSource没有被初始化时调用它private static void init() {// 初始化/** 1如果在Tomcat环境下,已经配置JNDI,那么就不用管其他的配置信息了,因为会在Tonmcat中配置好了 2如果用户使用的是DBCP* 3如果用户使用的c3p0*//** 当用户配置了jndiName属性时,那么使用这个值直接调用jndi()方法 indi()方法*/try {// 加载配置文件,配置文件名为dbconfig.propertiesProperties prop = new Properties();InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbconfig.properties");prop.load(in);// 获取jndiNameString jndiName = prop.getProperty("jndiName");// 如果存在jndiName,那么就直接使用jndi的初始化方式// jndi初始化if(jndiName != null) {jndi(jndiName);return;}// 配置初始化initDataSource(prop);} catch (Exception e) {throw new RuntimeException("dbconfig.properties找不到:", e);}}/** 修改了getConnection()* 当holder中存在Connection,说明用户已经开启了事务* 那么用来在获取连接时,一定要让他使用事务的连接对象*/public static Connection getConnection() throws SQLException {Connection con = connectionHolder.get();if(con != null) {return con;}return dataSource.getConnection();}public static void close(Connection con, Statement stmt) {close(con, stmt, null);}public static void close(Connection con) {close(con, null, null);}public static void close(Connection con, Statement stmt, ResultSet rs) {try {if (rs != null)rs.close();if (stmt != null)stmt.close();if (con != null)con.close();} catch (SQLException e) {throw new RuntimeException(e);}}
}
(2)数据库连接
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config><!-- 默认配置0~1 --><default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/leave?serverTimezone=UTC;characterEncoding=utf-8</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="user">root</property><property name="password">123456</property><property name="acquireIncrement">3</property><property name="initialPoolSize">10</property><property name="minPoolSize">2</property><property name="maxPoolSize">10</property></default-config>>
</c3p0-config>
dataSourceClassName=com.mchange.v2.c3p0.ComboPooledDataSource
user=root
password=######
jdbcUrl=jdbc:mysql://localhost:3306/leave?serverTimezone=UTC&characterEncoding=utf-8
driverClass=com.mysql.jdbc.Driver
acquireIncrement=1
maxPoolSize=20
minPoolSize=3
initialPoolSize=5
三、Tomcat配置
我配置的是Tomcat7.0 ,详细安装配置过程参考下面连接:
tomcat下载安装及配置教程_NiUoW的博客-CSDN博客_tomcat下载安装及配置教程
四、运行截图
登录页面
学生界面
请假申请界面
请假记录页面
班主任审核界面
辅导员审核界面
简单的一个项目,虽然很粗糙,但完成大作业还是很不错的,哈哈哈哈。小白一名,上述内容如有错误的地方,还请指正。
个人原创,如有侵权请联系!
学生请假管理系统(需求说明+项目(部分代码))相关推荐
- SpringBoot+Vue项目在线学生请假管理系统
文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript.Vue .css3 开发工具:IDEA/MyEclipse/Eclipse.Visual Studi ...
- (附源码)基于SpringBoot的在线学生请假管理系统的设计与实现 毕业设计060935
Springboot在线学生请假管理系统 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们 ...
- 基于SpringBoot的在线学生请假管理系统的设计与实现 毕业设计-附源码060935
Springboot在线学生请假管理系统 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们 ...
- 请假代码java web_基于jsp的学生请假管理系统-JavaEE实现学生请假管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的学生请假管理系统, 该项目可用各类java课程设计大作业中, 学生请假管理系统的系统架构分为前后台两部分, 最终实 ...
- 学生请假管理系统(jsp+servlet)
前段时间做了一个基于jsp+servlet学生请假管理系统,主要根据如下需求实现的: [需求分析] 1. 学生通过系统提出请假申请,在申请单提交之后,申请单流转到班主任处理. 2. 学生在以下几种情况 ...
- 学生请销假管理系统java_学生请假管理系统.docx
学生请假管理系统课案 中原工学院软件学院软件工程实践一设计任务书 姓名*** 软件工程 专业 JAVA123 班题目学生请假管理系统的开发设计任务开发一个基于Web的学生请假管理系统,包括教师端和学生 ...
- 学生请销假管理系统java_学生请假管理系统方案.doc
WORD格式 整理分享 范文范例 参考指导 WORD格式 整理分享 范文范例 参考指导 中原工学院软件学院 软件工程实践一设计任务书 姓名 *** 软件工程 专业 JAVA123 班 题目 学生请假管 ...
- 学生请假管理系统需求分析说明书
原创不易,麻烦点个关注,点个赞,谢谢各位. 学生请假管理系统 需求分析说明书 1.引言 2 1.1目标 2 1.2项目背景 2 1.3参考资料 2 2.任务概述 2 2.1目标 2 2.2运行环境 2 ...
- java毕业设计学生请假管理系统Mybatis+系统+数据库+调试部署
java毕业设计学生请假管理系统Mybatis+系统+数据库+调试部署 java毕业设计学生请假管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...
- 基于JAVA学生请假管理系统计算机毕业设计源码+系统+lw文档+部署
基于JAVA学生请假管理系统计算机毕业设计源码+系统+lw文档+部署 基于JAVA学生请假管理系统计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 ...
最新文章
- html div圆滑效果,美化网页div -让边框拥有阴影,边角变得圆滑
- axure 素材_Axure原型:超漂亮的系统首页
- Autofac框架初识与应用
- 解决:Could not find metadata org.apache.maven.plugins:maven-archetype-plugin/maven-metadata.xml in loc
- (转载)分享常用的GoLang包工具
- 纯做技术是自娱自乐 抛开技术做技术才是出路
- vue 项目:文件夹 结构 、配置详解
- 九九乘法表--0702
- 【报告分享】2020年母婴未来消费新趋势报告.pdf(附下载链接)
- 删数问题(Noip1994)
- 为什么 Math.min() 比 Math.max() 大?
- 搭建最简单的Drool框架
- 软件开发生命周期的管理
- 联想台式计算机设置u盘启动不了,联想台式电脑bios设置u盘启动教程
- 华三路由器配置mstp多生成树协议
- osu计算机专业排名,OSU计算机专业有奖学金啦~
- 基于激光雷达的室内探测系统
- 大数据人才培养的规划之路如何走
- “NP问题是可计算的吗?” - 从“可计算性”的角度审视NP
- 2020江苏选调考察体检环节的记录
热门文章
- 新品周刊 | 雀巢脆脆鲨推出坚果巧克力威化;金宾波本威士忌推出父子合作酒品...
- python实现multi函数参数个数不限、返回所有参数乘积_实现multi()函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
- Python tkinter(GUI编程)模块最完整讲解(上)
- 用dxdiag命令show计算机系统配置
- CentOS7各种代理设置
- 哪个软件能代替斐讯路由_斐讯路由器最新版本|好用的路由器管理软件_最火手机站...
- 面试官:说说如何打破或违反双亲委派!
- 蔡康永--说话之道(一)
- 智能工厂具体的名词解释
- keepalived配置虚拟IP