VUE+Element 前端是一個純粹的前端處理,前面介紹了很多都是Vue+Element開發的基礎,從本章隨筆開始,就需要進入深水區了,需要結合ABP框架使用(如果不知道,請自行補習一下我的隨筆:ABP框架使用),ABP框架作為后端,是一個非常不錯的技術方向,但是前端再使用Asp.NET 進行開發的話,雖然會快捷一點,不過可能顯得有點累贅了,因此BS的前端選項采用Vue+Element來做管理(后續可能會視情況加入Vue+AntDesign),CS前端我已經完成了使用Winform+ABP的模式了,本篇隨筆主要介紹Vue+Element+ABP的整合方式,先從登錄開始介紹,
1、ABP開發框架的回顧
ABP是ASP.NET Boilerplate的簡稱,ABP是一個開源且檔案友好的應用程式框架,ABP不僅僅是一個框架,它還提供了一個最徍實踐的基于領域驅動設計(DDD)的體系結構模型,
啟動Host的專案,我們可以看到Swagger的管理界面如下所示,

我們登錄獲得用戶訪問令牌token后,測驗字典型別或者字典資料的介面,才能回傳回應的資料,

我根據ABP后端專案之間的關系,整理了一個架構的圖形,
應用服務層是整個ABP框架的靈魂所在,對內協同倉儲物件實作資料的處理,對外配合Web.Core、Web.Host專案提供Web API的服務,而Web.Core、Web.Host專案幾乎不需要進行修改,因此應用服務層就是一個非常關鍵的部分,需要考慮對用戶登錄的驗證、介面權限的認證、以及對審計日志的記錄處理,以及例外的跟蹤和傳遞,基本上應用服務層就是一個大內總管的角色,重要性不言而喻,

對于通過Winform方式展示界面,以Web API方式和后端的ABP的Web API服務進行資料互動,是我們之前已經完成的專案,專案界面如下所示,

主體框架界面采用的是基于選單的動態生成,以及多檔案的界面布局,具有非常好的美觀性和易用性,
左側的功能樹串列和頂部的選單模塊,可以根據角色擁有的權限進行動態構建,不同的角色具有不同的選單功能點,如下是測驗用戶登錄后具有的界面,
2、Vue+Element整合ABP框架的前端登錄處理
之前我們開發完成的Vue+Element的前端專案,默認已經具有登錄系統的功能,不過登錄是采用mock方式進行驗證并處理的,本篇隨筆介紹是基于實際的ABP專案進行用戶身份的登錄處理,這個也是開發其他介面展示資料的開始步驟,必須通過真實的用戶身份登錄后臺,獲得對應的token令牌,才能進行下一步介面的開發作業,
例如對應登錄界面上,界面效果如下所示,

