2020-12-17

<meta charset="utf-8">

1.安裝 nodejs

2.安裝 git

3.下載 vue-element-admin

> 建議

> 本項目的定位是后臺集成方案割以,不太適合當基礎模板來進行二次開發(fā)。因為本項目集成了很多你可能用不到的功能奕坟,會造成不少的代碼冗余愕撰。如果你的項目不關注這方面的問題扰路,也可以直接基于它進行二次開發(fā)。

>

> * 集成方案: vue-element-admin

> * 基礎模板: vue-admin-template

> * 桌面終端: electron-vue-admin

> * Typescript 版: vue-typescript-admin-template (鳴謝: @Armour)

> * Others: awesome-project


# clone the project

git clone https://github.com/PanJiaChen/vue-admin-template.git

# enter the project directory

cd vue-admin-template

# install dependency

npm install

# develop

npm run dev

image.png
1608169678(1).png

刪除多余界面 router/index


import Vue from 'vue'

import Router from 'vue-router'

Vue.use(Router)

/* Layout */

import Layout from '@/layout'

/**

* Note: sub-menu only appear when route children.length &gt;= 1

* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html

*

* hidden: true                  if set true, item will not show in the sidebar(default is false)

* alwaysShow: true              if set true, will always show the root menu

*                                if not set alwaysShow, when item has more than one children route,

*                                it will becomes nested mode, otherwise not show the root menu

* redirect: noRedirect          if set noRedirect will no redirect in the breadcrumb

* name:'router-name'            the name is used by <keep-alive> (must set!!!)

* meta : {

    roles: ['admin','editor']    control the page roles (you can set multiple roles)

    title: 'title'              the name show in sidebar and breadcrumb (recommend set)

    icon: 'svg-name'            the icon show in the sidebar

    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)

    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set

  }

*/

/**

* constantRoutes

* a base page that does not have permission requirements

* all roles can be accessed

*/

export const constantRoutes = [

  {

    path: '/login',

    component: () =&gt; import('@/views/login/index'),

    hidden: true

  },

  {

    path: '/404',

    component: () =&gt; import('@/views/404'),

    hidden: true

  },

  {

    path: '/',

    component: Layout,

    redirect: '/dashboard',

    children: [{

      path: 'dashboard',

      name: 'Dashboard',

      component: () =&gt; import('@/views/dashboard/index'),

      meta: { title: 'Dashboard', icon: 'dashboard' }

    }]

  },

  // 404 page must be placed at the end !!!

  { path: '*', redirect: '/404', hidden: true }

]

const createRouter = () =&gt; new Router({

  // mode: 'history', // require service support

  scrollBehavior: () =&gt; ({ y: 0 }),

  routes: constantRoutes

})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465

export function resetRouter() {

  const newRouter = createRouter()

  router.matcher = newRouter.matcher // reset router

}

export default router

安裝ES6語法插件


npm install --save es6-promise

http.js


import Vue from 'vue';

import Axios from 'axios';

import {Promise} from 'es6-promise';

import {MessageBox, Message} from 'element-ui'

Axios.defaults.timeout = 30000; // 1分鐘

Axios.defaults.baseURL = '';

Axios.interceptors.request.use(function (config) {

  // Do something before request is sent

  //change method for get

  /*if(process.env.NODE_ENV == 'development'){

      config['method'] = 'GET';

      console.log(config)

  }*/

  if (config['MSG']) {

    // Vue.prototype.$showLoading(config['MSG']);

  } else {

    // Vue.prototype.$showLoading();

  }

  // if(user.state.token){//用戶登錄時每次請求將token放入請求頭中

  //  config.headers["token"] = user.state.token;

  // }

  if (config['Content-Type'] === 'application/x-www-form-urlencoded;') {//默認發(fā)application/json請求,如果application/x-www-form-urlencoded;需要使用transformRequest對參數(shù)進行處理

    /*config['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';*/

    config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

    config['transformRequest'] = function (obj) {

      var str = [];

      for (var p in obj)

        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));

      return str.join("&amp;")

    };

  }

  //config.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

  return config;

}, function (error) {

  // Do something with request error

  // Vue.$vux.loading.hide()

  return Promise.reject(error);

});

Axios.interceptors.response.use(

  response =&gt; {

    // Vue.$vux.loading.hide();

    return response.data;

  },

  error =&gt; {

    // Vue.$vux.loading.hide();

    if (error.response) {

      switch (error.response.status) {

        case 404:

          Message({

            message: '' || 'Error',

            type: 'error',

            duration: 5 * 1000

          })

          break;

        default:

          Message({

            message: '' || 'Error',

            type: 'error',

            duration: 5 * 1000

          })

      }

    } else if (error instanceof Error) {

      console.error(error);

    } else {

      Message({

        message: '' || 'Error',

        type: 'error',

        duration: 5 * 1000

      })

    }

    return Promise.reject(error.response);

  });

export default Vue.prototype.$http = Axios;

vue.config.js


'use strict'

const path = require('path')

const defaultSettings = require('./src/settings.js')

function resolve(dir) {

  return path.join(__dirname, dir)

}

const name = defaultSettings.title || 'vue Admin Template' // page title

// If your port is set to 80,

// use administrator privileges to execute the command line.

// For example, Mac: sudo npm run

// You can change the port by the following methods:

// port = 9528 npm run dev OR npm run dev --port = 9528

