20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

在做一些常規應用的時候,我們往往需要確定條件的內容,以便在后臺進行區分的進行精確查詢,在移動端,由于受限于屏幕界面的情況,一般會對多個指定的條件進行模糊的搜索,而這個搜索的處理 , 也是和前者強類型的條件查詢處理類似的處理過程,因此本篇隨筆探討兩種不同查詢在前端界面上的展示效果,以及后端基于.netCore的Web API端的基類進行的統一封裝處理 。
1、前端精確條件的查詢處理在基于Vue3+Typescript+ElementPlus的前端界面中,查詢是很多界面需要擁有的功能,如下所示 。

20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
展開后的全部查詢條件
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
以上的查詢部分是一個查詢函數的處理,如下代碼所示 。
// 查詢列表處理async function search() {pageInfo.pageIndex = 1; // 重置為第一頁//默認使用當前用戶公司const userInfo = $u.util.storageSession.getItem('user_info');searchForm.company_ID = userInfo?.company_ID; //所屬公司await getlist(); //獲取列表}//列表數據獲取async function getlist() {loading.value = https://www.huyubaike.com/biancheng/true;var param = {// 分頁條件SkipCount: (pageInfo.pageIndex - 1) * pageInfo.pageSize,MaxResultCount: pageInfo.pageSize,Sorting: sorting.value,// 查詢過濾條件Name: searchForm.name,MobilePhone: searchForm.mobilePhone,Email: searchForm.email,QQ: searchForm.qq,Nickname: searchForm.nickname,HandNo: searchForm.handNo,IsExpire: searchForm.isExpire,Title: searchForm.title,dept_ID: searchForm.dept_id,company_ID: searchForm.company_ID};//日期條件處理addDateRange(param, searchForm.creationTime);let result = await user.GetList(param);if (result) {list.value = result.items;pageInfo.totalCount = result.totalCount;}setTimeout(() => {loading.value = false;}, 500);}我們看到,這些條件都是由特定的參數組成的,因此他們是精確性的屬性查詢 。
前端根據框架后端的接口進行前端JS端的類的封裝處理,引入了ES6類的概念實現業務基類接口的統一封裝,簡化代碼 。
權限模塊我們涉及到的用戶管理、機構管理、角色管理、菜單管理、功能管理、操作日志、登錄日志等業務類,那么這些類繼承BaseApi,就會具有相關的接口了,如下所示繼承關系 。
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
按照這個思路,我們在BaseApi的ES6類里面定義了對應Web API基類里面的操作方法 , 如下所示 。
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
這樣,我們在創建一個業務類的時候,如果沒有特殊的自定義接口,只需要繼承基類BaseApi即可具有所有的常規基類方法了 。
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
我們再來后端看看具體的查詢邏輯實現,首先需要了解各個控制器之間的繼承關系 , 如下圖所示。
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
同樣,我們基礎的查詢處理邏輯,主要也是放在BusinessController里面實現,畢竟是通用的邏輯 , 變化的只是一些實體信息,因此可以通過泛型的模板方法設計模式處理變化的部分 。
20 基于SqlSugar的開發框架循序漸進介紹-- 在基于UniApp+Vue的移動端實現多條件查詢的處理

文章插圖
我們可以看到,在BusinessController控制器部分 , 它也只是對Service層邏輯的簡單封裝一下,核心的處理邏輯部分,在下面的基類Service層的代碼中 。
/// <summary>/// 根據條件獲取列表/// </summary>/// <param name="input">分頁查詢條件</param>/// <returns></returns>public virtual async Task<PagedResultDto<TEntity>> GetListAsync(TGetListInput input){var query = CreateFilteredQueryAsync(input);var totalCount = await query.CountAsync();query = ApplySorting(query, input);query = ApplyPaging(query, input);var list = await query.ToListAsync();return new PagedResultDto<TEntity>(totalCount,list);}這里基類Service層主要處理邏輯部分 , 而具體的構建精確的查詢處理條件,下放在了每個具體業務Service類中進行處理了 。
UserService是具體對應的業務類的邏輯處理層,該類的定義方法如下所示 。
/// <summary>/// 應用層服務接口實現/// </summary>public class UserService : MyCrudService<UserInfo, int, UserPagedDto>, IUserService下放在UserService這個具體業務的Service類中的查詢處理邏輯,這部分通過代碼生成工具生成即可 。
/// <summary>/// 自定義條件處理/// </summary>/// <param name="input">查詢條件Dto</param>/// <returns></returns>protected override ISugarQueryable<UserInfo> CreateFilteredQueryAsync(UserPagedDto input){var query = base.CreateFilteredQueryAsync(input);query = query.WhereIF(input.ExcludeId.HasValue, t => t.Id != input.ExcludeId) //不包含排除ID.WhereIF(input.PID.HasValue, s => s.PID == input.PID).WhereIF(!input.HandNo.IsNullOrWhiteSpace(), t => t.HandNo.Contains(input.HandNo)) //如需要精確匹配則用Equals.WhereIF(!input.Name.IsNullOrWhiteSpace(), t => t.Name.Contains(input.Name)) //如需要精確匹配則用Equals.WhereIF(!input.FullName.IsNullOrWhiteSpace(), t => t.FullName.Contains(input.FullName)) //如需要精確匹配則用Equals.WhereIF(!input.Nickname.IsNullOrWhiteSpace(), t => t.Nickname.Contains(input.Nickname)) //如需要精確匹配則用Equals.WhereIF(input.IsExpire.HasValue, t => t.IsExpire == input.IsExpire) //如需要精確匹配則用Equals//過期時間區間查詢.WhereIF(input.ExpireDateStart.HasValue, s => s.ExpireDate >= input.ExpireDateStart.Value).WhereIF(input.ExpireDateEnd.HasValue, s => s.ExpireDate <= input.ExpireDateEnd.Value)

推薦閱讀