基于SSM+Bootstrap【爱校教务系统管理系统】附源码

简介: 基于SSM+Bootstrap【爱校教务系统管理系统】附源码

前言介绍:

现如今学校招生越来越多,必然就会有大量的学生信息需要处理。如果只靠人力来完成,这将会变成一项非常繁琐、复杂的工作,而且还会出现很多意想不到的错误,给管理这些数据带来了很大的不便,也越来越不适合学校发展的需要.教务管理系统是一个庞大而复杂的系统,它包括对院系资料的管理,对课程资料的管理,对学生资料的管理和对学生成绩的管理等等主要的功能。教务管理系统是每个学校的一项必不可少的内容,它的好坏直接影响到学校里的主要工作,一旦此系统瘫疾,学校将会受到非常严重的损失,也会影响到每一个学生.


Nowadays, with more and more school enrollment, it is inevitable that there will be a lot of student information to deal with. If only rely on manpower to complete, this will become a very tedious, complex work, and there will be a lot of unexpected mistakes, to manage these data brought great inconvenience, but also more and more not suitable for the needs of school development. Educational administration management system is a huge and complex system, it includes the management of department information, the management of course information, the management of student information and the management of student achievement and so on. Educational administration management system is an essential content of each school, its quality directly affects the main work in the school, once this system paralysis disease, the school will be very serious loss, will also affect every student.

image.png

一、行业发展缓慢的原因分析


所以现如今设计一个功能完整、操作简单以及界面友好的教务管理系统变得非常重要。


为了提高教务管理工作的效率,减少错误的出现,节约大量的人力资源,现在的学校的教务管理也逐步从手工转到计算机自动化信息处理阶段。


通过这个系统,用户可以方便的对院系资料、课程资料、学生资料和学生成绩资料进行添加、修改和删除操作,还可以对学生资料和成绩进行查询操作.除此之外,对用户的添加和删除操作也很方便


系统设计:

系统设计:

该项目是基于SSM+Bootstrap【爱校教务系统管理系统】,下面做了功能和相关技术的描述,适合出入职场和即将进入职场的各位,如有问题欢迎留言。

系统总共分为几个大的模块。


管理员可对 教师信息、学生信息、课程信息 进行 增删改查 操作,管理员账户,可以重置非管理员账户的密码


课程管理:当课程已经有学生选课成功时,将不能删除

学生管理:添加学生信息时,其信息也会添加到登录表中

教师管理:同上

账户密码重置:

修改密码:

教师登陆后,可以获取其,教授的课程列表,并可以给已经选择该课程的同学打分,无法对已经给完分的同学进行二次操作


我的课程

修改密码

学生登录后,根据学生信息,获取其已经选择的课程,和已经修完的课程


所有课程: 在这里选修课程,选好后,将会自动跳转到已选课程选项


已选课程: 这里显示的是,还没修完的课程,也就是老师还没给成绩,由于还没有给成绩,所以这里可以进行退课操作


已修课程: 显示已经修完,老师已经给成绩的课程


修改密码:

运行环境

JDK8、Tomcat8、MySQL5.7、IntelliJ IDEA、Maven

  • IOC容器:Spring Web框架:SpringMVC
  • ORM框架:Mybatis
  • 数据源:C3P0
  • 日志:log4j
  • 前端框架:Bootstrap

账号:

![Alt text]

管理员页:管理员账户:admin+123

![Alt text]

学生页:学生登录: 10001+123

![Alt text]

老师页:教师登录:1001+123

功能截图:

代码实现:



import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
       
    public MyServlet() {
        super();
    }

    @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("doget MyServlet");
  }
    @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      System.out.println("dopost MyServlet");
      super.doPost(request, response);
  }
    @Override
    public void init(ServletConfig servletConfig){
      System.out.println("MyServlet");
    }

}


package com.system.controller;

import com.system.exception.CustomException;
import com.system.po.*;
import com.system.service.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by Jacey on 2017/6/30.
 */
@Controller
@RequestMapping("/admin")
public class AdminController {

  @Resource(name = "studentServiceImpl")
  private StudentService studentService;

  @Resource(name = "teacherServiceImpl")
  private TeacherService teacherService;

  @Resource(name = "courseServiceImpl")
  private CourseService courseService;

  @Resource(name = "collegeServiceImpl")
  private CollegeService collegeService;

