CRUD最佳實踐PasteForm及項目模板的製作視頻,讓重覆的CRUD更加簡單直接[附帶源碼和視頻](三)

来源:https://www.cnblogs.com/pastespider/p/18404029
-Advertisement-
Play Games

關說不練假把式,在上一,二篇中介紹了我心目中的CRUD的樣子 基於之前的理念,我開發了一個命名為PasteTemplate的項目,這個項目呢後續會轉化成項目模板,轉化成項目模板後,後續需要開發新的項目就可以基於這個模板創建,這樣就不要copy一個舊的項目,然後刪刪刪,改改改,重命名等操作了 強迫症, ...


關說不練假把式,在上一,二篇中介紹了我心目中的CRUD的樣子

image

基於之前的理念,我開發了一個命名為PasteTemplate的項目,這個項目呢後續會轉化成項目模板,轉化成項目模板後,後續需要開發新的項目就可以基於這個模板創建,這樣就不要copy一個舊的項目,然後刪刪刪,改改改,重命名等操作了
強迫症,一個項目的名字就得統一,心裡才舒服
那麼本次作者就帶來了實物,本次主要介紹管理端的內容,我們一起來看看
image

這個是後臺,目前使用的是HTML原生寫的,如果說使用VUE的話,會更簡單,這個後續看情況推出!
先用原生的原因呢,一是順手,二是前期是規劃期,改動比較多,這個項目開發過程我是錄製了視頻的,後續會和項目模板一併放出來!

這個管理端有多少代碼?

可能說代碼量不太合適,我就列出下各個文件的大概情況(文件採用鬆散編輯模式,就是一個花括弧就一行的寫法,所以不存在刻意壓縮代碼行的問題哈!)

文件 大小 行數 說明
login/index.html 8KB 177 登陸頁面,賬號密碼驗證碼登陸
login.less 9KB 381 登陸頁面的樣式文件
pasteform/index.html 12KB 212 表格列表頁面的主UI頁面
pasteform/index.js 22KB 682 表格頁面的主邏輯JS頁面
pasteform/index.less 14KB 656 表格頁面的樣式文件
pasteform/view.html 12KB 184 表單新增編輯頁面的UI文件
pasteform/view.js 27KB 820 表單新增編輯頁面的邏輯JS代碼
pasteform/view.less 10KB 499 表單編輯新增頁的樣式文件
index.html 11KB 225 首頁,也就是菜單頁面,上圖的這個主頁面,菜單採用API獲取的動態方式
index.less 5KB 311 首頁的樣式文件
lib/api.js 18KB 598 ajax請求,一些基礎函數的轉化等,相當於幫助類

還有一些其他的三方組件,比如jquery.js,layer.js,daterange.js,pagenum.js,datepicker.js,template.js,wangedit.js等

為啥才這麼幾個文件?

看上圖至少有4個表為啥才這麼幾個文件?
文件復用了
比如許可權的列表頁面為pasteform/index.html?path=roleInfo,而用戶的列表頁面為pasteform/index.html?path=userInfo
對應的表單頁面為pasteform/view.html?path=roleInfo和pasteform/view.html?path=userInfo
image

實現原理

在執行UI之前,獲取對應的模型的模型內容,比如新增的時候,獲取對應的AddDto模型的模型屬性,包括不限於,包含了哪些屬性(是否禁用add,edit,del等),有哪些欄位,欄位的特性是哪些,還有就是欄位的預設值!
同理在編輯的時候,會把要編輯的主鍵帶入API中,先查詢這個UpdateDto的模型數據,然後基於ID獲取這個模型的值,組合後返回給前端
至於表格,請求的時候要讀取ListDto和對應的搜索InputQueryDto的內容!

表格頁面功能介紹

image

