大学生科创项目在线管理系统设计与实现
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作
主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等
业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。
收藏点赞不迷路 关注作者有好处
文末获取源码
计算机Java项目|基于SpringBoot的大学生科创项目管理系统
项目编号:BS-XX-376
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
技术:springboot+mysql+vue
二,项目简介
传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装大学生科创项目在线管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,大学生科创项目在线管理系统的有效运用可以帮助管理人员准确快速地处理信息。
大学生科创项目在线管理系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现大学生科创项目在线管理系统的功能。其中管理员管理用户,新闻公告。
大学生科创项目在线管理系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,大学生科创项目在线管理系统都可以轻松应对。
作为程序后台的支持,本数据库也需要设计数据存储的结构。而数据存储结构的设计就包括了数据表结构的设计和创建。数据表结构包括了字段,数据类型,还有字段的取值范围等信息。而E-R模型中的实体就是一张表,实体的特征就可以作为该表中的字段,根据本程序信息存储要求,设计每个字段需要的类型,还有该字段的取值范围等。每当设计完成一张数据表,就需要及时保存在数据库里面,并对该设计的数据表准确命名,要求设置的数据表的名称尽量不要是中文,而且要方便记忆。因为在程序编码阶段,通过SQL语句可以把程序里面的数据写入在各个数据表里面,而这个环节需要使用到数据表的名称。如果数据表名称是中文的话,可能会乱码并影响程序运行。下面就以表格形式展示设计的结果。
表4.1字典表表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | dic_code | String | 字段 | 是 |
3 | dic_name | String | 字段名 | 是 |
4 | code_index | Integer | 编码 | 是 |
5 | index_name | String | 编码名字 | 是 |
6 | super_id | Integer | 父字段id | 是 |
7 | beizhu | String | 备注 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.2论坛表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | forum_name | String | 帖子标题 | 是 |
3 | yonghu_id | Integer | 学生 | 是 |
4 | jiaoshi_id | Integer | 教师 | 是 |
5 | users_id | Integer | 管理员 | 是 |
6 | forum_content | String | 发布内容 | 是 |
7 | super_ids | Integer | 父id | 是 |
8 | forum_state_types | Integer | 帖子状态 | 是 |
9 | insert_time | Date | 发帖时间 | 是 |
10 | update_time | Date | 修改时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.3教师表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | jiaoshi_name | String | 教师姓名 | 是 |
3 | jiaoshi_id_number | String | 身份证号 | 是 |
4 | jiaoshi_phone | String | 手机号 | 是 |
5 | jiaoshi_photo | String | 照片 | 是 |
6 | jiaoshi_delete | Integer | 假删 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.4科研项目表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | keyanxiangmu_uuid_number | String | 项目编号 | 是 |
3 | keyanxiangmu_name | String | 项目名称 | 是 |
4 | keyanxiangmu_types | Integer | 项目类型 | 是 |
5 | keyanxiangmu_file | String | 附件 | 是 |
6 | insert_time | Date | 开始时间 | 是 |
7 | yonghu_id | Integer | 学生 | 是 |
8 | jiaoshi_id | Integer | 审核教师 | 是 |
9 | keyanxiangmu_yesno_types | Integer | 审核结果 | 是 |
10 | shenheyijian_text | String | 审核意见 | 是 |
11 | keyanxiangmu_content | String | 项目详情 | 是 |
12 | keyanxiangmu_delete | Integer | 假删 | 是 |
13 | create_time | Date | 创建时间 | 是 |
表4.5公告信息表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | news_name | String | 公告信息标题 | 是 |
3 | news_types | Integer | 公告信息类型 | 是 |
4 | news_photo | String | 公告信息图片 | 是 |
5 | insert_time | Date | 公告信息时间 | 是 |
6 | news_content | String | 公告信息详情 | 是 |
7 | news_delete | Integer | 假删 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.6学生表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | yonghu_name | String | 学生姓名 | 是 |
3 | yonghu_id_number | String | 身份证号 | 是 |
4 | yonghu_phone | String | 手机号 | 是 |
5 | yonghu_photo | String | 照片 | 是 |
6 | yonghu_delete | Integer | 假删 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.7用户表表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
1 | Id | Int | id | 否 |
2 | username | String | 用户名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
三,系统展示
四,核心代码展示
package com.controller;import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;/*** 科研项目* 后端接口* @author* @email
*/
@RestController
@Controller
@RequestMapping("/keyanxiangmu")
public class KeyanxiangmuController {private static final Logger logger = LoggerFactory.getLogger(KeyanxiangmuController.class);@Autowiredprivate KeyanxiangmuService keyanxiangmuService;@Autowiredprivate TokenService tokenService;@Autowiredprivate DictionaryService dictionaryService;//级联表service@Autowiredprivate JiaoshiService jiaoshiService;@Autowiredprivate YonghuService yonghuService;/*** 后端列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));String role = String.valueOf(request.getSession().getAttribute("role"));if(StringUtil.isEmpty(role))return R.error(511,"权限为空");else if("学生".equals(role))params.put("yonghuId",request.getSession().getAttribute("userId"));else if("教师".equals(role))params.put("jiaoshiId",request.getSession().getAttribute("userId"));params.put("keyanxiangmuDeleteStart",1);params.put("keyanxiangmuDeleteEnd",1);if(params.get("orderBy")==null || params.get("orderBy")==""){params.put("orderBy","id");}PageUtils page = keyanxiangmuService.queryPage(params);//字典表数据转换List<KeyanxiangmuView> list =(List<KeyanxiangmuView>)page.getList();for(KeyanxiangmuView c:list){//修改对应字典表字段dictionaryService.dictionaryConvert(c, request);}return R.ok().put("data", page);}/*** 后端详情*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") Long id, HttpServletRequest request){logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);KeyanxiangmuEntity keyanxiangmu = keyanxiangmuService.selectById(id);if(keyanxiangmu !=null){//entity转viewKeyanxiangmuView view = new KeyanxiangmuView();BeanUtils.copyProperties( keyanxiangmu , view );//把实体数据重构到view中//级联表JiaoshiEntity jiaoshi = jiaoshiService.selectById(keyanxiangmu.getJiaoshiId());if(jiaoshi != null){BeanUtils.copyProperties( jiaoshi , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段view.setJiaoshiId(jiaoshi.getId());}//级联表YonghuEntity yonghu = yonghuService.selectById(keyanxiangmu.getYonghuId());if(yonghu != null){BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段view.setYonghuId(yonghu.getId());}//修改对应字典表字段dictionaryService.dictionaryConvert(view, request);return R.ok().put("data", view);}else {return R.error(511,"查不到数据");}}/*** 后端保存*/@RequestMapping("/save")public R save(@RequestBody KeyanxiangmuEntity keyanxiangmu, HttpServletRequest request){logger.debug("save方法:,,Controller:{},,keyanxiangmu:{}",this.getClass().getName(),keyanxiangmu.toString());String role = String.valueOf(request.getSession().getAttribute("role"));if(StringUtil.isEmpty(role))return R.error(511,"权限为空");else if("学生".equals(role))keyanxiangmu.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));else if("教师".equals(role))keyanxiangmu.setJiaoshiId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));Wrapper<KeyanxiangmuEntity> queryWrapper = new EntityWrapper<KeyanxiangmuEntity>().eq("keyanxiangmu_uuid_number", keyanxiangmu.getKeyanxiangmuUuidNumber()).eq("keyanxiangmu_name", keyanxiangmu.getKeyanxiangmuName()).eq("keyanxiangmu_types", keyanxiangmu.getKeyanxiangmuTypes()).eq("yonghu_id", keyanxiangmu.getYonghuId()).eq("jiaoshi_id", keyanxiangmu.getJiaoshiId()).eq("keyanxiangmu_yesno_types", keyanxiangmu.getKeyanxiangmuYesnoTypes()).eq("shenheyijian_text", keyanxiangmu.getShenheyijianText()).eq("keyanxiangmu_delete", keyanxiangmu.getKeyanxiangmuDelete());logger.info("sql语句:"+queryWrapper.getSqlSegment());KeyanxiangmuEntity keyanxiangmuEntity = keyanxiangmuService.selectOne(queryWrapper);if(keyanxiangmuEntity==null){keyanxiangmu.setInsertTime(new Date());keyanxiangmu.setKeyanxiangmuYesnoTypes(1);keyanxiangmu.setKeyanxiangmuDelete(1);keyanxiangmu.setCreateTime(new Date());keyanxiangmuService.insert(keyanxiangmu);return R.ok();}else {return R.error(511,"表中有相同数据");}}/*** 后端修改*/@RequestMapping("/update")public R update(@RequestBody KeyanxiangmuEntity keyanxiangmu, HttpServletRequest request){logger.debug("update方法:,,Controller:{},,keyanxiangmu:{}",this.getClass().getName(),keyanxiangmu.toString());String role = String.valueOf(request.getSession().getAttribute("role"));if(StringUtil.isEmpty(role))return R.error(511,"权限为空");else if("学生".equals(role))keyanxiangmu.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));else if("教师".equals(role))keyanxiangmu.setJiaoshiId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));//根据字段查询是否有相同数据Wrapper<KeyanxiangmuEntity> queryWrapper = new EntityWrapper<KeyanxiangmuEntity>().notIn("id",keyanxiangmu.getId()).andNew().eq("keyanxiangmu_uuid_number", keyanxiangmu.getKeyanxiangmuUuidNumber()).eq("keyanxiangmu_name", keyanxiangmu.getKeyanxiangmuName()).eq("keyanxiangmu_types", keyanxiangmu.getKeyanxiangmuTypes()).eq("insert_time", keyanxiangmu.getInsertTime()).eq("yonghu_id", keyanxiangmu.getYonghuId()).eq("jiaoshi_id", keyanxiangmu.getJiaoshiId()).eq("keyanxiangmu_yesno_types", keyanxiangmu.getKeyanxiangmuYesnoTypes()).eq("shenheyijian_text", keyanxiangmu.getShenheyijianText()).eq("keyanxiangmu_delete", keyanxiangmu.getKeyanxiangmuDelete());logger.info("sql语句:"+queryWrapper.getSqlSegment());KeyanxiangmuEntity keyanxiangmuEntity = keyanxiangmuService.selectOne(queryWrapper);if("".equals(keyanxiangmu.getKeyanxiangmuFile()) || "null".equals(keyanxiangmu.getKeyanxiangmuFile())){keyanxiangmu.setKeyanxiangmuFile(null);}if(keyanxiangmuEntity==null){// String role = String.valueOf(request.getSession().getAttribute("role"));// if("".equals(role)){// keyanxiangmu.set// }KeyanxiangmuEntity keyanxiangmuEntity1 = keyanxiangmuService.selectById(keyanxiangmu.getId());if(keyanxiangmuEntity1.getKeyanxiangmuYesnoTypes() ==3){keyanxiangmu.setKeyanxiangmuYesnoTypes(1);}else if(keyanxiangmuEntity1.getKeyanxiangmuYesnoTypes() ==6){keyanxiangmu.setKeyanxiangmuYesnoTypes(4);}keyanxiangmuService.updateById(keyanxiangmu);//根据id更新return R.ok();}else {return R.error(511,"表中有相同数据");}}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Integer[] ids){logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());ArrayList<KeyanxiangmuEntity> list = new ArrayList<>();for(Integer id:ids){KeyanxiangmuEntity keyanxiangmuEntity = new KeyanxiangmuEntity();keyanxiangmuEntity.setId(id);keyanxiangmuEntity.setKeyanxiangmuDelete(2);list.add(keyanxiangmuEntity);}if(list != null && list.size() >0){keyanxiangmuService.updateBatchById(list);}return R.ok();}/*** 批量上传*/@RequestMapping("/batchInsert")public R save( String fileName){logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);try {List<KeyanxiangmuEntity> keyanxiangmuList = new ArrayList<>();//上传的东西Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段Date date = new Date();int lastIndexOf = fileName.lastIndexOf(".");if(lastIndexOf == -1){return R.error(511,"该文件没有后缀");}else{String suffix = fileName.substring(lastIndexOf);if(!".xls".equals(suffix)){return R.error(511,"只支持后缀为xls的excel文件");}else{URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径File file = new File(resource.getFile());if(!file.exists()){return R.error(511,"找不到上传文件,请联系管理员");}else{List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件dataList.remove(0);//删除第一行,因为第一行是提示for(List<String> data:dataList){//循环KeyanxiangmuEntity keyanxiangmuEntity = new KeyanxiangmuEntity();
// keyanxiangmuEntity.setKeyanxiangmuUuidNumber(data.get(0)); //项目编号 要改的
// keyanxiangmuEntity.setKeyanxiangmuName(data.get(0)); //项目名称 要改的
// keyanxiangmuEntity.setKeyanxiangmuTypes(Integer.valueOf(data.get(0))); //项目类型 要改的
// keyanxiangmuEntity.setKeyanxiangmuFile(data.get(0)); //附件 要改的
// keyanxiangmuEntity.setInsertTime(date);//时间
// keyanxiangmuEntity.setYonghuId(Integer.valueOf(data.get(0))); //学生 要改的
// keyanxiangmuEntity.setJiaoshiId(Integer.valueOf(data.get(0))); //审核教师 要改的
// keyanxiangmuEntity.setKeyanxiangmuYesnoTypes(Integer.valueOf(data.get(0))); //审核结果 要改的
// keyanxiangmuEntity.setShenheyijianText(data.get(0)); //审核意见 要改的
// keyanxiangmuEntity.setKeyanxiangmuContent("");//照片
// keyanxiangmuEntity.setKeyanxiangmuDelete(1);//逻辑删除字段
// keyanxiangmuEntity.setCreateTime(date);//时间keyanxiangmuList.add(keyanxiangmuEntity);//把要查询是否重复的字段放入map中//项目编号if(seachFields.containsKey("keyanxiangmuUuidNumber")){List<String> keyanxiangmuUuidNumber = seachFields.get("keyanxiangmuUuidNumber");keyanxiangmuUuidNumber.add(data.get(0));//要改的}else{List<String> keyanxiangmuUuidNumber = new ArrayList<>();keyanxiangmuUuidNumber.add(data.get(0));//要改的seachFields.put("keyanxiangmuUuidNumber",keyanxiangmuUuidNumber);}}//查询是否重复//项目编号List<KeyanxiangmuEntity> keyanxiangmuEntities_keyanxiangmuUuidNumber = keyanxiangmuService.selectList(new EntityWrapper<KeyanxiangmuEntity>().in("keyanxiangmu_uuid_number", seachFields.get("keyanxiangmuUuidNumber")).eq("keyanxiangmu_delete", 1));if(keyanxiangmuEntities_keyanxiangmuUuidNumber.size() >0 ){ArrayList<String> repeatFields = new ArrayList<>();for(KeyanxiangmuEntity s:keyanxiangmuEntities_keyanxiangmuUuidNumber){repeatFields.add(s.getKeyanxiangmuUuidNumber());}return R.error(511,"数据库的该表中的 [项目编号] 字段已经存在 存在数据为:"+repeatFields.toString());}keyanxiangmuService.insertBatch(keyanxiangmuList);return R.ok();}}}}catch (Exception e){return R.error(511,"批量插入数据异常,请联系管理员");}}/*** 前端列表*/@IgnoreAuth@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));// 没有指定排序字段就默认id倒序if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){params.put("orderBy","id");}PageUtils page = keyanxiangmuService.queryPage(params);//字典表数据转换List<KeyanxiangmuView> list =(List<KeyanxiangmuView>)page.getList();for(KeyanxiangmuView c:list)dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段return R.ok().put("data", page);}/*** 前端详情*/@RequestMapping("/detail/{id}")public R detail(@PathVariable("id") Long id, HttpServletRequest request){logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);KeyanxiangmuEntity keyanxiangmu = keyanxiangmuService.selectById(id);if(keyanxiangmu !=null){//entity转viewKeyanxiangmuView view = new KeyanxiangmuView();BeanUtils.copyProperties( keyanxiangmu , view );//把实体数据重构到view中//级联表JiaoshiEntity jiaoshi = jiaoshiService.selectById(keyanxiangmu.getJiaoshiId());if(jiaoshi != null){BeanUtils.copyProperties( jiaoshi , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段view.setJiaoshiId(jiaoshi.getId());}//级联表YonghuEntity yonghu = yonghuService.selectById(keyanxiangmu.getYonghuId());if(yonghu != null){BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段view.setYonghuId(yonghu.getId());}//修改对应字典表字段dictionaryService.dictionaryConvert(view, request);return R.ok().put("data", view);}else {return R.error(511,"查不到数据");}}/*** 前端保存*/@RequestMapping("/add")public R add(@RequestBody KeyanxiangmuEntity keyanxiangmu, HttpServletRequest request){logger.debug("add方法:,,Controller:{},,keyanxiangmu:{}",this.getClass().getName(),keyanxiangmu.toString());Wrapper<KeyanxiangmuEntity> queryWrapper = new EntityWrapper<KeyanxiangmuEntity>().eq("keyanxiangmu_uuid_number", keyanxiangmu.getKeyanxiangmuUuidNumber()).eq("keyanxiangmu_name", keyanxiangmu.getKeyanxiangmuName()).eq("keyanxiangmu_types", keyanxiangmu.getKeyanxiangmuTypes()).eq("yonghu_id", keyanxiangmu.getYonghuId()).eq("jiaoshi_id", keyanxiangmu.getJiaoshiId()).eq("keyanxiangmu_yesno_types", keyanxiangmu.getKeyanxiangmuYesnoTypes()).eq("shenheyijian_text", keyanxiangmu.getShenheyijianText()).eq("keyanxiangmu_delete", keyanxiangmu.getKeyanxiangmuDelete());logger.info("sql语句:"+queryWrapper.getSqlSegment());KeyanxiangmuEntity keyanxiangmuEntity = keyanxiangmuService.selectOne(queryWrapper);if(keyanxiangmuEntity==null){keyanxiangmu.setInsertTime(new Date());keyanxiangmu.setKeyanxiangmuYesnoTypes(1);keyanxiangmu.setKeyanxiangmuDelete(1);keyanxiangmu.setCreateTime(new Date());// String role = String.valueOf(request.getSession().getAttribute("role"));// if("".equals(role)){// keyanxiangmu.set// }keyanxiangmuService.insert(keyanxiangmu);return R.ok();}else {return R.error(511,"表中有相同数据");}}}
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统