基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

系列文章

  1. 使用 abp cli 搭建项目

  2. 给项目瘦身,让它跑起来

  3. 完善与美化,Swagger登场

  4. 数据访问和代码优先

  5. 自定义仓储之增删改查

  6. 统一规范API,包装返回模型

  7. 再说Swagger,分组、描述、小绿锁

  8. 接入GitHub,用JWT保护你的API

  9. 异常处理和日志记录

  10. 使用Redis缓存数据

  11. 集成Hangfire实现定时任务处理

  12. 用AutoMapper搞定对象映射

  13. 定时任务最佳实战(一)

  14. 定时任务最佳实战(二)

  15. 定时任务最佳实战(三)

  16. 博客接口实战篇(一)

  17. 博客接口实战篇(二)

  18. 博客接口实战篇(三)


上篇文章完成了文章增删改的接口和友情链接列表的接口,本篇继续。

善于思考的同学肯定发现,在执行增删改操作后,Redis缓存中的数据还是存在的,也就意味着查询接口返回的数据还是旧的,所以在写接口之前,先完成一下清缓存的操作。

移除缓存

移除缓存我这里找了一个新的包:Caching.CSRedis,选他是因为微软的包Microsoft.Extensions.Caching.StackExchangeRedis没有给我们实现批量删除的功能。

Caching.CSRedis开源地址,https://github.com/2881099/csredis 在这不做过多介绍,感兴趣的自己去看。

.Application.Caching层添加包Caching.CSRedisInstall-Package Caching.CSRedis,然后在模块类MeowvBlogApplicationCachingModule中进行配置。

//MeowvBlogApplicationCachingModule.cs
...
public override void ConfigureServices(ServiceConfigurationContext context)
{...var csredis = new CSRedis.CSRedisClient(AppSettings.Caching.RedisConnectionString);RedisHelper.Initialization(csredis);context.Services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance));
}
...

直接新建一个移除缓存的接口:ICacheRemoveService,添加移除缓存的方法RemoveAsync()。代码较少,可以直接写在缓存基类CachingServiceBase中。

public interface ICacheRemoveService
{/// <summary>/// 移除缓存/// </summary>/// <param name="key"></param>/// <param name="cursor"></param>/// <returns></returns>Task RemoveAsync(string key, int cursor = 0);
}

然后可以在基类中实现这个接口。

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

//IBlogCacheService.cs
namespace Meowv.Blog.Application.Caching.Blog
{public partial interface IBlogCacheService : ICacheRemoveService{}
}

在基类中已经实现了这个接口,所以现在所有基层基类的缓存实现类都可以调用移除缓存方法了。

MeowvBlogConsts中添加缓存前缀的常量。

//MeowvBlogConsts.cs
/// <summary>
/// 缓存前缀
/// </summary>
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服务执行增删改后调用移除缓存的方法。

//BlogService.Admin.cs// 执行清除缓存操作
await _blogCacheService.RemoveAsync(CachePrefix.Blog_Post);

因为是小项目,采用这种策略直接删除缓存,这样就搞定了当在执行增删改操作后,前台接口可以实时查询出最后的结果。

文章详情

当我们修改文章数据的时候,是需要把当前数据库中的数据带出来显示在界面上的,因为有可能只是个别地方需要修改,所以这还需要一个查询文章详情的接口,当然这里的详情和前端的是不一样的,这里是需要根据Id主键去查询。

添加模型类PostForAdminDto.cs,直接继承PostDto,然后添加一个Tags列表就行,==,好像和上一篇文章中的EditPostInput字段是一模一样的。顺手将EditPostInput改一下吧,具体代码如下:

//PostForAdminDto.cs
using System.Collections.Generic;namespace Meowv.Blog.Application.Contracts.Blog
{public class PostForAdminDto : PostDto{/// <summary>/// 标签列表/// </summary>public IEnumerable<string> Tags { get; set; }}
}//EditPostInput.cs
namespace Meowv.Blog.Application.Contracts.Blog.Params
{public class EditPostInput : PostForAdminDto{}
}

IBlogService.Admin.cs中添加接口。

/// <summary>
/// 获取文章详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id);

实现这个接口。

/// <summary>
/// 获取文章详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id)
{var result = new ServiceResult<PostForAdminDto>();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.Idwhere post_tags.PostId.Equals(post.Id)select tag.TagName;var detail = ObjectMapper.Map<Post, PostForAdminDto>(post);detail.Tags = tags;detail.Url = post.Url.Split("/").Where(x => !string.IsNullOrEmpty(x)).Last();result.IsSuccess(detail);return result;
}

先根据Id查出文章数据,再通过联合查询找出标签数据。

CreateMap<Post, PostForAdminDto>().ForMember(x => x.Tags, opt => opt.Ignore());

新建一条AutoMapper配置,将Post转换成PostForAdminDto,忽略Tags。

然后将查出来的标签、Url赋值给DTO,输出即可。在BlogController.Admin中添加API。

/// <summary>
/// 获取文章详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Authorize]
[Route("admin/post")]
[ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync([Required] int id)
{return await _blogService.GetPostForAdminAsync(id);
}

至此,完成了关于文章的所有接口。

接下来按照以上方式依次完成分类、标签、友链的增删改查接口,我觉得如果你有跟着我一起做,剩下的可以自己完成。

开源地址:https://github.com/Meowv/Blog/tree/blog_tutorial


搭配下方课程学习更佳 ↓ ↓ ↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem

题目描述 输入描述: 输出描述: 示例1 输入 3 输出 5 分析&#xff1a; 1.这个题其实考的是一个莫比乌斯反演题&#xff0c;但是由于我知识储备不够&#xff0c;没有看出来&#xff0c;题目给的范围可以瞎搞一下&#xff0c;所以下面容斥可以过。 2.转换一下就是一道经典的…

猎鹰与龙飞船基于Linux,采用C++、Chromium与JS开发

最近两天科技界最重大的事件莫过于马斯克的 SpaceX 成功实现了猎鹰 9 号&#xff08;Falcon 9&#xff09;带着龙飞船&#xff08;Crew Dragon&#xff09;成功发射&#xff0c;并使飞船与国际空间站对接&#xff0c;将 NASA 两名宇航员送上了轨道前哨。背后关于 Falcon 9 与 C…

博客系统知多少:揭秘那些不为人知的学问(四)

点击上方关注“汪宇杰博客” ^_^上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;三&#xff09;》介绍了博客协议或标准。本篇终章介绍设计博客系统有哪些知识点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众&#xff1f;4. 博客基本功能设计要点…

Azure 国际版与中国版服务列表对(2020年6月版)

点击上方关注“汪宇杰博客” ^_^对于选择Azure平台的用户来说&#xff0c;会面临选择国内还是国际版的问题。由于一些原因&#xff0c;由世纪互联运营的中国大陆版Azure无法落地所有的国际版服务。相比几年前&#xff0c;情况已经有了一定的改善。本文列出了国际版和国内版Azur…

解读三组容易混淆的Dockerfile指令

长话短说&#xff0c;今天分享三组容易混淆的Dockerfile指令&#xff0c; 帮助大家编写更优雅的Dockfile文件、构建更纯净的Docker镜像。COPY vs ADDCOPY、ADD主体功能类似&#xff1a;从指定位置src拷贝文件到Docker镜像dest。COPY <src>... <dest> ADD <src&…

ASP.NET Core使用Nacos SDK访问阿里云ACM

背景 前段时间&#xff0c;cranelee 在Github上给老黄提了个issues&#xff0c; 问到了如何用Nacos的SDK访问阿里云ACM。https://github.com/catcherwong/nacos-sdk-csharp/issues/13刚看到这个issues的时候&#xff0c;老黄也是觉得一脸懵逼&#xff0c;好像这两者没有什么必然…

为.netcore助力--WebApiClient正式发布core版本

1、前言NCC WebApiClient 已成熟稳定&#xff0c;发布了WebApiClient.JIT 和 WebApiClient.AOT 两个 NuGet 包&#xff0c;累计近 10w 次下载。我对它的高可扩展性设计相当满意和自豪&#xff0c;但 WebApiClient 并不因此而停下脚步&#xff0c;在一年前&#xff0c;我产生了编…

一个static和面试官扯了一个小时,舌战加强版

一&#xff1a;背景1. 讲故事最近也是奇怪&#xff0c;在社区里看到好几篇文章聊static 的玩法以及怎么拿这个和面试官扯半个小时&#xff0c;有点意思&#xff0c;点进去看都是java版的&#xff0c;这就没意思了&#xff0c;怎么也得有一篇和面试官扯C# 中的 static用法撒&…

数据结构整理中。。。

目录栈队列链表单向链表双向链表向链表中插入&#xff08;写入&#xff09;数据单向链表单向循环链表双向循环链表从链表中删除数据单向&#xff08;循环&#xff09;链表双向循环链表哈希表哈希函数冲突拉链法闭散列法并查集启发式合并&#xff08;按秩合并&#xff09;带权并…

.NET开发者省份分布排名

什么叫.NET开发者省份分布排名呢&#xff1f; 顾名思义&#xff0c;这几个词大家都认识&#xff0c;.NET开发者都集中在城市&#xff0c;涵盖一线城市到五线城市。排名的方法非常简单粗暴&#xff0c;就是根据本公众号&#xff08;dotnet跨平台&#xff09;的省份订阅读者数量排…

创建型模式——单例模式

一、 实验目的与要求 1.练习使用单例模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 在山区或者边远地区火车站往往只有一个窗口在买票&#xff0c;但…

Sql Server之旅——终点站 nolock引发的三级事件的一些思考

曾今有件事情让我记忆犹新&#xff0c;那年刚来携程不久&#xff0c;马上就被安排写一个接口&#xff0c;供企鹅公司调用他们员工的差旅信息&#xff0c;然后我就三下五除二的给写好了&#xff0c;上线之后&#xff0c;大概过了一个月。。。DBA那边报告数据库出现大量锁超时&am…

创建型模式——原型模式

一、 实验目的与要求 1.练习使用单一模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 原型模式&#xff1a;在需要一个类的大量对象的时候&#xff0c;…

现在就是.Net最好的时代!我赞成,谁反对?

2020年.NET Core逆袭冲榜&#xff0c;多榜直接冠军&#xff01;Build2020&#xff0c;发布多款产品赋能.NET开发者&#xff01;截止5月&#xff0c;腾讯&#xff0c;阿里&#xff0c;特斯拉等大厂都在招聘.NET&#xff01;这些征兆&#xff0c;都预示着.NET的春天即将到来&…

如何给Blazor.Server加个API鉴权?

&#xff08;Ant Design of Blazor为努力而生&#xff09;书接上文&#xff0c;上次我们说到了最终选用Blazor.Server来实现了我们的MVP项目&#xff0c;额其实就是博客的增删改查&#xff0c;不过运行还是很爽的&#xff0c;不过是一个小demo&#xff0c;脑子里一直有个声音&a…

结构型模式——桥接模式

一、 实验目的与要求 1.练习使用桥接模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 相信大家都看过罗老师买奶茶的情节&#xff0c;现实生活中也是一…

TypeScript+vue使用与迁移经验总结

源宝导读&#xff1a;ERP平台的前端底层使用了Vue作为组件的基础架构&#xff0c;而使用了TypeScript语言进行组件的封装与开发。本文将简要介绍平台在使用TypeScript和Vue框架进行老功能重构时的经验总结。一、背景下面主要探讨是以下三个方面&#xff1a;目前项目中使用到的v…

结构型模式——适配器模式

一、 实验目的与要求 1.练习使用适配器模式。设计相关的模拟场景并进行实施&#xff0c;验证模式特性&#xff0c;掌握其优缺点。 2.实验结束后&#xff0c;对相关内容进行总结。 二、实验内容 1.模式应用场景说明 现在喜欢上网的年轻人越来越多&#xff0c;而家里面的电脑满足…

[号外] Blazor wasm 其实也挺快!

之前第一篇的时候&#xff0c;因为没有用任意配置&#xff0c;导致wasm加载很慢&#xff0c;我就感觉不会是这样的&#xff0c;为了不误导小盆友&#xff0c;所以还是趁着周末研究了一波&#xff0c;做了相关的调整&#xff0c;经过测试&#xff0c;速度基本可观了&#xff0c;…

WinUI 3 试玩报告

1. 什么是 WinUI 3#在微软 Build 2020 开发者大会上&#xff0c;WinUI 团队宣布可公开预览的 WinUI 3 Preview 1&#xff0c;它让开发人员可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 项目模板&#xff0c;可以创建面向 .NET 5 的 C# 和 C/Win32 项目…