  @Resource(name = "userloginServiceImpl")
  private UserloginService userloginService;

  /*
   * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<学生操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   * >>>>>
   */

  // 学生信息显示
  @RequestMapping("/showStudent")
  public String showStudent(Model model, Integer page) throws Exception {

    List<StudentCustom> list = null;
    // 页码对象
    PagingVO pagingVO = new PagingVO();
    // 设置总页数
    pagingVO.setTotalCount(studentService.getCountStudent());
    if (page == null || page == 0) {
      pagingVO.setToPageNo(1);
      list = studentService.findByPaging(1);
    } else {
      pagingVO.setToPageNo(page);
      list = studentService.findByPaging(page);
    }

    model.addAttribute("studentList", list);
    model.addAttribute("pagingVO", pagingVO);

    return "admin/showStudent";

  }

  // 添加学生信息页面显示
  @RequestMapping(value = "/addStudent", method = { RequestMethod.GET })
  public String addStudentUI(Model model) throws Exception {

    List<College> list = collegeService.finAll();

    model.addAttribute("collegeList", list);

    return "admin/addStudent";
  }

  // 添加学生信息操作
  @RequestMapping(value = "/addStudent", method = { RequestMethod.POST })
  public String addStudent(StudentCustom studentCustom, Model model)
      throws Exception {

    Boolean result = studentService.save(studentCustom);

    if (!result) {
      model.addAttribute("message", "学号重复");
      return "error";
    }
    // 添加成功后,也添加到登录表
    Userlogin userlogin = new Userlogin();
    userlogin.setUsername(studentCustom.getUserid().toString());
    userlogin.setPassword("123");
    userlogin.setRole(2);
    userloginService.save(userlogin);

    // 重定向
    return "redirect:/admin/showStudent";
  }

  // 修改学生信息页面显示
  @RequestMapping(value = "/editStudent", method = { RequestMethod.GET })
  public String editStudentUI(Integer id, Model model) throws Exception {
    if (id == null) {
      // 加入没有带学生id就进来的话就返回学生显示页面
      return "redirect:/admin/showStudent";
    }
    StudentCustom studentCustom = studentService.findById(id);
    if (studentCustom == null) {
      throw new CustomException("未找到该名学生");
    }
    List<College> list = collegeService.finAll();

    model.addAttribute("collegeList", list);
    model.addAttribute("student", studentCustom);

    return "admin/editStudent";
  }

  // 修改学生信息处理
  @RequestMapping(value = "/editStudent", method = { RequestMethod.POST })
  public String editStudent(StudentCustom studentCustom) throws Exception {

    studentService.updataById(studentCustom.getUserid(), studentCustom);

    // 重定向
    return "redirect:/admin/showStudent";
  }

  // 删除学生
  @RequestMapping(value = "/removeStudent", method = { RequestMethod.GET })
  private String removeStudent(Integer id) throws Exception {
    if (id == null) {
      // 加入没有带学生id就进来的话就返回学生显示页面
      return "admin/showStudent";
    }
    studentService.removeById(id);
    userloginService.removeByName(id.toString());

    return "redirect:/admin/showStudent";
  }

  // 搜索学生
  @RequestMapping(value = "selectStudent", method = { RequestMethod.POST })
  private String selectStudent(String findByName, Model model)
      throws Exception {

    List<StudentCustom> list = studentService.findByName(findByName);

    model.addAttribute("studentList", list);
    return "admin/showStudent";
  }

  /*
   * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<教师操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   * >>>>>>>>
   */

  // 教师页面显示
  @RequestMapping("/showTeacher")
  public String showTeacher(Model model, Integer page) throws Exception {

    List<TeacherCustom> list = null;
    // 页码对象
    PagingVO pagingVO = new PagingVO();
    // 设置总页数
    pagingVO.setTotalCount(teacherService.getCountTeacher());
    if (page == null || page == 0) {
      pagingVO.setToPageNo(1);
      list = teacherService.findByPaging(1);
    } else {
      pagingVO.setToPageNo(page);
      list = teacherService.findByPaging(page);
    }

    model.addAttribute("teacherList", list);
    model.addAttribute("pagingVO", pagingVO);

    return "admin/showTeacher";

  }

  // 添加教师信息
  @RequestMapping(value = "/addTeacher", method = { RequestMethod.GET })
  public String addTeacherUI(Model model) throws Exception {

    List<College> list = collegeService.finAll();

    model.addAttribute("collegeList", list);

    return "admin/addTeacher";
  }

