1 文件结构:pages中放置页面代码;server 分为 dbs 和interface两个文件夹;
dbs设置有关数据库的代码;interface设置接口信息;
2.2 先看dbs的,在dbs的配置文件config.js中定义:
export default { //该文件是配置文件,在 server/index 和interface 中引入使用。 dbs:'mongodb://127.0.0.1:27017/student',//配置数据库host和数据库名字student redis:{ //配置redis快速存储的数据库地址和端口 get host(){ return '127.0.0.1' }, get port(){ return 6379 } }, smtp:{ //配置发送邮箱的信息 get host(){ return 'smtp.qq.com' //smtp发送邮件的协议 }, get user(){ return '2751581738@qq.com' //邮箱地址 }, get pass(){ return 'rxufkzgrrfcodhei' //授权码 }, get code(){ //发送的四位随机码 return ()=>{ return Math.random().toString(16).slice(2,6).toUpperCase() } }, get expire(){ return ()=>{ //设置验证码的设置有效期 return new Date().getTime()+60*60*1000 } } } }
然后在数据库的dbs中model中新建数据表:
import mongoose from 'mongoose' //使用 mongoose 新建数据库的表 users const Schema = mongoose.Schema const UserSchema=new Schema({ username:{ type:String, unique:true, require:true }, password:{ type:String, require:true }, email:{ type:String, require:true } }) export default mongoose.model('User',UserSchema)
还要在server/index.js中
import mongoose from 'mongoose' mongoose.connect(dbConfig.dbs,{ useNewUrlParser:true })
处理完数据库之后,再来设置接口,在interface文件夹中:
首先在interface/utils文件夹下新建 axios和passport两个文件:
import axios from 'axios' const instance = axios.create({ baseURL:`http://${process.env.HOST||'localhost'}:${process.env.PORT||3000}`, timeout:2000, headers:{ } }) export default instance
然后设置 passport文件:
/*koa-passport是koa的一个中间件,它实际上只是对passport的一个封装。 利用koa-passport可以简便的实现登录注册功能,不但包括本地验证*/ /* passport的主要功能就是能够提供一个用户鉴权的框架,并把鉴权得到的用户身份供后续的业务逻辑来使用。 */ import passport from 'koa-passport' /* 网络中最常用的方式就是通过用户名和密码进行认证,提供这种认证的策略是 passport-local 。 此模块允许您使用Node.js应用程序中的用户名和密码进行身份验证。 通过插入Passport,本地身份验证可以轻松而不显眼地集成到任何支持Connect式中间件( 包括Express)的应用程序或框架中。 */ import LocalStrategy from 'passport-local' import UserModel from '../../dbs/models/users'//该文件定义了数据库的基本框架 //连接数据库 passport.use(new LocalStrategy(async function(username,password,done){ let where = { username }; let result = await UserModel.findOne(where) if(result!=null){ if(result.password===password){ return done(null,result) }else{ return done(null,false,'密码错误') } }else{ return done(null,false,'用户不存在') } })) /* 序列化和反序列化的对象是session,是将信息存入session,和将信息从session中取出来。 (要存入的变量可以是一个String或者Number或Object) 序列化函数:serializeUser,在ctx.login(id)函数调用时触发,其中的参数会传给serializeUser函数作为其第一个参数, 反序列化函数:deserializeUser,会自动解析用户请求中session的信息,并作为回调函数的第一个参数, 在典型的网络应用中,登录请求中包含验证用户的认证信息。如果认证成功, 用户浏览器中通过 cookie 创建并保存 sessionID。随后所有的请求不再需要验证, 而是通过 sessionID 来识别用户。Passport 可以将 session 中的用户信息序列化或反序列化, 以此支持 session 机制。 */ passport.serializeUser(function(user,done){ done(null,user) }) passport.deserializeUser(function(user,done){ return done(null,user) }) export default passport
注意几点:
1:定义的策略
passport.use(new LocalStrategy(async function(username,password,done){ ... }))
会在下面定义接口时调用:
Passport.authenticate('local', function(err, user, info, status) { ... }