1. 程式人生 > >基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(四)

基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(四)

## 系列文章 1. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 使用 abp cli 搭建專案](https://www.cnblogs.com/meowv/p/12896177.html)** 2. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 給專案瘦身,讓它跑起來](https://www.cnblogs.com/meowv/p/12896898.html)** 3. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 完善與美化,Swagger登場](https://www.cnblogs.com/meowv/p/12909558.html)** 4. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 資料訪問和程式碼優先](https://www.cnblogs.com/meowv/p/12913676.html)** 5. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 自定義倉儲之增刪改查](https://www.cnblogs.com/meowv/p/12916613.html)** 6. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 統一規範API,包裝返回模型](https://www.cnblogs.com/meowv/p/12924409.html)** 7. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 再說Swagger,分組、描述、小綠鎖](https://www.cnblogs.com/meowv/p/12924859.html)** 8. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 接入GitHub,用JWT保護你的API](https://www.cnblogs.com/meowv/p/12935693.html)** 9. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 異常處理和日誌記錄](https://www.cnblogs.com/meowv/p/12943699.html)** 10. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 使用Redis快取資料](https://www.cnblogs.com/meowv/p/12956696.html)** 11. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 整合Hangfire實現定時任務處理](https://www.cnblogs.com/meowv/p/12961014.html)** 12. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 用AutoMapper搞定物件對映](https://www.cnblogs.com/meowv/p/12966092.html)** 13. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 定時任務最佳實戰(一)](https://www.cnblogs.com/meowv/p/12971041.html)** 14. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 定時任務最佳實戰(二)](https://www.cnblogs.com/meowv/p/12974439.html)** 15. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 定時任務最佳實戰(三)](https://www.cnblogs.com/meowv/p/12980301.html)** 16. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(一)](https://www.cnblogs.com/meowv/p/12987623.html)** 17. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(二)](https://www.cnblogs.com/meowv/p/12994914.html)** 18. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 部落格介面實戰篇(三)](https://www.cnblogs.com/meowv/p/13039883.html)** --- [上篇文章](https://www.cnblogs.com/meowv/p/13039883.html)完成了文章增刪改的介面和友情連結列表的介面,本篇繼續。 善於思考的同學肯定發現,在執行增刪改操作後,Redis快取中的資料還是存在的,也就意味著查詢介面返回的資料還是舊的,所以在寫介面之前,先完成一下清快取的操作。 ## 移除快取 移除快取我這裡找了一個新的包:`Caching.CSRedis`,選他是因為微軟的包`Microsoft.Extensions.Caching.StackExchangeRedis`沒有給我們實現批量刪除的功能。 `Caching.CSRedis`開源地址,https://github.com/2881099/csredis 在這不做過多介紹,感興趣的自己去看。 在`.Application.Caching`層新增包`Caching.CSRedis`,`Install-Package Caching.CSRedis`,然後在模組類`MeowvBlogApplicationCachingModule`中進行配置。 ```CSharp //MeowvBlogApplicationCachingModule.cs ... public override void ConfigureServices(ServiceConfigurationContext context) { ... var csredis = new CSRedis.CSRedisClient(AppSettings.Caching.RedisConnectionString); RedisHelper.Initialization(csredis); context.Services.AddSingleton(new CSRedisCache(RedisHelper.Instance)); } ... ``` 直接新建一個移除快取的介面:`ICacheRemoveService`,新增移除快取的方法`RemoveAsync()`。程式碼較少,可以直接寫在快取基類`CachingServiceBase`中。 ```CSharp public interface ICacheRemoveService { /// /// 移除快取 /// /// /// /// Task RemoveAsync(string key, int cursor = 0); } ``` 然後可以在基類中實現這個介面。 ```CSharp public async Task RemoveAsync(string key, int cursor = 0) { var scan = await RedisHelper.ScanAsync(cursor); var keys = scan.Items; if (keys.Any() && key.IsNotNullOrEmpty()) { keys = keys.Where(x =>
x.StartsWith(key)).ToArray(); await RedisHelper.DelAsync(keys); } } ``` 簡單說一下這個操作過程,使用`ScanAsync()`獲取到所有的Redis key值,返回的是一個string陣列,然後根據引數找到符合此字首的所有key,最後呼叫`DelAsync(keys)`刪除快取。 在需要有移除快取功能的介面上繼承`ICacheRemoveService`,這裡就是`IBlogCacheService`。 ```CSharp //IBlogCacheService.cs namespace Meowv.Blog.Application.Caching.Blog { public partial interface IBlogCacheService : ICacheRemoveService { } } ``` 在基類中已經實現了這個介面,所以現在所有基層基類的快取實現類都可以呼叫移除快取方法了。 在`MeowvBlogConsts`中新增快取字首的常量。 ```CSharp //MeowvBlogConsts.cs /// /// 快取字首 ///
public static class CachePrefix { public const string Authorize = "Authorize"; public const string Blog = "Blog"; public const string Blog_Post = Blog + ":Post"; public const string Blog_Tag = Blog + ":Tag"; public const string Blog_Category = Blog + ":Category"; public const string Blog_FriendLink = Blog + ":FriendLink"; } ``` 然後在`BlogService.Admin.cs`服務執行增刪改後呼叫移除快取的方法。 ```CSharp //BlogService.Admin.cs // 執行清除快取操作 await _blogCacheService.RemoveAsync(CachePrefix.Blog_Post); ``` 因為是小專案,採用這種策略直接刪除快取,這樣就搞定了當在執行增刪改操作後,前臺介面可以實時查詢出最後的結果。 ## 文章詳情 ![1](https://img2020.cnblogs.com/blog/891843/202006/891843-20200604135933251-1454347843.png) 當我們修改文章資料的時候,是需要把當前資料庫中的資料帶出來顯示在介面上的,因為有可能只是個別地方需要修改,所以這還需要一個查詢文章詳情的介面,當然這裡的詳情和前端的是不一樣的,這裡是需要根據Id主鍵去查詢。 新增模型類`PostForAdminDto.cs`,直接繼承`PostDto`,然後新增一個Tags列表就行,==,好像和上一篇文章中的`EditPostInput`欄位是一模一樣的。順手將`EditPostInput`改一下吧,具體程式碼如下: ```CSharp //PostForAdminDto.cs using System.Collections.Generic; namespace Meowv.Blog.Application.Contracts.Blog { public class PostForAdminDto : PostDto { /// /// 標籤列表 ///
public IEnumerable Tags { get; set; } } } //EditPostInput.cs namespace Meowv.Blog.Application.Contracts.Blog.Params { public class EditPostInput : PostForAdminDto { } } ``` 在`IBlogService.Admin.cs`中新增介面。 ```CSharp /// /// 獲取文章詳情 /// /// /// Task> GetPostForAdminAsync(int id); ``` 實現這個介面。 ```CSharp /// /// 獲取文章詳情 /// /// /// public async Task> GetPostForAdminAsync(int id) { var result = new ServiceResult(); var post = await _postRepository.GetAsync(id); var tags = from post_tags in await _postTagRepository.GetListAsync() join tag in await _tagRepository.GetListAsync() on post_tags.TagId equals tag.Id where post_tags.PostId.Equals(post.Id) select tag.TagName; var detail = ObjectMapper.Map(post); detail.Tags = tags; detail.Url = post.Url.Split("/").Where(x => !string.IsNullOrEmpty(x)).Last(); result.IsSuccess(detail); return result; } ``` 先根據Id查出文章資料,再通過聯合查詢找出標籤資料。 ```CSharp CreateMap().ForMember(x => x.Tags, opt => opt.Ignore()); ``` 新建一條AutoMapper配置,將`Post`轉換成`PostForAdminDto`,忽略Tags。 然後將查出來的標籤、Url賦值給DTO,輸出即可。在`BlogController.Admin`中新增API。 ```CSharp /// /// 獲取文章詳情 /// /// /// [HttpGet] [Authorize] [Route("admin/post")] [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)] public async Task> GetPostForAdminAsync([Required] int id) { return await _blogService.GetPostForAdminAsync(id); } ``` ![2](https://img2020.cnblogs.com/blog/891843/202006/891843-20200604144612021-1493627466.png) 至此,完成了關於文章的所有介面。 接下來按照以上方式依次完成分類、標籤、友鏈的增刪改查介面,我覺得如果你有跟著我一起做,剩下的可以自己完成。 開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial --- **搭配下方課程學習更佳 ↓ ↓ ↓** [http://gk.link/a/10iQ7](http://gk.link/a/10iQ7) ![3](https://img2020.cnblogs.com/blog/891843/202006/891843-20200603101718800-1586400906.jpg)