  // 添加教师信息处理
  @RequestMapping(value = "/addTeacher", method = { RequestMethod.POST })
  public String addTeacher(TeacherCustom teacherCustom, Model model)
      throws Exception {

    Boolean result = teacherService.save(teacherCustom);

    if (!result) {
      model.addAttribute("message", "工号重复");
      return "error";
    }
    // 添加成功后,也添加到登录表
    Userlogin userlogin = new Userlogin();
    userlogin.setUsername(teacherCustom.getUserid().toString());
    userlogin.setPassword("123");
    userlogin.setRole(1);
    userloginService.save(userlogin);

    // 重定向
    return "redirect:/admin/showTeacher";
  }

  // 修改教师信息页面显示
  @RequestMapping(value = "/editTeacher", method = { RequestMethod.GET })
  public String editTeacherUI(Integer id, Model model) throws Exception {
    if (id == null) {
      return "redirect:/admin/showTeacher";
    }
    TeacherCustom teacherCustom = teacherService.findById(id);
    if (teacherCustom == null) {
      throw new CustomException("未找到该名学生");
    }
    List<College> list = collegeService.finAll();

    model.addAttribute("collegeList", list);
    model.addAttribute("teacher", teacherCustom);

    return "admin/editTeacher";
  }

  // 修改教师信息页面处理
  @RequestMapping(value = "/editTeacher", method = { RequestMethod.POST })
  public String editTeacher(TeacherCustom teacherCustom) throws Exception {

    teacherService.updateById(teacherCustom.getUserid(), teacherCustom);

    // 重定向
    return "redirect:/admin/showTeacher";
  }

  // 删除教师
  @RequestMapping("/removeTeacher")
  public String removeTeacher(Integer id) throws Exception {
    if (id == null) {
      // 加入没有带教师id就进来的话就返回教师显示页面
      return "admin/showTeacher";
    }
    teacherService.removeById(id);
    userloginService.removeByName(id.toString());

    return "redirect:/admin/showTeacher";
  }

  // 搜索教师
  @RequestMapping(value = "selectTeacher", method = { RequestMethod.POST })
  private String selectTeacher(String findByName, Model model)
      throws Exception {

    List<TeacherCustom> list = teacherService.findByName(findByName);

    model.addAttribute("teacherList", list);
    return "admin/showTeacher";
  }

  /*
   * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<课程操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   * >>>>>>>>
   */

  // 课程信息显示
  @RequestMapping("/showCourse")
  public String showCourse(Model model, Integer page) throws Exception {

    List<CourseCustom> list = null;
    // 页码对象
    PagingVO pagingVO = new PagingVO();
    // 设置总页数
    pagingVO.setTotalCount(courseService.getCountCouse());
    if (page == null || page == 0) {
      pagingVO.setToPageNo(1);
      list = courseService.findByPaging(1);
    } else {
      pagingVO.setToPageNo(page);
      list = courseService.findByPaging(page);
    }

    model.addAttribute("courseList", list);
    model.addAttribute("pagingVO", pagingVO);

    return "/admin/showCourse";

  }

  // 添加课程
  @RequestMapping(value = "/addCourse", method = { RequestMethod.GET })
  public String addCourseUI(Model model) throws Exception {

    List<TeacherCustom> list = teacherService.findAll();
    List<College> collegeList = collegeService.finAll();

    model.addAttribute("collegeList", collegeList);
    model.addAttribute("teacherList", list);

    return "admin/addCourse";
  }

  // 添加课程信息处理
  @RequestMapping(value = "/addCourse", method = { RequestMethod.POST })
  public String addCourse(CourseCustom courseCustom, Model model)
      throws Exception {

    Boolean result = courseService.save(courseCustom);

    if (!result) {
      model.addAttribute("message", "课程号重复");
      return "error";
    }

    // 重定向
    return "redirect:/admin/showCourse";
  }

  // 修改教师信息页面显示
  @RequestMapping(value = "/editCourse", method = { RequestMethod.GET })
  public String editCourseUI(Integer id, Model model) throws Exception {
    if (id == null) {
      return "redirect:/admin/showCourse";
    }
    CourseCustom courseCustom = courseService.findById(id);
    if (courseCustom == null) {
      throw new CustomException("未找到该课程");
    }
    List<TeacherCustom> list = teacherService.findAll();
    List<College> collegeList = collegeService.finAll();

    model.addAttribute("teacherList", list);
    model.addAttribute("collegeList", collegeList);
    model.addAttribute("course", courseCustom);

    return "admin/editCourse";
  }

