天天看點

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

前言:

        這個章節内容是比較多的,分為前端部分和後端部分。

目錄:

實作效果:增删改查

 一、後端部分:

(1)資料庫:

        建立一張表user,設定幾個字段,效果如下:

 (2)egg邏輯部分:

提供的接口:http://localhost:7001/setUserList

 (3)egg具體實作步驟:

1、router.js中添加:

2、建立:app / controller / new / user.js

(1)查,模糊查詢 

(2)增

 (3)改

 (4)删

 user.js 源碼:

3、引入mysql:點我

4、跨域問題解決:點我

 二、前端部分:

建立vue檔案:testApi.vue

1、初始化查詢清單資料:頁面展示清單,清單資料mouted擷取

2、頁面點選新增:展示彈框,并将彈框内容去除掉,點選新增,将彈框内容發送給後端

 3、頁面點選清單裡面具體資料的編輯:彈框,并回填資料,修改将目前資料的id和表格資料傳給後端

4、删除按鈕,點選出現二次确認彈框,點選确認将目前資料的id給後端就行 

 testApi.vue 源碼:

實作效果:增删改查

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 一、後端部分:

(1)資料庫:

        建立一張表user,設定幾個字段,效果如下:

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 (2)egg邏輯部分:

提供的接口:http://localhost:7001/setUserList

  1. get 請求,擷取資料,支援模糊查詢
  2. post 請求,新增資料
  3. put 請求,給後端目前資料id,修改内容
  4. delete 請求,根據資料id删除目前條資料

 (3)egg具體實作步驟:

1、router.js中添加:

/**
 * 路由配置
 * @param app
 */
module.exports = app => {
    const { router, controller } = app;
    //--------------------------------------------------
    // server接口
    //--------------------------------------------------
    app.get('/setUserList', controller.new.user.getUserList);
    app.post('/setUserList', controller.new.user.postUserList);
    app.put('/setUserList', controller.new.user.putUserList);
    app.delete('/setUserList', controller.new.user.deleteUserList);

}
           

2、建立:app / controller / new / user.js

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

(1)查,模糊查詢 

select * from user where name like ? % 内容 %      
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

(2)增

this.app.mysql.insert('表名',内容)      
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 (3)改

UPDATE loginlist SET `password` = 'Ad123456' WHERE id = 2      
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 (4)删

delete from user where id = 1      
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 user.js 源碼:

/**
 *  使用者資訊路由
 * @param app
 * @returns {HomeController}
 */
