系统设计

主要功能点

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

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

主要功能如下:

  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 {@AutowiredPlanService 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 {@AutowiredPlanDao planDao;@AutowiredStudentDao studentDao;@AutowiredPlanStudentDao planStudentDao;@AutowiredUserDao userDao;@AutowiredProfessionalDao professionalDao;@AutowiredTaskCompleteDao taskCompleteDao;@AutowiredJobStudentDao jobStudentDao;//    private final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");/*** 分页查询** @param page* @return*/@Overridepublic 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*/@Overridepublic 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);}@Overridepublic ResponseResult queryStudentComplete(Integer studentId) {TaskCompleteVo taskCompleteVo = taskCompleteDao.queryStudentComplete(studentId);return ResponseResult.success(taskCompleteVo);}/*** 查询所有** @return*/@Overridepublic ResponseResult queryAll() {List<Plan> planList = planDao.selectAll();return getPlanVo(planList);}/*** 查询单个** @param id* @return*/@Overridepublic ResponseResult getOne(Integer id) {Plan plan = planDao.selectByPrimaryKey(id);return ResponseResult.success(plan);}@Overridepublic 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);}@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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*/@Overridepublic ResponseResult delete(Integer id) {int i = planDao.deleteByPrimaryKey(id);if (i<=0){return ResponseResult.fail();}return ResponseResult.success();}/*** 查询计划列表-学生页面** @return*/@Overridepublic 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);}@Overridepublic ResponseResult evaluate(int id, String evaluate, String score) {planStudentDao.evaluate(id,evaluate,score);return ResponseResult.success();}/*** 统计数量** @return*/@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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.generatedThis 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.generatedThis element is automatically generated by MyBatis Generator, do not modify.-->delete from planwhere id = #{id,jdbcType=INTEGER}</delete><insert id="insert" parameterType="com.crk.shixiguanli.entity.Plan"><!--WARNING - @mbg.generatedThis 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.generatedThis element is automatically generated by MyBatis Generator, do not modify.-->update planset 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.generatedThis 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_timefrom planwhere id = #{id,jdbcType=INTEGER}</select><select id="selectAll" resultMap="BaseResultMap"><!--WARNING - @mbg.generatedThis 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 2else status end as status, creator, create_time, updater, update_timefrom planorder 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 planwhere 1=1<if test="creator != null and creator != ''">and creator = #{creator}</if>order by update_time desclimit #{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_idwhere 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 2else status end as status from plan pwhere (p.join_people = -1 or p.join_people like concat('%',#{professional},'%'))order by p.update_time desclimit #{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_cardleft join plan_student p on p.student_id = su.id where  p.id is not nullunionselect '未参与实习' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_cardleft 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_cardleft join job_student p on p.student_id = su.idwhere p.id is not nullunionselect '未加入岗位' as name,count(s.id) as value from student s left join sys_user su on s.id_card = su.id_cardleft join job_student p on p.student_id = su.idwhere p.id is  null</select></mapper>
    

操作指引

  1. 管理员操作

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

    • 录入学院信息

    • 录入专业信息

    • 录入学生信息

    • 统计分析

  2. 学生操作

    • 学生注册

    • 学生登录

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

    • 我的实习计划

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

    • 我参加的实习岗位

    • 其他功能

  3. 教师操作

    • 教师注册

    • 教师登陆

    • 查看实习岗位列表

    • 发布实习计划

    • 实习评价

  4. 企业操作

    • 企业注册

    • 企业登陆

    • 查看实习计划列表

    • 发布实习岗位

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

演示视频

演示视频下载地址

作者唯一联系方式

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

  1. 基于ssm的用户管理系统_基于SSM的高校学生实习管理系统

    前言:本文描述了基于SSM的高校学生实习管理系统的实战项目,分析了该项目的功能需求以及最终呈现的效果 基于SSM的高校学生实习管理系统应完成如下功能: 1. 用户角色划分 本系统主要用户有四类:实习企 ...

  2. 【JAVA程序设计】(C00095)基于SSM框架的学生选课管理系统

    基于SSM框架的学生选课管理系统 项目获取 文章结构 一.开发框架及业务方向 1.开发环境 2.开发框架 3.整体业务 二.项目结构及页面展示 1.项目整体结构 2.学生页面 3.教师页面 4.管理员 ...

  3. 嘉明SSM学习之基于SSM框架的学生信息管理系统

    项目的github:https://github.com/zjm-cityboy/sims-GitHub.git 可以的话点个小星星嘿嘿 1.项目介绍 1.1.项目环境配置 操作系统:Windows1 ...

  4. 基于SSM框架的学生在线教育教学课程管理系统

    基于SSM框架的学生在线教育教学课程管理系统 1.1 项目概述 开发语言:Java8 数据库:Mysql5 前端技术:echarts图表 渲染数据:thymeleaf模板引擎 ${ } 后端框架:Sp ...

  5. Java毕业设计_基于SSM框架的图片素材管理系统的设计与实现

    基于SSM框架的图片素材管理系统的设计与实现 基于SSM框架的图片素材管理系统的设计与实现mysql数据库创建语句 基于SSM框架的图片素材管理系统的设计与实现oracle数据库创建语句 基于SSM框 ...

  6. 帮忙写基于SSM框架的购物商城管理系统

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单的web项目的框架 ...

  7. 基于SSM搭建的学生信息管理系统项目源码+学习视频

    基于SSM搭建的学生信息管理系统 目录 基于SSM搭建的学生信息管理系统 1.为什么要编写学生信息管理系统 1.1编写项目的起因: 2.编写学生信息管理系统的过程 2.1项目成果的展示: 登录界面: ...

  8. java计算机毕业设计基于ssm的火车订票管理系统(源代码+数据库+Lw文档)

    项目介绍 本论文主要论述的是如何利用JAVA语言去设计一个好的火车订票系统.在前言当中,我们会简述在当前时代研究火车订票系统的背景以及研究现状.本系统的框架将会采用B/S结构和Spring Boot框 ...

  9. 基于SSM框架实现的汽车维修管理系统【源码+数据库】

    一.项目简介 本项目是一套基于SSM框架实现的汽车维修管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者. 包含:项目源码.数据库脚本等,该项目附带全部源码可作为毕设 ...

  10. 计算机毕业设计-基于ssm+vue的科研成果管理系统-高校科研管理系统java代码

    计算机毕业设计-基于ssm+vue的科研成果管理系统-高校科研管理系统java代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 架构:B/S 框架:SSM ...

最新文章

  1. 把ePO4.5或者4.6从32位迁移到64位系统
  2. FileSystemObject
  3. 二分法如何排查问题版本
  4. java图片格式转化(例如jpg格式转化png)
  5. java怎么调用7zip进行压缩_JAVA使用7-zip解压缩带密码的Zip文件(非Proccess方法)...
  6. 最佳调度问题(搜索回溯)
  7. Python学习杂记之静态网页学习
  8. 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤
  9. 怎样将程序猿写出来的程序打包成安装包(最简单的)
  10. 什么情况下使用多线程
  11. oracle bpm 教学视频,oracle BPM直接更新流程
  12. python单词必背打印_为什么Python要用print打印这个单词?
  13. 时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ 中的T和Z表示什么
  14. 信息技术基础2(课程笔记)
  15. 两个苹果手机怎么定位_苹果手机很卡怎么办
  16. 人脸检测卷积神经网络_卷积神经网络和计算机视觉的人脸面具检测算法
  17. SQL注入漏洞测试(参数加密)
  18. Thinkphp内核虚拟资源素材源码交易下载平台网站源码
  19. 腾讯云GPU桌面服务器驱动安装
  20. 蚌埠有考计算机等级的考点吗,2018年3月安徽省蚌埠市计算机等级考试时间

热门文章

  1. windows10pygame下载安装问题描述
  2. pygame游戏库如何下载
  3. Oracle数据库常用Sql语句大全
  4. excel模板 基金账本_专项基金拨款记录EXCEL图表
  5. Java常用设计模式总结及应用场景分析
  6. python音乐推荐系统_音乐推荐系统
  7. Oracle数据库 查询所有表
  8. 机房布线技术设计与施工
  9. 沙盘模拟软件_三连冠!我校学子连续三年蝉联全国大学生沙盘模拟经营大赛福建省决赛一等奖...
  10. [软件工程] 数据字典