Egg之插件

本章前沿:最近更新的比较频繁,实际上是在还之前欠下的章节,react和ts板块,还是会继续更新的,之所以最近在写egg的东西,是因为,我觉得这玩意还不错,很感兴趣,所以我就记录一下我跟着大佬学习的过程,当然啦,目前为止都是基础内容,没有涉及到更深的,而且我之前也说过了,你会java或者php的建议就不要看了,没必要。

回到本章内容,这一章,主要讲的是关于用于egg的一些插件。

一、egg-view-nunjucks (view的模板渲染)

使用模板引擎
1、npm install --save egg-view-nunjucks
2、在plugin.js文件中引入插件,在config.default.js中配置插件
3、在view目录中创建模板文件,并在控制器中使用render方法渲染模板

下载完插件,我们必须进行一些模板的配置
在plugin.js里面:

nunjucks:{
     enable:true,
     package:'egg-view-nunjucks'
}

在config.default.js里面:

config.view = {
     defaultViewEngine:'nunjucks'
}

配置好了这些呢,可以写个水果列表的demo来看下效果,首先我们在app文件夹下面创建一个view文件夹,在view文件夹下面创建index.html。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
 <!-- nunjucks模板写法 -->
  <h1>水果列表</h1>
  <ul>
    {% for item in fruits %}
    <li>{{item}}</li>
    {% endfor %}
  </ul>
</body>

</html>

html文件写完,此时我们需要引用这个模板,才能显示,还需要传入我们定义的fruits数组,我们只需要再去控制器里面写上await ctx.render("index", { fruits: ["香蕉", "苹果", "西瓜"] })

'use strict'; //严格模式

const Controller = require('egg').Controller; //Controller类

class HomeController extends Controller { //定义一个新的类去继承Controller类
  async index() {
    const {
      ctx
    } = this;
    await ctx.render("index", {
      fruits: ["香蕉", "苹果", "西瓜"]
    })
  }
}

module.exports = HomeController; //暴露HomeController

访问页面:


index.html

ps:强调一下,不要在public文件夹写,一定要在app下的view文件夹下创建html文件。

二、egg-cors (前后端分离跨域请求)

使用Egg-cors
1、npm install --save egg-cors
2、在plugin.js文件中引入插件
3、在config.default.js文件中配置egg-cors插件

我们先不配置这个插件,我们先去启动一个vue的前端项目,然后去调我们的egg服务器上的接口。
vue项目怎么创建这里就不说了,我直接上代码,因为只是一个demo,所以就直接在app.vue里面写了

<template>
  <div>
    <h1>{{message}}</h1>
  </div>
</template>

<script>

import axios from 'axios'
export default {
  data () {
    return {
      message: 'hello world'
    }
  },
  created () {
    axios.get("http://127.0.0.1:7001/data").then((res) => {
      this.message = res.data
    })
  }

}
</script>

<style>
</style>

此时我们进入页面去调去接口,接口是不通的,因为我们egg的后台服务还没写


还未开通服务的接口界面

接下来,我们去写egg的代码。首先在router.js里面写上

  router.get('/data', controller.home.getData)

在home.js里面加上

 async getData() {
    this.ctx.body = "你好世界"
  }

接着我们再回到前端页面上,会看到接口还是不通,接下来就要去配置插件了
同样的配置plugin.js:

cors:{
     enable:true,
     package:'egg-cors'
}

配置config.default.js

config.cors = {
     origin:"*",
     allowMethods:'GET,HEAD,PUT,POST,DELETE,PATCH'
}

配置完,我们重新启动项目,刷新前端页面,会发现,接口就已经通了,页面也拿到了接口返回的值。


正确的返回

三、简易的学生系统(增删)

因为考虑到再做水果列表的例子,大家会审美疲劳了,所以干脆就做晓舟老师视频最后布置的任务
要求:
1、使用Vue + ElementUI实现前端功能
2、实现学生列表的查看、添加、删除功能。
3、学生字段包括,ID、姓名、成绩

列表成品图
新增学生成品图
删除成品图

大家可以先思考一下怎么做,说一下思路,前端页面的逻辑我想可以不用赘述了,咱就说,这个后台的逻辑,三个方法,一个展示列表,一个新增学生,还有一个删除学生,用到我们之前说的,egg封装的通用接口,index,create,destroy分别来实现,这些功能。

成品代码如下,仅供参考:

//egg   router.js
'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const {
    router,
    controller
  } = app;
  router.get('/', controller.home.index); //默认页
  router.resources('student', '/student', controller.student) //学生管理系统
