一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发:springiboot+mybatis
前端开发:vue+elementUI
二,项目简介
2.1 开发背景
随着计算机应用技术的快速发展,计算机应用技术也逐渐深入到教育领域,给我们带来了教育观念、教育模式、教学方法的变革,尤其在疫情的特殊时期开展的网络教学模式,减少了师生之间面对面的交流机会,因此教师无法及时解答学生学习中遇到的问题,而且教师每年面对的学生都是不同的,很多问题都是重复性的,上一届学生提出的问题极大可能出现在下一届学生上。而网络上的信息杂而多,不能针对性地解决学生的问题,本课题通过建立《计算机网络》课程知识库,将老师常年的教学过程中产生的问题及解决方法记录在系统中,学生通过问题关键字进行检索来获取解决方法。这样教师不需要年复一年地回答学生重复提出的问题,极大地减轻了教师的工作量,学生也可以随时随地获得问题解决方法,提高学生学习的积极性。
《计算机网络》课程教学系统使用springboot框架和Vue框架开发,springboot框架简单,简化了配置,减少了开发周期,能有更多的时间进行优化,同时springboot提供maven的极简配置,以及可视化的相关监控功能,比如性能监控,应用的健康程度等;在前端Vue框架上,Vue的使用使网站更加简约好看,性能大大提升,使网站运行更加流畅。
2.2 需求分析
根据市场调研和用户走访,并进行整理分析,得知本次设计实现的<<计算机网络>>课程教学网站用户一共有三类,一是学生用户,一类是教师用户,还有一类是平台提供的用于管理系统基本信息的管理员账户。这三类用户的角色和操作功能权限各不不同,下面通过用例图的方式来进行展示。
学生用户的用例图如下图1所示。
学生用户用例描述:学生用户注册登陆后,主要可以实现在线浏览公告信息、浏览自己的课程信息、章节信息、在线学习课程、查看新闻资讯、博客文章,并可以在个人中心中管理自己的个人信息和收藏信息,同时在个人后台管理处可以发布博客,管理自己的提问和老师的解答信息等。
教师用户的操作用例图如下图2所示。
教师用户用例图描述:教师登陆<<计算机网络>>课程教学网站,主要的职责是对自己的课程信息进行相关的管理操作,主要包含课程管理、章节管理、提问管理、解答管理、课程资源管理等。
管理员用户的用例图如下图3所示。
管理员用户用例图描述:管理员登陆<<计算机网络>>课程教学网站,主要的操作功能包含用户管理、管理员管理、课程管理、课程章节管理、课程资源管理、博客文章管理、新闻资讯管理、轮播图管理等。
2.3 功能介绍
在对整个<<计算机网络>>课程教学网站做了充分的需求分析和架构设计之后,最终确定了本次开发设计的<<计算机网络>>课程教学网站要实现的功能目标,具体展示如下图5所示。
对于本课题要实现的功能,下面进行一下相应的介绍。
学生用户的功能描述:
(1)注册登陆:<<计算机网络>>课程教学网站的前端如果以游客身份进入平台,主要可以进行信息的浏览操作,其它的在线学习、在线问答等模块是无权限操作的。只有注册为会员用户,并根据注册时指定的账户登陆平台,才可以获得平台的授权来进行相关操作。
(2)课程浏览:点击课程连接即可进入在线课程详情展示页,并可以收藏课程和对课程进行评论。
(3)在线学习:用户在课程章节详情页可以查看章节内容信息,并在线观看学习课程视频,同时可以下载课程相关的资源文件。
(4)新闻浏览:平台可以根据需要发布一些新闻或系统公告,来让用户浏览了解。
(5)博客浏览:用户可以在线发布学习的笔记等博客信息,供别人浏览。
(6)个人中心:在个人中心处主要完成对个人基本信息管理,以及自己收藏信息管理。
(7)在线问答:用户可以在课程中在线进行提问问题,课程所属老师看到后会进行解答,用户可以看到老师给出的解答内容。
教师用户的功能描述:
(1)个人中心:管理个人信息和登陆的密码。
(2)课程管理:教师可以发布属于自己的课程信息,并进行管理。
(3)章节管理:每个课程可以添加若干章节,并在章节中添加课程资源和对应讲解的视频。
(4)课程资源管理:老师可以对上传的课程资源信息进行管理操作。
(5)问题管理:主要可以查看前端用户对自己发布的课程提出的问题,并对问题进行解答,答案用户可以在前端查看。
(6)解答管理:可以对自己回答的答案进行信息的修改和删除操作。
后台管理员的操作功能描述如下:
(1)用户管理:主要实现对在<<计算机网络>>课程教学网站注册的学生信息、教师信息和平台管理员的管理操作。
(2)文章分类管理:主要完成对系统博客分类信息的管理操作,方便用户分类进行博客信息的查看。
(3)课程管理:管理可以管理所有老师发布的课程信息。
(3)章节管理:管理员可以管理所有老师发布的课程章节信息,每个课程可以添加若干章节,并在章节中添加课程资源和对应讲解的视频。
(4)课程资源管理:管理员可以对所有老师上传的课程资源信息进行管理操作。
(5)问题管理:主要可以查看所有前端用户对课程提出的问题,并对问题进行解答,答案用户可以在前端查看。
(6)解答管理:可以对所有老师回答的答案进行信息的修改和删除操作。
(7)轮播图管理:管理前端展示的轮播图片。
(8)新闻管理:管理员可以发布相关的新闻和公告信息供前端用户查看。
三,系统展示
用户登录
用户注册
课程浏览
课程详情
新闻浏览
课程资源
个人中心后台管理
管理员后台管理
用户管理
博客分类管理
博客管理
课程管理
轮播图管理
新闻管理
课程章节管理
课程资源管理
问答管理
四,核心代码展示
package com.controller; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.utils.ValidatorUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.annotation.IgnoreAuth; import com.entity.KechengziyuanEntity; import com.entity.view.KechengziyuanView; import com.service.KechengziyuanService; import com.service.TokenService; import com.utils.PageUtils; import com.utils.R; import com.utils.MD5Util; import com.utils.MPUtil; import com.utils.CommonUtil; import java.io.IOException; import com.service.StoreupService; import com.entity.StoreupEntity; /** * 课程资源 * 后端接口 * @author * @email * @date 2022-07-23 18:58:54 */ @RestController @RequestMapping("/kechengziyuan") public class KechengziyuanController { @Autowired private KechengziyuanService kechengziyuanService; @Autowired private StoreupService storeupService; /** * 后端列表 */ @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params,KechengziyuanEntity kechengziyuan, HttpServletRequest request){ String tableName = request.getSession().getAttribute("tableName").toString(); if(tableName.equals("jiaoshi")) { kechengziyuan.setJiaoshigonghao((String)request.getSession().getAttribute("username")); } EntityWrapper<KechengziyuanEntity> ew = new EntityWrapper<KechengziyuanEntity>(); PageUtils page = kechengziyuanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengziyuan), params), params)); return R.ok().put("data", page); } /** * 前端列表 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params,KechengziyuanEntity kechengziyuan, HttpServletRequest request){ EntityWrapper<KechengziyuanEntity> ew = new EntityWrapper<KechengziyuanEntity>(); PageUtils page = kechengziyuanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengziyuan), params), params)); return R.ok().put("data", page); } /** * 列表 */ @RequestMapping("/lists") public R list( KechengziyuanEntity kechengziyuan){ EntityWrapper<KechengziyuanEntity> ew = new EntityWrapper<KechengziyuanEntity>(); ew.allEq(MPUtil.allEQMapPre( kechengziyuan, "kechengziyuan")); return R.ok().put("data", kechengziyuanService.selectListView(ew)); } /** * 查询 */ @RequestMapping("/query") public R query(KechengziyuanEntity kechengziyuan){ EntityWrapper< KechengziyuanEntity> ew = new EntityWrapper< KechengziyuanEntity>(); ew.allEq(MPUtil.allEQMapPre( kechengziyuan, "kechengziyuan")); KechengziyuanView kechengziyuanView = kechengziyuanService.selectView(ew); return R.ok("查询课程资源成功").put("data", kechengziyuanView); } /** * 后端详情 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id){ KechengziyuanEntity kechengziyuan = kechengziyuanService.selectById(id); return R.ok().put("data", kechengziyuan); } /** * 前端详情 */ @IgnoreAuth @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id){ KechengziyuanEntity kechengziyuan = kechengziyuanService.selectById(id); return R.ok().put("data", kechengziyuan); } /** * 后端保存 */ @RequestMapping("/save") public R save(@RequestBody KechengziyuanEntity kechengziyuan, HttpServletRequest request){ kechengziyuan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(kechengziyuan); kechengziyuanService.insert(kechengziyuan); return R.ok(); } /** * 前端保存 */ @RequestMapping("/add") public R add(@RequestBody KechengziyuanEntity kechengziyuan, HttpServletRequest request){ kechengziyuan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(kechengziyuan); kechengziyuanService.insert(kechengziyuan); return R.ok(); } /** * 修改 */ @RequestMapping("/update") @Transactional public R update(@RequestBody KechengziyuanEntity kechengziyuan, HttpServletRequest request){ //ValidatorUtils.validateEntity(kechengziyuan); kechengziyuanService.updateById(kechengziyuan);//全部更新 return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] ids){ kechengziyuanService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } /** * 提醒接口 */ @RequestMapping("/remind/{columnName}/{type}") public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map<String, Object> map) { map.put("column", columnName); map.put("type", type); if(type.equals("2")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); Date remindStartDate = null; Date remindEndDate = null; if(map.get("remindstart")!=null) { Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart); remindStartDate = c.getTime(); map.put("remindstart", sdf.format(remindStartDate)); } if(map.get("remindend")!=null) { Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindEnd); remindEndDate = c.getTime(); map.put("remindend", sdf.format(remindEndDate)); } } Wrapper<KechengziyuanEntity> wrapper = new EntityWrapper<KechengziyuanEntity>(); if(map.get("remindstart")!=null) { wrapper.ge(columnName, map.get("remindstart")); } if(map.get("remindend")!=null) { wrapper.le(columnName, map.get("remindend")); } String tableName = request.getSession().getAttribute("tableName").toString(); if(tableName.equals("jiaoshi")) { wrapper.eq("jiaoshigonghao", (String)request.getSession().getAttribute("username")); } int count = kechengziyuanService.selectCount(wrapper); return R.ok().put("count", count); } }
package com.controller; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.utils.ValidatorUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.annotation.IgnoreAuth; import com.entity.NewsEntity; import com.entity.view.NewsView; import com.service.NewsService; import com.service.TokenService; import com.utils.PageUtils; import com.utils.R; import com.utils.MD5Util; import com.utils.MPUtil; import com.utils.CommonUtil; import java.io.IOException; /** * 高校资讯 * 后端接口 * @author * @email * @date 2022-07-23 18:58:54 */ @RestController @RequestMapping("/news") public class NewsController { @Autowired private NewsService newsService; /** * 后端列表 */ @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){ EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>(); PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); return R.ok().put("data", page); } /** * 前端列表 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){ EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>(); PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params)); return R.ok().put("data", page); } /** * 列表 */ @RequestMapping("/lists") public R list( NewsEntity news){ EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>(); ew.allEq(MPUtil.allEQMapPre( news, "news")); return R.ok().put("data", newsService.selectListView(ew)); } /** * 查询 */ @RequestMapping("/query") public R query(NewsEntity news){ EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>(); ew.allEq(MPUtil.allEQMapPre( news, "news")); NewsView newsView = newsService.selectView(ew); return R.ok("查询高校资讯成功").put("data", newsView); } /** * 后端详情 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id){ NewsEntity news = newsService.selectById(id); return R.ok().put("data", news); } /** * 前端详情 */ @IgnoreAuth @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id){ NewsEntity news = newsService.selectById(id); return R.ok().put("data", news); } /** * 后端保存 */ @RequestMapping("/save") public R save(@RequestBody NewsEntity news, HttpServletRequest request){ news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(news); newsService.insert(news); return R.ok(); } /** * 前端保存 */ @RequestMapping("/add") public R add(@RequestBody NewsEntity news, HttpServletRequest request){ news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(news); newsService.insert(news); return R.ok(); } /** * 修改 */ @RequestMapping("/update") @Transactional public R update(@RequestBody NewsEntity news, HttpServletRequest request){ //ValidatorUtils.validateEntity(news); newsService.updateById(news);//全部更新 return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] ids){ newsService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } /** * 提醒接口 */ @RequestMapping("/remind/{columnName}/{type}") public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map<String, Object> map) { map.put("column", columnName); map.put("type", type); if(type.equals("2")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); Date remindStartDate = null; Date remindEndDate = null; if(map.get("remindstart")!=null) { Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart); remindStartDate = c.getTime(); map.put("remindstart", sdf.format(remindStartDate)); } if(map.get("remindend")!=null) { Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindEnd); remindEndDate = c.getTime(); map.put("remindend", sdf.format(remindEndDate)); } } Wrapper<NewsEntity> wrapper = new EntityWrapper<NewsEntity>(); if(map.get("remindstart")!=null) { wrapper.ge(columnName, map.get("remindstart")); } if(map.get("remindend")!=null) { wrapper.le(columnName, map.get("remindend")); } int count = newsService.selectCount(wrapper); return R.ok().put("count", count); } }
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的各类毕业设计作品
基于Nodejs、Vue等前端技术开发设计的前端毕业设计作品
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统
前沿技术、一站式服务、贴心售后解决你后顾之忧