循序漸進VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理

来源:https://www.cnblogs.com/wuhuacong/archive/2020/07/13/13293106.html
-Advertisement-
Play Games

在前面隨筆介紹了ABP+Vue前後端的整合處理,包括介紹了ABP的後端設計,以及前端對ABP介面API的ES6的封裝,通過JS的繼承類處理,極大減少了重覆臃腫的代碼,可以簡化對後端API介面的封裝,而且前端使用Element組件,很好展示API獲得的數據,通過在界面中展示樹狀列表,以及表格列表數據,... ...


在前面隨筆介紹了ABP+Vue前後端的整合處理,包括介紹了ABP的後端設計,以及前端對ABP介面API的ES6的封裝,通過JS的繼承類處理,極大減少了重覆臃腫的代碼,可以簡化對後端API介面的封裝,而且前端使用Element組件,很好展示API獲得的數據,通過在界面中展示樹狀列表,以及表格列表數據,可以構建一個很好的列表展示界面,而常規的界面,通過也包括了新增、編輯、查看等展示場景,一般我們通過對話框的方式進行展示處理。本篇隨筆以許可權管理模塊中的用戶管理為媒介,進行相關功能的介紹和界面設計的處理。

1、許可權管理模塊的設計

我們知道,許可權管理一般都會涉及到用戶、組織機構、角色,以及許可權功能等方面的內容,ABP框架的基礎內容也是涉及到這幾方面的內容,其中它們之間的關係基本上是多對多的關係,它們的關係如下所示。

 許可權模塊裡面包含的一些主對象表和中間表,中間表主要用來存儲兩個對象之間的多對多關係,如角色包含多個用戶,用戶屬於多個機構,機構包含多個角色等等。

結合ABP後端提供的介面,Vue前端我們要實現基礎的用戶、組織機構、角色、功能許可權等內容的管理,以及維護它們之間的關係。Vue前端對於許可權管理模塊的菜單列表如下所示。

 上圖許可權管理模塊中,包括用戶管理、機構管理、角色管理、菜單管理、功能管理、審計日誌、登錄日誌等內容模塊的管理。 

其中用戶管理模塊,主要用來展示用戶信息列表,以及查看對應用戶許可權、維護密碼等處理。

用戶列表界面如下所示,包括對應條件的查詢和列表展示、以及查看、添加、編輯、刪除、重置密碼等功能入口。

用戶信息查看界面如下所示

 主要展示用戶基礎信息,和所屬的關係信息,其中許可權部分列出對應用戶包含的功能點,用於界面按鈕等方面的控制處理。

  用戶添加界面,則主要用來處理錄入用戶基礎信息部分即可,如下界面所示。

 用戶信息錄入,對用戶基礎表單數據進行校驗,符合格式要求才能錄入。

用戶編輯界面,基本上和上面的類似了,不在贅述。

另外,刪除用戶或者重置密碼,一般需對確認後再行操作,彈出一個對話框用戶確認再繼續。

ABP+Vue的框架參考的是已完成的ABP+Winform的功能界面進行開發,具體也可以瞭解下Winform版本框架《ABP開發框架前後端開發系列---(14)基於Winform的ABP快速開發框架》 

 

2、用戶管理界面功能

以上我們介紹了許可權管理模塊涉及的內容和關係,並著重介紹了用戶管理界面中的內容展示,下麵介紹在Element中如何實現對上面界面的處理的。

首先我們需要根據ABP後端的介面進行前端JS端的類的封裝處理,其中前面說過,常規的Get/GetAll/Create/Update/Delete/Count等介面,我們放在BaseApi基類裡面定義,其他子類繼承它即可。

許可權模塊我們涉及到的用戶管理、機構管理、角色管理、菜單管理、功能管理、審計日誌、登錄日誌等業務類,那麼這些類繼承BaseApi,就會具有相關的介面了,如下所示繼承關係。

 我們這裡以UserAPI的JS類定義介紹,如下所示。

 我們以其中一個介面為例進行介紹實現代碼,可以看到主要就是簡單封裝的調用即可。

  GetGrantedFunctionsByUser(id) { // 獲取用戶許可權列表
    return request({
      url: this.baseurl + 'GetGrantedFunctionsByUser',
      method: 'get',
      params: { id }
    })
  }

