ABP開(kāi)發(fā)框架前后端開(kāi)發(fā)系列---(6)ABP基礎(chǔ)接口處理和省份城市行政區(qū)管理模塊的開(kāi)發(fā)

最近沒(méi)有更新ABP框架的相關(guān)文章宜咒,一直在研究和封裝相關(guān)的接口无虚,總算告一段落踢俄,開(kāi)始繼續(xù)整理下開(kāi)發(fā)心得咪橙。上次我在隨筆《ABP開(kāi)發(fā)框架前后端開(kāi)發(fā)系列---(5)Web API調(diào)用類(lèi)在Winform項(xiàng)目中的使用》中介紹了字典模塊的管理,以及實(shí)現(xiàn)了常規(guī)的獲取所有記錄愁拭,獲取條件查詢記錄讲逛,創(chuàng)建、更新岭埠、刪除這些接口盏混。本篇繼續(xù)深入介紹ABP框架在實(shí)際項(xiàng)目中使用的情況,本篇隨筆整理對(duì)ABP基礎(chǔ)接口惜论,以及展示完成的省份城市行政區(qū)管理模塊的內(nèi)容许赃。

1、ABP常規(guī)處理接口

根據(jù)ABP框架默認(rèn)提供的一些接口馆类,我們可以在服務(wù)端封裝好相關(guān)的Web API接口(由于動(dòng)態(tài)API的便利混聊,其實(shí)是完成ApplicationService層即可),前面介紹了獲取條件查詢記錄乾巧,創(chuàng)建句喜、更新预愤、刪除這些接口的實(shí)現(xiàn)和處理,以及可以擴(kuò)展自己的自定義業(yè)務(wù)接口咳胃,如下是字典模塊的接口關(guān)系植康。

image

字典管理界面,列出字典類(lèi)型展懈,并對(duì)字典類(lèi)型下的字典數(shù)據(jù)進(jìn)行分頁(yè)展示销睁,分頁(yè)展示利用分頁(yè)控件展示。

image

新增或者編輯窗體界面如下

image

或者是批量的字典數(shù)據(jù)錄入

image

這個(gè)精確或者模糊查詢存崖,則是在應(yīng)用服務(wù)層里面定義規(guī)則的冻记,在應(yīng)用服務(wù)層接口類(lèi)里面,重寫(xiě)CreateFilteredQuery可以設(shè)置GetAll的查詢規(guī)則来惧,重寫(xiě)ApplySorting則可以指定列表的排序順序盒揉。

image

2厅缺、ABP常規(guī)查詢接口的細(xì)化

在前面介紹了的內(nèi)容匯總孤荣,基本上實(shí)現(xiàn)了常規(guī)數(shù)據(jù)的分頁(yè)查詢契邀,我們可以看到,對(duì)于字典數(shù)據(jù)來(lái)說(shuō)趁曼,分頁(yè)查詢條件是在DictDataPagedDto里面定義,這個(gè)是我們定義的分頁(yè)條件棕洋,如下代碼所示挡闰。

    /// <summary>
    /// 用于根據(jù)條件分頁(yè)查詢
    /// </summary>
    public class DictDataPagedDto : PagedResultRequestDto
    {
        /// <summary>
        /// 字典類(lèi)型ID
        /// </summary>
        public virtual string DictType_ID { get; set; }

        /// <summary>
        /// 類(lèi)型名稱(chēng)
        /// </summary>
        public virtual string Name { get; set; }

        /// <summary>
        /// 指定值
        /// </summary>
        public virtual string Value { get; set; }

        /// <summary>
        /// 備注
        /// </summary>
        public virtual string Remark { get; set; }
    }

這個(gè)類(lèi)文件,我們一般把這個(gè)業(yè)務(wù)模塊相關(guān)的統(tǒng)一放在一個(gè)文件中掰盘,例如字典數(shù)據(jù)相關(guān)的DTO放在一個(gè)DictDataDto文件里面摄悯,方便管理,如下所示愧捕。

上面是字典模塊的一些基礎(chǔ)介紹奢驯,實(shí)際上我們開(kāi)發(fā)業(yè)務(wù)模塊的時(shí)候,錄入數(shù)據(jù)的時(shí)候次绘,還需要一個(gè)判斷的步驟瘪阁,如不允許名稱(chēng)重復(fù)的情況。在創(chuàng)建新的記錄和更新已有記錄都需要進(jìn)行必要的判斷邮偎,保證數(shù)據(jù)的有效性和不重復(fù)性管跺。

