1.通过 ObjectID 获取 _id

根目录/module/db.js

/**
* DB库
*/
var MongoDB = require('mongodb');
var MongoClient = MongoDB.MongoClient;
var 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 = ''; /*属性 存放db对象*/
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((err, docs) => {
if (err) {
reject(err);
return;
}
resolve(docs);
})
})
})
} update(collectionName, json1, json2) { /*更新数据*/
return new Promise((resolve, reject) => {
this.connect().then((db) => {
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) { /*mongodb里面查询 _id 把字符串转换成对象*/
return new ObjectID(id);
}
} module.exports = Db.getInstance();

2.视图层

根目录/views/index.html

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.table {
border: 1px solid #eee;
text-align: center;
} .table td,
.table th {
border: 1px solid #eee;
text-align: center;
}
</style>
</head> <body>
<br />
<br />
<a href="/add">增加用户</a>
<br />
<br />
<table class="table">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
{{each list}}
<tr>
<td>{{$value.username}}</td>
<td>{{$value.age}}</td>
<td>{{$value.sex}}</td>
<td>
<a href="/edit?id={{@$value._id}}">编辑</a> <a href="/delete?id={{@$value._id}}">删除</a>
</td>
</tr>
{{/each}}
</table>
</body> </html>

根目录/views/edit.html

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<h2>编辑用户</h2>
<form action="/doEdit" method="post">
<input type="hidden" name="id" value="{{@list._id}}" />
<br />用户名:
<input type="text" name="username" value="{{list.username}}" />
<br />
<br /> 年龄:
<input type="text" name="age" value="{{list.age}}" />
<br />
<br /> 性别:
<input type="text" name="sex" value="{{list.sex}}" />
<br />
<br />
<input type="submit" value="提交" />
</form>
</body> </html>

3.控制层

根目录/app.js

// 引入模块
const Koa = require('koa');
const router = require('koa-router')(); /*引入是实例化路由 推荐*/
const render = require('koa-art-template');
const path = require('path');
const BodyParser = require('koa-bodyparser');
const DB = require('./module/db.js'); // 实例化
let app = new Koa(); // 配置post提交数据的中间件
app.use(BodyParser()); // 配置 koa-art-template 模板引擎
render(app, {
root: path.join(__dirname, 'views'), // 视图的位置
extname: '.html', // 后缀名
debug: process.env.NODE_ENV !== 'production' // 是否开启调试模式
}) // 显示学员信息
router.get('/', async (ctx) => {
let result = await DB.find('user', {}); await ctx.render('index', {
list: result
});
}) // 增加学员
router.get('/add', async (ctx) => {
await ctx.render('add');
}) // 执行增加学员的操作
router.post('/doAdd', async (ctx) => {
// 获取表单提交的数据
// console.log(ctx.request.body); // { name: 'aaa', age: 'aa', sex: 'a' }
let data = await DB.insert('user', ctx.request.body);
// console.log(data); try {
if (data.result.ok) {
ctx.redirect('/');
}
} catch (err) {
console.log(err);
ctx.redirect('/add');
}
}) // 编辑学员
router.get('/edit', async (ctx) => {
// 通过 get 传过来的 id 来获取用户信息
let id = ctx.query.id;
// 获取用户信息
let data = await DB.find('user', { "_id": DB.getObjectId(id) });
console.log(data); await ctx.render('edit', {
list: data[0]
});
}) router.post('/doEdit', async (ctx) => {
// 获取用户信息
// console.log(ctx.request.body);
var id = ctx.request.body.id;
var username = ctx.request.body.username;
var age = ctx.request.body.age;
var sex = ctx.request.body.sex; let data = await DB.update('user', { "_id": DB.getObjectId(id) }, {
username, age, sex
}) try {
if (data.result.ok) {
ctx.redirect('/')
}
} catch (err) {
console.log(err);
ctx.redirect('/edit');
}
}) // 删除学员
router.get('/delete', async (ctx) => {
let id = ctx.query.id;
let data = await DB.remove('user', { "_id": DB.getObjectId(id) });
console.log(data); if (data) {
ctx.redirect('/');
}
}) app.use(router.routes());
app.use(router.allowedMethods()); app.listen(3000);

.

koa 基础(二十六)数据库 与 art-template 模板 联动 --- 编辑数据、删除数据的更多相关文章

  1. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  2. Java进阶专题(二十六) 数据库原理研究与优化

    前言 在一个大数据量的系统中,这些数据的存储.处理.搜索是一个非常棘手的问题. 比如存储问题:单台服务器的存储能力及数据处理能力都是有限的, 因此需要增加服务器, 搭建集群来存储海量数据. 读写性能问 ...

  3. koa 基础(十六)koa 中 session 的使用

    1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...

  4. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  5. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  6. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  7. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  8. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  9. Bootstrap<基础二十> 标签

    Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> ...

  10. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

随机推荐

  1. AL11新建目录、删除目录

    AL11可以进入SAP应用服务器中. 项目上需要和外围系统做接口 写文件到文件服务器上,让外围系统过来读取,但是为了减少SAP应用服务器的负担,需要一台独立的文件服务器共享目录到SAP应用服务器, 也 ...

  2. Troubleshooting: Cannot Run on an Android Device

    同事在他的开发环境中,在IDE中直接在手机上运行Android项目,结果出现这个错误,无法在手机上安装. 产生这个问题的原因,一般就是签名不对,这种情况,删除手机上装过的同名应用,就可以解决.当然,你 ...

  3. 经典i++和++i问题(附带运算符优先级问题)

    转自 https://blog.csdn.net/mustard1020/article/details/79617865 1.i++和++i的区别     (1)i++简单来说就是先用i的值来参加表 ...

  4. 在Windows server 2019 Core 版本上安装SQL2016

    安装系统后,通过网络等方式先把安装ISO的文件copy过来,虚拟机则用挂一个虚拟光驱即可,然后cd进入目录,执行以下命名即可安装核心服务了: Setup.exe /qs /ACTION=Install ...

  5. SDU&PDU

    SDU(service Data Unit):服务数据单元,又叫业务数据单元,是指定层的用户服务的数据集,传送到接收方的时候同一协议层时数据没有发生变化,即业务部分,然后发给下层之后,下层将其封装在P ...

  6. idea 下gradle创建springboot 项目

    InterlijIdea 开发环境下创建基于springBoot的项目. 环境 1.jdk1.5以上 2.interlijidea 15 以上 步骤 1.File –>new –>Proj ...

  7. 1.opencv_画图

    #导入工具包 import numpy as np import cv2 import matplotlib.pyplot as plt # 定义显示图片 def show(image): plt.i ...

  8. 内嵌tomcat快速入门

    1.依赖 <!--Java语言操作tomcat --> <dependency> <groupId>org.apache.tomcat.embed</grou ...

  9. oracle plsql登陆用户名密码都正确,拒绝登陆

    先通过sqlplus  或者 sql developer 或者其他用户登陆 然后更改 登陆不上的用户的密码  然后再用plsql登陆就可以了  然后还可以再把用户密码再改回来 也可以登陆了

  10. Poi导出Excle

    场景 准备金系统需要从数据库读取大量数据存放到List集合中(可能还会做逻辑上的处理),并生成一个Excle文件,下载到客户本地. 问题一:客户体验 如果导出的文件比较大,比如几十万条数据,同步导出页 ...