疫情下的学生管理系统

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了疫情下的学生管理系统相关的知识,希望对你有一定的参考价值。

代码:https://github.com/FengYongXuan/epidemic_student_managerment

整体采用前后端分离的开发模式

前端技术栈 Vue + Vue-router(Vue.js官方路由插件,实现前端路由) + axios(请求拦截,添加token) + Element-UI

后端技术栈 Node.js + Express(基于Node.js的后端框架) + Jwt(用于身份验证) + Mysql

开发过程中的思考

1.什么是回调函数?

回调函数就是传递一个参数化的函数,就是将这个函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行这个函数。

2.异步编程

同步函数:当一个同步函数被调用时,该函数不会立即返回,直到该函数里面的代码全部执行完了才返回
异步函数:当一个异步函数被调用时,该函数会立即返回,尽管这个函数规定的操作任务还没有完成

所以,异步函数不阻塞代码

但是,如果我想要异步函数执行的结果,我怎么获取?

可以用回调函数来接收嘛。而Promise能够以一种更优雅的方式执行异步操作。

 new Promise((resolve, reject) => {
    setTimeout(() => {
      //成功的时候调用resolve
      // resolve('Free Loop');
      //失败的时候调用reject
      reject('Error Message');
    }, 1000)
  }).then((data) => {
    console.log(data);
  }).catch((err) => {
    console.log(err);
  })

而在js中,我们可以用async/await来更简洁地实现基于Promise的异步行为

使用async关键字声明一个异步函数。

await  操作符用于等待一个Promise 对象,只能在异步函数 async function 中使用。

await 会暂停当前 异步函数 的执行,等待 Promise 处理完成。

若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 异步函数下面的代码

若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出

另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function f1() {
  var x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}
f1();

3.http请求报文

请求行+请求头+请求体

举例:

1 GET/sample.jspHTTP/1.1

2 Accept:image/gif.image/jpeg,*/*

3 Accept-Language:zh-cn

4 Connection:Keep-Alive

5 Host:localhost

6 User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

7 Accept-Encoding:gzip,deflate

8

9 username=jinqiao&password=1234

第一行为http请求行,包含方法,URI 和http版本

2-7为请求头,包含浏览器,主机,接受的编码方式和压缩方式

第8行表示一个空行 表示请求头结束 这个空行是必须的

第9行是数据体,比如是需要查询的信息

4.跨域问题

从一个域名去请求另一个域名的资源,如果跨域,将无法访问

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

本项目客户端端口为8080,后台项目监听的是5000端口,存在跨域

解决方法①

app.all("*", function (req, res, next) {
  // 设置允许跨域的域名,*代表允许任意域名跨域
  res.header("Access-Control-Allow-Origin", "*")
  // 允许的header类型
  res.header("Access-Control-Allow-Headers", "*")
  // 跨域允许的请求方式
  res.header("Access-Control-Allow-Methods", "*")
  if (req.method.toLowerCase() === 'options')
    res.sendStatus(200)
  else
    next()
})

解决方法②

安装cors模块        npm install cors --save

const cors = require('cors')    //导入

app.use(cors())                 //使用,要放在所有API前面

5.sessionStorage、localStorage、cookie

都用于浏览器本地存储数据

cookie是当你浏览某个网站的时候,由web服务器存储在你的机器硬盘上的一个小的文本文件。它记录了你的用户名、密码、浏览的网页、停留的时间等等信息。当你再次来到这个网站时,web服务器会先看看有没有它上次留下来的cookie。如果有的话,会读取cookie中的内容,来判断使用者,并送出相应的网页内容,比如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。

sessionStorage用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问,并且当会话结束后,数据也随之销毁。所以sessionStorage仅仅是会话级别的存储,而不是一种持久化的本地存储。

localStorage是持久化的本地存储,除非是通过js删除,或者清除浏览器缓存,否则数据是永远不会过期的。

客户端收到服务器返回的JWT,可以存储在Cookie里面,也可以存储在localStorage

此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面 

6.基于JWT的身份验证

安装 npm install jsonwebtoken

要访问有权限的接口要携带token

7.登录模块

和教务网类似,无需注册账号,账号即学号,管理员提前注册好,初始化密码都为11111

提交表单之前进行校验:学号、密码不能为空,密码3~15个字符,不合这些要求就报错

重置功能(如果有默认值,那么重置之后为默认值,不为空)

8.主页部分

左侧的菜单可折叠

点击二级菜单高亮显示,刷新之后仍然高亮

不同用户,看到的页面是不一样的(登录后携带identity信息到home.vue,方便根据identity选择不同数据渲染菜单)

后面组件的路由都是home.vue的子路由

9.管理员 - 账号管理功能

可通过搜索框进行查询,可添加、删除账号

账号删除时让用户再确认一次

查询账号依据学号/工号,模糊查询(在sql中用like)

分页,要及时检测当前页码和每页显示数据条数,及时传给url的Params

添加用户,提交表单之前要进行校验,默认身份是学生

关闭添加用户的dialog,数据要重置,确保下次再点开是干净的

已经创建的账号如果再添加,就报错

修改账号,dialog要先获取数据进行渲染,ID不能修改,其余可改

在user表中创建新账号时,student或counselor表也需要初始化记录(例如都为‘空’),删除账号时同时也要删(通过外键约束中的级联)

10.学生 - 个人信息管理、请假条、提交体温表

11.辅导员 - 个人信息管理、审批假条、查看汇总的体温表

12.其余

时间戳的格式化处理要用到silly-datetime模块,这个要装一下

获取假条数据为0条时,不去报错

如何消除地址栏中url的/#/?

路由有两种模式 hash 和 history,默认为hash,所以路径会有 # 号,因此我们只需要修改成 history 即可

const router = new VueRouter({
  mode: 'history',
  routes: [
    ...
  ]
})

什么作为假条的主键? 

可以用序号,不过要注意每次创建假条的序号 = 当前数据库中所有假条序号最大值+1

获取请求的方式

req.params       用于获取url中的参数

req.query         用于获取get请求中的参数(params)中的数据

req.body           用于获取post请求中的数据

以上是关于疫情下的学生管理系统的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb项目-疫情环境下校园宿舍管理系统-附源码-毕业设计

JavaWeb项目-疫情环境下校园宿舍管理系统-附源码-毕业设计

计算机毕业设计疫情学生信息日报系统ssm+vue代码讲解+安装调试+文档指导

疫情下的在线上课方案:QQ直播+蓝墨云班课

项目练习目录

基于ssm校园疫情防控管理系统