Vue--element實現刪除會員功能


前戲

現在會員管理就差一個功能沒有實現了,那就是刪除會員的功能。

刪除二次確認對話框

實現效果如下

之前我們已經寫好了刪除按鈕,並且定義好了刪除方法 handDelete 現在就來實現這個方法,在實現之前先寫好我們的接口

在 src/api/member.js 里寫delete請求,完整代碼如下

// 會員管理接口

import request from '@/utils/request'
import BASE_URL from '@/utils/common'


export default {
    // 獲取會員列表數據,page 當前頁碼。size,每頁查詢條數,searchMap 搜索的參數
    getList(token,size,page,searchMap){
        return request({
            url: BASE_URL +`/api/manage/search/member?page=${page}&size=${size}`, // 反單引號
            method: 'post',
            data: searchMap,
            headers:{
                "Authorization":"JWT "+token
            }

        })
    },

    // 新增會員
    add(pojo,token){
        return request({
            url: BASE_URL + '/api/manage/member',
            method: 'post',
            data: pojo,
            headers:{
                "Authorization":"JWT "+token
            }
        })
    },

    // 根據會員 id 查詢單條數據
    getById(id,token){
        return request({
            url: BASE_URL + `/api/manage/member?id=${id}`,
            method: 'get',
            headers:{
                "Authorization":"JWT "+token
            }
        })
    },

    // 修改數據
    update(pojo,token){
        return request({
            url: BASE_URL + '/api/manage/member',
            method: 'put',
            data: pojo,
            headers:{
                "Authorization":"JWT "+token
            }
        })
    },

    // 刪除數據
    deleteById(id,token){
        return request({
            url: BASE_URL + `/api/manage/member?id=${id}`,
            method: 'delete',
            headers:{
                "Authorization":"JWT "+token,
                "content-type": "application/json"
            }
        })
    }

    
}

然后再 src/views/member/index.vue 里實現handDelete 方法,只增加下面的方法就可以了

 完整代碼如下