  // 修改教师信息页面处理
  @RequestMapping(value = "/editCourse", method = { RequestMethod.POST })
  public String editCourse(CourseCustom courseCustom) throws Exception {

    courseService.upadteById(courseCustom.getCourseid(), courseCustom);

    // 重定向
    return "redirect:/admin/showCourse";
  }

  // 删除课程信息
  @RequestMapping("/removeCourse")
  public String removeCourse(Integer id) throws Exception {
    if (id == null) {
      // 加入没有带教师id就进来的话就返回教师显示页面
      return "admin/showCourse";
    }
    courseService.removeById(id);

    return "redirect:/admin/showCourse";
  }

  // 搜索课程
  @RequestMapping(value = "selectCourse", method = { RequestMethod.POST })
  private String selectCourse(String findByName, Model model)
      throws Exception {

    List<CourseCustom> list = courseService.findByName(findByName);

    model.addAttribute("courseList", list);
    return "admin/showCourse";
  }

  /*
   * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   * >>>>>>>>
   */

  // 普通用户账号密码重置
  @RequestMapping("/userPasswordRest")
  public String userPasswordRestUI() throws Exception {
    return "admin/userPasswordRest";
  }

  // 普通用户账号密码重置处理
  @RequestMapping(value = "/userPasswordRest", method = { RequestMethod.POST })
  public String userPasswordRest(Userlogin userlogin) throws Exception {

    Userlogin u = userloginService.findByName(userlogin.getUsername());

    if (u != null) {
      if (u.getRole() == 0) {
        throw new CustomException("该账户为管理员账户,没法修改");
      }
      u.setPassword(userlogin.getPassword());
      userloginService.updateByName(userlogin.getUsername(), u);
    } else {
      throw new CustomException("没找到该用户");
    }

    return "admin/userPasswordRest";
  }

  // 本账户密码重置
  @RequestMapping("/passwordRest")
  public String passwordRestUI() throws Exception {
    return "admin/passwordRest";
  }

}

package com.system.controller;

import com.system.po.Userlogin;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Created by Jacey on 2017/6/30.
 */
@Controller
public class LoginController {

    //登录跳转
    @RequestMapping(value = "/login", method = {RequestMethod.GET})
    public String loginUI() throws Exception {
        return "../../login";
    }

    //登录表单处理
    @RequestMapping(value = "/login", method = {RequestMethod.POST})
    public String login(Userlogin userlogin) throws Exception {

        //Shiro实现登录
        UsernamePasswordToken token = new UsernamePasswordToken(userlogin.getUsername(),
                userlogin.getPassword());
        Subject subject = SecurityUtils.getSubject();

        //如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常
        subject.login(token);

        if (subject.hasRole("admin")) {
            return "redirect:/admin/showStudent";
        } else if (subject.hasRole("teacher")) {
            return "redirect:/teacher/showCourse";
        } else if (subject.hasRole("student")) {
            return "redirect:/student/showCourse";
        }

        return "/login";
    }

}

package com.system.controller;

import com.system.exception.CustomException;
import com.system.po.Userlogin;
import com.system.service.UserloginService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.annotation.Resource;

/**
 * Created by Jacey on 2017/7/6.
 */
@Controller
public class RestPasswordController {

    @Resource(name = "userloginServiceImpl")
    private UserloginService userloginService;

    // 本账户密码重置
    @RequestMapping(value = "/passwordRest", method = {RequestMethod.POST})
    public String passwordRest(String oldPassword, String password1) throws Exception {
        Subject subject = SecurityUtils.getSubject();
        String username = (String) subject.getPrincipal();

        Userlogin userlogin = userloginService.findByName(username);

        if (!oldPassword.equals(userlogin.getPassword())) {
            throw new CustomException("旧密码不正确");
        } else {
            userlogin.setPassword(password1);
            userloginService.updateByName(username, userlogin);
        }

        return "redirect:/logout";
    }

}

论文参考:

