如何做好一款管理後臺框架

来源:https://www.cnblogs.com/hooray/archive/2022/12/26/17004953.html
-Advertisement-
Play Games

序 2020 年 10 月 17 日,我正式發佈了 Fantastic-admin 這款基於 Vue 的中後臺管理系統框架。在這兩年多的時間里,我陸續寫了幾篇我在開發這套框架中的一些心得和技術總結: 2020 年《我是如何設計後臺框架里那些錦上添花的動畫效果》 2020 年《一勞永逸,解決基於 ke ...


2020 年 10 月 17 日,我正式發佈了 Fantastic-admin 這款基於 Vue 的中後臺管理系統框架。在這兩年多的時間里,我陸續寫了幾篇我在開發這套框架中的一些心得和技術總結:

但是今年,有大半年的時間我幾乎銷聲匿跡,沒有產出一篇文章。除了一直在維護和迭代框架外,我也在思考一個問題,那就是:

如何才能做好一款管理系統框架?

有手就行?

這是“VUE後臺管理系統模板”網站上整理的一些相對做得比較出色,或者說有一定知名度的框架。當然這也只是冰山一角,如果去 Gitee 或者 Github 搜索 “後臺” “admin” 等關鍵詞,你還能發現更多。似乎寫一個後臺框架對前端開發來說,有手就行?

zvh62T.md.png

確實,一個標準的後臺管理系統,大部分基礎功能是相對統一的,因為它不像C端產品需要高度定製化。一個側邊或者頭部導航欄,通過配置自動生成;再預設幾套主題,方便切換;然後寫幾個通用模塊,比如用戶管理、角色管理、字典管理;最後再加個登錄頁,完善下許可權控制,基本就大功告成了。

要實現這些難麽?不難,對前端來說,確實有手就行。這也促使很多開發者選擇自己寫,寫完有興緻的還會推廣宣傳一番,反饋好就繼續維護,沒啥反饋可能就逐漸變成了一個自用框架或者棄坑了。

這也是為什麼網上有如此多後臺框架的原因,因為一直有新的框架出現,也有大量框架已經幾個月,甚至超過半年時間未更新,頗有一種「你方唱罷我登場」感覺。

給誰服務?

回歸到主題,既然要做好一款管理系統框架,那誰來定義這個“”呢,是客戶嗎?是,但又不全是。

任何一款技術框架或產品,最終一定是服務於客戶、服務於業務的,但做為一款管理系統框架,我認為更多還是服務於開發者,讓開發者用更少的時間,完成客戶或業務需求,那就是一款好的管理系統框架。

但是一個有手就能寫的框架,要讓開發者選擇使用你的,而不是自己去寫,想必肯定不是實現上面那些功能那麼簡單,那要如何服務好開發者呢?

如何服務?

既然確定是給開發者服務,那就需要確定開發者的痛點。好在我本身也是開發者,在公司內部業務開發中就有實際在使用,所以開發中的痛點還是比較好找的,無非以下幾點:

  • 通用業務組件少
  • 相似業務模塊需要頻繁拷貝代碼或文件
  • 特殊場景缺少統一解決方案
  • 框架本身提供API少,擴展性差

針對以上整理的幾點,下麵我會用幾個實際的例子來介紹下我是怎麼為開發者提供服務的,或者說我是怎麼服務自己的。

畢竟只要我自己覺得用得爽了,其他開發者的使用體驗也肯定不會太差,當然前提是拔高自我要求,以“人無我有,人有我優”做為目標。

通用業務組件少

這個痛點是相對比較容易解決的,因為市面上各種 UI 庫已經能滿足大部分的業務使用需求了,我只是做了一些二次封裝或補充。

比如在 Element Plus 的 Cascader 組件基礎上,封裝了省市區街道聯動組件,方便實現二級、三級和四級的選擇聯動:

zvH9Wn.md.png

再比如在 Element Plus 的 Upload 組件基礎上,封裝了圖片上傳組件,提供了多圖排序、多圖預覽、文件類型和數量限制等特性:

zvHFyV.md.png

除了對 Element Plus 進行一些二次封裝外,我還補充了一些組件,比如趨勢標記組件:

zvHmFJ.md.png

還有搜索面板組件:

zvHnY9.md.png

當然不僅僅是上面介紹的這些,更多可以訪問 演示站 進行查看。

我想說的就是,通用業務組件,是框架比較容易解決的一個痛點,因為它肉眼可見,通過原型圖或設計稿,找出一些頻繁在多個業務模塊中出現的功能,就可以考慮是否可以封裝成組件,從而減少開發者自己去實現的時間。

相似業務模塊需要頻繁拷貝代碼或文件