有了這些業務類的準備,那麼我們和後端ABP的API介面對接,就很容易了,如下圖所示。

剩下的就是對Vue + Element前端的界面處理事情了。

我們先來看看查詢的處理,常規的查詢涉及日期區間的查詢處理,這裡我們用一個一個查詢日期的處理操作,如下圖所示。

 表單的界面代碼如下所示 

    <el-form ref="searchForm" :model="searchForm" label-width="80" :inline="true">
      <el-form-item label="創建時間">
        <el-date-picker
          v-model="searchForm.creationTime"
          type="daterange"
          align="right"
          unlink-panels
          range-separator="至"
          start-placeholder="開始日期"
          end-placeholder="結束日期"
          :picker-options="pickerOptions"
        />
      </el-form-item>
      <el-form-item label="用戶名" prop="UserName">
        <el-input v-model="searchForm.UserName" />
      </el-form-item>
      <el-form-item label="手機" prop="PhoneNumber">
        <el-input v-model="searchForm.PhoneNumber" />
      </el-form-item>
    </el-form>

其中定義了一個pickerOptions 屬性,用於快速選擇日期的,在data裡面增加一個這樣的屬性即可。

      pickerOptions: {
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一個月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近三個月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
            picker.$emit('pick', [start, end]);
          }
        }]
      },

在頁面裡面,我們定義了一些分頁查詢的處理條件和對象,如下所示。

  查詢表單則定義一個單獨的表單對象,如下代碼所示

      searchForm: { // 查詢表單
        UserName: '',
        PhoneNumber: '',
        creationTime: ''
      },

頁面載入準備好,我們就調用獲取列表的數據即可。

  created() { // 頁面載入後,載入列表數據
    this.getlist()
  },

獲取列表的處理操作如下代碼所示,主要就是準備構建好對應的查詢參數,然後調用UserApi類的介面查詢列表即可。

    getlist() { // 列表數據獲取
      var CreationTimeStart = ''
      if (this.searchForm.creationTime && this.searchForm.creationTime.length > 0) {
        CreationTimeStart = this.parseTime(this.searchForm.creationTime[0], '{y}-{m}-{d}')
      }
      var CreationTimeEnd = ''
      if (this.searchForm.creationTime && this.searchForm.creationTime.length > 1) {
        CreationTimeEnd = this.parseTime(this.searchForm.creationTime[1], '{y}-{m}-{d}')
      }

      var param = { // 構造常規的分頁查詢條件
        SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize,
        MaxResultCount: this.pageinfo.pagesize,
        // 過濾條件
        UserName: this.searchForm.UserName,
        PhoneNumber: this.searchForm.PhoneNumber,
        CreationTimeStart: CreationTimeStart,
        CreationTimeEnd: CreationTimeEnd
      };

      // 獲取列表,綁定到模型上,並修改分頁數量
      this.listLoading = true
      user.GetAll(param).then(data => {
        this.list = data.result.items
        this.pageinfo.total = data.result.totalCount
        this.listLoading = false
      })
    },
    search() { // 查詢列表處理
      this.pageinfo.pageindex = 1;// 重置為第一頁=
      this.getlist()
    },

通過列表的查詢操作,我們就可以把數據獲取到,界面就會得到及時的更新顯示了

      // 獲取列表,綁定到模型上,並修改分頁數量
      this.listLoading = true
      user.GetAll(param).then(data => {
        this.list = data.result.items
        this.pageinfo.total = data.result.totalCount
        this.listLoading = false
      })

而列表主要就是在界面使用el-table組件進行展示的了,如下圖所示代碼。

  el-table綁定了對應的數據,並設置好顯示的格式以及選擇操作事件、行雙擊事件等操作。

而el-table裡面的顯示的列,需要根據我們返回數據的屬性名稱進行顯示,如下代碼所示。

  而如果我們需要對屬性進行特殊的展示,我們就需要使用v-if條件或者過濾器進行處理了。如下是根據不同內容,構建標簽顯示內容。

      <el-table-column align="center" label="賬號激活" width="80">
        <template slot-scope="scope">
          <el-tag v-if="scope.row.isActive === true" type="success" effect="dark">已激活</el-tag>
          <el-tag v-else type="danger" effect="dark">未激活</el-tag>
        </template>
      </el-table-column>