const port = process.env.port || process.env.npm_config_port || 9528 // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/

module.exports = {

  /**

  * You will need to set publicPath if you plan to deploy your site under a sub path,

  * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,

  * then publicPath should be set to "/bar/".

  * In most cases please use '/' !!!

  * Detail: https://cli.vuejs.org/config/#publicpath

  */

  publicPath: '/',

  outputDir: 'dist',

  assetsDir: 'static',

  lintOnSave: process.env.NODE_ENV === 'development',

  productionSourceMap: false,

  devServer: {

    port: port,

    open: true,

    overlay: {

      warnings: false,

      errors: true

    },

    proxy: {

      // change xxx-api/login =&gt; mock/login

      // detail: https://cli.vuejs.org/config/#devserver-proxy

      [process.env.VUE_APP_BASE_API]: {

        target: `http://127.0.0.1:${port}/mock`,

        changeOrigin: true,

        pathRewrite: {

          ['^' + process.env.VUE_APP_BASE_API]: ''

        }

      },

      ['/api']: {

        target: `http://127.0.0.1:3000`,

        changeOrigin: true,

        pathRewrite: {

          ['^' + '/api']: ''

        }

      }

    },

    after: require('./mock/mock-server.js')

  },

  configureWebpack: {

    // provide the app's title in webpack's name field, so that

    // it can be accessed in index.html to inject the correct title.

    name: name,

    resolve: {

      alias: {

        '@': resolve('src')

      }

    }

  },

  chainWebpack(config) {

    config.plugins.delete('preload') // TODO: need test

    config.plugins.delete('prefetch') // TODO: need test

    // set svg-sprite-loader

    config.module

      .rule('svg')

      .exclude.add(resolve('src/icons'))

      .end()

    config.module

      .rule('icons')

      .test(/\.svg$/)

      .include.add(resolve('src/icons'))

      .end()

      .use('svg-sprite-loader')

      .loader('svg-sprite-loader')

      .options({

        symbolId: 'icon-[name]'

      })

      .end()

    // set preserveWhitespace

    config.module

      .rule('vue')

      .use('vue-loader')

      .loader('vue-loader')

      .tap(options =&gt; {

        options.compilerOptions.preserveWhitespace = true

        return options

      })

      .end()

    config

    // https://webpack.js.org/configuration/devtool/#development

      .when(process.env.NODE_ENV === 'development',

        config =&gt; config.devtool('cheap-source-map')

      )

    config

      .when(process.env.NODE_ENV !== 'development',

        config =&gt; {

          config

            .plugin('ScriptExtHtmlWebpackPlugin')

            .after('html')

            .use('script-ext-html-webpack-plugin', [{

            // `runtime` must same as runtimeChunk name. default is `runtime`

              inline: /runtime\..*\.js$/

            }])

            .end()

          config

            .optimization.splitChunks({

              chunks: 'all',

              cacheGroups: {

                libs: {

                  name: 'chunk-libs',

                  test: /[\\/]node_modules[\\/]/,

                  priority: 10,

                  chunks: 'initial' // only package third parties that are initially dependent

                },

                elementUI: {

                  name: 'chunk-elementUI', // split elementUI into a single package

                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app

                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm

                },

                commons: {

                  name: 'chunk-commons',

                  test: resolve('src/components'), // can customize your rules

                  minChunks: 3, //  minimum common number

                  priority: 5,

                  reuseExistingChunk: true

                }

              }

            })

          config.optimization.runtimeChunk('single')

        }

      )

  }

}

index.vue


<template>

  <div class="dashboard-container">

    歡迎

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'Dashboard',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    mounted(){

      this.$http.get('/api/users/add').then(res => {

        console.log('this.panels', res)

      })

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

全局安裝koa-generator,執(zhí)行下面命令


npm install -g koa-generator

.構建koa2項目代碼如下


koa2 projectName

構建成功信息


D:\project&gt;koa2 projectName

  create : projectName

  create : projectName/package.json

  create : projectName/app.js

  create : projectName/public

  create : projectName/public/images

  create : projectName/routes

  create : projectName/routes/index.js

  create : projectName/routes/users.js

  create : projectName/views

  create : projectName/views/index.pug

  create : projectName/views/layout.pug

  create : projectName/views/error.pug

  create : projectName/public/stylesheets

  create : projectName/public/stylesheets/style.css

  create : projectName/bin

  create : projectName/bin/www

  install dependencies:

    &gt; cd projectName &amp;&amp; npm install

  run the app:

    &gt; SET DEBUG=koa* &amp; npm start projectName

  create : projectName/public/javascripts

D:\project>

初始化后臺項目插件窑邦,命令屬下:


cd projectName

npm install


項目試運行

npm run dev


在瀏覽器打開地址:

[http://localhost:3000/](https://links.jianshu.com/go?to=http%3A%2F%2Flocalhost%3A3000%2F)

出現(xiàn)koa2的歡迎界面就代表成功了

安裝mongoose

npm install mongoose --save

config.js


module.exports = {

    // dbs: 'mongodb://139.159.253.110:27017/test1'

    dbs: 'mongodb+srv://zrc46hao:zrc46hao@cluster0-7d5kk.mongodb.net/test?retryWrites=true&amp;w=majority'

}

app.js


const Koa = require('koa')

const app = new Koa()

const views = require('koa-views')

const json = require('koa-json')

const onerror = require('koa-onerror')

const bodyparser = require('koa-bodyparser')

const logger = require('koa-logger')

const index = require('./routes/index')

const users = require('./routes/users')

const mongoose = require('mongoose')

const dbconfig = require('./db/config')

mongoose.connect(dbconfig.dbs, {useNewUrlParser: true,useUnifiedTopology: true})

const db = mongoose.connection

db.on('error', console.error.bind(console, 'connection error:'));

db.once('open', function() {

  console.log('mongoose 連接成功')

});

// error handler

onerror(app)

// middlewares

app.use(bodyparser({

  enableTypes:['json', 'form', 'text']

}))

app.use(json())

app.use(logger())

app.use(require('koa-static')(__dirname + '/public'))

app.use(views(__dirname + '/views', {

  extension: 'pug'

}))

// logger

app.use(async (ctx, next) =&gt; {

  const start = new Date()

  await next()

  const ms = new Date() - start

  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)

})

// routes

app.use(index.routes(), index.allowedMethods())

app.use(users.routes(), users.allowedMethods())

// error-handling

app.on('error', (err, ctx) =&gt; {

  console.error('server error', err, ctx)

});

module.exports = app

// error handler

onerror(app)

// middlewares

app.use(bodyparser({

  enableTypes:['json', 'form', 'text']

}))

app.use(json())

app.use(logger())

app.use(require('koa-static')(__dirname + '/public'))

app.use(views(__dirname + '/views', {

  extension: 'pug'

}))

// logger

app.use(async (ctx, next) =&gt; {

  const start = new Date()

  await next()

  const ms = new Date() - start

  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)

})

