美文网首页vue系列
也许是最简单的node egg入门demo

也许是最简单的node egg入门demo

作者: litielongxx | 来源:发表于2018-03-25 16:50 被阅读0次

    前言:

    对于node能实现的后台比较感兴趣,大致看了下node和egg文档,了解了下基本的sql语句开始学习node了,发现教程的确比较少,记录分享一个egg的入门demo。

    准备工作

    egg-init

    安装完node,npm,egg-init,egg-bin后使用egg-init egg-example --type=simple快速搭建项目,然后配置所需要的package.json的文件。页面渲染使用文档中的 Nunjucks ,访问数据库采用 egg-mysql

    package.json:

    在config/config/plugin.js下开启插件,config/config.default.js下配置关联和数据库信息。

    // config/config/plugin.js
    'use strict';
    
    exports.nunjucks = {
    
        enable: true,
    
        package: 'egg-view-nunjucks'
    
    };
    
    exports.mysql = {
    
        enable: true,
    
        package: 'egg-mysql',
    
    };
    
    config/config.default.js
    'use strict';
    
    module.exports = appInfo => {
      const config = {
        // 渲染模板
        view:{
          defaultViewEngine:'nunjucks',
          mapping:{
            '.tpl':'nunjucks',
          }
        },
        mysql: {
          client: {
              // ip地址
              host: 'localhost',
              // 端口
              port: '3306',
              // 用户名
              user: 'root',
              // 密码
              password: '123456',
              // 数据库名
              database: 'test',   
          },
          app: true,
          agent: false,
      }
    };
    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name + '_1521956862800_7591';
    // add your config here
    config.middleware = [];
      return config;
    };
    

    创建mysql模拟数据表

    安装下载mysql,打开mysqlworkbench,初次打开设置密码123456。


    新建数据库 新建表注意id自增长,int类型 上传成功

    测试预览

    npm run dev测试查看,默认127.0.0.1:7001端口。

    app下新建view文件夹,新建.tpl文件模拟页面绑定ajax事件

    app/view/index.tpl
    <html>
      <head>
        <title>Egg Demo</title>
        <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.css" rel="stylesheet">
      </head>
      <body class="container">
        <input class="form-control" type="text"><br />
        <button class="btn btn-success">上传到数据库</button>
        <button class="btn btn-success">删除</button>
        <button class="btn btn-success">查询对应</button>
        <button class="btn btn-success">更新对应</button>
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
        <script>
          $("button:eq(0)").click(function(){
            var data= $("input").val();
            if(data){
              $.ajax({
              type:'get',
              url:'/add/'+data,
              success:function(data){
                  if(data == 'success'){
                      alert('上传成功!');
                  }
                }
              });
            }
          });
    
          $('button:eq(1)').on('click',function(){
            var data= $("input").val();
             if(data){
              $.ajax({
              type:'get',
              url:'/del/'+data,
              success:function(data){
                  if(data == 'success'){
                      alert('删除成功!');
                  }
                }
              });
            }
          })
    
          //reach
          $('button:eq(2)').on('click',function(){
            var data= $("input").val();
             if(data){
              $.ajax({
              type:'get',
              url:'/get/'+data,
              success:function(data){
                  if(data == 'success'){
                      alert('查询成功!');
                  }
                }
              });
            }
          })
    
          $('button:eq(3)').on('click',function(){
            var data= $("input").val();
             if(data){
              $.ajax({
              type:'get',
              url:'/update/'+data,
              success:function(data){
                  if(data == 'success'){
                      alert('更新成功!');
                  }
                }
              });
            }
          })
        </script>
      </body>
    </html>
    
    简易请求页面

    编写controller和配置router

    controller控制器函数

    //* 同等async yeild同等于函数中的return
    module.exports = app => {
      class HomeController extends app.Controller {
        * index() {
          yield this.ctx.render('index.tpl');
        }
        // 新增 同理构建基于router对应的控制器
        * add() {
          const data = this.ctx.params.data;
          const result = yield this.service.mysql.add(data);
          this.ctx.body =result;
        }
    
        *del() {
          const data=this.ctx.params.data;
          const result = yield this.service.mysql.del(data);
          this.ctx.body = result;
        }
        
        // 查询
        *reach() {
          const data=this.ctx.params.data;
          const result=yield this.service.mysql.reach(data);
          this.ctx.body=result;
        }
    
        *update() {
          const data=this.ctx.params.data;
          const result=yield this.service.mysql.update(data);
          this.ctx.body=result;
        }
    
      }
      return HomeController;
    };
    

    router路由映射,其请求接口根据路径判断

    
    /**
     * @param {Egg.Application} app - egg application
     */
    module.exports = app => {
      app.get('/', 'home.index');
      app.get('/add/:data','home.add');
      app.get('/del/:data','home.del');
      app.get('/get/:data','home.reach');
      app.get('/update/:data','home.update');
    
    };
    
    router对应请求地址的参数名和控制器

    app下新建service,中间层处理mysql.js

    module.exports=app=>{
        // 接受请求的参数,查询服务器,返回对应信息
       return class User extends app.Service{
            *add() {}
            *del() {}
            // ...
    }
    

    新增数据
    this.app.mysql.insert('test',{'name'})

    *add() {
                const data=this.ctx.params.data;
                // 表格名称test,数据库名称在config/config.default.js下已定义
                const result=yield this.app.mysql.insert('test',{
                    // 时间优化下
                    'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'')  ,
                    'name':data
                });
                if(result.serverStatus == 2){
                    return 'success';
               }else{
                   return "fail";
               }
            }
    
    上传a1到测试表 刷新查看

    删除数据
    this.app.mysql.delete('test',{name:data}

                const data = this.ctx.params.data;
                const result=yield this.app.mysql.delete('test',{
                    name:data
                })
                console.log('result.affectedRows  '+result.affectedRows)
                if(result.affectedRows==1) {
                    return result
                }else{
                    return false
                }
            }
    

    查询数据
    单条查询
    this.app.mysql.get('test',{ name:'a1'})
    条件查询
    this.app.mysql.select('sea_data')

     this.app.mysql.select('sea_data',{
                    where: {v_name:data }, // WHERE 条件
                    columns: ['v_name','v_pic','v_id'], // 要查询的表字段
                    // orders: [], // 排序方式
                    limit:5, 
                    offset: 0, // 数据偏移量
      })
    
    *reach() {
                const data = this.ctx.params.data;
                // get单条查询,select多条查询和全部 0这里表示查全部数据
                const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
                    where: {v_name:data }, // WHERE 条件
                    columns: ['v_name','v_pic','v_id'], // 要查询的表字段
                    // orders: [], // 排序方式
                    limit:5, 
                    offset: 0, // 数据偏移量
                })
                if(result) {
                    return result;
                }else{
                    return {
                        code:'1001',
                        data:'false'
                    }
                }
            }
    

    更新数据
    this.app.mysql.update('test',{ id:'1', 'name':'ceshi'})

    *update() {
                const data = this.ctx.params.data;
                console.log('更新数据'+data)
                const result=yield this.app.mysql.update('test',{
                    id:'1',
                    'name':'ceshi'
                })
             
                if(result) {
                    return result;
                }else{
                    return {
                        code:'1001',
                        data:'false'
                    }
                }
            }
    

    service/service.js

    module.exports=app=>{
        // 接受请求的参数,查询服务器,返回对应信息
        return class User extends app.Service{
            *add() {
                const data=this.ctx.params.data;
                // 表格名称test,数据库名称在config/config.default.js下已定义
                const result=yield this.app.mysql.insert('test',{
                    // 时间优化下
                    'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'')  ,
                    'name':data
                });
                if(result.serverStatus == 2){
                    return 'success';
               }else{
                   return "fail";
               }
            }
    
            *del() {
                const data = this.ctx.params.data;
                const result=yield this.app.mysql.delete('test',{
                    name:data
                })
                console.log('result.affectedRows  '+result.affectedRows)
                if(result.affectedRows==1) {
                    return result
                }else{
                    return false
                }
            }
    
            *reach() {
                const data = this.ctx.params.data;
                // get单条查询,select多条查询和全部 0这里表示查全部数据
                const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
                    where: {v_name:data }, // WHERE 条件
                    columns: ['v_name','v_pic','v_id'], // 要查询的表字段
                    // orders: [], // 排序方式
                    limit:5, 
                    offset: 0, // 数据偏移量
                })
                if(result) {
                    return result;
                }else{
                    return {
                        code:'1001',
                        data:'false'
                    }
                }
            }
            
            *update() {
                const data = this.ctx.params.data;
                console.log('更新数据'+data)
                const result=yield this.app.mysql.update('test',{
                    id:'1',
                    'name':'ceshi'
                })
             
                if(result) {
                    return result;
                }else{
                    return {
                        code:'1001',
                        data:'false'
                    }
                }
            }
          
        }
    }
    

    相关文章

      网友评论

        本文标题:也许是最简单的node egg入门demo

        本文链接:https://www.haomeiwen.com/subject/ipnhcftx.html