後臺系統里,一定有一些模塊在界面、操作邏輯上是高度相似的,比如各個模塊里的列表頁,它們都有搜索功能、數據展示、分頁功能。但又不完全一樣,比如數據源、搜索項、列表展示欄位都不一樣。

對於這種場景,我的做法是通過框架預設的目標,搭配互動式的指令去生成對應的文件。小到組件和單頁面的模板,大到整個模塊(包含列表頁、詳情頁、新增、編輯、刪除功能一應俱全),都可以通過幾個指令快速生成,如下圖:

當然開發者也可以根據具體業務場景,自行擴展需要生成的模板。

特殊場景缺少統一解決方案

這一塊的痛點,更多體現在框架自身的能力上,也是我認為決定框架是否好用中最大的因素。

因為上面提到了兩個痛點,即使框架做得不到位,開發者也能自己想辦法去解決。業務組件少可以自己寫,或者找三方別人寫好的組件;頻繁拷貝代碼也不是多大的問題,開發者可以藉助編輯器的代碼片段功能,或者其他方式去提高效率。

但一些稍微特殊的場景下,如果框架本身沒有考慮到,那需求只能向框架妥協,畢竟不是所有開發者都有能力去完整閱讀框架源碼,併進行二次開發定製功能。

說了這麼多,可能大家還不清楚到底有哪些特殊場景,這裡我舉幾個我遇到的:

大家可以對比下現在正在使用的框架是否能滿足這些場景下使用,也可以留言分享一些其他業務場景

1、導航欄按需隱藏

導航欄是個必備的功能,尤其是這種分欄佈局的導航(主導航+次導航),既然有分欄導航,那就會有次導航能否隱藏的場景,效果如下:

我的做法是通過兩個獨立的配置項組合使用,實現了這一場景,分別是 切換主導航時自動跳轉到次導航里第一個欄目路由次導航只有一個欄目時自動隱藏

2、標簽頁合併

標簽頁的實現是通過路由切換來實現的,每訪問一個路由就會增加一個標簽頁。

但有的場景需要對標簽頁進行合併,比如反覆從列表頁打開不同條目的編輯頁,因為每個編輯頁的路由不同,所以對應也會生成多個標簽頁,這時候就希望能將所有編輯頁的標簽頁合併成一個,效果如下:

既然有編輯頁合併的場景,那也會有列表頁和編輯頁合併的場景,比如同個模塊下,不管是列表頁,還是編輯頁,或者其他同屬於該模塊下的頁面,都希望能合併成一個標簽頁,效果如下:

這塊我的做法是提供了一個合併規則的配置項,預設不合併,同時支持 根據路由name進行合併根據activeMenu進行合併 兩條合併規則,分別對應了上面兩個場景,具體配置可參考文檔介紹。

3、頁面按需緩存

在瞭解這個場景前,我們先要知道什麼是頁面緩存,就是當用戶離開當前頁面後,再返回該頁面,需要複原離開時的所有狀態,這就是頁面緩存。

頁面緩存是一個比較常見的場景,部分框架也提供了支持,但按需緩存,也就是根據離開並訪問的目標頁面,判斷是否需要對當前頁進行緩存,舉個例子:

假設 A 頁面的緩存規則是,如果離開並訪問 B 頁面則進行緩存,訪問其他頁面則不緩存;或者只有離開並訪問 B 頁面不緩存,訪問其他頁面則都需要緩存。

如果是上面假設的這兩個場景,按照大部分框架提供的能力(即在路由配置里提供一個頁面是否開啟緩存的設置項),可能就不一定能滿足了,因為頁面緩存只提供了兩種狀態,即始終緩存和始終不緩存。

而我的做法是分別提供了 cachenoCache 兩個設置項,開發者可以對 cache 設置 true/false 值以滿足頁面始終緩存或始終不緩存的場景,也可以設置路由的name,實現精細化緩存控制,還是拿上面兩個場景舉例,就可以輕鬆配置成:

// A 頁面離開並訪問 B 頁面則進行緩存,訪問其他頁面則不緩存
cache: 'b-route-name' // B頁面路由name

// A 頁面只有離開並訪問 B 頁面不緩存,訪問其他頁面則都需要緩存
cache: true,
noCache: 'b-route-name'  // B頁面路由name

更多細節可參考文檔介紹。

框架本身提供API少,擴展性差

這一痛點的根本原因其實是上一個痛點造成的,因為能力少,所以能暴露出的內部方法就不多,所以能提供的 API 自然也就少了。

這裡我就介紹幾個簡單的 API ,大家可以點預覽鏈接看實際效果:

1、主導航切換

import useMenu from '@/utils/composables/useMenu'

const { switchTo } = useMenu()

switchTo(index)

預覽

