koa+mongDb+arttemplat 实现一个增删改查

添加用户:跳转到添加页面(一个添加的表单)

编辑用户:跳转到编辑页面(跳转过去要携带所编辑用户的id,查询到所编辑的该用户信息,获取编辑后传过来的值修改数据库中的数据)

删除用户:获取所要删除的用户的 id,执行数据库的删除操作

添加页面:

编辑页面:

路由配置:

首页,需要查询数据库中的用户信息并渲染到页面上:

添加用户:直接获取添加的页面:

提交添加表单后,执行添加用户逻辑:获取添加表单传过来的值,再执行数据库添加操作,并判断是否添加成功,添加失败的错误处理等

编辑用户:先拿到所编辑的用户的id,查询到该用户的信息,将查询到的信息渲染到编辑页面上

需要注意的是,

① 获取用户的id,需要编辑页面中表单能传过来这个id,所以在编辑页面隐藏了一个用户ID的输入框,

② 传id时,通过 @ 将数据库中的 id 直接解析,否则传递过来的 id 会出现引号

③ 获取到传递过来的用户id,在数据库中不能直接通过这个id查询,查询会为空,因为数据库中的 id 的存储是 ObjectID,所以在 数据库操作的库中定义了一个 getObjectId( ) 的方法,用来将我们获取到的 id 转换为数据中的 ObjectID,再进行数据库查询操作

编辑表单提交后,获取编辑表单提交的修改后的用户信息,再执行数据库的编辑操作:

删除操作,在删除连接点击是将所要删除用户的 id 传过来,然后直接从数据库中删除:

最后,一个简单的对用户信息的增删改查就实现了,测试过程中也可以去查看数据中的信息是否有修改。

 app.js

const Koa = require('koa')
const app = new Koa()
const router = require('koa-router')()
const render = require('koa-art-template')
const Db = require('./db/db')
const path = require('path')
const bodyParser = require('koa-bodyparser')

//配置art-template
render(app,{
    root: path.join(__dirname, 'views'),
    extname: '.html',
    debug: process.env.NODE_ENV !== 'production'
})

//配置bodyParse获取提交数据
app.use(bodyParser());

//配置路由
router.get('/',async (ctx)=>{
    let userInfo=await Db.find('user',{})
    ctx.render('index',{userInfo})
})

//添加用户页面
router.get('/add', async (ctx) => {
    await ctx.render('add')
})
//添加逻辑
router.post('/doAdd', async (ctx) => {
    //console.log("提交数据是:", ctx.request.body) //{ name: '武松', age: '123', sex: '男' }
    let res = await Db.insert('user', ctx.request.body)
    //console.log(newUser)
    try {
        if (res.result.ok) { //添加用户成功,重定向到首页
            console.log("数据库添加用户成功")
            ctx.redirect('/')
        }
    } catch (error) { //添加用户失败,没有result,重定向到添加页面
        console.log("数据库添加用户失败")
        ctx.redirect('/add')
    }
    
})
//编辑用户页面
router.get('/edit', async (ctx) => {
    //通过get传过来的id来获取用户信息
    //console.log("编辑用户id:",ctx.query.id) //获取get传值
    /**
     * let res = await Db.find('user', { "_id": ctx.query.id })
     * console.log("所编辑的用户信息:", res) //[]
     */
    let res = await Db.find('user', { "_id": Db.getObjectId(ctx.query.id) })
    //console.log("所编辑的用户信息:", editUser) //[{ _id: 5eec5070b23b0bc30e706782, name: 'jack11', age: 16, sex: '女' }]
    await ctx.render('edit',{ //查询到所编辑用户的信息后渲染到页面上
        editUser:res[0]
    })
})
//编辑逻辑
router.post('/doEdit', async (ctx) => {
    //通过get传过来的用户id获取所编辑用户的信息
    //console.log("执行编辑操作获取所编辑用户信息:",ctx.request.body)
    let {id,name,age,sex} = ctx.request.body //获取到编辑后的信息,修改数据库中的信息
    let res = await Db.update('user',{"_id":Db.getObjectId(ctx.request.body.id)},{
        name,age,sex
    })
    try {
        if(res.result.ok){ //编辑用户成功,重定向到首页
            console.log("数据库编辑用户成功")
            ctx.redirect('/')
        }
    } catch (error) { //编辑用户失败
        console.log("数据库编辑用户失败")
        ctx.redirect('/edit')
    }
})
//执行删除逻辑
router.get('/doDelete', async (ctx) => {
    //console.log("所删除用户的id:",ctx.query.id)
    let res = await Db.delete('user',{"_id":Db.getObjectId(ctx.query.id)})
    try {
        if(res.result.ok){
            console.log("数据库删除数据成功")
            ctx.redirect('/')
        }
    } catch (error) {
        console.log("数据库删除数据失败")
    }
})