在用戶登錄界面中,我們處理用戶登錄邏輯代碼如下所示,
// 處理登錄事件 handleLogin() { this.$refs.loginForm.validate(valid => { if (valid) { this.loading = true this.$store .dispatch('user/login', this.loginForm) .then(() => { this.$router.push({ path: this.redirect || '/' }) this.loading = false }) .catch(() => { this.loading = false }) } else { console.log('error submit!!') return false } }) }
這里主要就是呼叫Store模塊里面的用戶Action處理操作,
例如對于用戶store模塊里面的登錄Action函式如下所示,
const actions = { // user login login({ commit }, userInfo) { const { username, password } = userInfo return new Promise((resolve, reject) => { login({ username: username.trim(), password: password }).then(response => { const { result } = response // 獲取回傳物件的 result var token = result.accessToken var userId = result.userId // 記錄令牌和用戶Id commit('SET_TOKEN', token) commit('SET_USERID', userId) // 存盤cookie setToken(token) setUserId(userId) resolve() }).catch(error => { reject(error) }) }) },
而其中 login({ username: username.trim(), password: password }) 操作,是通過API封裝處理的呼叫,使用前在Store模塊中先引入API模塊,如下所示,
import { login, logout, getInfo } from '@/api/user'
而其中 API模塊代碼如下所示,
export function login(data) { return request({ url: '/abp/TokenAuth/Authenticate', method: 'post', data: { UsernameOrEmailAddress: data.username, password: data.password } }) }
這里我們用了一個/abp的前綴,用來給WebProxy的處理,實作地址的轉義,從而可以實作跨站的處理,讓前端呼叫外部地址就和呼叫本地地址一樣,無縫對接,
我們來看看vue.config.js里面對于這個代理的轉義操作代碼,

而 http://localhost:21021/api 地址指向的專案,是我們本地使用ABP開發的一個后端Web API專案,我們可以通過地址 http://localhost:21021/swagger/index.html 進行介面的查看,

我們打開獲取授權令牌的Authenticate介面,查看它的介面定義內容

通過標注的1,2,我們可以看到這個介面的輸入引數和輸出JSON資訊,從而為我們封裝Web API的呼叫提供很好的參考,
ABP框架統一回傳的結果是result,這個result里面才是回傳對應的介面內容,如上面的輸出JSON資訊里面的定義,
所以在登陸回傳結果后,我們要回傳它的result物件,然后在進行資料的處理,
const { result } = response // 獲取回傳物件的 result
然后通過result來訪問其他屬性即可,
var token = result.accessToken // 用戶令牌 var userId = result.userId // 用戶id
用戶登錄成功后,并獲取到對應的資料,我們就可以把必要的資料,如token和userid存盤在State和Cookie里面了,
// 修改State物件,記錄令牌和用戶Id commit('SET_TOKEN', token) commit('SET_USERID', userId) // 存盤cookie setToken(token) setUserId(userId)
有了這些資訊,我們就可以進一步獲取用戶的相關資訊,如用戶名稱、介紹,包含角色串列和權限串列等內容了,
例如對應用戶資訊獲取介面的ABP后端地址是 http://localhost:21021//api/services/app/User/Get

那么我們前端就需要在API模塊里面構建它的訪問地址(/abp/services/app/User/Get)和介面處理了,
export function getInfo(id) { return request({ url: '/abp/services/app/User/Get', method: 'get', params: { id } }) }
如上所示,在Store模塊里引入API模塊,如下所示,
import { login, logout, getInfo } from '@/api/user'
然后在Store模塊中封裝一個Action用來處理用戶資訊的獲取的,
// 獲取用戶資訊 getInfo({ commit, state }) { return new Promise((resolve, reject) => { getInfo(state.userid).then(response => { const { result } = response console.log(result) // 輸出測驗 if (!result) { reject('Verification failed, please Login again.') } const { roles, roleNames, name, fullName } = result // 角色非空提醒處理 if (!roles || roles.length <= 0) { reject('getInfo: roles must be a non-null array!') } commit('SET_ROLES', { roles, roleNames }) commit('SET_NAME', name) // commit('SET_AVATAR', avatar) //可以動態設定頭像 commit('SET_INTRODUCTION', fullName) resolve(result) }).catch(error => { reject(error) }) }) },

Vue + Element前端專案的視圖、Store模塊、API模塊、Web API之間關系如下所示,

登錄后我們獲取用戶身份資訊,在控制臺中記錄回傳物件資訊,可以供參考,如下所示
有了token資訊,我們就可以繼續其他介面的資料請求或者提交了,從而可以實作更多的管理功能了,
后續隨筆將基于ABP介面對接的基礎上進行更多界面功能的開發和整合,
為了方便讀者理解,我列出一下前面幾篇隨筆的連接,供參考:
循序漸進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 前端應用開發(10)--- 基于vue-echarts處理各種圖表展示
循序漸進VUE+Element 前端應用開發(11)--- 圖示的維護和使用
循序漸進VUE+Element 前端應用開發(12)--- 整合ABP框架的前端登錄處理
循序漸進VUE+Element 前端應用開發(13)--- 前端API介面的封裝處理
循序漸進VUE+Element 前端應用開發(14)--- 根據ABP后端介面實作前端界面展示
循序漸進VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理
循序漸進VUE+Element 前端應用開發(16)--- 組織機構和角色管理模塊的處理
循序漸進VUE+Element 前端應用開發(17)--- 選單管理
循序漸進VUE+Element 前端應用開發(18)--- 功能點管理及權限控制
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/21641.html
標籤:Html/Css
