前言
今天导员找到我,说我也学了这么长时间的java了,问我能不能给咱们学院写个学生请假管理系统,不然每到周五,好多的学生都挤到他的办公室找他请假审批,非常麻烦,更何况让自己都没有时间陪女朋友去玩了!
所以这才找到我这个学习了两年半的小码农,这里在详细的说明一下,为何要写这个脚本:
目前我校基本上是采用线下请假,学生先是向班主任说明情况,班主任再向辅导员进行报告,然后学生去辅导员那里申请请假并盖章,再到书记那边盖章,最后到学工处盖章,这才算是完成了一个完整的请假流程,离校时还需向宿管报备。这些流程不仅办事效率不高,而且需要老师和学生同时有时间才能完成请假,为了提高请假效率,请假管理系统能够解决线下请假所带来的麻烦。所以学校花“重金”让我写个请假审批管理脚本
这对我来讲其实就小儿科,不过为了和学校辅导员等一系列的老师们打好管理,那我就必须得把这件事情办得漂漂亮亮!
目标
该管理系统的用户可分为两大类,即学生用户和校方用户,实现管理的登录,学生用户可以填写请假信息并打印请假条,等待校方领导审核,还可以查看请假记录;校方用户可以对学生的请假情况进行审核、批准,完成学生的请假,还可以对学生请假信息进行增删改查的操作。
用户的特点
学生用户:学生填写请假原因进行请假、打印请假条、查看请假记录。
校方用户:学生管理系统(增/删/改/查)、老师(含辅导员和院系领导)信息管理、对学生的请假申请进行审核、打印、和查看请假记录。
该管理系统面对我校全体师生,故使用频度很高,需要经常修改和维护。
功能的规定
基于我院采用的是线下请假,请假手续繁琐,还有诸多不确定因素,导致学生请假存在较多的问题。为了提高请假效率,请假管理系统能够解决线下请假所带来的麻烦。
数据字典:
数据需求
对系统中的实体及属性进行ER建模
项目(部分源码+运行截图)
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;
}
}
老师
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()
{
//无参构造函数
}
}
数据库(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);
}
}
}
数据库连接
<?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 ,
四、运行截图
简单的一个项目,虽然很粗糙,但完成导员的要求还是很不错的,哈哈哈哈。上述内容如有错误的地方,还请指正。
如果觉得小编写的内容是你喜欢看的和有用的可以点点赞,关注一下哦