// routes

app.use(index.routes(), index.allowedMethods())

app.use(users.routes(), users.allowedMethods())

// error-handling

app.on('error', (err, ctx) =&gt; {

  console.error('server error', err, ctx)

});

module.exports = app

user.js


const router = require('koa-router')()

const User = require('../db/models/user')

router.prefix('/users')

router.get('/add', function (ctx, next) {

    ctx.body = 'this is a users/bar response'

})

router.get('/', function (ctx, next) {

  ctx.body = 'this is a users response!'

})

router.get('/bar', function (ctx, next) {

  ctx.body = 'this is a users/bar response'

})

module.exports = router

啟動


npm run dev

效果

image.png

打開projectName文件噪舀,在models目錄下創(chuàng)建school.js文件魁淳,接著文件操作:


const mongoose = require('mongoose')

const feld={

    name: String,

    //人物標簽

    where:String,

    leixing: String

}

//自動添加更新時間創(chuàng)建時間:

let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

module.exports= mongoose.model('School',personSchema)

找到projectName下的routes目錄:


const router = require('koa-router')()

//建立模塊,require(“../db/models/文件名”)

let Model = require("../db/models/school");

router.prefix('/school')

router.get('/', function (ctx, next) {

    ctx.body = 'this is a users response!'

})

//數(shù)據(jù)庫增刪改查

router.post('/add', async function (ctx, next) {

    console.log(ctx.request.body)

    let model = new Model(ctx.request.body);

    model = await model.save();

    console.log('user',model)

    ctx.body = model

})

router.post('/find', async function (ctx, next) {

    let models = await Model.

    find({})

    ctx.body = models

})

router.post('/get', async function (ctx, next) {

    // let users = await User.

    // find({})

    console.log(ctx.request.body)

    let model = await Model.find(ctx.request.body)

    console.log(model)

    ctx.body = model

})

router.post('/update', async function (ctx, next) {

    console.log(ctx.request.body)

    let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);

    ctx.body = pbj

})

router.post('/delete', async function (ctx, next) {

    console.log(ctx.request.body)

    await Model.remove({ _id: ctx.request.body._id });

    ctx.body = 'shibai '

})

module.exports = router

在app.js中掛載路由:


const school = require('./routes/school')

app.use(school.routes(), school.allowedMethods())

二与倡、前臺三步驟:

打開vue-admin-template-master文件界逛,在src/views目錄下創(chuàng)建一個school模塊:

并在school目錄下創(chuàng)建vue文件。


<template>

  <div class="dashboard-container">

    <el-form ref="form" :model="form" label-width="80px">

      <el-form-item label="學校名稱">

        <el-input v-model="form.name"></el-input>

      </el-form-item>

      <el-form-item label="位置">

        <el-input v-model="form.where"></el-input>

      </el-form-item>

      <el-form-item label="類型">

        <el-input v-model="form.leixing"></el-input>

      </el-form-item>

      <el-form-item>

        <el-button type="primary">立即創(chuàng)建</el-button>

        <el-button>取消</el-button>

      </el-form-item>

    </el-form>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'school',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data(){

      return{

        apiModel:'school',

        form:{}

      }

    },

    methods:{

      onSubmit(){

        console.log('222:', 222)

        if(this.form._id){

          this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }else

        {

          this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }

      }

    },

    mounted() {

      if(this.$route.query._id){

        this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {

          if(res&&res.length>0){

            this.form = res[0]

          }

        })

      }

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

效果

image.png
image.png

<template>

  <div class="dashboard-container">

    <el-table :data="users" style="width: 100%" :row-class-name="tableRowClassName">

<!--      <el-table-column-->

<!--        prop="_id"-->

<!--        label="學校_id"-->

<!--        width="180">-->