而對於時間,我們則可以使用格式化函數或者過濾器規範顯示的格式內容。

<el-table-column align="center" label="創建時間" width="120" prop="creationTime" :formatter="dateFormat" />

其中 :formatter="dateFormat"  指定了對應的格式化處理函數。

    dateFormat(row, column, cellValue) {
      // this.parseTime是在main.js中的全局掛載函數
      return cellValue ? this.parseTime(cellValue, '{y}-{m}-{d}') : '' // 完整格式:{y}-{m}-{d} {h}-{i}-{s}
    },
    timeFormat(row, column, cellValue) {
      // this.parseTime是在main.js中的全局掛載函數
      return cellValue ? this.parseTime(cellValue, '{y}-{m}-{d} {h}:{i}:{s}') : '' // 完整格式:{y}-{m}-{d} {h}-{i}-{s}
    }

另外,操作列的代碼,主要就是構建一些方法操作的入口,並傳遞對應的變數,如ID值即可。

      <el-table-column align="center" label="操作" width="190">
        <template scope="scope">
          <el-row>
            <el-tooltip effect="light" content="查看" placement="top-start">
              <el-button icon="el-icon-search" type="success" circle size="mini" @click="showView(scope.row.id)" />
            </el-tooltip>
            <el-tooltip effect="light" content="編輯" placement="top-start">
              <el-button icon="el-icon-edit" type="primary" circle size="mini" @click="showEdit(scope.row.id)" />
            </el-tooltip>
            <el-tooltip effect="light" content="刪除" placement="top-start">
              <el-button icon="el-icon-delete" type="danger" circle size="mini" @click="showDelete(scope.row.id)" />
            </el-tooltip>
            <el-tooltip effect="light" content="重置密碼" placement="top-start">
              <el-button icon="el-icon-setting" type="warning" circle size="mini" @click="showSetPass(scope.row.id)" />
            </el-tooltip>
          </el-row>
        </template>
      </el-table-column>

列表的底部分頁處理,也是利用對應的屬性進行顯示即可,並處理分頁變化的事件。

    <div class="block" style="height:70px;">
      <el-pagination
        :current-page="pageinfo.pageindex"
        :page-size="pageinfo.pagesize"
        :total="pageinfo.total"
        :page-sizes="[10,20,30,40]"
        layout="total, sizes, prev, pager, next"
        @size-change="sizeChange"
        @current-change="currentChange"
      />
    </div>

最後完成列表界面代碼,顯示列表界面如下所示。

而對於查看、編輯、新增等對話框,一般我們需要創建對應的表單屬性,用來承載對應的信息的,如我們為了查看信息的需要,創建一個viewForm的對象,如下所示。

      viewForm: { // 查看表單
        id: '',
        userName: '',
        surname: '',
        name: '',
        emailAddress: '',
        phoneNumber: '',
        ouNames: ''
      },

 

 在查看信息對話框裡面,我們展示對應的用戶信息,包括基礎信息和相關的關係,如下界面代碼所示。

 界面組件通過v-modal進行綁定對應的ViewForm屬性對象即可。

最後,我們在觸發showView函數裡面,獲取對應的用戶信息,然後展示在界面上即可,showView函數代碼如下所示。

    showView(id) { // 顯示查看對話框處理
      var param = { id: id }
      user.Get(param).then(data => {
        // console.log(data.result)
        Object.assign(this.viewForm, data.result);

        this.getOuName(id).then(result => {
          this.viewForm.ouNames = result
        })
      })
      this.getFunctionsByUser(id)

      this.isView = true
    },

查看界面效果如下所示。

在新增或者編輯處理界面中,我們修改了數據,都會提交到ABP後端進行錄入或者更新,因此就涉及到數據的回寫處理,然後提示客戶端狀態即可。

下麵是保存編輯界面的內容操作。

    saveEdit() { // 保存數據處理
      this.$refs['editForm'].validate(valid => {
        if (valid) {
          // 保存數據
          const form = this.editForm
          user.Update(form).then(data => {
            // console.log(data)
            if (data.success) {
              // 提示信息
              this.msgSuccess('更新成功!')
              // 刷新數據
              this.getlist()
            } else {
              this.msgError('更新失敗:' + data.error)
            }

            this.$refs['editForm'].resetFields()
            // 重置視窗狀態
            this.closeDialog()
          })
        }
      })
    },

