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();