如對(duì)于省份管理界面來(lái)說(shuō),我們不能運(yùn)行重復(fù)錄入省份名稱(chēng)禾进,那么就需要在錄入數(shù)據(jù)或者更新數(shù)據(jù)的時(shí)候豁跑,進(jìn)行必要的存在性判斷。

image

那么上面的處理是如何實(shí)現(xiàn)的呢泻云。

主要的界面實(shí)現(xiàn)代碼如下所示艇拍。

if (string.IsNullOrEmpty(ID))
{
    //判斷存在條件
    var countDto = new ProvincePagedDto() { ProvinceName = this.txtProvince.Text };
    bool isExist = await ProvinceApiCaller.Instance.Count(countDto) > 0;
    if (isExist)
    {
        MessageDxUtil.ShowTips("省份名稱(chēng)已存在狐蜕,請(qǐng)選擇其他名稱(chēng)");
        this.txtProvince.Focus();
        return;
    }
    else
    {
        //創(chuàng)建新記錄
        tempInfo = await ProvinceApiCaller.Instance.Create(tempInfo);
    }
}
else
{
    //判斷存在條件,排除本記錄同名情況
    var countDto = new ProvincePagedDto() { ProvinceName = this.txtProvince.Text, ExcludeId = ID.ToInt64() };
    bool isExist = await ProvinceApiCaller.Instance.Count(countDto) > 0;
    if (isExist)
    {
        MessageDxUtil.ShowTips("省份名稱(chēng)已存在,請(qǐng)選擇其他名稱(chēng)");
        this.txtProvince.Focus();
        return;
    }
    else
    {
        //更新記錄
        tempInfo = await ProvinceApiCaller.Instance.Update(tempInfo);
    }
}

ProcessDataSaved(this.btnOK, new EventArgs());
this.DialogResult = System.Windows.Forms.DialogResult.OK;

我們發(fā)現(xiàn)卸夕,這里增加了一個(gè)Count的函數(shù)用來(lái)判斷层释,傳入的條件就是前面的分頁(yè)請(qǐng)求條件。

bool isExist = await ProvinceApiCaller.Instance.Count(countDto) > 0;

我們看看我們的應(yīng)用服務(wù)層的接口實(shí)現(xiàn)如下所示娇哆。

        /// <summary>
        /// 獲取指定條件的數(shù)量
        /// </summary>
        /// <param name="input">查找條件</param>
        /// <returns></returns>
        public async virtual Task<int> Count(TGetAllInput input)
        {
            var query = CreateFilteredQuery(input);
            return await Task.FromResult(query.Count());
        }

這里最終還是跳轉(zhuǎn)到 CreateFilteredQuery 函數(shù)里面實(shí)現(xiàn)判斷邏輯了湃累。

        /// <summary>
        /// 自定義條件處理
        /// </summary>
        /// <param name="input">查詢條件Dto</param>
        /// <returns></returns>
        protected override IQueryable<Province> CreateFilteredQuery(ProvincePagedDto input)
        {
            return base.CreateFilteredQuery(input)
                .WhereIf(input.ExcludeId.HasValue, t=>t.Id != input.ExcludeId) //不包含排除ID
                .WhereIf(!input.ProvinceName.IsNullOrWhiteSpace(), t => t.ProvinceName.Contains(input.ProvinceName));             
        }

這里面包含了兩個(gè)判斷條件,一個(gè)是排除指定的ID記錄碍讨,一個(gè)是匹配省份名稱(chēng)治力。

因?yàn)槲覀冊(cè)诟掠涗浀臅r(shí)候,需要判斷非本記錄是否有重復(fù)的名稱(chēng)勃黍。

//判斷存在條件,排除本記錄同名情況
var countDto = new ProvincePagedDto() { ProvinceName = this.txtProvince.Text, ExcludeId = ID.ToInt64() };
bool isExist = await ProvinceApiCaller.Instance.Count(countDto) > 0;

這個(gè)ExcludeId 我們?cè)诜猪?yè)條件里面增加一個(gè)固定的屬性即可宵统。

