PasteForm最佳CRUD實踐,實際案例PasteTemplate詳解之3000問(四)

PasteSpider發表於2024-10-09
無論100個表還是30個表,在使用PasteForm模式的時候,管理端的頁面是一樣的,大概4個頁面,
利用不同操作模式下的不同dto資料模型,透過後端修改對應的dto可以做到控制前端的UI,在沒有特別特殊的需求下可以做到快速的實現CRUD!
免去版本相容問題,免去前後端不一致的問題,免去樣式不一的問題!
基於PasteForm的思想,你也可以用其他語言實現,比如java+vue,或者php+angluar等

image

距上次之後,那麼多天就一晃而過了,在這段時間我還是繼續使用PasteForm進行開發新的專案,發現了新的問題,或者說不足,所以對原來的進行了一些補充!

表格按照許可權區別回顯

比如你可以設定為擁有某一個許可權的賬號,返回選單三,而沒有這個許可權的則不返回這個許可權,這裡的案例是在表格的資料中,所以我們找到對應的ReadListModel的介面中,按照如下操作即可

        /// <summary>
        /// 讀取ListDto的資料模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public PasteBuilderHelper.VoloModelInfo ReadListModel()
        {
            var _model = PasteBuilderHelper.ReadModelProperty<StoreInfoListDto>(new StoreInfoListDto());
            var _query_model = PasteBuilderHelper.ReadModelProperty(new InputQueryStore());
            if (_query_model != null)
            {
                _model.QueryProperties = _query_model.Properties;
            }
            var _isroot = base.IsSuper();
            if (!_isroot)
            {
                var prost = _model.Properties.Where(x => x.Name == "Menu3" || x.Name == "Menu4").ToList();
                if(prost!=null && prost.Count > 0)
                {
                    foreach(var ii in prost)
                    {
                        _model.Properties.Remove(ii);
                    }
                }
            }
            return _model;
        }

如上所示,表示如果沒有超級許可權(IsSuper()),則移除物件Menu3和Menu4,這2個欄位是我自定義的選單,這樣就實現比如張三登陸看到了這2個選單,而李四登陸則看不到這兩個選單了!改動後介面升級後前端即時生效,避免版本過渡的問題!
同理,你也可以基於不同的許可權對一些欄位進行特殊的處理!

自定義上傳檔案的問題

之前使用了file的屬性,定義檔案上傳,預設args1的引數是自定義路徑,後面由於其他的需求,參考了menu的定義,引入了args3,可以自定義function,比如我的!

        /// <summary>
        /// 使用者資料
        /// </summary>
        [ColumnDataType("file", "", "", "global_upload_media(this);")]
        public string UploadMedia { get; set; } = "點選上傳資料檔案(*.mp3)";

注意ColumnDataType總共有6個引數,分別為name,args1,args2,args3,args4,error,預設都是空值!

表單中自定義樣式

有時候我們需要對錶單的一個項加入一些樣式,也就是css中的style="xxxx";這個時候你可以在欄位上標註style,如下

        /// <summary>
        /// 備註
        /// </summary>
        [ColumnDataType("textarea")]
        [ColumnDataType("style", "height:90px;")]
        public string Mark { get; set; } = "";

比如上面的,定義了2個屬性,當前欄位使用textarea來顯示,然後配置了這個的高度為90px;
image

query的重新定義

比如有時候我們開啟一個頁面,會傳入引數
示例

pasteform/index.html?path=roleInfo&gradeId=5

表示的意思是,我要顯示許可權roleInfo列表,傳入的引數為gradeId=5,所以在index.html頁面中,獲得引數gradeId後,則搜尋項中的gradeId承載的欄位會隱藏,同時賦值為5,如果這個搜尋項gradeId對應的欄位沒有從query引數中獲取到值,則這個搜尋項不會自動隱藏,當然了,你也可以標記hidden來主動隱藏他!
搜尋項中隱藏的欄位,注意預設值,比如orderby,如果你沒有給預設值,就會造成搜尋的時候基於空排序,這個時候會不會報錯?

form中的id重新定義

有時候我們需要在新增資料的時候自定義主鍵Id,一般的Id是預設隱藏的,這個時候就有點尷尬了,又由於比如Int型別,有時候允許不寫,也就是值為0,這個時候required就不太適用了,所以更改規則為有欄位描述的為顯示,否則按照預設的隱藏處理

        ///<summary>
        ///ID 必填專案(注意這裡的註釋,中間用空格隔開,空格前面是名稱,後面是註釋)
        ///</summary>
        [Required]
        [MaxLength(32)]
        public string Id { get; set; } = "";

form中image的調整

如果圖片為單圖模式,則佔用表單的半行,舊版本為image就佔用一行!
image

switch屬性新增args1的支援

有時候我們希望顯示swtich,有時候又不希望顯示,比如許可權的列表中有IsEnable表示狀態,噹噹前模式為model=bind的時候,我們往往希望讀取的是IsEnable==true的資料,然後extendBind為是否繫結的欄位,這個時候就需要配置IsEnable在view的時候才顯示switch,其他模式為true/false顯示,也就是不可操作的模式,所以就有!

        ///<summary>
        ///狀態
        ///</summary>
        [ColumnDataType("switch","view")]
        public bool IsEnable { get; set; }

        /// <summary>
        /// 繫結 擴充套件基於角色的時候是否擁有這個許可權
        /// </summary>
        [ColumnDataType("switch")]
        [ColumnDataType("hidden", "bind")]
        public bool ExtendBind { get; set; }

上面的程式碼注意!!!
hidden表示當前為bind的時候不隱藏,而不是bind的時候隱藏
switch表示,當前為bind的時候顯示switch模式,而不是bind的時候不顯示switch,也就是顯示true/false模式,
如果switch的args1不填寫,也就是保持空,則表示任何模式都顯示switch模式
ps:上面說的model是指pasteform/index.html的展示方式,有view,select,bind三種模式
view預設的模式,就是表格資料展示
select表示的是使用屬性outer的時候選擇這個物件的顯示模式
bind模式為,比如為角色繫結許可權,這個時候需要羅列所有的許可權,已經繫結的則switch開啟了!
image
上圖為為某一個角色繫結許可權,可以看到狀態為true/false的不可互動的顯示,而extendBind則顯示為switch的可互動方式!
而在預設view的時候,狀態又是可互動的switch模式,這個時候的繫結是隱藏的,如下圖
image

【【【在使用PasteForm模式中,你是否還有其他問題,可以在評論中留言,我們下期見】】】

相關文章