<!--      </el-table-column>-->

      <el-table-column prop="name" label="學校名稱" width="180">

      </el-table-column>

      <el-table-column prop="where" label="位置" width="180">

      </el-table-column>

      <el-table-column prop="leixing" label="類型">

      </el-table-column>

      <el-table-column label="操作">

        <template slot-scope="scope">

          <el-button size="mini" scope.row>編輯

          </el-button>

          <el-button size="mini" type="danger" scope.row>刪除

          </el-button>

        </template>

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'school',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data() {

      return {

        apiModel:'school',

        users: {}

      }

    },

    methods: {

      onSubmit() {

        console.log(123434)

      },

      handleEdit(index, item) {

        this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })

      },

      handleDelete(index, item) {

        this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {

          console.log('res:', res)

          this.findUser()

        })

      },

      findUser(){

        this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {

          console.log('res:', res)

          this.users = res

        })

      }

    },

    mounted() {

      this.findUser()

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

3.在index.js中添加路由:


{

    path: '/school',

    component: Layout,

    meta: { title: '學校管理', icon: 'example' },

    redirect: 'school',

    children: [{

      path: 'school',

      name: 'school',

      component: () =&gt; import('@/views/school'),

      meta: { title: '學校管理', icon: 'school' }

    },

      {

        path: 'editor',

        name: 'editor',

        component: () =&gt; import('@/views/school/editor'),

        meta: { title: '添加學校', icon: 'school' }

      }]

  },

項目三

打開projectName文件纺座,在models目錄下創(chuàng)建academy.js文件息拜,接著文件操作:


const mongoose = require('mongoose')

const Schema= mongoose.Schema

const feld={

    name: String,

    //人物標簽

    major:String,

    renshu: Number,

    school : { type: Schema.Types.ObjectId, ref: 'School' }

}

//自動添加更新時間創(chuàng)建時間:

let schema = new Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

module.exports= mongoose.model('Academy',schema)

找到projectName下的routes目錄,創(chuàng)建academy.js文件:


const router = require('koa-router')()

let Model = require("../db/models/academy");

router.prefix('/academy')

router.get('/', function (ctx, next) {

    ctx.body = 'this is a users response!'

})

router.post('/add', async function (ctx, next) {

    console.log(ctx.request.body)

    let model = new Model(ctx.request.body);

    model = await model.save();

    console.log('user',model)

    ctx.body = model

})

router.post('/find', async function (ctx, next) {

    let models = await Model.

    find({}).populate('school')

    ctx.body = models

})

router.post('/get', async function (ctx, next) {

    // let users = await User.

    // find({})

    console.log(ctx.request.body)

    let model = await Model.find(ctx.request.body)

    console.log(model)

    ctx.body = model

})

router.post('/update', async function (ctx, next) {

    console.log(ctx.request.body)

    let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);

    ctx.body = pbj

})

router.post('/delete', async function (ctx, next) {

    console.log(ctx.request.body)

    await Model.remove({ _id: ctx.request.body._id });

    ctx.body = 'shibai '

})

module.exports = router

.在app.js中掛載路由:


const academy = require('./routes/academy')

app.use(academy.routes(), academy.allowedMethods())

前臺三步驟:

打開vue-admin-template-master文件比驻,在src/views目錄下創(chuàng)建一個academy模塊:

image.png

并在academy目錄下創(chuàng)建vue文件该溯。

1.editor.vue為編輯文件,用于創(chuàng)建學院記錄别惦;

image.png

<template>

  <div class="dashboard-container">

    <el-form ref="form" :model="form" label-width="80px">

      <el-form-item label="學院名稱">

        <el-input v-model="form.name"></el-input>

      </el-form-item>

      <el-form-item label="專業(yè)">

        <el-input v-model="form.major"></el-input>

      </el-form-item>

      <el-form-item label="人數(shù)">

        <el-input v-model="form.renshu"></el-input>

      </el-form-item>

      <el-form-item label="所屬學校">

        <el-select v-model="form.school" placeholder="請選擇">

          <el-option v-for="item in options" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

      <el-form-item>

        <el-button type="primary">立即創(chuàng)建</el-button>

        <el-button>取消</el-button>

      </el-form-item>

    </el-form>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'academy',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data(){

      return{

        options: [

          ],

        apiModel:'academy',

        form:{}

      }

    },

    methods:{

      onSubmit(){

        console.log('222:', 222)

        if(this.form._id){

          this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }else

        {

          this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }

      }

    },

    mounted() {

      if(this.$route.query._id){

        this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {

          if(res&&res.length>0){

            this.form = res[0]

          }

        })

      }

      this.$http.post('/api/school/find').then(res => {

        if(res&&res.length>0){

          this.options = res

          console.log('res:', res)

        }

      })

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

image.png