從上圖中可以看到大概幾個要點!
1.左側的菜單是採用動態模式的,看圖的中間部分的菜單類型可以看到和左側的一一對應!
2.右側區域的功能都是動態的,貌似除了關鍵字輸入和搜索按鈕是固定的,其他都是動態控制的
3.搜索區域的內容和類型由後端的InputQueryXXX的模型來控制
4.新增,編輯和刪除按鈕由對應模型的ListDto控制
5.列表中支持排序,比如上圖的ID,排序,層級等
6.列表中支持直接顯示外表的對應欄位,比如父級ID那一列,直接顯示了父級ID對應的許可權的名稱
7.支持狀態快編,也就如上圖的switch,這個是可以交互的!

外表輸入

image

支持外表輸入,比如要查詢某一個角色有多少用戶,那麼用戶列表中,角色ID作為篩選,那角色ID不能自己手動輸入吧
點擊後,會彈出角色列表頁面,選擇要查詢的,然後點擊確定,就會把對應的值輸入到輸入框中(顯示的是友好名)
image

在Model中是這樣配置外表選擇的
image

時間區間

有些時候需要查詢時間區間,比如本月新增的用戶有多少
image

在Model中,時間區間其實是由2個欄位表示的,開始欄位和結束欄位,當然了結束欄位需要配置隱藏,如下圖
image

單選

有時候查詢需要選擇某一個狀態,比如查詢禁用的用戶有多少,查詢狀態正常的用戶有多少(也就是一個select的選項)
image

在Model中體現為:
image

表單頁面功能介紹

表單頁面也就是新增數據,或者編輯,如下

基本輸入

一些比如文本,文本域,數字,開關等的輸入,和基本的一致,約定輸入框的名稱為Model對應欄位的註釋部分的前部分,後部分則為placeholder,前後部分使用空格隔開!
image

頭像圖片

image

不單單支持單圖,還支持多圖模式!

富文本模式

image

系統採用的是wangEdit v5的版本

時間模式

時間上支持單時間和時間區間模式
image

單選模式

image

單選有一個問題,就是選項是固定的,也就是要預先寫好,如果是動態的,則使用外表的模式

外表單選

image

點擊和表格那邊的操作模式是一樣的
image

要實現這些功能,只需要在對應的Model做屬性的標記即可,如下

    ///<summary>
    ///測試表 用於測試CURD的表
    ///</summary>
    public class TestTableAddDto
    {
        ///<summary>
        ///姓名 模擬短文本輸入
        ///</summary>
        [MaxLength(32)]
        [Required]
        public string Name { get; set; }

        ///<summary>
        ///頭像 模擬圖片上傳
        ///</summary>
        [MaxLength(128)]
        [ColumnDataType("image","1","head","60*60")]
        public string Head { get; set; }

        ///<summary>
        ///年齡 模擬輸入number
        ///</summary>
        [Range(5, 90, ErrorMessage = "年齡必須限定在5~90之間!")]
        public int Age { get; set; }

        ///<summary>
        ///文本區域 模擬文本區域的輸入
        ///</summary>
        [MaxLength(128)]
        public string Desc { get; set; }

        ///<summary>
        ///富文本 模擬富文本,前端HTML的是使用wangEditv5
        ///</summary>
        public string Blog { get; set; }

        ///<summary>
        ///加入日期 模擬必填時間的輸入
        ///</summary>
        public DateTime JoinDate { get; set; }


        ///<summary>
        ///單選 一般表示狀態,內定的,有點像Enum,關於Enum後續會支持
        ///</summary>
        [ColumnDataType("select", "[{\"name\":\"日類型\",\"value\":0},{\"name\":\"月類型\",\"value\":1},{\"name\":\"年類型\",\"value\":2}]")]
        public int DateType { get; set; }

        ///<summary>
        ///角色ID 這裡一般用於外表,就是選擇其他表的一個數據作為輸入內容
        ///</summary>
        [ColumnDataType("outer", "gradeInfo", "", "id", "name")]
        public int GradeId { get; set; }

        ///<summary>
        ///成績 模擬前端限定2位小數
        ///</summary>
        public double Score { get; set; }

        /// <summary>
        /// 會員周期 會員生效區間
        /// </summary>
        [ColumnDataType("daterange","dateStart","dateEnd")]
        public DateTime DateStart { get; set; }

        /// <summary>
        /// 會員周期 會員生效區間
        /// </summary>
        [ColumnDataType("hidden")]
        public DateTime DateEnd { get; set; }

    }