const Controller = require('egg').Controller;
class NewsController extends Controller {
  async getUserList() {
    //查詢庫裡的user表
    let params = this.ctx.query //擷取路徑後面的參數
    console.log('使用者的參數:');
    console.log(params);
    let sql = 'select * from user'
    let initSql = sql

      let content = [];//參數
    let isMore = false;//是否有多個查詢參數
    /**
     * @模糊查詢-量大的時候效率低
     * select * from user where name like ? % 内容 %
     * 在user表中全局查找name值 == 内容的
     * % 内容 % 全局查找内容
     *   内容 %  查找以 内容 開頭的資料
     * */
    if(params.name){
      sql += " where name like ?";
      content.push( "%"+params.name+"%" );
      isMore = true;
    }
    if(params.age){
      if(isMore){//true代表有多個參數
        sql += "and age LIKE ?";//and是兩個條件都必須滿足,or是或的關系
      }else{
        sql += " WHERE age LIKE ?";
      }
      content.push( "%"+params.age+"%" )
      isMore = true;
    }
    if(params.address){
      if(isMore){//true代表有多個參數
        sql += "and address LIKE ?";//and是兩個條件都必須滿足,or是或的關系
      }else{
        sql += " WHERE address LIKE ?";
      }
      content.push( "%"+params.address+"%" )
      isMore = true;
    }
    if(params.phone){
      if(isMore){//true代表有多個參數
        sql += "and phone LIKE ?";//and是兩個條件都必須滿足,or是或的關系
      }else{
        sql += " WHERE phone LIKE ?";
      }
      content.push( "%"+params.phone+"%" )
    }

    //開啟分頁
    if(params.page || params.pageSize){
      let current = params.page;//目前頁碼
      let pageSize = params.pageSize;//一頁展示多少條資料
      sql += " limit ?,?";
      content.push((current-1)*pageSize,parseInt(pageSize));
    }

    let allList = await this.app.mysql.query(initSql);
    let userList= await this.app.mysql.query(
      sql,content
    );
    this.ctx.body = {
      code:200,
      masg:'success',
      data: {
        list:userList,
        total:allList.length
      }
    };
  }
  /**
   * 新增使用者資訊
   * INSERT INTO loginlist (aaa,bbb,ccc) VALUES ('"'+111+'","'+222+'","'+333+'"')
   * this.app.mysql.insert('表名',内容)
   * this.app.mysql.insert('表名',{
   *   name:123,
   *   age:1,
   *   address:西安
   * })
   */
  //
  async postUserList() {
    console.log(this.ctx.request.body);
    //新增資料-user表
    let data = this.ctx.request.body
    data.id = parseInt(Math.random()*100000)
    let insertResult = await this.app.mysql.insert(
      'user', data
    );
    this.ctx.body = {
      code:200,
      masg:'success',
      data:insertResult
    };
  }
  /**
   * 修改使用者資訊
   * UPDATE loginlist SET `password` = 'Ad123456' WHERE id = 2(唯一值),修改一個
   * UPDATE loginlist SET username = 'admins', `password` = 'Ad123456' WHERE id = 2,修改多個
   */
  async putUserList(){
    //新增資料-user表
    let id = this.ctx.query.id //擷取路徑後面的參數
    let data = this.ctx.request.body
    let sql = 'update user set '
    let isMore = false;//是否有多個查詢參數
    if(!id){
      this.ctx.body = {
        code:200,
        masg:'warning',
        data:'id沒有傳'
      };
      return
    }
    //姓名
    if(data.name){
      sql += 'name = "'+data.name+'"'
      isMore = true
    }
    //年齡
    if(data.age){
      if(isMore){
        sql += ',age = "'+data.age+'"'
      }else{
        sql += 'age = "'+data.age+'"'
      }
      isMore = true
    }
    //位址
    if(data.address){
      if(isMore){
        sql += ',address = "'+data.address+'"'
      }else{
        sql += 'address = "'+data.address+'"'
      }
      isMore = true
    }
    //手機号
    if(data.phone){
      if(isMore){
        sql += ',phone = "'+data.phone+'"'
      }else{
        sql += 'phone = "'+data.phone+'"'
      }
      isMore = true
    }
    //郵箱位址
    if(data.email){
      if(isMore){
        sql += ',email = "'+data.email+'"'
      }else{
        sql += 'email = "'+data.email+'"'
      }
    }
    sql += ' where id = ' + id

    let insertResult = await this.app.mysql.query(sql)
    this.ctx.body = {
      code:200,
      masg:'success',
      data:insertResult
    };
  }
  /**
   * 登出使用者接口
   * DELETE FROM loginlist WHERE username = 'superman'
   */
  async deleteUserList(){
    //查詢庫裡的user表
    let params = this.ctx.query //擷取路徑後面的參數
    console.log('使用者的參數:');
    console.log(params);
    let sql = 'delete from user where id = '+ params.id
    let res = await this.app.mysql.query(
      sql
    );
    this.ctx.body = {
      code:200,
      masg:'success',
      data:res
    };

  }

  /**
   * 模糊查詢封裝方法
   * @params = auth
   * */
  async query( auth ) {
    const TABLE_NAME = 'user';
    const QUERY_STR = 'id, name, age, phone, address';
    let sql = `select ${QUERY_STR} from ${TABLE_NAME} where authName like "%${auth.authName}%"`;
    const row = await this.app.mysql.query(sql);
    return row;
  }


}
module.exports = NewsController;

           

3、引入mysql:點我

