koa2实现登录注册功能(ejs+mongodb版)

gtihub仓库地址:(由于国内处于敏感时期,github暂时无法访问)

主要使用的中间件:

"ejs": "^2.7.1",(渲染模板)
"koa": "^2.8.1",(主角)
"koa-bodyparser": "^4.2.1",(用于获取post提交的数据)
"koa-router": "^7.4.0",(koa2路由控制)
"koa-session": "^5.12.3",(用于权限认证)
"koa-static": "^5.0.0",(用于加载静态资源)
"koa-views": "^6.2.1",(配合ejs使用)
"mongodb": "^3.3.2"(数据库)

项目目录结构:

*   app.js            //主入口文件
*   package.json      //项目相关信息
*   README.md
*   
****module            //封装好的数据库操作模块
*       config.js     //数据库配置信息
*       db.js         //数据库增删改查
*       
****views             //模板文件夹
    *   index.ejs     //首页
    *   login.ejs     //登录页面
    *   register.ejs  //注册页面
    *   
    ****public        //公共渲染页面模块
    *       footer.ejs//footer页面
    *       
    ****statics       //静态资源目录
    *       basic.css
    *       form.css

 项目分析:

废话不多说,直接上代码!!!

app.js

const Koa=require('koa');//引入koa
const router=require('koa-router')();//引入koa-router
const views=require('koa-views');//引入koa-views
const bodyParser=require('koa-bodyparser');//引入koa-bodyparser
const static=require('koa-static');//引入koa-static
const session = require('koa-session');//引入koa-session
const DB=require('./module/db.js');//引入数据库操作模块

const app=new Koa();//初始化koa

app.use(views('views', { extension: 'ejs' }))//配置koa-views
app.use(bodyParser());//配置koa-bodyparser
app.use(static(__dirname+'/views'));//配置koa-static静态资源目录

app.keys = ['some secret hurr'];   /*cookie的签名*/
const CONFIG = {
    key: 'koa:sess', /** 默认 */
    maxAge: 10000,  /*  cookie的过期时间        【需要修改】  */
    overwrite: true, /** (boolean) can overwrite or not (default true)    没有效果,默认 */
    httpOnly: true, /**  true表示只有服务器端可以获取cookie */
    signed: true, /** 默认 签名 */
    rolling: false, /** 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) 【需要修改】 */
    renew: false, /** (boolean) renew session when session is nearly expired      【需要修改】*/
};
app.use(session(CONFIG, app));//配置koa-session


//写一个中间件配置公共的信息
app.use(async (ctx,next)=>{

    ctx.state.title='koa2登陆注册权限练习';//ctx.state可以在全局获取到
    ctx.state.name=ctx.session.name;

    await next();/*继续向下匹配路由*/
})


//首页
router.get('/',async (ctx,next)=>{

   
    // ctx.body='这是主页面';
    // ctx.session.name='张文浩';

    var result=await DB.find('users',{});

    // console.log(result);
   

    await ctx.render('index.ejs',{
        list:result
    });
    await next();
})


//登陆页面
router.get('/login',async (ctx,next)=>{
    // ctx.body='这是登陆面';

    await ctx.render('login.ejs');

    
})

router.post('/dologin',async (ctx)=>{
    // ctx.body='这是登陆面';
    // console.log(ctx.request.body);
    
    // ctx.body=ctx.request.body;
    let data=await DB.find('users',ctx.request.body);
    // console.log(data[0]);
    try{
        if(data[0]){
            
            ctx.session.name=data[0].name;
            ctx.redirect('/');

        }
        else{
            ctx.redirect('/');
        }
    }catch(err){
        console.log(err);
        return;
        ctx.redirect('/login');
    }
    
})

//注册页面
router.get('/register',async (ctx,next)=>{
    // ctx.body='这是注册面';
    // console.log(ctx.session.name);

    await ctx.render('register.ejs');


    
})

router.post('/doregister',async (ctx)=>{
    // ctx.body='这是注册面';

//    console.log(ctx.request.body);
//    ctx.body=ctx.request.body;s
    let data=await DB.insert('users',ctx.request.body);
    //console.log(data);
    try{
        if(data.result.ok){
            ctx.redirect('/')
        }
    }catch(err){
        console.log(err);
        return;
        ctx.redirect('/register');
    }
})