image

以上的分頁(yè)信息,包含了實(shí)體DTO對(duì)象的一些屬性覆获,我們可以根據(jù)需要增加或者減少一部分屬性马澈。

另外我們定義的創(chuàng)建省份Dto對(duì)象和獲取到單個(gè)實(shí)體的DTO對(duì)象,他們的定義和關(guān)系如下所示弄息,方便我們?cè)诮缑嫔线M(jìn)行操作痊班。

    /// <summary>
    /// 創(chuàng)建全國(guó)省份表,DTO對(duì)象
    /// </summary>
    public class CreateProvinceDto : EntityDto<long>
    { 
        /// <summary>
        /// 默認(rèn)構(gòu)造函數(shù)(需要初始化屬性的在此處理)
        /// </summary>
        public CreateProvinceDto()
        {
         }

        #region Property Members
        
        /// <summary>
        /// 省份名稱(chēng)
        /// </summary>
        [Required]
        public virtual string ProvinceName { get; set; }


        #endregion

    }

    /// <summary>
    /// 全國(guó)省份表摹量,DTO對(duì)象
    /// </summary>
    public class ProvinceDto : CreateProvinceDto
    {

    }

固定這些規(guī)則后涤伐,我們也可以用代碼生成工具快速生成對(duì)應(yīng)的DTO文件了。

有了這些分頁(yè)屬性后缨称,我們就可以在應(yīng)用服務(wù)層里面定義自己的過(guò)濾規(guī)則了凝果,如對(duì)于字典類(lèi)型的應(yīng)用服務(wù)層的篩選條件函數(shù),如下所示睦尽。

        /// <summary>
        /// 自定義條件處理
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        protected override IQueryable<DictType> CreateFilteredQuery(DictTypePagedDto input)
        {
            return base.CreateFilteredQuery(input)
                .WhereIf(!string.IsNullOrEmpty(input.ExcludeId), t => t.Id != input.ExcludeId) //不包含排除ID
                .WhereIf(!string.IsNullOrEmpty(input.Name), t => t.Name.Contains(input.Name))
                .WhereIf(!string.IsNullOrEmpty(input.Remark), t => t.Remark.Contains(input.Remark))
                .WhereIf(!string.IsNullOrEmpty(input.Code), t => t.Code == input.Code)
                .WhereIf(!string.IsNullOrEmpty(input.PID), t => t.PID == input.PID);
        }

上面是對(duì)于包含器净、相等或者不等于的三種情況的條件判斷,如果我們還需要一個(gè)時(shí)間區(qū)間范圍或者數(shù)值范圍的判斷当凡,那么同樣可以在這里進(jìn)行管理規(guī)則山害,如下是針對(duì)產(chǎn)品應(yīng)用服務(wù)層的過(guò)濾規(guī)則,如下代碼所示沿量。

        /// <summary>
        /// 自定義條件處理
        /// </summary>
        /// <param name="input">查詢條件Dto</param>
        /// <returns></returns>
        protected override IQueryable<Product> CreateFilteredQuery(ProductPagedDto input)
        {
            return base.CreateFilteredQuery(input)
                .WhereIf(!input.ExcludeId.IsNullOrWhiteSpace(), t => t.Id != input.ExcludeId) //不包含排除ID

                .WhereIf(!input.ProductNo.IsNullOrWhiteSpace(), t => t.ProductNo.Contains(input.ProductNo)) //如需要精確匹配則用Equals
                .WhereIf(!input.BarCode.IsNullOrWhiteSpace(), t => t.BarCode.Contains(input.BarCode)) //如需要精確匹配則用Equals
                .WhereIf(!input.MaterialCode.IsNullOrWhiteSpace(), t => t.MaterialCode.Contains(input.MaterialCode)) //如需要精確匹配則用Equals
                .WhereIf(!input.ProductType.IsNullOrWhiteSpace(), t => t.ProductType.Contains(input.ProductType)) //如需要精確匹配則用Equals
                .WhereIf(!input.ProductName.IsNullOrWhiteSpace(), t => t.ProductName.Contains(input.ProductName)) //如需要精確匹配則用Equals
                .WhereIf(!input.Unit.IsNullOrWhiteSpace(), t => t.Unit.Contains(input.Unit)) //如需要精確匹配則用Equals
                .WhereIf(!input.Note.IsNullOrWhiteSpace(), t => t.Note.Contains(input.Note)) //如需要精確匹配則用Equals
                .WhereIf(!input.Description.IsNullOrWhiteSpace(), t => t.Description.Contains(input.Description)) //如需要精確匹配則用Equals
                 
                 //狀態(tài)
                .WhereIf(input.Status.HasValue, t => t.Status==input.Status)
                                                                                              
                 //成本價(jià)區(qū)間查詢
                .WhereIf(input.PriceStart.HasValue, s => s.Price >= input.PriceStart.Value)
                .WhereIf(input.PriceEnd.HasValue, s => s.Price <= input.PriceEnd.Value)

                //銷(xiāo)售價(jià)區(qū)間查詢
                .WhereIf(input.SalePriceStart.HasValue, s => s.SalePrice >= input.SalePriceStart.Value)
                .WhereIf(input.SalePriceEnd.HasValue, s => s.SalePrice <= input.SalePriceEnd.Value)

                //特價(jià)區(qū)間查詢
                .WhereIf(input.SpecialPriceStart.HasValue, s => s.SpecialPrice >= input.SpecialPriceStart.Value)
                .WhereIf(input.SpecialPriceEnd.HasValue, s => s.SpecialPrice <= input.SpecialPriceEnd.Value)
                .WhereIf(input.IsUseSpecial.HasValue, t => t.IsUseSpecial == input.IsUseSpecial) //如需要精確匹配則用Equals
                                                                                                  
                //最低折扣區(qū)間查詢
                .WhereIf(input.LowestDiscountStart.HasValue, s => s.LowestDiscount >= input.LowestDiscountStart.Value)
                .WhereIf(input.LowestDiscountEnd.HasValue, s => s.LowestDiscount <= input.LowestDiscountEnd.Value)

                //創(chuàng)建日期區(qū)間查詢
                .WhereIf(input.CreationTimeStart.HasValue, s => s.CreationTime >= input.CreationTimeStart.Value)
                .WhereIf(input.CreationTimeEnd.HasValue, s => s.CreationTime <= input.CreationTimeEnd.Value);
        }

以上就是我們深入對(duì)分頁(yè)查詢和判斷是否存在接口的細(xì)節(jié)處理粗恢,可以包含很多自定義的條件,如等于或不等于欧瘪、包含或者不包含眷射,區(qū)間查詢(大于或者小于等)條件的處理。對(duì)于省份城市行政區(qū)管理模塊的重復(fù)性判斷,我們通過(guò)Count函數(shù)來(lái)判斷妖碉,同時(shí)在后臺(tái)應(yīng)用服務(wù)層對(duì)這些參數(shù)進(jìn)行規(guī)則過(guò)濾即可涌庭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市欧宜,隨后出現(xiàn)的幾起案子坐榆,更是在濱河造成了極大的恐慌,老刑警劉巖冗茸,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席镀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夏漱,警方通過(guò)查閱死者的電腦和手機(jī)豪诲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挂绰,“玉大人屎篱,你說(shuō)我怎么就攤上這事】伲” “怎么了交播?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)践付。 經(jīng)常有香客問(wèn)我秦士,道長(zhǎng),這世上最難降的妖魔是什么永高? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任伍宦,我火速辦了婚禮,結(jié)果婚禮上乏梁,老公的妹妹穿的比我還像新娘。我一直安慰自己关贵,他們只是感情好遇骑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著揖曾,像睡著了一般落萎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炭剪,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天练链,我揣著相機(jī)與錄音,去河邊找鬼奴拦。 笑死媒鼓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绿鸣,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疚沐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了潮模?” 一聲冷哼從身側(cè)響起亮蛔,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擎厢,沒(méi)想到半個(gè)月后究流,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡动遭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年芬探,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽损。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灯节,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绵估,到底是詐尸還是另有隱情炎疆,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布国裳,位于F島的核電站形入,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缝左。R本人自食惡果不足惜亿遂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渺杉。 院中可真熱鬧蛇数,春花似錦、人聲如沸是越。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倚评。三九已至浦徊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間天梧,已是汗流浹背盔性。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呢岗,地道東北人冕香。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓蛹尝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暂筝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箩言,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容