2.index.vue為目錄文件狈茉,用于顯示結果;


  <template>

  <div class="dashboard-container">

    <el-table :data="users" style="width: 100%" :row-class-name="tableRowClassName">

      <el-table-column prop="_id" label="學院_id" width="180">

      </el-table-column>

      <el-table-column prop="name" label="學院名稱" width="180">

      </el-table-column>

      <el-table-column prop="major" label="專業(yè)" width="180">

      </el-table-column>

      <el-table-column prop="renshu" label="人數(shù)">

      </el-table-column>

      <el-table-column prop="school" label="學校名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.school">

            <el-tag :type="scope.row.school.name === '深信' ? 'primary' : 'success'" disable-transitions>{{scope.row.school.name}}</el-tag>

          </span>

      </template>

      </el-table-column>

      <el-table-column label="操作">

        <template slot-scope="scope">

          <el-button size="mini" scope.row>編輯

          </el-button>

          <el-button size="mini" type="danger" scope.row>刪除

          </el-button>

        </template>

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'academy',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data() {

      return {

        apiModel:'academy',

        users: {}

      }

    },

    methods: {

      onSubmit() {

        console.log(123434)

      },

      handleEdit(index, item) {

        this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })

      },

      handleDelete(index, item) {

        this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {

          console.log('res:', res)

          this.findUser()

        })

      },

      findUser(){

        this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {

          console.log('res:', res)

          this.users = res

        })

      }

    },

    mounted() {

      this.findUser()

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>   

3.在index.js中添加路由:


{

    path: '/academy',

    component: Layout,

    meta: { title: '學院管理', icon: 'example' },

    redirect: 'academy',

    children: [{

      path: 'academy',

      name: 'academy',

      component: () =&gt; import('@/views/academy'),

      meta: { title: '學院管理', icon: 'academy' }

    },

      {

        path: 'editor',

        name: 'editor',

        component: () =&gt; import('@/views/academy/editor'),

        meta: { title: '添加學院', icon: 'academy' }

      }]

  },

項目四

打開projectName文件掸掸,在models目錄下創(chuàng)建classs.js文件氯庆,接著文件操作:


const mongoose = require('mongoose')

const Schema= mongoose.Schema

const feld={

    name: String,

    //人物標簽

    level:String,

    renshu: Number,

    school : { type: Schema.Types.ObjectId, ref: 'School' },

    academy : { type: Schema.Types.ObjectId, ref: 'Academy' }

}

//自動添加更新時間創(chuàng)建時間:

let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

module.exports= mongoose.model('Classs',personSchema)

2蹭秋、找到projectName下的routes目錄,創(chuàng)建classs.js文件:


const router = require('koa-router')()

let Model = require("../db/models/classs");

router.prefix('/classs')

router.get('/', function (ctx, next) {

    ctx.body = 'this is a users response!'

})

router.post('/add', async function (ctx, next) {

    console.log(ctx.request.body)

    let model = new Model(ctx.request.body);

    model = await model.save();

    console.log('user',model)

    ctx.body = model

})

router.post('/find', async function (ctx, next) {

    let models = await Model.

    find({}).populate('academy').populate('school')

    ctx.body = models

})

router.post('/get', async function (ctx, next) {

    // let users = await User.

    // find({})

    console.log(ctx.request.body)

    let model = await Model.find(ctx.request.body)

    console.log(model)

    ctx.body = model

})

router.post('/update', async function (ctx, next) {

    console.log(ctx.request.body)

    let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);

    ctx.body = pbj

})

router.post('/delete', async function (ctx, next) {

    console.log(ctx.request.body)

    await Model.remove({ _id: ctx.request.body._id });

    ctx.body = 'shibai '

})

module.exports = router

3.在app.js中掛載路由:


const classs= require('./routes/classs')

app.use(classs.routes(), classs.allowedMethods())

前臺三步驟:

打開vue-admin-template-master文件堤撵,在src/views目錄下創(chuàng)建一個classs模塊仁讨,并在academy目錄下創(chuàng)建vue文件。

image.png

<template>

  <div class="dashboard-container">

    <el-form ref="form" :model="form" label-width="80px">

      <el-form-item label="所屬學校">

        <el-select v-model="form.school" placeholder="請選擇">

          <el-option v-for="item in schools" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

<!--      編輯框:學院選擇列表-->

      <el-form-item label="所屬學院">

        <el-select v-model="form.academy" placeholder="請選擇">

          <el-option v-for="item in academys" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

      <el-form-item label="班級名稱">

        <el-input v-model="form.name"></el-input>

      </el-form-item>

      <el-form-item label="專業(yè)">

        <el-input v-model="form.level"></el-input>

      </el-form-item>

      <el-form-item label="人數(shù)">

        <el-input v-model="form.renshu"></el-input>

      </el-form-item>

      <el-form-item>

        <el-button type="primary">立即創(chuàng)建</el-button>

        <el-button>取消</el-button>

      </el-form-item>

    </el-form>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'classs',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data(){

      return{

        schools:[],

        academys:[],

        //列表內(nèi)容

        options: [

        ],

        apiModel:'classs',

        form:{}

      }

    },

    methods:{

      onSubmit(){

        if(this.form._id){

          this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }else

        {

          this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }

      },

      schoolChange(val1){

        //顯示學院選擇欄目

        this.$http.post('/api/academy/get',{school:val1}).then(res => {

          if(res&&res.length>0){

            this.academys = res

            console.log('res:', res)

          }

        })

      }

    },

    mounted() {

      if(this.$route.query._id){

        this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {

          if(res&&res.length>0){

            this.form = res[0]

            this.schoolChange(this.form.school)

          }

        })

      }

      //顯示學校選擇欄目

      this.$http.post('/api/school/find').then(res => {

        if(res&&res.length>0){

          this.schools = res

          console.log('res:', res)

        }

      })

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

image.png

<template>

  <div class="dashboard-container">

    <el-table :data="users" style="width: 100%" :row-class-name="tableRowClassName">

      <el-table-column prop="name" label="班級名稱" width="180">

      </el-table-column>

      <el-table-column prop="level" label="專業(yè)" width="180">

      </el-table-column>

      <el-table-column prop="renshu" label="人數(shù)">

      </el-table-column>