<template>
    <div>

        <!-- 搜索框 -->
    <!-- :inline="true" 表單一行顯示 -->
    <!-- :model="searchMap" 綁定到這個參數上 -->
    <el-form ref="searchForm" :inline="true" :model="searchMap" style="margin-top: 20px">
        <!-- 重置會看 el-form-item 組件元素的 prop 上是否指定了字段名,指定了才會重置生效 -->
        <el-form-item prop="member_card">
          <!--prop需要在data里指定,不指定會出現重置不了的問題, placeholder背景文案 -->
          <el-input v-model="searchMap.member_card" placeholder="會員卡號" style="width: 200px"></el-input>
        </el-form-item>
        <!-- prop重置用 -->
        <el-form-item prop="member_name">
          <el-input v-model="searchMap.member_name" placeholder="會員名字" style="width: 200px"></el-input>
        </el-form-item>
        <el-form-item prop="pay_type">
          <el-select v-model="searchMap.pay_type" placeholder="支付類型" style="width: 110px">
            <!-- 不要忘記 payTypeOptions 綁定到data中 -->
            <!-- for循環。label就是看到的中文,value提交到后台的值,也就是1,2,3,4 -->
            <el-option
              v-for="option in payTypeOptions"
              :key="option.pay_type"
              :label="option.name"
              :value="option.pay_type"
            ></el-option>
          </el-select>
        </el-form-item>
  
        <!-- 日期搜索框 -->
        <el-form-item prop="member_birthday">
          <!-- value-format 是指定綁定值的格式 -->
          <el-date-picker
            style="width: 200px"
            value-format="yyyy-MM-dd"
            v-model="searchMap.member_birthday"
            type="date"
            placeholder="出生日期"
          ></el-date-picker>
        </el-form-item>
        <!-- 日期搜索框結束 -->
  
        <el-form-item>
          <el-button type="primary" @click="fetchData">查詢</el-button>
          <el-button type="primary" @click="handleAdd">新增</el-button>
          <!-- searchForm 為搜索框上面 ref 綁定的屬性,resetForm 要在methods里面定義-->
          <el-button @click="resetForm('searchForm')">重置</el-button> 
        </el-form-item>
      </el-form>
      <!-- 搜索框結束 -->



      <!-- 列表頁面
      :data綁定渲染的數據,data 里我們定義的上list
      border 表格邊框,表頭最上面的那個邊框
      height 表格高度
    -->
    <el-table :data="list" height="480" border style="width: 100%">
        <!-- type='index'獲取索引值,從1開始,label顯示的標題,prop接口返回數據的字段名,width列寬,不寫就自動 -->
        <el-table-column type="index" label="序號" width="50"></el-table-column>
        <el-table-column prop="member_card" label="會員卡號" width="180"></el-table-column>
        <el-table-column prop="member_name" label="會員姓名"></el-table-column>
        <el-table-column prop="member_birthday" label="會員生日" width="100"></el-table-column>
        <el-table-column prop="phone_number" label="手機號碼" width="120"></el-table-column>
        <el-table-column prop="card_money" label="可用積分"></el-table-column>
        <el-table-column prop="Available_integral" label="開卡余額"></el-table-column>

        <!-- 支付類型開始 -->
        <el-table-column prop="pay_type" label="支付類型">
            <template slot-scope="scope">
                <!-- 使用過濾器,scope.row.pay_type為接口返回的pay_type的值,后面的是作用在哪個過濾器上面,這里作用在 payTypeFilter 上面-->
                <span>{{scope.row.pay_type | payTypeFilter }}</span>
              </template>
        </el-table-column>
        <!-- 支付類型結束 -->

        <el-table-column prop="member_address" label="會員地址" width='180'></el-table-column>

        <!-- 操作開始,scope 可以獲取行數據 ,scope.row.id 獲取該行數據的 id值-->
        <el-table-column label="操作" width="150">
        <template slot-scope="scope">
          <el-button size="mini" @click="handleEdit( scope.row.id)">編輯</el-button>
          <!-- 根據后端返回該行的id進行編輯和刪除 -->
          <el-button size="mini" type="danger" @click="handleDelete( scope.row.id)">刪除</el-button>
        </template>
      </el-table-column>
      <!-- 操作結束 -->

    </el-table>
      <!-- 列表頁面結束 -->

     <!-- 分頁 -->
     <!--
         handleSizeChange 改變每頁多少條調用這個方法,會傳選擇的條數過去
         handleCurrentChange 點擊頁碼調用這個方法,會傳點擊的頁碼過去
          current-page當前的頁碼,data里定義的1,默認第一頁
          page-sizes 選擇項,每頁顯示多少條
          page-size 每頁顯示多少條,data里定義
          layout="total, sizes, prev, pager, next, jumper"
          total 總共多少條,去掉后不顯示,sizes選擇項,prev上一頁的箭頭,pager頁碼,next下一頁的箭頭,jumper前往多少頁
        -->
    <el-pagination
    @size-change="handleSizeChange" 
    @current-change="handleCurrentChange"
    :current-page="currenPage"
    :page-sizes="[10, 15, 20, 30]"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="total"
    ></el-pagination>
     <!-- 分頁結束 -->


         <!-- 彈出新增窗口 
        title 窗口的標題
        :visible.sync 當它true的時候,窗口會被彈出
    -->
    <!-- :rules="rules"校驗,需要在校驗的字段上指定prop -->
    <!-- 這里都要綁定prop,並且在data里聲明,要不然彈框里的數據不會清空或者不能輸入 -->
    <!-- :closeOnClickModal=false 點擊空白區域不關閉彈框,默認為true -->
    <!-- pojo 就是提交的數據 -->
    <el-dialog title="新增會員" :closeOnClickModal=false :visible.sync="dialogFormVisible" width="500px">
      <!-- 設置彈出框的樣式 label-position="right" 右對齊 -->
      <el-form
        :rules="rules"
        ref="pojoForm"
        label-width="100px"
        label-position="right"
        style="width: 400px;"
        :model="pojo"
      >
        <el-form-item label="會員卡號"  prop="member_card">
          <el-input v-model="pojo.member_card" placeholder="請輸入會員卡號"></el-input>
        </el-form-item>
        <el-form-item label="會員姓名"  prop="member_name">
          <el-input v-model="pojo.member_name" placeholder="請輸入會員姓名"></el-input>
        </el-form-item>
        <el-form-item label="會員生日" prop="member_birthday">
          <!-- value-format 是指定綁定值的格式 -->
          <el-date-picker
            style="width: 200px"
            value-format="yyyy-MM-dd"
            v-model="pojo.member_birthday"
            type="date"
            placeholder="會員生日"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="手機號碼" prop="phone_number">
          <el-input v-model="pojo.phone_number" placeholder="請輸入手機號碼"></el-input>
        </el-form-item>
        <el-form-item label="開卡金額"  prop="card_money">
          <el-input v-model="pojo.card_money" placeholder="請輸入開卡金額"></el-input>
        </el-form-item>
        <el-form-item label="可用積分" prop="Available_integral">
          <el-input v-model="pojo.Available_integral" placeholder="請輸入可用積分"></el-input>
        </el-form-item>
        <el-form-item label="支付類型" prop="pay_type">
          <el-select v-model="pojo.pay_type" placeholder="支付類型" style="width: 110px">
            <!-- 不要忘記 payTypeOptions 綁定到data中 -->
            <el-option
              v-for="option in payTypeOptions"
              :key="option.pay_type"
              :label="option.name"
              :value="option.pay_type"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="會員地址" prop="member_address">
          <el-input type="textarea" v-model="pojo.member_address" placeholder="請輸入會員地址"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <!-- pojoForm 為el-form 的ref屬性值 -->
        <!-- <el-button type="primary" @click="addData('pojoForm')">確 定</el-button> -->
        <!-- 當pojo.id === null時,調用新增接口addData,當不為null,表示有id,則調更新接口updateData -->
        <el-button type="primary" @click="pojo.id === null ? addData('pojoForm'): updateData('pojoForm')">確 定</el-button>
        

        
      </div>
    </el-dialog>
    <!-- 彈出窗口結束 -->

    </div>