其中msgSuccess、msgError 是全局掛載的提示信息函數,在入口main.js裡面統一處理,封裝的函數方便在各個界面中統一處理。

 以上就是關於用戶管理界面的內容介紹,其中涉及到前端API類的封裝處理,界面組件的使用,以及一些常規操作,希望能夠帶給大家一些vue+element開發界面的參考。 

 

為了方便讀者理解,我列出一下前面幾篇隨筆的連接,供參考:

循序漸進VUE+Element 前端應用開發(1)--- 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)--- Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)--- 動態菜單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)--- 獲取後端數據及產品信息頁面的處理

循序漸進VUE+Element 前端應用開發(5)--- 表格列表頁面的查詢,列表展示和欄位轉義處理

循序漸進VUE+Element 前端應用開發(6)--- 常規Element 界面組件的使用

循序漸進VUE+Element 前端應用開發(7)--- 介紹一些常規的JS處理函數

循序漸進VUE+Element 前端應用開發(8)--- 樹列表組件的使用

循序漸進VUE+Element 前端應用開發(9)--- 界面語言國際化的處理

循序漸進VUE+Element 前端應用開發(11)--- 圖標的維護和使用

循序漸進VUE+Element 前端應用開發(12)--- 整合ABP框架的前端登錄處理

循序漸進VUE+Element 前端應用開發(13)--- 前端API介面的封裝處理

循序漸進VUE+Element 前端應用開發(14)--- 根據ABP後端介面實現前端界面展示

循序漸進VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 選擇排序: 第一輪: 第0個與第1個比, 如果 第0個 > 第1個 那就交換位置,第0個再與第2個比...... 第二輪: 第1個與第2比, ...................直到排序完成 let arr = [5,4,3,2,1] for(let i = 0; i < arr.length - ...
  • 參考網站 https://visualgo.net/ 冒泡排序: 前後兩個數兩兩進行比較 前 < 後, 則後面一個繼續與下一個比較 前 > 後,則交換位置,再與下一個比較 第一輪比較完成可以確定最後一個數字的位置 再進行第二輪來確定倒數第二個的位置 直到排序完成 arr.length = 5 關於 ...
  • 在參考小米官網寫頁面你時,會發現小米中有很多的矢量圖標,小米的圖標或許是自己的,但是我們寫頁面時要用到矢量圖標時怎麼辦,可以使用阿裡提供的圖標庫 阿裡矢量圖標庫網址:https://www.iconfont.cn/?spm=a313x.7781069.1998910419.d4d0a486a 註冊一 ...
  • 最近仿造了小米官網寫了一遍,可以說是完全把官網給寫完了。 官網中有一個log切換的動態效果,有點把我卡住了找方法找了許久,然後用一個簡單的方法實現了: 先瞭解一下before和after兩個屬性選擇器: before:在元素之前插入內容; after:在元素之後插入內容; 兩個屬性可以添加圖片類型, ...
  • 🌸本文主要內容: 各排序演算法時間複雜度 js預設sort演算法於各瀏覽器中的實現 1.冒泡排序 2.選擇排序 3.插入排序 4.歸併排序(含小動畫) 5.快速排序(含小動畫) 時間複雜度 O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2n) ...
  • 系統提供的排序方法(一般情況下,我們需要自己進行編寫排序演算法) reverser( ) 逆向排序 格式: 數組.reverse( ) let arr = [1,2,3,4,5]; arr.reverse(); console.log(arr);//列印結果為[5,4,3,2,1] sort( ) 將 ...
  • 一 通過迴圈按行順序為5*5的二維數組,a賦值1到25的自然數, 二 然後輸出該數組的左下半三角形,試編程。 [ 1, 2, 3, 4, 5 ] [ 6, 7, 8, 9, 10 ] [ 11, 12, 13, 14, 15 ] [ 16, 17, 18, 19, 20 ] [ 21, 22, 23 ...
  • <style> html{ display: none; <!--開始的時候讓頁面全部隱藏--> } </style> <script> function Web_Presentation() { document.querySelector('html').style.display='block ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...