Vue+Node(express)+ ElementUI实现各种功能(一)

一.首先使用ElementUI实现后台的增删改查
用vue-cli先搭建一个项目admin,再创建一个文件夹,命名为serve,里面放自己写的接口数据和连接mongodb数据库等

在serve文件夹中操作

第一步

npm init -y 先初始化一个package.json
再安装express,mongoose,cors
npm i express   
npm i mongoose
npm i cors  //跨域

第二步:建立一个plugins文件,里面建立一个db.js,导入数据库

  module.exports =app=>{
  const mongoose =require('mongoose')
  mongoose.connect('mongodb://127.0.0.1:27017/store',{
  //store名字可随便取,会存到你的mongo数据库
    useNewUrlParser:true //解析URL
  })
}

第三步:建立一个models文件,里面建立一个Category.js,作为编译模版,操作数据库

 const mongoose =require('mongoose')
 const schema =new mongoose.Schema({
  name:{type:String}
})
module.exports = mongoose.model('Category',schema)

第四步:建立一个routes文件,里面在建立一个admin文件,admin里面再建立一个index.js,用来存放接口数据,更改数据,删除数据等请求

module.exports =app =>{
  const express = require('express')
  const router = express.Router({
  mergeParams:true //合并url参数
}) //引入路由
  //创建分类接口
 router.post('/',async(req,res)=>{
 const model =  await req.Model.create(req.body)
 res.send(model)
})
//更新数据
router.put('/:id',async(req,res)=>{
const model =  await  req.Model.findByIdAndUpdate(req.params.id,req.body)
res.send(model)
})
//删除数据
router.delete('/:id',async(req,res)=>{
await req.Model.findByIdAndDelete(req.params.id,req.body)
res.send({
  success:true
})
})
//详情数据接口
router.get('/:id',async(req,res)=>{
const model =  await req.Model.findById(req.params.id)
res.send(model)
})
}
app.use('/admin/api/rest/:resource',async(req,res,next)=>{
const modelName = require('inflection').classify(req.params.resource) //转大小写类名
req.Model = require(`../../models/${modelName}`)
next()
},router) //动态参数
这一步还需要在终端下一个插件
npm i inflection

第五步:建立一个主index.js文件,引入各类和使用

const express = require('express')
const app =express()
app.use(require('cors')())
app.use(express.json())
require('./plugins/db')(app)
require('./routes/admin')(app)
app.listen(3000,()=>{

}) //通过3000端口访问

前端页面,在admin中操作

第一步:安装element-ui和路由,axios插件

npm i element-ui -S
npm i router -S
npm i axios -S
然后在main.js中引入
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
Vue.use(ElementUI);
import http from "./http";
Vue.prototype.$http = http;

第二步:新建一个http.js文件,放网络请求

import axios from "axios";

const http = axios.create({
  baseURL: "http://localhost:3000/admin/api"
});

export default http;

第三步:在views文件中建立三个vue文件,Main.vue,CategoryEdit.vue,CategoryList.vue

Main.vue中

<template>
  <el-container style="height: 100vh;">
    <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
      <el-menu router :default-openeds="['1', '3']">
        <el-submenu index="1">
          <template slot="title"
            ><i class="el-icon-message"></i>内容管理</template
          >
          <el-menu-item-group>
            <template slot="title">分类</template>
            <el-menu-item index="/categories/create">新建分类</el-menu-item>
            <el-menu-item index="/categories/list">分类列表</el-menu-item>
          </el-menu-item-group>
        </el-submenu>
      </el-menu>
    </el-aside>

    <el-container>
      <el-header style="text-align: right; font-size: 12px">
        <el-dropdown>
          <i class="el-icon-setting" style="margin-right: 15px"></i>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>查看</el-dropdown-item>
            <el-dropdown-item>新增</el-dropdown-item>
            <el-dropdown-item>删除</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
        <span>王小虎</span>
      </el-header>

      <el-main>
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
   </template>

<style>
.el-header {
  background-color: #b3c0d1;
  color: #333;
  line-height: 60px;
}

.el-aside {
  color: #333;
}
</style>

<script>
export default {
  data() {
    const item = {
      date: "2016-05-02",
      name: "王小虎",
      address: "上海市普陀区金沙江路 1518 弄"
    };
    return {
      tableData: Array(20).fill(item)
    };
  }
};
</script>

CategoryEdit.vue中

<template>
  <div>
    <h1>{{id ?'编辑':'新建'}}分类</h1>
    <el-form label-width="120px" @submit.native.prevent="save">
      <el-form-item label="名称">
        <el-input v-model="model.name"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" native-type="submit">保存</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  props: {
    id: {}
  },
  data() {
    return {
      model: {},
    };
  },
  methods: {
    async save() {
      let res
      if(this.id){//有id就修改
     res = await this.$http.put(`rest/categories/${this.id}`, this.model);
      }else{//如果没有id就添加
     res = await this.$http.post("rest/categories", this.model);
      }
     
      this.$router.push("/categories/list");
      this.$message({
        type: "success",
        message: "保存成功"
      });
    },
    async fetch(){
      const res = await this.$http.get(`rest/categories/${this.id}`)
      this.model  =res.data
    },
   
},
  created() {
    this.id && this.fetch()
  },
};
</script>

<style></style>

CategoryList.vue中

 <template>
  <div>
    <h1>分类列表</h1>
    <el-table :data="items">
      <el-table-column prop="_id" label="ID" width="240"></el-table-column>
      <el-table-column prop="name" label="分类名称"></el-table-column>
      <el-table-column fixed="right" label="操作" width="180">
        <template slot-scope="scope">
          <el-button
            type="text"
            size="small"
            @click="$router.push(`/categories/edit/${scope.row._id}`)"
            >编辑</el-button
          >
          <el-button
            type="text"
            size="small"
            @click="remove(scope.row)"
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: []
    };
  },
  methods: {
    async fetch() {
      const res = await this.$http.get("rest/categories");
      this.items = res.data;
    },
    async remove(row){
      this.$confirm(`是否确定要删除分类 "${row.name}"`,'提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(async () => {
          const res = await this.$http.delete(`rest/categories/${row._id}`)
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
          this.fetch()
        })       
        
    }
  },
  created() {
    this.fetch();
  }
};
</script>

<style></style>

第四步:在路由js文件中引入这些组件

   import Vue from "vue";
import VueRouter from "vue-router";
import Main from "../views/Main.vue";
import CategoryEdit from "../views/CategoryEdit.vue";
import CategoryList from "../views/CategoryList.vue";


Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "main",
    component: Main,
    children: [
      {
        path: "/categories/create",
        component: CategoryEdit
      },
      {
        path: "/categories/edit/:id",
        component: CategoryEdit,
        props: true //把所以参数都注入到CategoryEdit里面
      },
      {
        path: "/categories/list",
        component: CategoryList
      },
    ]
  }
];

const router = new VueRouter({
  routes
});

export default router;

第五步:在APP.vue中操作

    <template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<style lang="less">
html,
body {
  padding: 0;
  margin: 0;
}
</style>

完事,下一篇博客讲上一级和上传图片等

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值