</template>

<script>
import memberApi from "@/api/member"
// 支付類型,不能寫在data里面,會報錯,定義好了在下面寫個 filters 方法
// 然后在列表頁面使用過濾器,接口返回的pay_type是數字,不是字符串
const payTypeOptions = [
  { pay_type: 1, name: "現金" },
  { pay_type: 2, name: "微信" },
  { pay_type: 3, name: "支付寶" },
  { pay_type: 4, name: "銀行卡" }
];

export default{
    data(){
        return {
            list: [],  // 數據傳給list,列表渲染的數據
            total: 0, // 總記錄數,在接口返回數據后賦值給total
            currenPage: 1, // 當前頁碼
            pageSize: 10, // 每頁顯示的數據條數
            searchMap: {
                // 條件查詢綁定的條件值,搜索字段有四個
                member_card: "",
                member_name: "",
                pay_type: "",
                member_birthday: ""
            },
            payTypeOptions, // 這里要申明,要不然搜索框里使用的時候會報錯
            dialogFormVisible: false, //控制對話框,默認不彈出
            pojo: {
              // 提交的數據,不寫有時候會導致輸入框輸入不了
              id: null,
              member_card: "",
              member_name: "",
              member_birthday: "",
              phone_number: "",
              card_money: 0, // 輸入框里的默認值
              Available_integral: 0,
              pay_type: "",
              member_address: ""
            },
            rules: {
              // 校驗規則,blur 失去焦點的時候驗證,change 輸入值改變的時候驗證
              member_card: [{ required: true, message: "卡號不能為空", trigger: "blur" }],
              member_name: [{ required: true, message: "姓名不能為空", trigger: "blur" }],
              pay_type: [
                { required: true, message: "支付類型不能為空", trigger: "change" }
              ]
            }
          
        }
    },

    created() {
        // 調接口請求數據,將調接口定義一個方法,在created里調用這個方法
        
        this.fetchData()
    },

    methods: {
        fetchData(){
            // 獲取token
            const token = localStorage.getItem('zz-token')
            console.log(token)
            // this.pageSize,this.currenPage 分頁的條數和頁碼,要this.
            memberApi.getList(token,this.pageSize,this.currenPage,this.searchMap).then( response=>{
                const res = response.data
                this.total = res.total  // 將接口返回的total 覆蓋 data里的total
                this.list = res.data  // 將返回數據的data賦值給list
                // console.log(res)
            })

        },
        
      // 打開編輯窗口
      handleEdit(id) {
        console.log("編輯", id);
        this.handleAdd();  // 要打開窗口,清除數據,直接復用handleAdd就可以了
        // 獲取token
        const token = localStorage.getItem('zz-token')
        memberApi.getById(id,token).then(response => {
          const res = response.data;
          if (res.success) {
            this.pojo = res.data;  // 將數據賦值給pojo顯示在輸入框里
            console.log(this.pojo);  
          }
        });
      },
      // 刪除會員
      handleDelete(id) {
        console.log('刪除', id)
              this.$confirm('該操作將永久性刪除數據,請謹慎操作。', '提示', {
                  confirmButtonText: '確認',
                  cancelButtonText: '取消',
              }).then(() => {
                  // 確認
                  console.log('確認')
                  // 獲取token
                  const token = localStorage.getItem('zz-token')
                  memberApi.deleteById(id,token).then(response => {
                      // console.log(response)
                      const res = response.data
                      // 刪除成功或失敗的提示信息
                      this.$message({
                          message: res.msg,
                          type: res.success ? 'success': 'error'
                      })
                      if(res.success) {
                          // 刪除成功,刷新列表數據
                          this.fetchData()
                      }
                  })
              }).catch(() => {
                  // 取消,不用理會
                  console.log('取消')
              })
      },
        // 彈出新增窗口
      handleAdd() {
        // this.pojo = {}
        this.dialogFormVisible = true;
        this.$nextTick(() => {
          // this.$nextTick()它是一個異步事件,當渲染結束 之后 ,它的回調函數才會被執行
          // 彈出窗口打開之后 ,需要加載Dom, 就需要花費一點時間,我們就應該等待它加載完dom之后,再進行調用resetFields方法,重置表單和清除樣式
          // pojoForm 為 ref 對應的值
          this.$refs["pojoForm"].resetFields();
        });
        },

    // 提交新增數據,formName就是傳過來的pojoForm
    addData(formName) {
      // console.log('數據',formName)
      this.$refs[formName].validate(valid => {
        if (valid) {
          //提交表單
          console.log("addData");
          const token = localStorage.getItem('zz-token')
          // pojo才是提交到后台的數據,不是formName
          memberApi.add(this.pojo,token).then(response => {
            const res = response.data;
            if (res.success) {
              // 新增成功,提示語
              this.$message({
                message: res.msg,
                type: "success"
              })
              //新增成功,刷新列表數據
              this.fetchData();
              this.dialogFormVisible = false; // 關閉窗口
            } else {
              // 失敗,來點提示信息
              this.$message({
                message: res.msg,
                type: "warning"
              });
            }
          });
        } else {  // 沒有校驗通過,返回false
          return false;
        }
      });
    },
      // 更新接口
      updateData(formName) {
          console.log("updateData");
          this.$refs[formName].validate(valid => {
            if (valid) {
              const token = localStorage.getItem('zz-token')
              // 提交更新
              memberApi.update(this.pojo,token).then(response => {
                const res = response.data;
                if (res.success) {
                  // 刷新列表
                  this.fetchData();
                  this.dialogFormVisible = false; // 關閉彈窗
                  // 提示修改成功
                  this.$message({
                    message: res.msg,
                    type: "success"
                  });
                } else {
                  this.$message({
                    message: res.msg,
                    type: "warning"
                  });
                }
              });
            } else {  // 沒有校驗通過,返回false
              return false;
            }
          });
        },
        // 當每頁顯示條數改變后被觸發,val是最新的每頁顯示條數
        handleSizeChange(val) {
            this.pageSize = val;
            this.fetchData();
        },
        // 當頁碼改變后被觸發,val是最新的頁碼
        handleCurrentChange(val) {
            this.currenPage = val;
            this.fetchData();
          },

        // 重置功能,element ui 提供的功能
        resetForm(formName) {
          // 重置要看 el-form-item 組件元素的 prop 上是否指定了字段名,指定了才會重置生效
            this.$refs[formName].resetFields();
            this.fetchData();
          },
        
    },
    filters: {
    // 過濾器,轉換支付類型,type為1,2,3,4
    payTypeFilter(pay_type) {
      const payObj = payTypeOptions.find(obj => {
          // obj 就是上面的一個對象,type和上面對象的type進行對比,在返回
        return obj.pay_type === pay_type;
      });
      // payObj 有值,返回 payObj.name
      return payObj ? payObj.name : null; // 沒找到類型返回null,找到了返回payObj.name
    }
  }
}
</script>

至此,我們的會員管理系統就全部完成了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM