一、需求背景
《学生教务系统》 系统设计以方便快捷和安全为出发点,放弃传统的人工记录对学生信息管理的缺陷和不足, 采用全新的方式使学校对学生信息进行存储和维护,增加管理效率。
本系统大体为教务学生管理系统 、并且赋予了管理员很多功能来操作这个系统,包括:学生管理,小组管理,班级管理等功能;通过这些功能模块的设计,满足了老师对学生的信息进行管控所需的功能。
系统采用 c/s 三层结构 ,对动态页面的制作采用了 JSP+Ajax 技术,为了实现管理系统的安全可靠以及对有些代码可以进行重复使用考虑, 对程序的重要代码进行封装时采用 Java Bean。本系统贯彻以人为本的思想,实用性高。
二、产品目标
学生信息的管理工作变得越来越庞大和繁冗,效率也低。为了充分利用互联网带给人们的便利,更好地提高教学管理管理工作的效率,使学生和教职员工能更方便地进行信息查询活动,特开发此教学管理系统。本软件通过权限识别登录到该系统,权限不同享有的功能就又说差异,来实现日常的学生信息的管理。
三、《学生教务系统》项目介绍:
1、开发环境
2、《TJCU教务系统》的总体功能
(3)用户角色描述
四、具体需求
1、功能划分
本系统总体功能上是C/S 结构的Windows应用程序!
2、项目整体功能框架
3、概念数据模型CMD
CMD是实体与实体之间关系的模型(使用PowerShell 设计)
五、主要功能截图
**「用户登录」 **
用户登录是选择角色进行登录:管理员、用户
「用户注册」
1. 用户登录之前用户名必须是在注册时通过邮箱激活后的,否则不能登录, 返回提示信息:用户名输入错误~~ 2. 如果用户名输入错误 返回提示信息:用户名输入错误~~ 3. 如果验证码输错 返回提示信息: 验证码输入错误~~~ 4. 如果用户名,验证码正确 返回提示信息: 密码输入错误~~
「用户激活模块」
1.注册进行提交后,会跳转到请去邮箱激活用户页面 3.激活成功后会跳转到登录
「学生管理模块」
1. 添加学生信息(城市表,班级表,标签表,小组表有数据之后才能添加) 2. 功能是修改学生,删除学生 3. 展示内容(分页实现) 4. 以Json形式下载信息 5. 以QQ或者姓名或者手机号查询学生信息
** 「小组管理模块」**
1. 添加小组功能:会添加组名称,然后选择班级(小组是班级的外键,需要先建班级表才能创建小组表) (其中包含student外键:添加组名称时:本组学生的标签会自动增加到小组标签上,并且统计本组学生人数) 2. 删除小组功能: 删除小组之前需要将本小组的studnet删除或者修改带其他组,否则无法删除 (使用Ajax判断是否删除) 3.页面展示功能中的学生标签和学生人数,将从外键Student中获取,班级名称名班级表中获取
「班级管理模块」
班级的增删查功能
「标签管理模块」
1. 添加标签: 添加标签注意添加标签名称,标签类型(标签类型包含:学生/班级两种类型) 2. 删除标签: 删除标签名字字段之前之前,我们得把对应的学生表, 班级表中选中相关标签的班级和班级信息进行修改或者删除 (使用Ajax判断是否删除)
「城市管理模块」
六、主要代码展示
「学生分页展示相关」
SELECT s.s_id, s.s_name, s.s_phone, s.s_qq, s.s_age, s.s_birthday, s.s_stars, s.s_attribute, clazz.clazz_id, clazz.c_name, g.g_id, g.g_name, c.c_id, c.c_name, m.m_id, m.m_name FROM (select * from t_student limit #{page} , #{rows} ) as s LEFT JOIN t_clazz clazz ON s.clazz_id = clazz.clazz_id LEFT JOIN t_city c ON s.c_id = c.c_id LEFT JOIN t_group g ON s.g_id = g.g_id LEFT JOIN m_s_fk ms ON s.s_id = ms.s_id LEFT JOIN t_mark m ON ms.m_id = m.m_id
「通过学生生日计算年龄,生肖,星座展示相关」
public class BirthdayUtil { //根据生日计算生肖,年龄,星座 private final static int[] dayArr = new int[] { 20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22 }; private final static ArrayList<String> constellationList = new ArrayList<>();//存放星座的集合 static { constellationList.add(0, "水瓶座"); constellationList.add(1, "双鱼座"); constellationList.add(2, "白羊座"); constellationList.add(3, "金牛座"); constellationList.add(4, "双子座"); constellationList.add(5, "巨蟹座"); constellationList.add(6, "狮子座"); constellationList.add(7, "处女座"); constellationList.add(8, "天秤座"); constellationList.add(9, "天蝎座"); constellationList.add(10, "射手座"); constellationList.add(11, "魔羯座"); } //获得年龄 public static Integer getAge(Date birthday){ int year1 = birthday.getYear(); Date date = new Date(); int year2 = date.getYear(); return year2-year1; } //获得生肖 public static String getChineseZodiac(Date birthday) { int year = birthday.getYear(); //0代表1900年 if (year < 0) { return "未知"; } int start = 0; String[] years = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" }; return years[(year - start) % 12]; } //获得星座 /** * 传入日期,返回星座 */ public static String getConstellation(Date date) { String constellation = ""; Calendar birthday = Calendar.getInstance(); birthday.setTime(date); int month = birthday.get(Calendar.MONTH) + 1; int day = birthday.get(Calendar.DAY_OF_MONTH); switch (month) { case 1: //Capricorn 摩羯座(12月22日~1月20日) constellation = day <= 20 ? constellationList.get(11) : constellationList.get(0); break; case 2: //Aquarius 水瓶座(1月21日~2月19日) constellation = day <= 19 ? constellationList.get(0) : constellationList.get(1); break; case 3: //Pisces 双鱼座(2月20日~3月20日) constellation = day <= 20 ? constellationList.get(1) : constellationList.get(2); break; case 4: //白羊座 3月21日~4月20日 constellation = day <= 20 ? constellationList.get(2) : constellationList.get(3); break; case 5: //金牛座 4月21~5月21日 constellation = day <= 21 ? constellationList.get(3) : constellationList.get(4); break; case 6: //双子座 5月22日~6月21日 constellation = day <= 21 ? constellationList.get(4) : constellationList.get(5); break; case 7: //Cancer 巨蟹座(6月22日~7月22日) constellation = day <= 22 ? constellationList.get(5) : constellationList.get(6); break; case 8: //Leo 狮子座(7月23日~8月23日) constellation = day <= 23 ? constellationList.get(6) : constellationList.get(7); break; case 9: //Virgo 处女座(8月24日~9月23日) constellation = day <= 23 ? constellationList.get(7) : constellationList.get(8); break; case 10: //Libra 天秤座(9月24日~10月23日) constellation = day <= 23 ? constellationList.get(8) : constellationList.get(9); break; case 11: //Scorpio 天蝎座(10月24日~11月22日) constellation = day <= 22 ? constellationList.get(9) : constellationList.get(10); break; case 12: //Sagittarius 射手座(11月23日~12月21日) constellation = day <= 21 ? constellationList.get(10) : constellationList.get(11); break; } return constellation; }
### 「注册邮箱发送相关源代码」
/* * 1.首先需要获取发送邮件的Session对象 * Session session = Session.getDefaultInstance(Properties prop) * 2.使用session对象 获取待发送的邮件信息 * MimeMessage mime = new MimeMessage(session) * 3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等 * 4.利用Transport 发送邮件 * */ public class EmailUtils { public static void sendEmail(User user){ //发送方 String myAccount = "15120308630@163.com"; //授权码 String myPass = "VBRMIRUBJXIERYNH"; //发件人 邮箱的 SMTP 服务器地址 String SMTPHost = "smtp.163.com"; //组成 properties Properties prop = new Properties(); prop.setProperty("mail.transport.protocol", "smtp");//设置协议类型 prop.setProperty("mail.smtp.host", SMTPHost);//定义发件人的邮箱服务器地址 prop.setProperty("mail.smtp.auth", "true");//设置请求验证 //1.Session对象 创建会话 用于和邮箱服务器进行交互 Session session = Session.getDefaultInstance(prop); //设置debug模式 可以查看详细发送信息 可略 session.setDebug(true); //2.创建方法 用来组成一封完整的邮件 //参数 session(参数配置), myAccount 发送方 , user.getEmail() 接收方 MimeMessage message = createMsg(session,myAccount,user); //4.利用Transport 发送邮件 try { Transport tran = session.getTransport(); //连接服务器 确认发送方 是否授权 tran.connect(myAccount, myPass); //发送邮件 将message 对象 传给 Transport 对象 将邮件发送出去 //参数1 要发的内容 参数2 要给哪些人发 //message.getAllRecipients() 获取到所有的收件人 | 抄送 | 密送 tran.sendMessage(message, message.getAllRecipients()); //关闭连接 tran.close(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static MimeMessage createMsg(Session session, String myAccount, User user) { //使用session对象 获取待发送的邮件信息 MimeMessage message = new MimeMessage(session); //3.设置发件人 收件人 标题 邮件内容 附件 发送时间等等 try { //3.1发件人 from message.setFrom(new InternetAddress(myAccount, "百知教务系统", "utf-8")); //3.2收件人 to 支持可以添加多个收件人 | 抄送 | 密送 如果想要发送给多个人 可以重复下面代码多次 /* * MimeMessage.RecipientType.TO 发送 * MimeMessage.RecipientType.CC 抄送 * MimeMessage.RecipientType.BCC 密送 * */ message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8")); //3.3生成邮件主题 message.setSubject("教务管理系统账号激活邮件","utf-8"); String ip = Inet4Address.getLocalHost().getHostAddress(); String url = "http://"+ip+":8080/student_system/user/active?c="+Base64Utils.encode(user.getCode()); //设置邮件正文 setContent 可以使用html标签 message.setContent(user.getUsername()+",你好<br>欢迎注册教务管理系统! 请点击链接进行激活:<a href='"+url+"'>点击此处进行激活!</a>","text/html;charset=utf-8"); //设置邮件的发送时间 是立即发送 message.setSentDate(new Date()); //保存设置 message.saveChanges(); } catch (UnsupportedEncodingException | MessagingException | UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } return message; } }
七、主要数据库表
1.表的数量 和模块有关 6表
2.确认字段
用户表:id 用户名 密码 角色
城市表:id 地址名
标签表: id 标签名,标签创建时间,标签类型
班级表: id 班级名称,班级Logo(图片路径)
小组表: id 小组名称,创建时间
学生表: id 名字,生日,QQ,电话,星座,生肖
3.确认关系
关系:
学生-班级: 多对一 外键列加在学生表 clazz_id
学生-小组: 多对一 外键列加在学生表 gropu_id
学生-就业城市: 多对一 外键列加在学生表 city_id
学生-标签: 多对多 中间表(关系表)
班级-标签: 多对一 外键列加在班级表 clazz_id
班级-小组: 一对多 外键列加在小组表 group_id
八、源码获取
今天分享这个基于java+Struts2+mybatis+jquery、用来作为java毕设和课程以及学习使用。都是不错的选择,该项目我已经全部开源到gitee上面了,如果需要研究一下的同学可以参考
《学生教务系统》源码:https://gitee.com/wanghengjie563135/student_system.git