问卷系统开发---服务器github:https://github.com/Snail017/testsystem-mysql-express.git1。数据库建表redis数据库(存储token,作为辅助数据库)redis查询速度快,但是作为内存数据库,不能存储太大的数据。存储缓存有助于提高性能。mysql数据库(存储大规模数据,作为主数据库)存储在硬盘上。它可以支持更大规模的数据和更低的成本。使用sequelize操作mysql数据库。考官需要指定答卷人,并建立指定答卷人与试卷表的关系。产品需求需要一份答题人名单,需要根据答卷状态和关键词进行搜索。创建表需要先指定答卷表和试卷表。他根据user_id拿到自己需要的所有试卷,然后对status和keywords进行一一筛选。实战:ORM数据模型(Object/RelationalMapping)通过实例对象的语法完成数据库操作。使用框架sequlize数据库表--->类(class)记录(record,rowdata)--->对象(object)字段(filed)-->对象属性(attribute)命名规范:一个类对应一个表.类名为单数,首字母大写;表名是复数,全部小写。例如,表books对应于Book类。如果名称是不规则的复数,则类名根据英语约定命名。例如,表mice对应类Mouse,表people对应类Person。如果名称由多个单词组成,则类名使用全大写驼峰式,表名使用下划线分隔的小写单词。例如,表book_clubs对应类BookClub,表line_items对应类LineItem。每个表都必须有一个主键字段,通常是一个名为id的整数字段。外键字段命名约定为单数表名+下划线+id,如item_id表示该字段对应items表的id字段。感觉好复杂,有没有更好的建表方式,或者处理方式?二、数据加密和加密的两种方式1、RES非对称加密:加密和解密密钥不同,私钥加密,公钥解密。AES对称加密实践:使用RES加密用户信息使用加密插件crypto进行RES非对称加密+md5不可逆加密关于加密解密,参考一个动画解读:https://mp.weixin.qq.com/s/1ojSrhc9LZV8zlX6YblMtA3.UsersAuthentication用户认证方式token方式和session认证目的:防止CSRF(跨站请求伪造)网站攻击。常用的网站攻击方式有两种:XSS、CSRF;CSRF:有关解释,请参阅wiki。防御方法:1.检查refrence字段2.添加tokenCSS:代码注入防御措施:htmlentites过滤输出。1.Token认证:JWT实现JWT的组成:Header+Payload+SignatureJWT优点:扩展性好。(session需要放在数据库中,而jwt只需要放在客户端)无状态(JWT不在服务端存储任何状态)JWT缺点:安全(bse64编码,不加密)性能(JWT数据相对long,一般存储在localstorage)一次性2.传统session认证实战:用户自动登录(JWT实现)设置token自动刷新时间,用户登录时设置access_token和refresh_token,access-token为key,fresh_token为value,存储在redis数据库中。并将access_token返回给客户端。access_token时间可以设置为1小时,refresh_token时间可以设置为一周(refresh_token有效期越长,token有效期越长)。>1、此时access_token无效时,根据access_toke获取refresh_token判断是否有效。>2.有效的给客户端返回一个新的access_token,并设置Authorization。将新的access_token和refresh_token存储到redis数据库中。>3.重新登录无效。>问卷系统开发---前端1.vue.config.js配置使用dev-server代理请求具体用法请参考文档webpack中文网constpath=require('path');functionresolve(_dir){returnpath.join(__dirname,_dir)}constwebpack=require("webpack")letwebpackConfig={configureWebpack:{plugins:[newwebpack.ProvidePlugin({$:"jquery",jQuery:"jquery","windows.jQuery":"jquery"}),]},chainWebpack:config=>{config.resolve.alias.set('@',resolve('/src'));配置.resolve.symlinks(真);},devServer:{hot:true,disableHostCheck:true,//设置代理proxy:{'/':{ws:false,target:'http://localhost:3000',changeOrigin:true,//如果为真,虚拟服务器可以在本地接受请求,代理发送该请求pathRewrite:{'^/':'/'}},}},css:{extract:falsese}}module.exports=webpackConfig;2.main.js获取公钥路径:/src/main.js项目执行获取公钥存储在浏览器localStorage//获取公钥Vue.prototype.$http({method:'get',url:"/publicKey",}).then((res)=>{res=res.data;if(res.code==200){window.localStorage.setItem("public_key",res.msg);}})3.http.js设置路由防御校验token,对每次路由跳转做权限校验importaxiosfrom'axios';importrouterfrom'./router';//定义一个路由防御,每次路由跳转,我们做权限校验router.beforeEach((to,from,next)=>{if(to.meta.requireAuth){//判断路由是否需要登录权限if(localStorage.token&&localStorage.token!=''){//判断token是否存在console.log("tokenexists");next();}else{console.log("tokendoesnotexist");next({path:'/login',//使用重定向的路由路径作为参数,并且登录成功后跳转到路由query:{redirect:to.fullPath}})}}else{//如果不需要权限验证,直接进入路由界面next();}});//http请求拦截器axios.interceptors.request.use(config=>{if(localStorage.token){//判断token是否存在config.headers.Authorization=localStorage.token;//设置token为请求头}returnconfig;},err=>{returnPromise.reject(err);});//http响应拦截器axios.interceptors.response.use(response=>{if(response.data.code===401){router.replace('/login');console.log("tokenexpired");}elseif(response.headers.authorization){localStorage.token=response.headers.authorization;}returnresponse;},error=>{returnPromise.reject(error);});exportdefaultaxios;探索学习,有不妥之处欢迎指教