<!--      列表添加項目

-->

      <el-table-column prop="school" label="學校名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.school">

            <el-tag :type="scope.row.school.name === '深圳信息職業(yè)技術學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.school.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column prop="academy" label="學院名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.academy">

            <el-tag :type="scope.row.academy.name === '軟件學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.academy.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column label="操作">

        <template slot-scope="scope">

          <el-button size="mini" scope.row>編輯

          </el-button>

          <el-button size="mini" type="danger" scope.row>刪除

          </el-button>

        </template>

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'classs',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data() {

      return {

        apiModel:'classs',

        users: {}

      }

    },

    methods: {

      onSubmit() {

        console.log(123434)

      },

      handleEdit(index, item) {

        this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })

      },

      handleDelete(index, item) {

        this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {

          console.log('res:', res)

          this.findUser()

        })

      },

      findUser(){

        this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {

          console.log('res:', res)

          this.users = res

        })

      }

    },

    mounted() {

      this.findUser()

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

3.在index.js中添加路由:


{

    path: '/classs',

    component: Layout,

    meta: { title: '班級管理', icon: 'example' },

    redirect: '/classs',

    children: [{

      path: 'classs',

      name: 'classs',

      component: () =&gt; import('@/views/classs'),

      meta: { title: '班級管理', icon: 'classs' }

    },

      {

        path: 'editor',

        name: 'editor',

        component: () =&gt; import('@/views/classs/editor'),

        meta: { title: '添加班級', icon: 'classs' }

      }]

  },

實訓五

打開projectName文件实昨,在models目錄下創(chuàng)建student.js文件洞豁,接著文件操作:


const mongoose = require('mongoose')

const Schema = mongoose.Schema

const feld={

    name: String,

    age: Number,

    student_number:Number,

    gender:String,

    school : { type: Schema.Types.ObjectId, ref: 'School' },

    academy : { type: Schema.Types.ObjectId, ref: 'Academy' },

    classs : { type: Schema.Types.ObjectId, ref: 'Classs' }

}

//自動添加更新時間創(chuàng)建時間:

let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

module.exports= mongoose.model('Student',personSchema)

找到projectName下的routes目錄,創(chuàng)建student.js文件:


const router = require('koa-router')()

let Model = require("../db/models/student");

router.prefix('/student')

router.get('/', function (ctx, next) {

    ctx.body = 'this is a users response!'

})

router.post('/add', async function (ctx, next) {

    console.log(ctx.request.body)

    let model = new Model(ctx.request.body);

    model = await model.save();

    console.log('user',model)

    ctx.body = model

})

router.post('/find', async function (ctx, next) {

    let models = await Model.

    find({}).populate('classs').populate('academy').populate('school')

    ctx.body = models

})

router.post('/get', async function (ctx, next) {

    // let users = await User.

    // find({})

    console.log(ctx.request.body)

    let model = await Model.find(ctx.request.body)

    console.log(model)

    ctx.body = model

})

router.post('/update', async function (ctx, next) {

    console.log(ctx.request.body)

    let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);

    ctx.body = pbj

})

router.post('/delete', async function (ctx, next) {

    console.log(ctx.request.body)

    await Model.remove({ _id: ctx.request.body._id });

    ctx.body = 'shibai '

})

module.exports = router

在app.js中掛載路由:


const classs= require('./routes/student')

app.use(student.routes(), student.allowedMethods())

前臺三步驟:

打開vue-admin-template-master文件荒给,在src/views目錄下創(chuàng)建一個student模塊丈挟,并在student目錄下創(chuàng)建vue文件。

1.editor.vue為編輯文件志电,用于創(chuàng)建班級記錄曙咽;

image.png

<template>

  <div class="dashboard-container">

    <el-form ref="form" :model="form" label-width="80px">

      <el-form-item label="所屬學校">

        <el-select v-model="form.school" placeholder="請選擇">

          <el-option v-for="item in schools" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

      <!--      編輯框:學院選擇列表-->

      <el-form-item label="所屬學院">

        <el-select v-model="form.academy" placeholder="請選擇">

          <el-option v-for="item in academys" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

      <el-form-item label="所屬班級">

        <el-select v-model="form.classs" placeholder="請選擇">

          <el-option v-for="item in classs" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </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.age"></el-input>

      </el-form-item>

      <el-form-item label="學號">

        <el-input v-model="form.student_number"></el-input>

      </el-form-item>

      <el-form-item label="性別">

        <el-input v-model="form.gender"></el-input>

      </el-form-item>

      <el-form-item>

        <el-button type="primary">立即創(chuàng)建</el-button>

        <el-button>取消</el-button>

      </el-form-item>

    </el-form>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'student',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data(){

      return{

        schools:[],

        academys:[],

        classs:[],

        options: [

        ],

        apiModel:'student',

        form:{}

      }

    },

    methods:{

      onSubmit(){

        if(this.form._id){

          this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }else

        {

          this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }

      },

      schoolChange(val1){

        //顯示學院選擇欄目

        this.$http.post('/api/academy/get',{school:val1}).then(res => {

          if(res&&res.length>0){

            this.academys = res

            console.log('res:', res)

          }

        })

      }

    },

    mounted() {

      if(this.$route.query._id){

        this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {

          if(res&&res.length>0){

            this.form = res[0]

            this.schoolChange(this.form.school)

          }

        })

      }

      //顯示學校選擇欄目

      this.$http.post('/api/school/find').then(res => {

        if(res&&res.length>0){

          this.schools = res

          console.log('res:', res)

        }

      })

      //顯示班級欄目

      this.$http.post('/api/classs/find').then(res => {

        if(res&&res.length>0){

          this.classs = res

          console.log('res:', res)

        }

      })

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

