草庐IT

学生请假管理系统(需求说明+项目(部分代码))

₯㎕ 山河故人 2023-04-03 原文

一、需求说明书

软件需求说明书

1引言

1.1编写目的

开发本系统的目的,就是要解决目前我校关于学生请假和管理请假事务所面临的一系列问题。

1.2背景

说明:

  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其他专门要求

  1. 系统健壮性:具有一定的容错能力,并且以友好的方式告知用户。
  2. 安全性:系统应自动备份数据库,防止意外操作或者恶意破坏造成数据的丢失和损坏。

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;// ID
	private 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; // ID

	private 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.properties
			Properties prop = new Properties();
			InputStream in = Thread.currentThread().getContextClassLoader()
					.getResourceAsStream("dbconfig.properties");
			prop.load(in);
			
			// 获取jndiName
			String 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下载安装及配置教程

四、运行截图

登录页面

学生界面

 请假申请界面

请假记录页面

 班主任审核界面

辅导员审核界面

简单的一个项目,虽然很粗糙,但完成大作业还是很不错的,哈哈哈哈。小白一名,上述内容如有错误的地方,还请指正。

个人原创,如有侵权请联系!

有关学生请假管理系统(需求说明+项目(部分代码))的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  6. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  10. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

随机推荐