2、主頁面刷新

import useMainPage from '@/utils/composables/useMainPage'

const { reload } = useMainPage()

reload()

預覽

3、主頁面最大化

import useMainPage from '@/utils/composables/useMainPage'

const { maximize } = useMainPage()

// status: true / false
maximize(status)

預覽

4、動態標題

有時候,我們需要在某個頁面顯示自定義的標題,而不是 meta.title 欄位,比如在編輯用戶的頁面,顯示當前用戶的名稱。

import useSettingsStore from '@/store/modules/settings'
const settingsStore = useSettingsStore()

onMounted(() => {
  settingsStore.setTitle('測試標題')
})

預覽

5、標簽頁相關

提供了打開、關閉、檢驗等 API 。

預覽

結尾

寫到這裡,想扯點題外話。

今年的某個時間,我突然對“程式員轉行,最適合轉產品經理”這句話有了更多認同感。而在程式員這個大類里,我認為前端開發是其中尤為適合轉產品經理的。

因為大部分客戶不在乎你用什麼技術,他們只看中“外表”,像界面是否好看,操作是否合理,動效是否流暢,而前端開發大部分日常工作內容就是在和這些打交道。當接觸了足夠多的業務需求,就越瞭解客戶想要的是什麼,就能在下個業務需求里快速找出其中的痛點或者不合理的地方,並提供一個相對成熟的解決方案,這同時也是一個產品經理所應該具備的能力和經驗。

就像我寫的這款管理系統框架,這一年我不滿足於堆砌新特性,而是在此基礎上思考怎麼更好的去服務使用我這套框架的開發者,不僅滿足他們的需求,還要讓他們用得舒適,正如 Fantastic-admin 官網首頁的標語——“開箱即用,提供舒適開發體驗”。

感謝大家閱讀到這裡,希望文中我的拙見能給大家帶來一些啟發。

新博客地址
hooray.github.io
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大數據時代,NoSQL資料庫是企業構建數據能力的核心工具之一。近期,在2022騰訊全球數字生態大會NoSQL資料庫專場上,騰訊雲發佈了多項NoSQL產品能力升級,並重點講解了其背後的自研技術要點及實現細節,分享了騰訊雲NoSQL為廣大企業提供的高可靠、高效率、低成本的企業級特性及行業解決方案。 開場 ...
  • 雖然說 MongoDB 是無模式的,但實際上模式設計在 MongoDB 中也非常重要。在實際開發中,大多數性能問題都可以追溯到糟糕的模式設計。 ...
  • 本文根據digoal(德哥)在〖2019 DAMS中國數據智能管理峰會〗現場演講內容整理而成。 講師介紹 digoal(德哥),PostgreSQL中國社區發起人之一、常委、兼任社區大學校長。阿裡雲資料庫首席專家團隊成員,提供資料庫首席專家服務。現任職於阿裡雲資料庫團隊,主要負責阿裡雲Postgre ...
  • 移動設備硬體的高速發展,讓游戲行業發生翻天覆地的變化,許多酷炫的游戲效果不再局限於電腦端,玩家在移動端就能享受到場景更逼真、畫質更清晰、體驗更流暢的游戲服務。但由於移動設備算力不足,為了實現真實感的水體效果,很多游戲廠商採用預計算的方法減少實時模擬的計算開銷,但水體場景在移動端的流體效果仍然不佳。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前段時間,對部門的個別項目進行Vue3.0+ts框架的遷移,剛開始研究的時候也是踩坑特別多,尤其我們的項目還有些特殊的webpack配置,所以,研究vue.config.js的配置的時候也是查閱了各種資料文檔,最終,完成了項目webpac ...
  • 在 JavaScript 中,有時候你可能會發現 0.1+0.2 不等於 0.3。這是因為 JavaScript 使用的是浮點數來表示小數,而浮點數在電腦內部是用二進位表示的,這導致了一些精度問題。 ...
  • 在 JavaScript 中,巨集任務和微任務是指在執行代碼的過程中的兩種不同的任務類型。 巨集任務(macro task)指的是瀏覽器在執行代碼的過程中會調度的任務,比如事件迴圈中的每一次迭代、setTimeout 和 setInterval 等。巨集任務會在瀏覽器完成當前同步任務之後執行。 微任務(m... ...
  • 今天,收到一個很有意思的提問,如何實現類似如下的背景效果圖: 嗯?核心主體是由多個六邊形網格疊加形成。 那麼我們該如何實現它呢?使用純 CSS 能夠實現嗎? 當然可以,下麵我們就將嘗試如何使用 CSS 去實現這樣一個背景效果。 如何繪製六邊形? 首先,看到這樣一個圖形,如果想要使用一個標簽完成整個背 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...