index.vue為目錄文件,用于顯示結果挑辆;


<template>

  <div class="dashboard-container">

    <el-table :data="users" style="width: 100%" :row-class-name="tableRowClassName">

      <el-table-column prop="name" label="名字" width="180">

      </el-table-column>

      <el-table-column prop="age" label="年齡" width="180">

      </el-table-column>

      <el-table-column prop="student_number" label="學號">

      </el-table-column>

      <el-table-column prop="gender" label="性別">

      </el-table-column>

      <!--      列表添加項目

-->

      <el-table-column prop="school" label="學校名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.school">

            <el-tag :type="scope.row.school.name === '深圳信息職業(yè)技術學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.school.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column prop="academy" label="學院名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.academy">

            <el-tag :type="scope.row.academy.name === '軟件學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.academy.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column prop="classs" label="班級名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.classs">

            <el-tag :type="scope.row.classs.name === '18軟工4-3' ? 'primary' : 'success'" disable-transitions>{{scope.row.classs.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column label="操作">

        <template slot-scope="scope">

          <el-button size="mini" scope.row>編輯

          </el-button>

          <el-button size="mini" type="danger" scope.row>刪除

          </el-button>

        </template>

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'student',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data() {

      return {

        apiModel:'student',

        users: {}

      }

    },

    methods: {

      onSubmit() {

        console.log(123434)

      },

      handleEdit(index, item) {

        this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })

      },

      handleDelete(index, item) {

        this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {

          console.log('res:', res)

          this.findUser()

        })

      },

      findUser(){

        this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {

          console.log('res:', res)

          this.users = res

        })

      }

    },

    mounted() {

      this.findUser()

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

在index.js中添加路由:


{

    path: '/student',

    component: Layout,

    meta: { title: '學生管理', icon: 'example' },

    redirect: '/student',

    children: [{

      path: 'student',

      name: 'student',

      component: () =&gt; import('@/views/student/index'),

      meta: { title: '學生管理', icon: 'user' }

    },

      {

        path: 'editor',

        name: 'editor',

        component: () =&gt; import('@/views/student/editor'),

        meta: { title: '添加學生', icon: 'user' }

      }]

  },

實訓六

打開projectName文件例朱,在models目錄下創(chuàng)建teacher.js文件,接著文件操作:


const mongoose = require('mongoose')

const Schema= mongoose.Schema

const feld={

    name: String,

    age: String,

    //人物標簽

    level:String,

    gender:String,

    school : { type: Schema.Types.ObjectId, ref: 'School' },

    academy : { type: Schema.Types.ObjectId, ref: 'Academy' }

}

//自動添加更新時間創(chuàng)建時間:

let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

module.exports= mongoose.model('Teacher',personSchema)

找到projectName下的routes目錄鱼蝉,創(chuàng)建teacher.js文件:


const router = require('koa-router')()

let Model = require("../db/models/teacher");

router.prefix('/teacher')

router.get('/', function (ctx, next) {

    ctx.body = 'this is a users response!'

})

router.post('/add', async function (ctx, next) {

    console.log(ctx.request.body)

    let model = new Model(ctx.request.body);

    model = await model.save();

    console.log('user',model)

    ctx.body = model

})

router.post('/find', async function (ctx, next) {

    let models = await Model.

    find({}).populate('academy').populate('school')

    ctx.body = models

})

router.post('/get', async function (ctx, next) {

    // let users = await User.

    // find({})

    console.log(ctx.request.body)

    let model = await Model.find(ctx.request.body)

    console.log(model)

    ctx.body = model

})

router.post('/update', async function (ctx, next) {

    console.log(ctx.request.body)

    let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);

    ctx.body = pbj

})

router.post('/delete', async function (ctx, next) {

    console.log(ctx.request.body)

    await Model.remove({ _id: ctx.request.body._id });

    ctx.body = 'shibai '

})

module.exports = router

.在app.js中掛載路由:


const teacher= require('./routes/teacher')

app.use(teacher.routes(), teacher.allowedMethods())

前臺三步驟:

打開vue-admin-template-master文件洒嗤,在src/views目錄下創(chuàng)建一個teacher模塊,并在teacher目錄下創(chuàng)建vue文件蚀乔。

image.png

