zoukankan      html  css  js  c++  java
  • 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 {
                 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>
    
  • 相关阅读:
    TCP/IP学习-链路层
    Linux下搭建Wordpress环境
    DiskMgr的限制项
    Win10系统Start Menu上的图标莫名消失
    powershell
    第一个页面的文本域中输入的值怎么在第二个页面中显示
    php 文本框里面显示数据库调出来的资料
    php代码
    php表单提交方法汇总
    php将SQL查询结果赋值给变量
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/13183510.html
Copyright © 2011-2022 走看看