开发环境与技术
3.1 MySQL数据库
本课题研究研发的应用程序在数据操作过程中是难以预测的,而且常常产生变化。没有办法直接从word里写数据,这不但不安全,并且难以实现应用程序的功能。想要实现运用所需要的数据存放功能,就必定要选择专业的数据库存储软件。大部分,应用程序达到的功能并不太繁杂,市场中所有关系数据库手机软件都能实现。参照自己的思维构造及使用习惯性,MySQL能够支持中小型系统软件,不用Oracle、SQL Server 大中小型数据适用,适宜大家全面的数据库,而非其他问题,由于真正意义上的系统在线,是数据库网络服务器,网站服务器。
3.2 Vue前端技术
在动态网站盛行之时,Java作为一种高级编程语言,当然不会轻易放弃这一领域的生日蛋糕。Sun企业上线了Servlet做为导出动态网站的标准规范。因为当时程序猿不是很喜欢,但一开始挑选很少。java语言在之后的好多个月里出现,不顾及性能高效率,最少区别了写网页页面所需要的动态性编码块和静态代码块,大大提升了创作效率易读性。因而,许多Java软件工程师和入行的初级程序员都会选择java语言当作个人职业生涯发展前景。为保持Java语言在高级编程语言中的重要性,避免java再次抢占市场,Sun与Apache慈善基金会协作,开发了一种有关Java动态网站的技术规范,即vue技术性。vue在页面写作时吸取java语言中的所有优势,却也靠着Java语言 EE庞大环境能通过Java组件完成很多作用。这种组件能够直接引用到vue页面,使vue更强大和完善。确保了Java科技的竖向可持续发展观,最终在动态网站开发行业占有一席之地。别的java开发工作人员能够快速转移到vue开展开发,不顾及一些特殊组件或功能性的开发,自打动态性页面的开发来说,彻底完成了java流程和vue流程的基本无成本费变换,vue技术性就是这样发展趋势起来。
3.3 Spring Boot框架
从取名上能够得知这一框架设计初心:快速开启Spring运用。因而,Spring。 实质上,Boot应用程序是一个根据Spring框架的应用程序。这是Spring“协议书先于配置”理论的良好实践物质。可以帮助开发者迅速、更有效地搭建根据Spring生态系统中的应用程序。
Spring Boot实现自动配置、发展依靠、Actuator、命令行界面(CLI) 是Spring Boot最主要的四个核心特点,在其中CLI是Spring Boot的能选特点尽管功能齐全,却也引入了一套非传统的开发模型,因此本系列文章只注重别的三个特点。如标题,本问题是本系列的第一部分,将为您开启Spring Boot大门,关键为您进一步分析启动过程及全自动配置完成基本原理。把握这一部分主要内容,了解一些Spring框架的基本知识,也会让你游刃有余。
3.4 微信小程序
微信小程序是一种轻量级的应用程序,可以在微信内部直接运行,无需下载安装,为用户提供快速便捷的服务和功能体验,涵盖了各种领域的应用,从社交、娱乐到商务和生活服务,为开发者提供了一个强大的平台,以低成本和高效率开发和发布小程序。
功能设计
4.1 主要功能描述
.
系统实现
5.1 前端界面实现
5.1.1 系统首页
5.1.2 学生选课(集成协同过滤算法)
未登录不能选课
登录后
5.1.3 素质拓展报名
未登录不能报名
登录后
5.1.4 奖学金申请(集成协同过滤算法)
未登录不能申请
登录后
5.1.5 个人信息展示
5.1.6 登录注册
5.2 后台管理实现
5.2.1 登录界面
三个身份可供选择
5.2.2 学生管理
5.2.3 奖学金审核
5.2.4 教师管理
5.2.4 其他CRUD管理
5.3 教师端功能
5.3.1 课程发布
管理员发布课程指定老师
老师端可以查看到管理员为自己分配的课程
5.3.2 选课审核(包含审核、打分功能)
学生选课后,老师要进行审核,学生端才能看到
审核通过后,可以对所选课程进行打分
学生端可以查看审核信息
学生端可查看详细信息
学生端查看自己课程所得分数
5.3.3 奖学金申请、活动扩展申请
同上选课流程
5.3.4 学生考勤
教师可对学生考勤状况进行记录
数据库设计参考
-- MySQL dump 10.13 Distrib 5.7.31, for Linux (x86_64) -- -- Host: localhost Database: springbootm3ord -- ------------------------------------------------------ -- Server version 5.7.31 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Current Database: `springbootm3ord` -- /*!40000 DROP DATABASE IF EXISTS `springbootm3ord`*/; CREATE DATABASE /*!32312 IF NOT EXISTS*/ `springbootm3ord` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; USE `springbootm3ord`; -- -- Table structure for table `aboutus` -- DROP TABLE IF EXISTS `aboutus`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `aboutus` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `title` varchar(200) NOT NULL COMMENT '标题', `subtitle` varchar(200) DEFAULT NULL COMMENT '副标题', `content` longtext NOT NULL COMMENT '内容', `picture1` longtext COMMENT '图片1', `picture2` longtext COMMENT '图片2', `picture3` longtext COMMENT '图片3', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='关于我们'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `aboutus` -- LOCK TABLES `aboutus` WRITE; /*!40000 ALTER TABLE `aboutus` DISABLE KEYS */; INSERT INTO `aboutus` VALUES (1,'2023-03-05 09:51:25','关于我们','ABOUT US','不管你想要怎样的生活,你都要去努力争取,不多尝试一些事情怎么知道自己适合什么、不适合什么呢?\n你说你喜欢读书,让我给你列书单,你还问我哪里有那么多时间看书;你说自己梦想的职业是广告文案,问我如何成为一个文案,应该具备哪些素质;你说你计划晨跑,但总是因为学习、工作辛苦或者身体不舒服第二天起不了床;你说你一直梦想一个人去长途旅行,但是没钱,父母觉得危险。其实,我已经厌倦了你这样说说而已的把戏,我觉得就算我告诉你如何去做,你也不会照做,因为你根本什么都不做。','upload/aboutus_picture1.jpg','upload/aboutus_picture2.jpg','upload/aboutus_picture3.jpg'); /*!40000 ALTER TABLE `aboutus` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `config` -- DROP TABLE IF EXISTS `config`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `config` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(100) NOT NULL COMMENT '配置参数名称', `value` varchar(100) DEFAULT NULL COMMENT '配置参数值', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='配置文件'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `config` -- LOCK TABLES `config` WRITE; /*!40000 ALTER TABLE `config` DISABLE KEYS */; INSERT INTO `config` VALUES (1,'picture1','upload/picture1.jpg'),(2,'picture2','upload/picture2.jpg'),(3,'picture3','upload/picture3.jpg'); /*!40000 ALTER TABLE `config` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `discussjiaoyuan` -- DROP TABLE IF EXISTS `discussjiaoyuan`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `discussjiaoyuan` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `refid` bigint(20) NOT NULL COMMENT '关联表id', `userid` bigint(20) NOT NULL COMMENT '用户id', `avatarurl` longtext COMMENT '头像', `nickname` varchar(200) DEFAULT NULL COMMENT '用户名', `content` longtext NOT NULL COMMENT '评论内容', `reply` longtext COMMENT '回复内容', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='教员评论表'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `discussjiaoyuan` -- LOCK TABLES `discussjiaoyuan` WRITE; /*!40000 ALTER TABLE `discussjiaoyuan` DISABLE KEYS */; /*!40000 ALTER TABLE `discussjiaoyuan` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `discusszhaopinxinxi` -- DROP TABLE IF EXISTS `discusszhaopinxinxi`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `discusszhaopinxinxi` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `refid` bigint(20) NOT NULL COMMENT '关联表id', `userid` bigint(20) NOT NULL COMMENT '用户id', `avatarurl` longtext COMMENT '头像', `nickname` varchar(200) DEFAULT NULL COMMENT '用户名', `content` longtext NOT NULL COMMENT '评论内容', `reply` longtext COMMENT '回复内容', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='招聘信息评论表'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `discusszhaopinxinxi` -- LOCK TABLES `discusszhaopinxinxi` WRITE; /*!40000 ALTER TABLE `discusszhaopinxinxi` DISABLE KEYS */; /*!40000 ALTER TABLE `discusszhaopinxinxi` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `jiajiaoshenqing` -- DROP TABLE IF EXISTS `jiajiaoshenqing`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `jiajiaoshenqing` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `shenqingbianhao` varchar(200) DEFAULT NULL COMMENT '申请编号', `gonghao` varchar(200) DEFAULT NULL COMMENT '工号', `jiaoshixingming` varchar(200) DEFAULT NULL COMMENT '教师姓名', `shoukezhuanye` varchar(200) DEFAULT NULL COMMENT '授课专业', `xueli` varchar(200) DEFAULT NULL COMMENT '学历', `jiajiaofeiyong` varchar(200) DEFAULT NULL COMMENT '家教费用', `shenqingriqi` date DEFAULT NULL COMMENT '申请日期', `shenqingneirong` longtext COMMENT '申请内容', `zhanghao` varchar(200) DEFAULT NULL COMMENT '账号', `xingming` varchar(200) DEFAULT NULL COMMENT '姓名', `shoujihaoma` varchar(200) DEFAULT NULL COMMENT '手机号码', `sfsh` varchar(200) DEFAULT '待审核' COMMENT '是否审核', `shhf` longtext COMMENT '审核回复', PRIMARY KEY (`id`), UNIQUE KEY `shenqingbianhao` (`shenqingbianhao`) ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COMMENT='家教申请'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `jiajiaoshenqing` -- LOCK TABLES `jiajiaoshenqing` WRITE; /*!40000 ALTER TABLE `jiajiaoshenqing` DISABLE KEYS */; INSERT INTO `jiajiaoshenqing` VALUES (51,'2023-03-05 09:51:24','1111111111','工号1','教师姓名1','授课专业1','学历1','家教费用1','2023-03-05','申请内容1','账号1','姓名1','手机号码1','是',''),(52,'2023-03-05 09:51:24','2222222222','工号2','教师姓名2','授课专业2','学历2','家教费用2','2023-03-05','申请内容2','账号2','姓名2','手机号码2','是',''),(53,'2023-03-05 09:51:24','3333333333','工号3','教师姓名3','授课专业3','学历3','家教费用3','2023-03-05','申请内容3','账号3','姓名3','手机号码3','是',''),(54,'2023-03-05 09:51:24','4444444444','工号4','教师姓名4','授课专业4','学历4','家教费用4','2023-03-05','申请内容4','账号4','姓名4','手机号码4','是',''),(55,'2023-03-05 09:51:24','5555555555','工号5','教师姓名5','授课专业5','学历5','家教费用5','2023-03-05','申请内容5','账号5','姓名5','手机号码5','是',''),(56,'2023-03-05 09:51:24','6666666666','工号6','教师姓名6','授课专业6','学历6','家教费用6','2023-03-05','申请内容6','账号6','姓名6','手机号码6','是',''),(57,'2023-03-05 09:51:24','7777777777','工号7','教师姓名7','授课专业7','学历7','家教费用7','2023-03-05','申请内容7','账号7','姓名7','手机号码7','是',''),(58,'2023-03-05 09:51:24','8888888888','工号8','教师姓名8','授课专业8','学历8','家教费用8','2023-03-05','申请内容8','账号8','姓名8','手机号码8','是',''); /*!40000 ALTER TABLE `jiajiaoshenqing` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `jiaoyuan` -- DROP TABLE IF EXISTS `jiaoyuan`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `jiaoyuan` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gonghao` varchar(200) NOT NULL COMMENT '工号', `mima` varchar(200) NOT NULL COMMENT '密码', `jiaoshixingming` varchar(200) NOT NULL COMMENT '教师姓名', `xingbie` varchar(200) DEFAULT NULL COMMENT '性别', `youxiang` varchar(200) DEFAULT NULL COMMENT '邮箱', `lianxishouji` varchar(200) DEFAULT NULL COMMENT '联系手机', `shoukezhuanye` varchar(200) DEFAULT NULL COMMENT '授课专业', `xueli` varchar(200) DEFAULT NULL COMMENT '学历', `touxiang` longtext COMMENT '头像', `jiajiaofeiyong` varchar(200) DEFAULT NULL COMMENT '家教费用', `gerenjianjie` longtext COMMENT '个人简介', `rongyuxinxi` longtext COMMENT '荣誉信息', PRIMARY KEY (`id`), UNIQUE KEY `gonghao` (`gonghao`) ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='教员'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `jiaoyuanfankui` -- DROP TABLE IF EXISTS `jiaoyuanfankui`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `jiaoyuanfankui` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `fankuibianhao` varchar(200) DEFAULT NULL COMMENT '反馈编号', `fankuibiaoti` varchar(200) NOT NULL COMMENT '反馈标题', `fankuineirong` longtext COMMENT '反馈内容', `fankuishijian` datetime DEFAULT NULL COMMENT '反馈时间', `gonghao` varchar(200) DEFAULT NULL COMMENT '工号', `jiaoshixingming` varchar(200) DEFAULT NULL COMMENT '教师姓名', `shhf` longtext COMMENT '回复内容', PRIMARY KEY (`id`), UNIQUE KEY `fankuibianhao` (`fankuibianhao`) ) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8 COMMENT='教员反馈'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `jiaoyuanfankui` -- LOCK TABLES `jiaoyuanfankui` WRITE; /*!40000 ALTER TABLE `jiaoyuanfankui` DISABLE KEYS */; INSERT INTO `jiaoyuanfankui` VALUES (111,'2023-03-05 09:51:25','1111111111','反馈标题1','反馈内容1','2023-03-05 17:51:25','工号1','教师姓名1',''),(112,'2023-03-05 09:51:25','2222222222','反馈标题2','反馈内容2','2023-03-05 17:51:25','工号2','教师姓名2',''),(113,'2023-03-05 09:51:25','3333333333','反馈标题3','反馈内容3','2023-03-05 17:51:25','工号3','教师姓名3',''),(114,'2023-03-05 09:51:25','4444444444','反馈标题4','反馈内容4','2023-03-05 17:51:25','工号4','教师姓名4',''),(115,'2023-03-05 09:51:25','5555555555','反馈标题5','反馈内容5','2023-03-05 17:51:25','工号5','教师姓名5',''),(116,'2023-03-05 09:51:25','6666666666','反馈标题6','反馈内容6','2023-03-05 17:51:25','工号6','教师姓名6',''),(117,'2023-03-05 09:51:25','7777777777','反馈标题7','反馈内容7','2023-03-05 17:51:25','工号7','教师姓名7',''),(118,'2023-03-05 09:51:25','8888888888','反馈标题8','反馈内容8','2023-03-05 17:51:25','工号8','教师姓名8',''); /*!40000 ALTER TABLE `jiaoyuanfankui` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `ketijiangjie` -- DROP TABLE IF EXISTS `ketijiangjie`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `ketijiangjie` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gonghao` varchar(200) DEFAULT NULL COMMENT '工号', `jiaoshixingming` varchar(200) DEFAULT NULL COMMENT '教师姓名', `xueli` varchar(200) DEFAULT NULL COMMENT '学历', `yuyueshijian` varchar(200) NOT NULL COMMENT '预约时间', `ketimingcheng` varchar(200) DEFAULT NULL COMMENT '课题名称', `jiangjieshipin` longtext COMMENT '讲解视频', `dizhi` varchar(200) DEFAULT NULL COMMENT '地址', `zhanghao` varchar(200) DEFAULT NULL COMMENT '账号', `xingming` varchar(200) DEFAULT NULL COMMENT '姓名', `shoujihaoma` varchar(200) DEFAULT NULL COMMENT '手机号码', `neirong` longtext COMMENT '内容', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8 COMMENT='课题讲解'; /*!40101 SET character_set_client = @saved_cs_client */;
代码参考
@IgnoreAuth @PostMapping(value = "/login") public R login(String username, String password, String captcha, HttpServletRequest request) { UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username)); if(user==null || !user.getPassword().equals(password)) { return R.error("账号或密码不正确"); } String token = tokenService.generateToken(user.getId(),username, "users", user.getRole()); return R.ok().put("token", token); } @Override public String generateToken(Long userid,String username, String tableName, String role) { TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role)); String token = CommonUtil.getRandomString(32); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.HOUR_OF_DAY, 1); if(tokenEntity!=null) { tokenEntity.setToken(token); tokenEntity.setExpiratedtime(cal.getTime()); this.updateById(tokenEntity); } else { this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime())); } return token; } /** * 权限(Token)验证 */ @Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY = "Token"; @Autowired private TokenService tokenService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //支持跨域请求 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态 if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { response.setStatus(HttpStatus.OK.value()); return false; } IgnoreAuth annotation; if (handler instanceof HandlerMethod) { annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); } else { return true; } //从header中获取token String token = request.getHeader(LOGIN_TOKEN_KEY); /** * 不需要验证权限的方法直接放过 */ if(annotation!=null) { return true; } TokenEntity tokenEntity = null; if(StringUtils.isNotBlank(token)) { tokenEntity = tokenService.getTokenEntity(token); } if(tokenEntity != null) { request.getSession().setAttribute("userId", tokenEntity.getUserid()); request.getSession().setAttribute("role", tokenEntity.getRole()); request.getSession().setAttribute("tableName", tokenEntity.getTablename()); request.getSession().setAttribute("username", tokenEntity.getUsername()); return true; } PrintWriter writer = null; response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); try { writer = response.getWriter(); writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); } finally { if(writer != null){ writer.close(); } } // throw new EIException("请先登录", 401); return false; } }