草庐IT

毕业设计:基于SSM框架的学生实习管理系统

毕知必会 2023-04-22 原文

系统设计

主要功能点

​ 高校实习管理系统主要解决各大高校学生暑假实习/寒假实习等过程管理难的问题,提升学校、老师和学生、企业之间的联系,避免学生因实习任务而感到为难,解决学校和老师无法实时感知到学生的实习情况,无法了解到学生的实习过程,无法对实习结果进行评分等问题,提升企业和学校的沟通,及时发现学生存在的问题,优化实习安排,更好的帮助学生尽快的融入社会。

​ 高校实习管理系统的主要需求是提供给学生以及老师管理学生实习过程的系统,方便师生管理自己的实习计划,目前系统分为 教师、企业以及学生三种角色,以及固定的管理员角色。 其中教师负责制定和发布学习计划,发布学习任务或者管理学生的日记等,评价学生的实习情况以及查看统计分析。 企业负责根据教师发布的学习计划,提供相应的实习岗位供学生选择,也可以对学生的岗位实习情况进行评价。 学生负责选择适合自己的学习计划以及学习岗位,并按时填写完成情况和周报等。 管理员角色负责管理用户信息、角色信息、角色权限、学生管理,教师信息管理、企业信息管理等等。

主要功能如下:

  1. 企业角色功能模块

    • 注册:注册企业账户
  • 登录:登录企业账户
    • 查看实习计划:查看教师发布的实习计划
  • 实习岗位管理:对实习岗位进行新增,修改,删除,查询操作。
    • 实习任务管理:对实习任务进行新增,修改,删除,查询操作。
  • 任务完成情况管理:可以查看任务完成情况,并予以评价。
  1. 教师角色功能模块

    • 注册:注册教师账户
    • 登录:登录教师账户
    • 实习计划管理:对实习计划进行新增,修改,删除,查询操作。
    • 查看实习岗位:查看企业发布的实习岗位。
    • 查看任务完成情况:查看学生的任务完成情况。
    • 实习评价:对各个学生的实习情况予以评价。
  2. 学生角色功能模块

    • 注册:注册教师账户

    • 登录:登录教师账户

    • 查看实习计划:查看教师发布的实习计划并选择加入。

    • 查看实习岗位:查看企业发布的实习岗位并选择加入。

    • 我参加的实习计划:查看我选择加入的实习计划。

    • 我的实习岗位:查看我选择加入的实习岗位。

    • 任务管理:查看企业针对岗位发布的实习任务并填写任务完成情况。

  3. 管理员角色功能模块

    • 学院管理:维护学院的信息
    • 专业管理:维护专业的信息
    • 学生管理:维护学生的信息
    • 统计分析
      • 学生人数分布
      • 学生专业分布
      • 学生实习计划分布
      • 学生实习岗位分布

拟解决的主要问题

  1. 前端展示分类合理,内容实用,主题突出;后台服务设计思路清晰,通用性强。
  2. 分类规则标准,数据接口设计通用。
  3. 后台数据可以快速检索。进行查询、增加、删除、修改、统计等操作。
  4. 系统安全包含用户安全,数据安全,验证技术可靠合理通用,对具体操作分角色分权限,保证数据的安全可靠。

技术实现