app.use(router.routes());   
app.use(router.allowedMethods());
app.listen(3000);

db.js

const {MongoClient} = require('mongodb')
const MongoDb = require('mongodb')
const Config = require('./config')

class Db{
    static getInstance(){
        if(!Db.instance){
            Db.instance=new Db()
        }
        return Db.instance
    }
    constructor(){
        this.dbClient=""
        this.connect()
    }
    //连接数据库
    connect(){
        return new  Promise((resolve,reject)=>{
            if(!this.dbClient){
                MongoClient.connect(Config.dbUrl, { useUnifiedTopology: true },(err,client)=>{
                    if(err){
                        console.log("连接数据库失败")
                        reject(err)
                    }
                    else{
                        console.log("连接数据库成功")
                        this.dbClient=client.db(Config.dbName)
                        resolve(this.dbClient)
                    }
                })
            }
            else{
                resolve(this.dbClient)
            }
        })
    }
    //查询数据
    find(collectionName,findData){
        return new Promise((resolve,reject)=>{
            this.connect().then(db=>{
               db.collection(collectionName).find(findData).toArray((err,result)=>{
                   if(err){
                       console.log("查询数据失败")
                       reject(err)
                   }
                   else{
                       console.log("查询数据成功")
                       resolve(result)
                   }
               })
            })
        })
    }
    //添加数据
    insert(collectionName,addData){
        return new Promise((resolve,reject)=>{
            this.connect().then(db=>{
                db.collection(collectionName).insertOne(addData, (err, result) => {
                    if (err) {
                        console.log("添加数据失败")
                        reject(err)
                    }
                    else {
                        console.log("添加数据成功")
                        resolve(result)
                    }
                })
            })
        })
    }
    //修改数据
    update(collecitonName, oldData,newData) {
        return new Promise((resolve, reject) => {
            this.connect().then(db => {
                db.collection(collecitonName).update(oldData,{$set:newData},(err,result)=>{
                    if(err){
                        console.log("修改数据失败")
                        reject(err)
                    }
                    else{
                        console.log("修改数据成功")
                        resolve(result)
                    }
                })
            })
        })
    }
    //删除数据
    delete(collecitonName,deleteData){
        return new Promise ((resolve,reject)=>{
            this.connect().then(db=>{
                db.collection(collecitonName).deleteOne(deleteData,(err,result)=>{
                    if(err){
                        console.log("删除数据失败")
                        reject(err)
                    }
                    else{
                        console.log("删除数据成功")
                        resolve(result)
                    }
                })
            })
        })
    }
    //将id装换为数据库中的ObjectID进行查询操作
    getObjectId(id){
        return new MongoDb.ObjectID(id)
    }
}

module.exports=Db.getInstance()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .table {
            width: 80%;
            border-collapse: collapse;
            margin-top:20px;
        }   
        .table td,
        .table th {
            border: 1px solid #ccc;
            text-align: center;
        }
    </style>
</head>
<body>
    <h3>index.html页面</h3>
    <a href="/add">添加用户</a>
    <table class="table">
        <tr>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>操作</th>
        </tr>
        {{each userInfo}}
        <tr>
            <td>{{$value.name}}</td>
            <td>{{$value.age}}</td>
            <td>{{$value.sex}}</td>
            <td>
                <a href="/edit?id={{@$value._id}}">编辑</a>  
                <a href="/doDelete?id={{@$value._id}}">删除</a>
            </td>
        </tr>
        {{/each}}
    </table>
</body>
</html>

add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>add.html页面</h3>
    <h3>添加用户</h3>
    <form action="/doAdd" method="post">
        用户名:<input type="text" name="name"> <br>
        年龄:<input type="text" name="age"><br>
        性别:<input type="text" name="sex"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h3>edit.html页面</h3>
    <h3>编辑用户</h3>
    <form action="/doEdit" method="post">
        用户ID:<input type="hidden" name="id" value={{@editUser._id}}>
        用户名:<input type="text" name="name" value={{editUser.name}}> <br>
        年龄:<input type="text" name="age" value={{editUser.age}}><br>
        性别:<input type="text" name="sex" value={{editUser.sex}}><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

 

posted @ 2021-01-30 18:54  shanlu  阅读(88)  评论(0编辑  收藏  举报