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

简介: 学生教务系统【java实现版附源码】

学生教务系统【java实现版附源码】

一、需求背景

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


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


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


二、产品目标

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


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

1、开发环境


image.png

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


image.png

(3)用户角色描述


image.png

四、具体需求

1、功能划分

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

2、项目整体功能框架


image.png

3、概念数据模型CMD

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


image.png


五、主要功能截图

**「用户登录」 **

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


image.png


「用户注册」

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


image.png

「用户激活模块」

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

image.png

image.png

image.png

「学生管理模块」

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


image.png

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

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


image.png

「班级管理模块」

班级的增删查功能


image.png

「标签管理模块」

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


image.png

「城市管理模块」


image.png

六、主要代码展示

「学生分页展示相关」

两张数据库表连接分页查询sql语句:

  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;
  }
}

七、主要数据库表

表的数量 和模块有关 6表


确认字段


   用户表:id 用户名 密码 角色


   城市表:id 地址名


   标签表: id 标签名,标签创建时间,标签类型


   班级表: id 班级名称,班级Logo(图片路径)


   小组表: id 小组名称,创建时间


   学生表: id 名字,生日,QQ,电话,星座,生肖


确认关系

   关系:


       学生-班级: 多对一 外键列加在学生表 clazz_id


       学生-小组: 多对一 外键列加在学生表 gropu_id


       学生-就业城市: 多对一 外键列加在学生表 city_id


       学生-标签: 多对多 中间表(关系表)


       班级-标签: 多对一 外键列加在班级表 clazz_id


       班级-小组: 一对多 外键列加在小组表 group_id


八、源码获取

今天分享这个基于java+Struts2+mybatis+jquery、用来作为java毕设和课程以及学习使用。都是不错的选择,该项目我已经全部开源到gitee上面了,如果需要研究一下的同学可以参考


《学生教务系统》源码:https://gitee.com/wanghengjie563135/student_system.git


image.png

image.png


相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
18 2
|
10天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
26 3
|
15天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
47 3
|
19天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
17 1
|
20天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
24天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
26天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
47 1
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
11天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
7天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
27 9