学生教务系统(java实现版)【附全部源码】

简介: 学生教务系统【java实现版附源码】🍅 作者:程序员小王🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕

一、需求背景

《学生教务系统》 系统设计以方便快捷和安全为出发点,放弃传统的人工记录对学生信息管理的缺陷和不足, 采用全新的方式使学校对学生信息进行存储和维护,增加管理效率。


本系统大体为教务学生管理系统 、并且赋予了管理员很多功能来操作这个系统,包括:学生管理,小组管理,班级管理等功能;通过这些功能模块的设计,满足了老师对学生的信息进行管控所需的功能。


系统采用 c/s 三层结构 ,对动态页面的制作采用了 JSP+Ajax 技术,为了实现管理系统的安全可靠以及对有些代码可以进行重复使用考虑, 对程序的重要代码进行封装时采用 Java Bean。本系统贯彻以人为本的思想,实用性高。


二、产品目标

学生信息的管理工作变得越来越庞大和繁冗,效率也低。为了充分利用互联网带给人们的便利,更好地提高教学管理管理工作的效率,使学生和教职员工能更方便地进行信息查询活动,特开发此教学管理系统。本软件通过权限识别登录到该系统,权限不同享有的功能就又说差异,来实现日常的学生信息的管理。

三、《学生教务系统》项目介绍:

1、开发环境

image.png

2、《TJCU教务系统》的总体功能

image.png


(3)用户角色描述

image.png


四、具体需求

1、功能划分

 

  本系统总体功能上是C/S 结构的Windows应用程序!


2、项目整体功能框架

0.png


3、概念数据模型CMD

CMD是实体与实体之间关系的模型(使用PowerShell 设计)

1.png


五、主要功能截图

**「用户登录」 **

用户登录是选择角色进行登录:管理员、用户

2.png



「用户注册」

1. 用户登录之前用户名必须是在注册时通过邮箱激活后的,否则不能登录, 返回提示信息:用户名输入错误~~
2. 如果用户名输入错误 返回提示信息:用户名输入错误~~
3. 如果验证码输错    返回提示信息: 验证码输入错误~~~
4. 如果用户名,验证码正确  返回提示信息: 密码输入错误~~


3.png

3.png

「用户激活模块」

1.注册进行提交后,会跳转到请去邮箱激活用户页面 
3.激活成功后会跳转到登录


4.png


5.png

6.png



「学生管理模块」

1. 添加学生信息(城市表,班级表,标签表,小组表有数据之后才能添加)
2. 功能是修改学生,删除学生
3. 展示内容(分页实现)
4. 以Json形式下载信息
5. 以QQ或者姓名或者手机号查询学生信息


8.png


** 「小组管理模块」**

1. 添加小组功能:会添加组名称,然后选择班级(小组是班级的外键,需要先建班级表才能创建小组表)
          (其中包含student外键:添加组名称时:本组学生的标签会自动增加到小组标签上,并且统计本组学生人数)
2. 删除小组功能: 删除小组之前需要将本小组的studnet删除或者修改带其他组,否则无法删除
                (使用Ajax判断是否删除)
3.页面展示功能中的学生标签和学生人数,将从外键Student中获取,班级名称名班级表中获取

9.png


「班级管理模块」

班级的增删查功能

10.png


「标签管理模块」

1. 添加标签: 添加标签注意添加标签名称,标签类型(标签类型包含:学生/班级两种类型)
2. 删除标签: 删除标签名字字段之前之前,我们得把对应的学生表,
            班级表中选中相关标签的班级和班级信息进行修改或者删除
            (使用Ajax判断是否删除)


11.png

11.png


「城市管理模块」

12.png


六、主要代码展示

「学生分页展示相关」

  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

13.png

14.png

相关文章
|
11天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
45 7
|
23天前
|
数据采集 人工智能 Java
Java产科专科电子病历系统源码
产科专科电子病历系统,全结构化设计,实现产科专科电子病历与院内HIS、LIS、PACS信息系统、区域妇幼信息平台的三级互联互通,系统由门诊系统、住院系统、数据统计模块三部分组成,它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。
28 4
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
26天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
4天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
39 13
|
17天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
47 12
|
12天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
17天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
37 3
|
13天前
|
人工智能 移动开发 安全
家政上门系统用户端、阿姨端源码,java家政管理平台源码
家政上门系统基于互联网技术,整合大数据分析、AI算法和现代通信技术,提供便捷高效的家政服务。涵盖保洁、月嫂、烹饪等多元化服务,支持多终端访问,具备智能匹配、在线支付、订单管理等功能,确保服务透明、安全,适用于家庭生活的各种需求场景,推动家政市场规范化发展。