至於編輯模式,其實編輯模式和新增模式的欄位屬性標記同樣適用!
在編輯模式中有一個特別的,就是外表顯示,比如上面的外表選擇中的選擇父級,則在編輯中是這樣的
在這裡插入圖片描述

補充

對於上面其實比較糾結的地方應該就是欄位的特性ColumnDataType

image

相對於後面的 head 來說,這裡是大圖模式,在ListDto中表示使用圖片的模式渲染

欄位 類型 示例 說明
args1 數字 1 圖片數量
args2 字元 cate 存放在什麼位置,上傳圖片的時候會附帶到參數type中
args3 字元 60*60 圖片是否需要壓縮,壓縮的寬高,不壓縮的設置為0,比如60*0
args4 字元 arr或str 預設值str對應欄位的類型,是array類型還是string類型,如果是string類型多個之間用,隔開

使用方式同 image 這裡表示的是小圖標模式

欄位 類型 示例 說明
args1 數字 1 圖片數量
args2 字元 cate 存放在什麼位置,上傳圖片的時候會附帶到參數type中
args3 字元 60*60 圖片是否需要壓縮,壓縮的寬高,不壓縮的設置為0,比如60*0
args4 字元 arr或str 預設值str對應欄位的類型,是array類型還是string類型,如果是string類型多個之間用,隔開

region

小程式中的地區選擇,可以配置精確度,到區還是到縣

欄位 類型 示例 說明
args1 字元 region 表示地址選擇的層級,可選region和sub-district
args2 字元 str 可用值str或者arr 表示返回的數據類型,str的時候用,隔開

outer

表示一個值需要從外表獲取,編輯的時候如何顯示? 比如fatherId,extendRole

欄位 類型 示例 說明
args1 字元 cateInfo 外表的名稱,對應模板的path,或者路徑,路徑一定附帶了/字元示例./abc.html
args2 字元 extendCates 表示顯示的數據,需要和下麵2個配合,是一個當前的擴展,目標數組要配置hidden
args3 字元 id 獲取返回對象的屬性,一般為id
args4 字元 name id的友好名稱顯示,這裡指的是外表,比如cateId,需要打開catelist頁面,選擇後,返回cate,則name作為友好顯示,id作為實際值

outers

outer的複數版本,表示可以從外部列表中選擇多個,比如在創建賬號的時候給他綁定多個角色,就用這個!

欄位 類型 示例 說明
args1 字元 cateInfo 外表的名稱,對應模板的path,或者路徑,路徑一定附帶了/字元示例./abc.html
args2 字元 extendCates 表示顯示的數據,需要和下麵2個配合,是一個數組,目標數組要配置hidden
args3 字元 id 獲取返回對象的屬性,一般為id
args4 字元 name id的友好名稱顯示,這裡指的是外表,比如cateId,需要打開catelist頁面,選擇後,返回cate,則name作為友好顯示,id作為實際值

outerdisplay

ListDto中用於外表的顯示,比如有欄位cateInfoId,對應的ExtendCateInfo要標記為outerdisplay,args2配置為extendCateInfo?.name || '',否則會顯示為[object object]

欄位 類型 示例 說明
args1 字元 cateInfoId 表示這個欄位的值,一般不顯示
args2 字元 extendCateInfo?.name || '' 表示顯示的名稱,友好名稱,需要後端支持,在前端會處理成.display

表示這個值需要使用頁面從另外一個列表中獲取,這裡表示小程式端的,建議使用outer outerdisplay