4、跨域問題解決:點我

 二、前端部分:

建立vue檔案:testApi.vue

1、初始化查詢清單資料:頁面展示清單,清單資料mouted擷取

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:
<el-table
      :data="tableInfo.list"
      style="width: 100%">
      <el-table-column
        type="index"
        label="序号"
        align="center">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年齡"
        align="center">
      </el-table-column>
      <el-table-column
        prop="address"
        label="位址">
      </el-table-column>
      <el-table-column
        prop="phone"
        label="手機号">
      </el-table-column>
      <el-table-column
        prop="email"
        label="郵箱">
      </el-table-column>
      <el-table-column
        label="操作"
        width="100">
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="editFun(scope.row)">編輯</el-button>
          <el-button type="text" size="small" @click="deleteFun(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
           
mounted(){
      this.initPage()
    },
 methods: {
      /***
       * 擷取清單資料
       */
      initPage() {
        let params = {
          page: this.tableInfo.page, //目前頁
          pageSize: this.tableInfo.pageSize //一頁展示多少條
        }
        this.$axios.get('http://localhost:7001/setUserList',{
          params
        }).then(res => {
            this.tableInfo.list = res.data.data.list
            this.tableInfo.total = res.data.data.total
          }).catch(error => {
          this.$message(error.data.message)
        })
      },

}
           

2、頁面點選新增:展示彈框,并将彈框内容去除掉,點選新增,将彈框内容發送給後端

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 3、頁面點選清單裡面具體資料的編輯:彈框,并回填資料,修改将目前資料的id和表格資料傳給後端

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

4、删除按鈕,點選出現二次确認彈框,點選确認将目前資料的id給後端就行 

egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:
egg(八):配合前端vue實作表格的增删改查目錄:實作效果:增删改查 一、後端部分: 二、前端部分:

 testApi.vue 源碼:

<template>
  <div class="pro_body">
    <el-button type='success' @click="addModal">新增</el-button>
    <el-table
      :data="tableInfo.list"
      style="width: 100%">
      <el-table-column
        type="index"
        label="序号"
        align="center">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年齡"
        align="center">
      </el-table-column>
      <el-table-column
        prop="address"
        label="位址">
      </el-table-column>
      <el-table-column
        prop="phone"
        label="手機号">
      </el-table-column>
      <el-table-column
        prop="email"
        label="郵箱">
      </el-table-column>
      <el-table-column
        label="操作"
        width="100">
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="editFun(scope.row)">編輯</el-button>
          <el-button type="text" size="small" @click="deleteFun(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-pagination
      class="work_pagination"
      background
      :layout="'total,prev, pager, next,sizes'"
      :total="tableInfo.total"
      :hide-on-single-page="false"
      :current-page="tableInfo.page"
      :page-size="tableInfo.pageSize"
      @current-change="pageChange"
      @size-change="pageSizeChange"
    >
    </el-pagination>


    <!--彈框部分-->
    <el-dialog
      custom-class="modalName"
      :visible.sync="modal.show"
      :width="modal.type === 'delete'? '470px' : '800px'">
      <h3 v-if="modal.type === 'add'" slot="title">新增</h3>
      <h3 v-if="modal.type === 'edit'" slot="title">修改</h3>
      <h3 v-if="modal.type === 'delete'" slot="title">提示</h3>
      <div v-if="modal.type !== 'delete'" class="editNameBody">
        <el-form class="editNameFrom" :model="modalFrom" label-width="120px" label-position="right">
          <el-form-item label="姓名:">
            <el-input v-model="modalFrom.name"></el-input>
          </el-form-item>
          <el-form-item label="年紀:">
            <el-input v-model="modalFrom.age"></el-input>
          </el-form-item>
          <el-form-item label="手機号:">
            <el-input v-model="modalFrom.phone"></el-input>
          </el-form-item>
          <el-form-item label="郵箱:">
            <el-input v-model="modalFrom.email"></el-input>
          </el-form-item>
          <el-form-item label="位址:">
            <el-input v-model="modalFrom.address" type="textarea"></el-input>
          </el-form-item>
        </el-form>
      </div>
      <div v-if="modal.type === 'delete'">
        <i class="el-icon-warning" style="margin-right:7px;color:#FFAA00;font-size: 16px;"></i>請确認是否删除
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="modal.show = false">取 消</el-button>
        <el-button v-if="modal.type === 'add'" type="primary"  @click="addUserList">新增</el-button>
        <el-button v-if="modal.type === 'edit'" type="primary"  @click="editUserList">修改</el-button>
        <el-button v-if="modal.type === 'delete'" type="primary" @click="deleteUserList">确 認</el-button>
      </div>
    </el-dialog>


  </div>