目录
相关文章
|
10月前
|
Java 关系型数据库 MySQL
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
本文针对高校体育场管理系统的开发与实现进行详细介绍。随着经济快速发展,人们对手机软件需求增加,高校体育场管理系统应运而生。系统采用JAVA技术、Mysql数据库和SSM框架等成熟技术,通过分析功能需求、可行性及性能,设计出包含管理员、用户和学生角色的功能模块。系统实现用户注册登录、信息管理等功能,简化传统手工统计模式,提高管理效率,满足用户对信息获取的及时性与准确性需求。
weixin050高校体育场管理系统+ssm(文档+源码)_kaic
|
10月前
|
小程序 JavaScript 关系型数据库
weixin118电影院订票选座系统设计及实现+ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的电影院订票选座系统。该系统采用WXML、WXS、JS小程序语言开发,结合微信开发者工具和MYSQL数据库,实现了便捷的订票选座功能。用户无需下载安装,通过微信即可快速访问,操作简单高效。系统分为用户与管理员两大模块,支持电影信息查询、在线选座、订单管理等功能,同时确保数据安全与用户体验。经过可行性分析、功能设计、测试等环节,系统表现出良好的稳定性、实用性和可扩展性,为用户提供了一个全面、便捷的订票平台。
|
9月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
10月前
|
小程序 Java 关系型数据库
weixin116大学生就业平台微信小程序+ssm(文档+源码)_kaic
本文介绍了一款大学生就业平台微信小程序的开发过程,涵盖开发环境、系统设计、实现与测试等方面。该小程序基于微信平台特性,采用MYSQL数据库存储数据,确保系统稳定与安全,同时满足学生、企业和管理员不同权限用户的功能需求。通过简化操作流程,实现了招聘信息查看、简历投递等实用功能,旨在为用户提供便捷高效的求职体验,符合“操作简单,功能实用”的设计理念。
|
10月前
|
小程序 Java 关系型数据库
weixin030英语学习交流平台小程序+ssm(文档+源码)_kaic
本文介绍了英语学习交流平台小程序的开发全过程,包括系统分析、设计与实现。该小程序基于Java的SSM框架进行后端管理开发,使用MySQL作为数据库,并借助微信开发者工具确保系统稳定性。小程序设有管理员和用户两个角色,功能涵盖个人中心、每日打卡、学习计划、论坛交流等,具有操作简单、界面清晰、功能齐全的特点。通过技术可行性、经济可行性和操作可行性分析,证明了系统的实用性和高效性,为英语学习者提供了一个便捷的交流平台。
|
10月前
|
小程序 Java 关系型数据库
weixin025移动学习平台的设计与实现+ssm(文档+源码)_kaic
基于微信小程序的移动学习平台旨在解决传统APP占用过多手机存储空间的问题,提升用户体验。该平台使用微信开发者工具开发前端,SSM框架和Java语言开发后台,并采用MySQL数据库保存数据。系统支持管理员对教师、课程、学生信息进行管理,教师可查看及审核作业,管理课程资源;学生能提交作业、查看审核结果并收藏或评论课程资源。此平台使用户无需安装独立APP即可访问学习内容,极大提升了便捷性和管理效率。 关键词:基于微信小程序的移动学习平台;微信开发者工具;SSM框架
|
10月前
|
安全 小程序 Java
weixin027校园二手平台的设计与实现+ssm(文档+源码)_kaic
本项目基于微信小程序开发校园二手交易平台,旨在解决大学生闲置物品交易问题。系统采用Java语言和MySQL数据库设计,支持用户浏览、收藏、评价商品及发布闲置物品。管理员可审核商品和用户信息,确保交易安全。系统具备在线搜索功能,方便用户查找商品,并提供实时沟通渠道,增强平台透明度和用户体验。该平台简化了二手交易流程,满足了大学生对便捷、高效交易的需求,具有重要的实际应用价值。
|
9月前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
10月前
|
前端开发 Java 关系型数据库
基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
439 17
|
10月前
|
前端开发 Java 关系型数据库
基于ssm的培训学校教学管理平台,附源码+数据库+论文
金旗帜文化培训学校网站项目包含管理员、教师和用户三种角色,各角色功能通过用例图展示。技术框架采用Java语言,B/S架构,前端为Vue+HTML+CSS+LayUI,后端为SSM,数据库为MySQL,运行环境为JDK8+Tomcat8.5。项目含12张数据库表,非前后端分离,支持演示视频与截图查看。购买后提供免费安装调试服务,确保顺利运行。
196 14