欄位 類型 示例 說明
args1 字元 cate.name || '' 表示顯示cate.name或者空這個一般用於ListDto中
args2 字元 cateInfo 外表的名稱,對應模板的path,可以為空
args3 字元 /pages/cate/index/?model=select 如果對應的表不用模板,則直接表示路徑

datetime

預設的yyyy-MM-dd HH:mm:ss的格式

欄位 類型 示例 說明
args1 字元 yyyy-MM-dd HH:mm:ss 表示時間使用的格式

hidden

表示隱藏這個欄位,一般是主鍵ID,或者外錶鏈接過來的會這配置,比如需要給cate添加子項,則添加由cate那邊過來
這個也適用於ListDto

欄位 類型 示例 說明
args1 字元 bind 如果不填表示隱藏,如果填寫了表示頁面的query中model=xxx的時候不隱藏,表示非xxx的時候隱藏,xxx的時候不隱藏

password

密碼框模式

query

需要和 hidden 配合使用一般,表示在表單的時候使用哪個參數作為數據

欄位 類型 示例 說明
args1 字元 cateid 表示使用url中的哪個參數讀取值

readyonly

表示這個欄位是只讀的,一般是編輯的時候生效

richtext

如果是字元串,沒有設置maxlength,預設就會變更成richtext,也可以手動強制配置

textarea

如果是字元串,設置maxlength,且設置的值大於128,預設就會變更成textarea,也可以手動強制配置

select

欄位 類型 示例 說明
args1 字元 [{"name":"大","value":"1"},{"name":"小","value":"2"}] 表示單選的可選值,name是顯示 value是值
args2 字元 表示值得類型,這裡是單個,跟隨主類型走

selects

表示多選,這個表示的是頁面上的多選

欄位 類型 示例 說明
args1 字元 [{"name":"大","value":"1"},{"name":"小","value":"2"}] 表示單選的可選值,name是顯示 value是值
args2 字元 str 表示值得類型是一個數組,還是字元串,如果是字元串則使用逗號隔開

sort

表示排序,表示欄位的順序,一般表格比較會使用這個

欄位 類型 示例 說明
args1 數字 0 小的排在前面,預設為0

這個用於表格顯示,一般表示用於顯示外表的數據,這個將棄用,使用outerdisplay替換

欄位 類型 示例 說明
args1 字元 extendCate.name 顯示的外錶鏈接,示例extendCate?.name || ''表示顯示cate.name或者空這個一般用於ListDto中

width

表示這個欄位在表格得寬度,可以為*或者對應得數字,是表格得列的寬度的權重,這個適用於ListDto

欄位 類型 示例 說明
args1 字元 60 表示這個列的寬度,可以為數字也可以是*比如3*這樣

orderby

表示基於哪個欄位進行排序,這個一般是ListDto表示表格中,可以基於哪個欄位進行排序查詢

欄位 類型 示例 說明
args1 字元 id 表示使用id正序排序
args2 字元 id desc 表示使用倒敘排序

datalist

前端表示使用datalist作為選擇數據源,前端需要把datalist的id賦值給datalistid,預設為欄位name,這個規則適用於表單和QueryDto

欄位 類型 示例 說明
args1 字元 [{"name":"正常","value":"1","selected":true}] JSON的字元串,也可以為空
args2 字元 data_pro 表示調用哪個datalist數據,表示datalist的id,和args1互斥
args3 字元 read_pro_datalist() 表示需要使用eval執行哪個函數,一般和args2配合使用,和args1互斥

daterange

主欄位需要設置為daterange,其他欄位需要設置hidden,在最後組合數據的時候,會基於參數生成對應的,應該要設置為可null格式

欄位 類型 示例 說明
args1 字元 sdate 表示開始時間,最後會傳送yyyy-MM-dd 00:00:00的格式數據
args2 字元 edate 表示結束時間,如果你選擇2024-08-31,最後上送的會是2024-08-31 00:00:00
args3 字元 yyyy-MM-dd 00:00:00 表示時間的格式化,預設使用yyyy-MM-dd 00:00:00

disable