//删除操作
router.get('/delete',async (ctx)=>{

    if(ctx.session.name){
        let id=ctx.query.id;
        // console.log(ctx.query.id);
        var data=await DB.remove('users',{"_id":DB.getObjectId(id)});
        // console.log(data);
        if(data){
        ctx.redirect('/')
        }
    }
    else{
        ctx.redirect('/')
    }

})

app.use(router.routes()).use(router.allowedMethods());//启动路由
app.listen(3001,()=>{
    console.log('已经在3001端口运行!');
})

views下主要的渲染页面

使用了ejs渲染引擎<% %>为其语法
/*index页面*/
DOCTYPE html> <html> <head> <link rel="stylesheet" href="statics/basic.css"/> head> <body> <% if(name){%> <h2>欢迎,<%= name%>h2> <% }else{ %> <h2><a href="/login">登陆a><a href="/register">注册a>h2> <% } %> <hr/> <table> <% for(var i=0;i<list.length;i++){%> <tr> <td><%= list[i]._id%>td> <td><%= list[i].name%>td> <td><%= list[i].sex%>td> <td><%= list[i].age%>td> <td><a href="/delete?id=<%= list[i]._id%>">删除a>td> tr> <%}%> table> <% include public/footer.ejs%> body> html> /*login页面*/ DOCTYPE html> <html> <head> <link rel="stylesheet" href="statics/form.css"/> head> <body> <h2>登陆h2> <hr/> <div> <form action="/dologin" method="POST"> 账号:<input type="text" name="account"/><br/> 密码:<input type="password" name="password"/><br/> <button type="submit">登陆button> form> div> <% include public/footer.ejs%> body> html> /*register页面*/ DOCTYPE html> <html> <head> <link rel="stylesheet" href="statics/form.css"/> head> <body> <h2>注册h2> <hr/> <div> <form action="/doregister" method="POST"> 账号:<input type="text" name="account"/><br/> 密码:<input type="password" name="password"/><br/> 姓名:<input type="text" name="name"/><br/> 性别:<input type="text" name="sex"/><br/> 年龄:<input type="text" name="age"/><br/> <button type="submit">注册button> form> div> <% include public/footer.ejs%> body> html>

 module下的数据库模块

config.js

var app={
    dbUrl: 'mongodb://localhost:27017/',
    dbName: 'koa'
}
module.exports=app;

db.js

/**
*官方文档 * http://mongodb.github.io/node-mongodb-native * http://mongodb.github.io/node-mongodb-native/3.0/api/
*/ var MongoDB=require('mongodb'); var MongoClient =MongoDB.MongoClient; const ObjectID = MongoDB.ObjectID; var Config=require('./config.js'); class Db{ static getInstance(){ /*单例*/ if(!Db.instance){ Db.instance=new Db(); } return Db.instance; } constructor(){ this.dbClient=''; /**/ this.connect(); /*连接数据库*/ } connect(){ /*连接数据库*/ let _that=this; return new Promise((resolve,reject)=>{ if(!_that.dbClient){ /*触发连接请求*/ MongoClient.connect(Config.dbUrl,(err,client)=>{ if(err){ reject(err) }else{ _that.dbClient=client.db(Config.dbName); resolve(_that.dbClient) } }) }else{ resolve(_that.dbClient); } }) } find(collectionName,json){ return new Promise((resolve,reject)=>{ this.connect().then((db)=>{ var result=db.collection(collectionName).find(json); result.toArray(function(err,docs){ if(err){ reject(err); return; } resolve(docs); }) }) }) }
update(collectionName,json1,json2){
return new Promise((resolve,reject)=>{ this.connect().then((db)=>{ //db.user.update({},{$set:{}}) db.collection(collectionName).updateOne(json1,{ $set:json2 },(err,result)=>{ if(err){ reject(err); }else{ resolve(result); } }) }) }) }
insert(collectionName,json){
return new Promise((resolve,reject)=>{ this.connect().then((db)=>{ db.collection(collectionName).insertOne(json,function(err,result){ if(err){ reject(err); }else{ resolve(result); } }) }) }) } remove(collectionName,json){ return new Promise((resolve,reject)=>{ this.connect().then((db)=>{ db.collection(collectionName).removeOne(json,function(err,result){ if(err){ reject(err); }else{ resolve(result); } }) }) }) } getObjectId(id){ return new ObjectID(id); } } module.exports=Db.getInstance();

 

你可能感兴趣的:(koa2实现登录注册功能(ejs+mongodb版))