//egg     student.js
'use strict'; //严格模式

const Controller = require('egg').Controller; //Controller类
let studentList = [{
  id: '1',
  name: '张三',
  achievement: 100
}, {
  id: '2',
  name: '李四',
  achievement: 90
}, {
  id: '3',
  name: '炮灰甲',
  achievement: 60
}]
class StudentController extends Controller {

  //学生列表
  async index() {
    this.ctx.body = studentList
  }

  //新增学生
  async create() {
    const student = this.ctx.request.body.student
    studentList.push(student)
    this.ctx.body = '添加成功'
  }

  //删除学生
  async destroy() {
    let id = this.ctx.params.id
    studentList = studentList.filter((item) => item.id !== id)
    this.ctx.body = '删除成功'
  }

}
module.exports = StudentController
//app.vue
<template>
  <div>
    <el-button type="text"
               @click="addStudent">添加学生</el-button>
    <el-table :data="studentList"
              :border="true"
              style="width: 50%">
      <el-table-column prop="id"
                       label="ID">
      </el-table-column>
      <el-table-column prop="name"
                       label="姓名">
      </el-table-column>
      <el-table-column prop="achievement"
                       label="成绩">
      </el-table-column>
      <el-table-column fixed="right"
                       label="操作"
                       width="100">
        <template slot-scope="scope">
          <el-button @click="deleteClick(scope.row)"
                     type="text"
                     size="small">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog title="新增学生"
               :visible.sync="dialogVisible"
               width="30%">
      <el-form ref="form"
               :model="form"
               label-width="80px">
        <el-form-item label="Id">
          <el-input v-model="form.id"></el-input>
        </el-form-item>
        <el-form-item label="姓名">
          <el-input v-model="form.name"></el-input>
        </el-form-item>
        <el-form-item label="成绩">
          <el-input v-model="form.achievement"></el-input>
        </el-form-item>
      </el-form>

      <span slot="footer"
            class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary"
                   @click="doSure">确 定</el-button>
      </span>
    </el-dialog>
  </div>

</template>

<script>

import axios from 'axios'
export default {
  data () {
    return {
      studentList: [],
      dialogVisible: false,
      form: {}
    }
  },
  created () {
    this.getList()
  },
  methods: {
    //学生列表
    getList () {
      axios.get("http://127.0.0.1:7001/student").then((res) => {
        this.studentList = res.data
      })
    },
    //添加学生弹窗
    addStudent () {
      this.dialogVisible = true
    },
    //添加学生
    doSure () {
      this.dialogVisible = false
      axios.post("http://127.0.0.1:7001/student", { student: this.form }).then(() => {
        this.$message.success('添加成功');
        this.getList()
      })
    },
    //删除学生
    deleteClick (item) {
      this.$confirm('此操作将永久删除该学生, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        axios.delete(`http://127.0.0.1:7001/student/${item.id}`).then(() => {
          this.$message.success('删除成功');
          this.getList()
        })
      })

    }

  }

}
</script>

<style>
</style>

好了,那么本章的内容就到此结束了,如果对这个demo还有问题的小伙伴可以留言,我看到了会回复,很感谢大家的观看。推荐一首汪苏泷最近上的新歌吧《眼泪落下之前》

传送门:
1、nunjucks中文文档:https://nunjucks.bootcss.com/
2、第一章 Egg框架概述://www.greatytc.com/p/bfdaecb5a18c
3、第二章 路由与控制器://www.greatytc.com/p/62edeb088d76

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • 前言 egg.js是一个渐进式的nodejs服务端框架,它奉行『约定优于配置』,按照一套统一的约定[https:/...
    0月阅读 1,002评论 0 1
  • 1.为什么要插件 我们在使用 Koa 中间件过程中发现了下面一些问题: 中间件加载其实是有先后顺序的,但是中间件自...
    朝朝_c53e阅读 688评论 0 0
  • 代码地址 https://github.com/MoceptWeb/egg-passport-portal看之前确...
    mocept阅读 3,388评论 1 0
  • Egg是什么? 由阿里巴巴团队开源的一套基于koa的应用框架,已经在集团内部服务了大量的nodejs系统。 Egg...
    强某某阅读 805评论 0 2
  • 1.编码规范 1.1 编码格式与语法 项目默认编码格式统一为UTF-8格式,语法采用ES6+语法 1.2 代码注释...
    中v中阅读 2,349评论 0 3