特殊限定,限定於class的,表示禁用這個模型的哪些功能,這個一般用於ListDto,因為這些功能都在列表頁面

欄位 類型 示例 說明
args1 字元 add 表示忽略新增,也就是不顯示新增按鈕
args2 字元 edit 表示忽略編輯,表示列表中沒有編輯的這個選項,有些數據只能看,不需要新增和編輯
args3 字元 del 表示這個表沒有刪除,頁面UI中不需要刪除按鈕

目前還在思考有哪些常用的需要添加進來,

目前還是缺少很多東西的
1.index.js和view.js有很多重覆的函數,可以考慮把他們2個綜合一下,後續好維護
2.一些特殊的常用的功能的實現,比如作者的PasteSpider中大量的使用了datalist
3.如何在小程式上接入,畢竟這個項目的初衷就是為瞭解決小程式上大量表單輸入和編輯的問題而提出的方案
4.後續大家如何使用,如何按照自己的需求修改規則等

案例項目和項目模板視頻如下

https://player.bilibili.com/player.html?aid=113093837524694

項目源碼
項目源碼已放置Gitee,點擊訪問

我們下期見


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

-Advertisement-
Play Games
更多相關文章
  • 日常使用的移動手機或者是電腦等其它電子產品都是每天在產生不同的數據。數據安全性的 保證需要有很多的電腦程式設計的運行程式進行有效保證。電子產品是硬體設備,硬體設 備就像機器機械一樣是可以看得見摸得著的具體物件設施。物質和能量,源頭物料可以通過 不同的設計工廠設計師加工進行生產設計,開發形成不同的可 ...
  • Django 一、Django介紹 1.1 簡介 Django是python語言中的一個web框架,Python語言中主流的web框架有Django、Tornado、Flask 等多種。Django相較與其它WEB框架,其優勢為:大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Session ...
  • 數據傳輸的過程首先要建立網路連接 。數據傳輸單元為數據包 DATA PRAGRAM. 電腦數 據網路的互通互聯物理硬體和軟體程式的管理。區域網絡是美國國防部連接不同電腦器設 備的一種方式 。光纜傳輸數據的速度更慢 。海底光纖的架設, 2000 年左右使得全球互聯網 時代惠國惠民。電腦信息技術起 ...
  • Python 速查表中文版 本手冊是 Python cheat sheet 的中文翻譯版。原作者:Arianne Colton and Sean Chen([email protected]) 編譯:ucasFL 目錄 常規 數值類類型 數據結構 函數 控制流 面向對象編程 ...
  • 寫在前面 Spring的核心思想就是容器,當容器refresh的時候,外部看上去風平浪靜,其實內部則是一片驚濤駭浪,汪洋一片。Springboot更是封裝了Spring,遵循約定大於配置,加上自動裝配的機制。很多時候我們只要引用了一個依賴,幾乎是零配置就能完成一個功能的裝配。 由spring提供的、 ...
  • 八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析) @目錄八,SpringBoot Web 開發訪問靜態資源(附+詳細源碼剖析)1. 基本介紹2. 快速入門2.1 準備工作3. 改變靜態資源訪問首碼,定義為我們自己想要的4. 改變Spring Boot當中的預設的靜態資源路徑(實 ...
  • 1.下載 Redis for Windows Redis 官方並沒有提供 Windows 版本的安裝包,但你可以使用 Microsoft 維護的 Windows 版本的 Redis。你可以從以下鏈接下載 Redis for Windows: 2.安裝 Redis 運行安裝程式: 雙擊下載的 .msi ...
  • 在Word中,分節符是一種強大的工具,用於將文檔分成不同的部分,每個部分可以有獨立的頁面設置,如頁邊距、紙張方向、頁眉和頁腳等。正確使用分節符可以極大地提升文檔的組織性和專業性,特別是在長文檔中,需要在不同部分應用不同的樣式時。本文將介紹如何使用一個免費的.NET庫通過C#實現插入或刪除Word分節 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...