学生教务系统(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


相关文章
|
3天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
8 1
|
5天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
8天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
10天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
32 1
|
14天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
18天前
|
前端开发 Java 数据库连接
基于Java的校车管理系统(下)
基于Java的校车管理系统(下)
11 0
|
18天前
|
存储 前端开发 Java
基于Java的校车管理系统
基于Java的校车管理系统(上)
14 0
|
18天前
|
Java 数据库
基于java的汽车服务管理系统(Car Service Management System)
基于java的汽车服务管理系统(Car Service Management System)
15 0
|
安全 Java
Java并发编程笔记之CopyOnWriteArrayList源码分析
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。
19547 0
|
Java 安全
Java并发编程笔记之读写锁 ReentrantReadWriteLock 源码分析
我们知道在解决线程安全问题上使用 ReentrantLock 就可以,但是 ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而实际情况下会有写少读多的场景,显然 ReentrantLock 满足不了需求,所以 ReentrantReadWriteLock 应运而生,ReentrantReadWriteLock 采用读写分离,多个线程可以同时获取读锁。
3131 0