</template>

<script>
  export default {
    data() {
      return {
        tableInfo:{
          columns:[
            {
              title: '序号',
              type: 'index',
            },{
              title: '姓名',
              prop: 'name',
              align: 'center'
            },
            {
              title: '年齡',
              prop: 'age',
              align: 'center'
            },{
              title: '位址',
              prop: 'address',
              align: 'center'
            },{
              title: '郵箱',
              prop: 'email',
              align: 'center'
            },{
              title: '手機号',
              prop: 'phone',
              align: 'center'
            },
            {//内容slot
              slot: 'operateT'
            }
          ],
          list:[],
          page:1,
          pageSize:10,
          total:0,
        },
        modal:{
          show:false,
          type:'add'
        },
        modalFrom:{
          name:'',
          age:'',
          phone:'',
          address:'',
          email:''
        }
      };
    },
    mounted(){
      this.initPage()
    },
    methods: {
      /***
       * 擷取清單資料
       */
      initPage() {
        let params = {
          page: this.tableInfo.page, //目前頁
          pageSize: this.tableInfo.pageSize //一頁展示多少條
        }
        this.$axios.get('http://localhost:7001/setUserList',{
          params
        }).then(res => {
            this.tableInfo.list = res.data.data.list
            this.tableInfo.total = res.data.data.total
          }).catch(error => {
          this.$message(error.data.message)
        })
      },
      /**
       * 目前頁發生改變
       * */
      pageChange(page) {
        this.tableInfo.page = page
        this.initPage() //重新整理清單資料
      },
      /**
       * 目前第幾頁發生改變
       * */
      pageSizeChange(pageSize) {
        this.tableInfo.page = 1
        this.tableInfo.pageSize = pageSize
        this.initPage() //重新整理清單資料
      },
      //新增彈框
      addModal(){
        this.modalFrom ={
          name:'',
          age:'',
          phone:'',
          address:'',
          email:''
        }
        this.modal.show  = true
        this.modal.type  = 'add'
      },
      //修改彈框
      editFun(row){
        this.modalFrom = row
        this.modal.show  = true
        this.modal.type  = 'edit'
      },
      //删除彈框
      deleteFun(row){
        this.modalFrom = row
        this.modal.show  = true
        this.modal.type  = 'delete'
      },
      addUserList(){
        this.$axios({
          method:'post',
          url:'http://localhost:7001/setUserList',
          data:this.modalFrom
        }).then(res => {
          this.$message.success('新增成功')
          this.initPage() //重新整理資料
          this.modal.show  = false
        })
      },
      editUserList(){
        this.$axios({
          method:'put',
          url:'http://localhost:7001/setUserList',
          params:{
            id:this.modalFrom.id
          },
          data:this.modalFrom
        }).then(res => {
          this.$message.success('修改成功')
          this.initPage() //重新整理資料
          this.modal.show  = false
        })
      },
      deleteUserList(){
        this.$axios({
          method:'delete',
          url:'http://localhost:7001/setUserList',
          params:{
            id:this.modalFrom.id
          }
        }).then(res => {
          this.$message.success('删除成功')
          this.initPage() //重新整理資料
          this.modal.show  = false
        })
      }
    }

  }
</script>

<style >
.modalName{
  h3{
    padding:10px;
  }
}
</style>
           

繼續閱讀