高校实习管理系统主要解决各大高校学生暑假实习/寒假实习等过程管理难的问题,提升学校、老师和学生、企业之间的联系,避免学生因实习任务而感到为难,解决学校和老师无法实时感知到学生的实习情况,无法了解到学生的实习过程,无法对实习结果进行评分等问题,提升企业和学校的沟通,及时发现学生存在的问题,优化实习安排,更好的帮助学生尽快的融入社会。
高校实习管理系统的主要需求是提供给学生以及老师管理学生实习过程的系统,方便师生管理自己的实习计划,目前系统分为 教师、企业以及学生三种角色,以及固定的管理员角色。 其中教师负责制定和发布学习计划,发布学习任务或者管理学生的日记等,评价学生的实习情况以及查看统计分析。 企业负责根据教师发布的学习计划,提供相应的实习岗位供学生选择,也可以对学生的岗位实习情况进行评价。 学生负责选择适合自己的学习计划以及学习岗位,并按时填写完成情况和周报等。 管理员角色负责管理用户信息、角色信息、角色权限、学生管理,教师信息管理、企业信息管理等等。
主要功能如下:
企业角色功能模块
教师角色功能模块
学生角色功能模块
注册:注册教师账户
登录:登录教师账户
查看实习计划:查看教师发布的实习计划并选择加入。
查看实习岗位:查看企业发布的实习岗位并选择加入。
我参加的实习计划:查看我选择加入的实习计划。
我的实习岗位:查看我选择加入的实习岗位。
任务管理:查看企业针对岗位发布的实习任务并填写任务完成情况。
管理员角色功能模块
本系统按照角色划分为管理员、学生、教师、企业,教师角色负责管理实习计划,企业负责管理实习岗位,学生角色可以选择实习计划、实习岗位等加入,并且填写相关的任务反馈,管理员角色负责查看整体的统计分析,对整体学生的实习过程进行管理。
本系统采用Java语言编写,主要是基于Mvc的架构模式实现,按照模块可以划分为控制层、服务层、持久层三大块
控制层
控制层主要是基于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();
}
}
服务层
服务层提供具体业务功能的实现,比如学院管理,查询学院信息进行分页处理时,可能要先查询总数,然后按照总数和每页数量进行分页查询所需的数据,在服务层会对控制层的请求和操作数据库的多次动作进行包装,例如查询出某条数据,但该数据中信息需要进行编码-显示名称的转化时(如数据库存储的性别数据是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);
}
}
持久层
持久层负责与数据库交互,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 > 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 > 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>
管理员操作



录入学生信息

统计分析


学生操作







教师操作
教师注册

教师登陆

查看实习岗位列表

发布实习计划


企业操作






我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我安装了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
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/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