<template>

  <div class="dashboard-container">

    <el-form ref="form" :model="form" label-width="80px">

      <el-form-item label="所屬學校">

        <el-select v-model="form.school" placeholder="請選擇">

          <el-option v-for="item in schools" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </el-form-item>

      <!--      編輯框:學院選擇列表-->

      <el-form-item label="所屬學院">

        <el-select v-model="form.academy" placeholder="請選擇">

          <el-option v-for="item in academys" :key="item._id" :label="item.name" :value="item._id">

          </el-option>

        </el-select>

      </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.age"></el-input>

      </el-form-item>

      <el-form-item label="性別">

        <el-input v-model="form.gender"></el-input>

      </el-form-item>

      <el-form-item label="級別">

        <el-input v-model="form.level"></el-input>

      </el-form-item>

      <el-form-item>

        <el-button type="primary">立即創(chuàng)建</el-button>

        <el-button>取消</el-button>

      </el-form-item>

    </el-form>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'teacher-editor',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data(){

      return{

        schools:[],

        academys:[],

        options: [

        ],

        apiModel:'teacher',

        form:{}

      }

    },

    methods:{

      onSubmit(){

        if(this.form._id){

          this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }else

        {

          this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {

            console.log('bar:', res)

            this.$router.push({path:this.apiModel})

            this.form={}

          })

        }

      },

      schoolChange(val1){

        //顯示學院選擇欄目

        this.$http.post('/api/academy/get',{school:val1}).then(res => {

          if(res&&res.length>0){

            this.academys = res

            console.log('res:', res)

          }

        })

      }

    },

    mounted() {

      if(this.$route.query._id){

        this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {

          if(res&&res.length>0){

            this.form = res[0]

            this.schoolChange(this.form.school)

          }

        })

      }

      //顯示學校選擇欄目

      this.$http.post('/api/school/find').then(res => {

        if(res&&res.length>0){

          this.schools = res

          console.log('res:', res)

        }

      })

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

index.vue為目錄文件烁竭,用于顯示結果;


<template>

  <div class="dashboard-container">

    <el-table :data="users" style="width: 100%" :row-class-name="tableRowClassName">

      <el-table-column prop="name" label="名字" width="180">

      </el-table-column>

      <el-table-column prop="age" label="年齡" width="180">

      </el-table-column>

      <el-table-column prop="level" label="等級">

      </el-table-column>

      <el-table-column prop="gender" label="性別">

      </el-table-column>

      <!--      列表添加項目

-->

      <el-table-column prop="school" label="學校名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.school">

            <el-tag :type="scope.row.school.name === '深圳信息職業(yè)技術學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.school.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column prop="academy" label="學院名稱" width="180">

        <template slot-scope="scope">

          <span class="" v-if="scope.row.academy">

            <el-tag :type="scope.row.academy.name === '軟件學院' ? 'primary' : 'success'" disable-transitions>{{scope.row.academy.name}}</el-tag>

          </span>

        </template>

      </el-table-column>

      <el-table-column label="操作">

        <template slot-scope="scope">

          <el-button size="mini" scope.row>編輯

          </el-button>

          <el-button size="mini" type="danger" scope.row>刪除

          </el-button>

        </template>

      </el-table-column>

    </el-table>

  </div>

</template>

<script>

  import { mapGetters } from 'vuex'

  export default {

    name: 'teacher',

    computed: {

      ...mapGetters([

        'name'

      ])

    },

    data() {

      return {

        apiModel:'teacher',

        users: {}

      }

    },

    methods: {

      onSubmit() {

        console.log(123434)

      },

      handleEdit(index, item) {

        this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })

      },

      handleDelete(index, item) {

        this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {

          console.log('res:', res)

          this.findUser()

        })

      },

      findUser(){

        this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {

          console.log('res:', res)

          this.users = res

        })

      }

    },

    mounted() {

      this.findUser()

    }

  }

</script>

<style lang="scss" scoped>

  .dashboard {

    &-container {

      margin: 30px;

    }

    &-text {

      font-size: 30px;

      line-height: 46px;

    }

  }

</style>

在index.js中添加路由


  {

    path: '/teacher',

    component: Layout,

    meta: { title: '老師管理', icon: 'example' },

    redirect: '/teacher',

    children: [{

      path: 'teacher',

      name: 'teacher',

      component: () =&gt; import('@/views/teacher'),

      meta: { title: '老師管理', icon: 'user' }

    },

      {

        path: 'editor',

        name: 'editor',

        component: () =&gt; import('@/views/teacher/editor'),

        meta: { title: '添加老師', icon: 'user' }

      }]

  },

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吉挣,一起剝皮案震驚了整個濱河市派撕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬魂,老刑警劉巖终吼,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氯哮,居然都是意外死亡际跪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門喉钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆打,“玉大人,你說我怎么就攤上這事肠虽♂O罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵税课,是天一觀的道長闲延。 經(jīng)常有香客問我痊剖,道長,這世上最難降的妖魔是什么垒玲? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任陆馁,我火速辦了婚禮,結果婚禮上合愈,老公的妹妹穿的比我還像新娘叮贩。我一直安慰自己,他們只是感情好佛析,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布妇汗。 她就那樣靜靜地躺著,像睡著了一般说莫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寞焙,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天储狭,我揣著相機與錄音,去河邊找鬼捣郊。 笑死辽狈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的呛牲。 我是一名探鬼主播刮萌,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娘扩!你這毒婦竟也來了着茸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琐旁,失蹤者是張志新(化名)和其女友劉穎涮阔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灰殴,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡敬特,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牺陶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟阔。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掰伸,靈堂內(nèi)的尸體忽然破棺而出皱炉,到底是詐尸還是另有隱情,我是刑警寧澤碱工,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布娃承,位于F島的核電站奏夫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏历筝。R本人自食惡果不足惜酗昼,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梳猪。 院中可真熱鬧麻削,春花似錦、人聲如沸春弥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匿沛。三九已至扫责,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逃呼,已是汗流浹背鳖孤。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抡笼,地道東北人苏揣。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像推姻,于是被迫代替她去往敵國和親平匈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容