涉及的主要技术点

  1. 基于SSM思想实现的SpringBoot框架,用于提供web服务,SpringBoot是在SpringMvc的基础上提出了约定大于配置的思想,以约定的形式省去了SpringMvc的许多配置项,这些配置项可以以约定好的名称以类似插件的方式接入到系统中。
  2. MyBatis框架,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
  3. Mysql数据库,MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
  4. Shiro框架,Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
  5. Redis缓存数据库,Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
  6. Layui框架,一个优秀的前端UI框架,可以帮你快速建立增删改查等基础前端架构,https://layuion.com/
  7. Jquery,Jquery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由[John Resig](https://baike.baidu.com/item/John Resig/6336344)发布。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
  8. ECharts,ECharts是一款基于JavaScript数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目

设计思路

本系统按照角色划分为管理员、学生、教师、企业,教师角色负责管理实习计划,企业负责管理实习岗位,学生角色可以选择实习计划、实习岗位等加入,并且填写相关的任务反馈,管理员角色负责查看整体的统计分析,对整体学生的实习过程进行管理。

代码实现

本系统采用Java语言编写,主要是基于Mvc的架构模式实现,按照模块可以划分为控制层、服务层、持久层三大块

  1. 控制层

    控制层主要是基于Springboot提供Web接口,本系统所有数据接口均采用JSON的方式进行数据交互,页面映射采用ModelAndView的方式处理,只映射页面不传递数据,命名方式也是按照业务划分的,比如实习计划管理对应的控制层代码文件命名为PlanController

    控制层代码如下所示,控制层会按照统一的状态码返回信息,遵循Http状态码的规则,默认200为正常请求,异常请求会返回msg作为提示信息。部分代码实现如下所示

    package com.crk.shixiguanli.controller;
    
    import com.crk.shixiguanli.entity.Plan;
    import com.crk.shixiguanli.entity.User;
    import com.crk.shixiguanli.service.PlanService;
    import com.crk.shixiguanli.util.LayUiTableJson;
    import com.crk.shixiguanli.util.Page;
    import com.crk.shixiguanli.util.ResponseResult;
    import org.apache.shiro.SecurityUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.util.List;
    
    /**
     * Description:
     *
     * @author:
     * Date: 2020-04-26
     * Time: 16:32
     */
    @RestController
    @RequestMapping("plan")
    public class PlanController {
        @Autowired
        PlanService planService;
    
        /**
         * 列表页
         * @return
         */
        @RequestMapping("manage")
        public ModelAndView manage(){
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/planList.html");
            return modelAndView;
        }
    
        @RequestMapping("show")
        public ModelAndView show(){
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/planShow.html");
            modelAndView.addObject("userType",userinfo.getUserType());
            return modelAndView;
        }
    
        /**
         * 详情页
         * @return
         */
        @GetMapping("detail")
        public ModelAndView detail(){
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/planAdd.html");
            return modelAndView;
        }
    
        /**
         * 详情页
         * @return
         */
        @GetMapping("detailShow")
        public ModelAndView detailShow(){
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/planAddShow.html");
            modelAndView.addObject("userType",userinfo.getUserType());
            return modelAndView;
        }
    
    
        @GetMapping("detailStudent")
        public ModelAndView detailStudent(){
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/planDetailStudent.html");
            return modelAndView;
        }
    
        /**
         * 详情页
         * @return
         */
        @GetMapping("myPlan")
        public ModelAndView myPlan(){
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/myPlan.html");
            return modelAndView;
        }
    
        @GetMapping("studentComplete")
        public ModelAndView stduentComplete(){
            ModelAndView modelAndView = new ModelAndView("/workspace/plan/studentComplete.html");
            return modelAndView;
        }
    
    
        @GetMapping("statics")
        public ModelAndView statics(){
            ModelAndView modelAndView = new ModelAndView("/workspace/statics.html");
            return modelAndView;
        }
    
    
    
        /**
         * 分页查询
         * @param page
         * @param limit
         * @return
         */
        @GetMapping("queryPage")
        public LayUiTableJson queryPage(@RequestParam(defaultValue = "1") int page
                , @RequestParam(defaultValue = "10") int limit){
            Page pageInfo = new Page();
            pageInfo.setCurrentPage(page);
            pageInfo.setSize(limit);
            ResponseResult ResponseResult = planService.queryPage(pageInfo);
            LayUiTableJson layUiTableJson = new LayUiTableJson(0,null,pageInfo.getAllRow(),(List)ResponseResult.getData());
            return layUiTableJson;
        }
    
        @GetMapping("queryStudentDetail")
        public LayUiTableJson queryStudentDetail(String planName,String studentName,@RequestParam(defaultValue = "1") int page
                , @RequestParam(defaultValue = "10") int limit){
            Page pageInfo = new Page();
            pageInfo.setCurrentPage(page);
            pageInfo.setSize(limit);
            ResponseResult ResponseResult = planService.queryStudentDetail(planName,studentName,pageInfo);
            LayUiTableJson layUiTableJson = new LayUiTableJson(0,null,pageInfo.getAllRow(),(List)ResponseResult.getData());
            return layUiTableJson;
        }
    
        @GetMapping("queryStudentComplete")
        public ResponseResult queryStudentComplete(@RequestParam("studentId") int studentId){
            return planService.queryStudentComplete(studentId);
        }
    
        @GetMapping("getStudentComplete")
        public ResponseResult getStudentComplete(@RequestParam("id") int id){
            return planService.getStudentComplete(id);
        }
    
    
    
    
        /**
         * 查询所有
         * @return
         */
        @RequestMapping("queryAll")
        public ResponseResult queryAll(){
            return planService.queryAll();
        }
    
        /**
         * 查询单个
         * @param id
         * @return
         */
        @RequestMapping("getOneShow")
        public ResponseResult getOneShow(@RequestParam("id") Integer id){
            return planService.getOneShow(id);
        }
    
        /**
         * 查询单个
         * @param id
         * @return
         */
        @RequestMapping("getOne")
        public ResponseResult getOne(@RequestParam("id") Integer id){
            return planService.getOne(id);
        }
    
    
        /**
         * 查询单个
         * @return
         */
        @RequestMapping("getMyPlan")
        public ResponseResult getMyPlan(){
            return planService.getMyPlan();
        }
    
    
        /**
         * 加入计划
         * @param id
         * @return
         */
        @RequestMapping("joinPlan")
        public ResponseResult joinPlan(@RequestParam("id") Integer id){
            return planService.joinPlan(id);
        }
    
        /**
         * 保存数据
         * @param job
         * @return
         */
        @RequestMapping("save")
        public ResponseResult save(Plan job){
            return planService.save(job);
        }
    
        /**
         * 删除数据
         * @param id
         * @return
         */
        @RequestMapping("delete")
        public ResponseResult delete(@RequestParam("id") Integer id){
            return planService.delete(id);
        }
    
        @RequestMapping("queryPlanList")
        public ResponseResult queryPlanList(){
            return planService.queryPlanList();
        }
    
    
    
        @RequestMapping("evaluate")
        public ResponseResult evaluate(@RequestParam("id") int id,@RequestParam("evaluate") String evaluate,@RequestParam("score") String score){
            return planService.evaluate(id,evaluate,score);
        }
    
        @RequestMapping("getCount")
        public ResponseResult getCount(){
            return planService.getCount();
        }
    
        @RequestMapping("getStudentProfessionalMap")
        public ResponseResult getStudentProfessionalMap(){
            return planService.getStudentProfessionalMap();
        }
    
        @RequestMapping("getStudentPlanMap")
        public ResponseResult getStudentPlanMap(){
            return planService.getStudentPlanMap();
        }
    
        @RequestMapping("getStudentJobMap")
        public ResponseResult getStudentJobMap(){
            return planService.getStudentJobMap();
        }
    
    
    }
    
    
  2. 服务层

    服务层提供具体业务功能的实现,比如学院管理,查询学院信息进行分页处理时,可能要先查询总数,然后按照总数和每页数量进行分页查询所需的数据,在服务层会对控制层的请求和操作数据库的多次动作进行包装,例如查询出某条数据,但该数据中信息需要进行编码-显示名称的转化时(如数据库存储的性别数据是0和1,页面上显示需要展示成男和女),命名方式也是按照业务划分的,服务层部分代码如下所示

    package com.crk.shixiguanli.service.impl;
    
    import com.crk.shixiguanli.dao.*;
    import com.crk.shixiguanli.entity.*;
    import com.crk.shixiguanli.service.PlanService;
    import com.crk.shixiguanli.util.Page;
    import com.crk.shixiguanli.util.ResponseResult;
    import org.apache.shiro.SecurityUtils;
    import org.omg.CORBA.OBJ_ADAPTER;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    
    
    /**
     * Description:
     *
     * @author:
     * Date: 2020-04-26
     * Time: 17:42
     */
    @Service
    public class PlanServiceImpl implements PlanService {
        @Autowired
        PlanDao planDao;
        @Autowired
        StudentDao studentDao;
        @Autowired
        PlanStudentDao planStudentDao;
        @Autowired
        UserDao userDao;
        @Autowired
        ProfessionalDao professionalDao;
        @Autowired
        TaskCompleteDao taskCompleteDao;
        @Autowired
        JobStudentDao jobStudentDao;
    
    
    //    private final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        /**
         * 分页查询
         *
         * @param page
         * @return
         */
        @Override
        public ResponseResult queryPage(Page page) {
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            Integer count = planDao.countByCondition(userinfo.getId());
            page.setAllRow(count);
            List<Plan> planList  = planDao.selectByCondition(userinfo.getId(),page.getStart(), page.getSize());
            return getPlanVo(planList);
        }
    
        /**
         * 分页查询
         *
         * @param page
         * @return
         */
        @Override
        public ResponseResult queryStudentDetail(String planName,String studentName,Page page) {
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            Integer count = planStudentDao.countByCondition(userinfo.getId(),planName,studentName);
            page.setAllRow(count);
            List<PlanStudentVo> planStudentVoList  = planStudentDao.selectByCondition(userinfo.getId(),planName,studentName,page.getStart(), page.getSize());
            return ResponseResult.success(planStudentVoList);
        }
    
        @Override
        public ResponseResult queryStudentComplete(Integer studentId) {
            TaskCompleteVo taskCompleteVo = taskCompleteDao.queryStudentComplete(studentId);
            return ResponseResult.success(taskCompleteVo);
        }
    
        /**
         * 查询所有
         *
         * @return
         */
        @Override
        public ResponseResult queryAll() {
            List<Plan> planList = planDao.selectAll();
            return getPlanVo(planList);
        }
    
        /**
         * 查询单个
         *
         * @param id
         * @return
         */
        @Override
        public ResponseResult getOne(Integer id) {
            Plan plan = planDao.selectByPrimaryKey(id);
            return ResponseResult.success(plan);
        }
    
        @Override
        public ResponseResult getStudentComplete(Integer id) {
            PlanStudent planStudent = planStudentDao.selectByPrimaryKey(id);
            PlanStudentVo planStudentVo = new PlanStudentVo();
            planStudentVo.setId(planStudent.getId());
            planStudentVo.setEvaluate(planStudent.getEvaluate());
            planStudentVo.setScore(planStudent.getScore());
            Plan plan = planDao.selectByPrimaryKey(planStudent.getPlanId());
            planStudentVo.setPlanName(plan.getPlanName());
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            planStudentVo.setUserType(userinfo.getUserType());
            return ResponseResult.success(planStudentVo);
        }
    
        @Override
        public ResponseResult getMyPlan() {
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            PlanStudent planStudent = planStudentDao.selectByStudent(userinfo.getId());
            if (null == planStudent){
                return ResponseResult.success(null);
            }
            Plan plan = planDao.selectByPrimaryKey(planStudent.getPlanId());
            PlanVo planVo = new PlanVo();
            planVo.setId(plan.getId());
            planVo.setPlanName(plan.getPlanName());
            planVo.setStartTime(plan.getStartTime());
            planVo.setEndTime(plan.getEndTime());
            planVo.setUserName(userDao.selectByPrimaryKey(plan.getUpdater()).getUserName());
            planVo.setUpdateTime(plan.getUpdateTime());
            planVo.setPlanDesc(plan.getPlanDesc());
            planVo.setEvaluationCriterion(plan.getEvaluationCriterion());
            int compareTo = new Date().compareTo(plan.getEndTime());
            if(compareTo == 1){
                planVo.setStatusStr("已过期");
            }else{
                planVo.setStatusStr("进行中");
            }
            String joinPeople = plan.getJoinPeople();
            if (joinPeople.equals("-1")){
                planVo.setJoinPeopleStr("所有专业");
            }else{
                String[] split = joinPeople.split(",");
                List<String> stringBuffer = new ArrayList<>();
                for (String s : split) {
                    String name = professionalDao.selectByCode(s);
                    stringBuffer.add(name);
                }
                planVo.setJoinPeopleStr(String.join(",", stringBuffer));
            }
    
            planVo.setUserType(userinfo.getUserType());
    
            planVo.setHasJoin(true);
    
            planVo.setEvaluate(planStudent.getEvaluate());
            planVo.setScore(planStudent.getScore());
    
            return ResponseResult.success(planVo);
        }
    
        /**
         * 加入计划
         *
         * @param id
         * @return
         */
        @Override
        public ResponseResult joinPlan(Integer id) {
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            PlanStudent planStudent = new PlanStudent();
            planStudent.setStudentId(userinfo.getId());
            planStudent.setPlanId(id);
            planStudent.setStatus(1);
            int insert = planStudentDao.insert(planStudent);
            if (insert >0){
                return ResponseResult.success();
            }else{
                return ResponseResult.fail();
            }
        }
    
        /**
         * 查询单个
         *
         * @param id
         * @return
         */
        @Override
        public ResponseResult getOneShow(Integer id) {
            Plan plan = planDao.selectByPrimaryKey(id);
            PlanVo planVo = new PlanVo();
            planVo.setId(plan.getId());
            planVo.setPlanName(plan.getPlanName());
            planVo.setStartTime(plan.getStartTime());
            planVo.setEndTime(plan.getEndTime());
            planVo.setUserName(userDao.selectByPrimaryKey(plan.getUpdater()).getUserName());
            planVo.setUpdateTime(plan.getUpdateTime());
            planVo.setPlanDesc(plan.getPlanDesc());
            planVo.setEvaluationCriterion(plan.getEvaluationCriterion());
            int compareTo = new Date().compareTo(plan.getEndTime());
            if(compareTo == 1){
                planVo.setStatusStr("已过期");
            }else{
                planVo.setStatusStr("进行中");
            }
            String joinPeople = plan.getJoinPeople();
            if (joinPeople.equals("-1")){
                planVo.setJoinPeopleStr("所有专业");
            }else{
                String[] split = joinPeople.split(",");
                List<String> stringBuffer = new ArrayList<>();
                for (String s : split) {
                    String name = professionalDao.selectByCode(s);
                    stringBuffer.add(name);
                }
                planVo.setJoinPeopleStr(String.join(",", stringBuffer));
            }
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            planVo.setUserType(userinfo.getUserType());
            PlanStudent planStudent = planStudentDao.selectByStudent(userinfo.getId());
            if (planStudent !=null){
                planVo.setHasJoin(true);
            }else{
                planVo.setHasJoin(false);
            }
            return ResponseResult.success(planVo);
        }
    
        /**
         * 保存数据
         *
         * @param plan
         * @return
         */
        @Override
        public ResponseResult save(Plan plan) {
            if (plan.getId() == null){
                User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
                plan.setCreateTime(new Date());
                plan.setCreator(userinfo.getId());
                plan.setUpdateTime(new Date());
                plan.setUpdater(userinfo.getId());
                plan.setStatus(1);
                int insert = planDao.insert(plan);
                if (insert<=0){
                    return ResponseResult.fail();
                }
                return ResponseResult.success();
            }else{
                User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
                plan.setUpdateTime(new Date());
                plan.setUpdater(userinfo.getId());
                int updateByPrimaryKey = planDao.updateByPrimaryKey(plan);
                if (updateByPrimaryKey<=0){
                    return ResponseResult.fail();
                }
                return ResponseResult.success();
            }
        }
    
        /**
         * 删除
         *
         * @param id
         * @return
         */
        @Override
        public ResponseResult delete(Integer id) {
            int i = planDao.deleteByPrimaryKey(id);
            if (i<=0){
                return ResponseResult.fail();
            }
            return ResponseResult.success();
        }
    
        /**
         * 查询计划列表-学生页面
         *
         * @return
         */
        @Override
        public ResponseResult queryPlanList() {
            User userinfo = (User) SecurityUtils.getSubject().getPrincipal();
            Student studentByIdCard = studentDao.getStudentByIdCard(userinfo.getIdCard());
            List<Plan> planList = planDao.selectByProfession(studentByIdCard.getProfessional());
            return getPlanVo(planList);
        }
    
    
        private ResponseResult getPlanVo(List<Plan> planList){
            List<PlanVo> result = new ArrayList<>();
            for (Plan plan : planList) {
                PlanVo planVo = new PlanVo();
                planVo.setId(plan.getId());
                planVo.setPlanName(plan.getPlanName());
                planVo.setStartTime(plan.getStartTime());
                planVo.setEndTime(plan.getEndTime());
                planVo.setUserName(userDao.selectByPrimaryKey(plan.getUpdater()).getUserName());
                planVo.setUpdateTime(plan.getUpdateTime());
                planVo.setPlanDesc(plan.getPlanDesc());
                planVo.setEvaluationCriterion(plan.getEvaluationCriterion());
                int compareTo = new Date().compareTo(plan.getEndTime());
                if(compareTo == 1){
                    planVo.setStatusStr("已过期");
                }else{
                    planVo.setStatusStr("进行中");
                }
                String joinPeople = plan.getJoinPeople();
                if (joinPeople.equals("-1")){
                    planVo.setJoinPeopleStr("所有专业");
                }else{
                    String[] split = joinPeople.split(",");
                    List<String> stringBuffer = new ArrayList<>();
                    for (String s : split) {
                        String name = professionalDao.selectByCode(s);
                        stringBuffer.add(name);
                    }
                    planVo.setJoinPeopleStr(String.join(",", stringBuffer));
                }
                result.add(planVo);
            }
            return ResponseResult.success(result);
        }
    
        @Override
        public ResponseResult evaluate(int id, String evaluate, String score) {
            planStudentDao.evaluate(id,evaluate,score);
            return ResponseResult.success();
        }
    
        /**
         * 统计数量
         *
         * @return
         */
        @Override
        public ResponseResult getCount() {
    //        系统已录入的学生数量
            int studentCount = studentDao.getCount();
    //        已注册的学生数量
            int studentUserCount =  userDao.getCount("student");
    //        已注册的教师数
            int teacherUserCount =  userDao.getCount("teacher");
    //        已注册的公司数
            int companyUserCount =  userDao.getCount("company");
    //        已参加实习计划的学生数
            int planStudentCount = planStudentDao.getCount();
    //        已参加实习岗位的学生数
            int jobStudentCount = jobStudentDao.getCount();
            HashMap<String,Object> count = new HashMap<>();
            count.put("studentUserCount",studentUserCount);
            count.put("teacherUserCount",teacherUserCount);
            count.put("companyUserCount",companyUserCount);
            count.put("studentCount",studentCount);
            count.put("planStudentCount",planStudentCount);
            count.put("jobStudentCount",jobStudentCount);
            return ResponseResult.success(count);
        }
    
        @Override
        public ResponseResult getStudentProfessionalMap() {
            HashMap<String,Object> data = new HashMap<>();
            List<HashMap<String,Object>> map = planDao.getStudentProfessionalMap();
            List<String> legend = new ArrayList<>();
            for (HashMap<String, Object> stringObjectHashMap : map) {
                legend.add(stringObjectHashMap.get("name").toString());
            }
            data.put("legend",legend);
            data.put("result",map);
            return ResponseResult.success(data);
        }
    
        @Override
        public ResponseResult getStudentPlanMap() {
            HashMap<String,Object> data = new HashMap<>();
            List<HashMap<String,Object>> map = planDao.getStudentPlanMap();
            List<String> legend = new ArrayList<>();
            for (HashMap<String, Object> stringObjectHashMap : map) {
                legend.add(stringObjectHashMap.get("name").toString());
            }
            data.put("legend",legend);
            data.put("result",map);
            return ResponseResult.success(data);
        }
    
        @Override
        public ResponseResult getStudentJobMap() {
            HashMap<String,Object> data = new HashMap<>();
            List<HashMap<String,Object>> map = planDao.getStudentJobMap();
            List<String> legend = new ArrayList<>();
            for (HashMap<String, Object> stringObjectHashMap : map) {
                legend.add(stringObjectHashMap.get("name").toString());
            }
            data.put("legend",legend);
            data.put("result",map);
            return ResponseResult.success(data);
        }
    }
    
    
  3. 持久层

    持久层负责与数据库交互,mybatis正是在这一层发挥其作用,通过其ORM框架的能力连接起java代码和数据库SQL执行,示例代码如下

    package com.crk.shixiguanli.dao;
    
    import com.crk.shixiguanli.entity.Plan;
    import org.apache.ibatis.annotations.Param;
    import org.springframework.stereotype.Repository;
    
    import java.util.HashMap;
    import java.util.List;
    
    @Repository
    public interface PlanDao {
        /**
         * This method was generated by MyBatis Generator.
         * This method corresponds to the database table plan
         *
         * @mbg.generated
         */
        int deleteByPrimaryKey(Integer id);
    
        /**
         * This method was generated by MyBatis Generator.
         * This method corresponds to the database table plan
         *
         * @mbg.generated
         */
        int insert(Plan record);
    
        /**
         * This method was generated by MyBatis Generator.
         * This method corresponds to the database table plan
         *
         * @mbg.generated
         */
        Plan selectByPrimaryKey(Integer id);
    
        /**
         * This method was generated by MyBatis Generator.
         * This method corresponds to the database table plan
         *
         * @mbg.generated
         */
        List<Plan> selectAll();
    
        /**
         * This method was generated by MyBatis Generator.
         * This method corresponds to the database table plan
         *
         * @mbg.generated
         */
        int updateByPrimaryKey(Plan record);
    
        int countByCondition(@Param("creator") int creator);
    
        List<Plan> selectByCondition(@Param("creator") int creator, @Param("start") int start, @Param("end") int end);
    
    
        /**
         * 根据专业查询计划
         * @param professional
         * @return
         */
        List<Plan> selectByProfession(@Param("professional") String professional);
    
    
        List<HashMap<String,Object>>  getStudentProfessionalMap();
    
        List<HashMap<String,Object>>  getStudentPlanMap();
    
    
        List<HashMap<String,Object>>  getStudentJobMap();
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.crk.shixiguanli.dao.PlanDao">
      <resultMap id="BaseResultMap" type="com.crk.shixiguanli.entity.Plan">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="plan_name" jdbcType="VARCHAR" property="planName" />
        <result column="plan_desc" jdbcType="VARCHAR" property="planDesc" />
        <result column="join_people" jdbcType="VARCHAR" property="joinPeople" />
        <result column="evaluation_criterion" jdbcType="VARCHAR" property="evaluationCriterion" />
        <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
        <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
        <result column="status" jdbcType="INTEGER" property="status" />
        <result column="creator" jdbcType="INTEGER" property="creator" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
        <result column="updater" jdbcType="INTEGER" property="updater" />
        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
      </resultMap>
      <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        delete from plan
        where id = #{id,jdbcType=INTEGER}
      </delete>
      <insert id="insert" parameterType="com.crk.shixiguanli.entity.Plan">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
          SELECT LAST_INSERT_ID()
        </selectKey>
        insert into plan (plan_name, plan_desc,
          join_people, evaluation_criterion, start_time, 
          end_time, `status`, creator, 
          create_time, updater, update_time
          )
        values (#{planName,jdbcType=VARCHAR}, #{planDesc,jdbcType=VARCHAR},
          #{joinPeople,jdbcType=VARCHAR}, #{evaluationCriterion,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, 
          #{endTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}, #{creator,jdbcType=INTEGER}, 
          #{createTime,jdbcType=TIMESTAMP}, #{updater,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}
          )
      </insert>
      <update id="updateByPrimaryKey" parameterType="com.crk.shixiguanli.entity.Plan">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        update plan
        set plan_name = #{planName,jdbcType=VARCHAR},
          plan_desc = #{planDesc,jdbcType=VARCHAR},
          join_people = #{joinPeople,jdbcType=VARCHAR},
          evaluation_criterion = #{evaluationCriterion,jdbcType=VARCHAR},
          start_time = #{startTime,jdbcType=TIMESTAMP},
          end_time = #{endTime,jdbcType=TIMESTAMP},
          updater = #{updater,jdbcType=INTEGER},
          update_time = #{updateTime,jdbcType=TIMESTAMP}
        where id = #{id,jdbcType=INTEGER}
      </update>
      <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        select id, plan_name, plan_desc, join_people, evaluation_criterion, start_time,
        end_time, `status`, creator, create_time, updater, update_time
        from plan
        where id = #{id,jdbcType=INTEGER}
      </select>
      <select id="selectAll" resultMap="BaseResultMap">
        <!--
          WARNING - @mbg.generated
          This element is automatically generated by MyBatis Generator, do not modify.
        -->
        select id, plan_name, plan_desc, join_people, evaluation_criterion, start_time,
        end_time,
        case when end_time &gt; now() then 2
        else status end as status
        , creator, create_time, updater, update_time
        from plan
        order by update_time desc
      </select>
    
    
      <select id="countByCondition" resultType="java.lang.Integer">
        select count(*) from plan where 1=1
        <if test="creator != null and creator != ''">
          and creator = #{creator}
        </if>
      </select>
    
    
      <select id="selectByCondition" resultMap="BaseResultMap">
        select * from plan
        where 1=1
        <if test="creator != null and creator != ''">
          and creator = #{creator}
        </if>
        order by update_time desc
        limit #{start},#{end}
      </select>
    
    
      <select id="countByStudent" resultType="java.lang.Integer">
          select count(p.*) from plan p left join plan_student s on p.id = s.plan_id
          where s.student_id = #{studentId}
      </select>
    
      <select id="selectByProfession" resultMap="BaseResultMap">
          select p.id, p.plan_name, p.plan_desc, p.join_people, p.evaluation_criterion, p.start_time,
                 p.end_time,case when end_time &gt; now() then 2
                          else status end as status from plan p
          where (p.join_people = -1 or p.join_people like concat('%',#{professional},'%'))
          order by p.update_time desc
          limit #{start},#{end}
      </select>
    
    
      <select id="getStudentProfessionalMap" resultType="java.util.HashMap">
          select any_value(professional) as name, count(id) as value from student group by professional
      </select>
    
      <select id="getStudentPlanMap" resultType="java.util.HashMap">
          select '已参与实习' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_card
           left join plan_student p on p.student_id = su.id where  p.id is not null
          union
          select '未参与实习' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_card
           left join plan_student p on p.student_id = su.id  where p.id is  null
      </select>
    
      <select id="getStudentJobMap" resultType="java.util.HashMap">
          select '已加入岗位' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_card
           left join job_student p on p.student_id = su.id
          where p.id is not null
          union
          select '未加入岗位' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_card
           left join job_student p on p.student_id = su.id
          where p.id is  null
      </select>
    
    </mapper>
    

操作指引

  1. 管理员操作

    • 管理员使用默认的管理员账号密码登录系统(admin/12345)

    • 录入学院信息

    • 录入专业信息

    • 录入学生信息

    • 统计分析

  2. 学生操作

    • 学生注册

    • 学生登录

    • 查看实习计划列表并选择加入

    • 我的实习计划

    • 查看实习岗位列表并选择加入

    • 我参加的实习岗位

    • 其他功能

  3. 教师操作

    • 教师注册

    • 教师登陆

    • 查看实习岗位列表

    • 发布实习计划

    • 实习评价

  4. 企业操作

    • 企业注册

    • 企业登陆

    • 查看实习计划列表

    • 发布实习岗位

    • 发布岗位任务
    • 评价岗位任务完成情况

演示视频

演示视频下载地址

作者唯一联系方式

有关毕业设计:基于SSM框架的学生实习管理系统的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