系列文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来
  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
  7. 基于 abp vNext 和 .NET Core 开发博客项目 - 再说Swagger,分组、描述、小绿锁
  8. 基于 abp vNext 和 .NET Core 开发博客项目 - 接入GitHub,用JWT保护你的API
  9. 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录
  10. 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
  11. 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理
  12. 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
  13. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
  14. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
  15. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)
  16. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(一)
  17. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
  18. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)

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

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

移除缓存

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

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

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

  1. //MeowvBlogApplicationCachingModule.cs
  2. ...
  3. public override void ConfigureServices(ServiceConfigurationContext context)
  4. {
  5. ...
  6. var csredis = new CSRedis.CSRedisClient(AppSettings.Caching.RedisConnectionString);
  7. RedisHelper.Initialization(csredis);
  8. context.Services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance));
  9. }
  10. ...

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

  1. public interface ICacheRemoveService
  2. {
  3. /// <summary>
  4. /// 移除缓存
  5. /// </summary>
  6. /// <param name="key"></param>
  7. /// <param name="cursor"></param>
  8. /// <returns></returns>
  9. Task RemoveAsync(string key, int cursor = 0);
  10. }

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

  1. public async Task RemoveAsync(string key, int cursor = 0)
  2. {
  3. var scan = await RedisHelper.ScanAsync(cursor);
  4. var keys = scan.Items;
  5. if (keys.Any() && key.IsNotNullOrEmpty())
  6. {
  7. keys = keys.Where(x => x.StartsWith(key)).ToArray();
  8. await RedisHelper.DelAsync(keys);
  9. }
  10. }

简单说一下这个操作过程,使用ScanAsync()获取到所有的Redis key值,返回的是一个string数组,然后根据参数找到符合此前缀的所有key,最后调用DelAsync(keys)删除缓存。

在需要有移除缓存功能的接口上继承ICacheRemoveService,这里就是IBlogCacheService

  1. //IBlogCacheService.cs
  2. namespace Meowv.Blog.Application.Caching.Blog
  3. {
  4. public partial interface IBlogCacheService : ICacheRemoveService
  5. {
  6. }
  7. }

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

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

  1. //MeowvBlogConsts.cs
  2. /// <summary>
  3. /// 缓存前缀
  4. /// </summary>
  5. public static class CachePrefix
  6. {
  7. public const string Authorize = "Authorize";
  8. public const string Blog = "Blog";
  9. public const string Blog_Post = Blog + ":Post";
  10. public const string Blog_Tag = Blog + ":Tag";
  11. public const string Blog_Category = Blog + ":Category";
  12. public const string Blog_FriendLink = Blog + ":FriendLink";
  13. }

然后在BlogService.Admin.cs服务执行增删改后调用移除缓存的方法。

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

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

文章详情

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

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

  1. //PostForAdminDto.cs
  2. using System.Collections.Generic;
  3. namespace Meowv.Blog.Application.Contracts.Blog
  4. {
  5. public class PostForAdminDto : PostDto
  6. {
  7. /// <summary>
  8. /// 标签列表
  9. /// </summary>
  10. public IEnumerable<string> Tags { get; set; }
  11. }
  12. }
  13. //EditPostInput.cs
  14. namespace Meowv.Blog.Application.Contracts.Blog.Params
  15. {
  16. public class EditPostInput : PostForAdminDto
  17. {
  18. }
  19. }

IBlogService.Admin.cs中添加接口。

  1. /// <summary>
  2. /// 获取文章详情
  3. /// </summary>
  4. /// <param name="id"></param>
  5. /// <returns></returns>
  6. Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id);

实现这个接口。

  1. /// <summary>
  2. /// 获取文章详情
  3. /// </summary>
  4. /// <param name="id"></param>
  5. /// <returns></returns>
  6. public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id)
  7. {
  8. var result = new ServiceResult<PostForAdminDto>();
  9. var post = await _postRepository.GetAsync(id);
  10. var tags = from post_tags in await _postTagRepository.GetListAsync()
  11. join tag in await _tagRepository.GetListAsync()
  12. on post_tags.TagId equals tag.Id
  13. where post_tags.PostId.Equals(post.Id)
  14. select tag.TagName;
  15. var detail = ObjectMapper.Map<Post, PostForAdminDto>(post);
  16. detail.Tags = tags;
  17. detail.Url = post.Url.Split("/").Where(x => !string.IsNullOrEmpty(x)).Last();
  18. result.IsSuccess(detail);
  19. return result;
  20. }

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

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

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

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

  1. /// <summary>
  2. /// 获取文章详情
  3. /// </summary>
  4. /// <param name="id"></param>
  5. /// <returns></returns>
  6. [HttpGet]
  7. [Authorize]
  8. [Route("admin/post")]
  9. [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
  10. public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync([Required] int id)
  11. {
  12. return await _blogService.GetPostForAdminAsync(id);
  13. }

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

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

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


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

http://gk.link/a/10iQ7

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)的更多相关文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)

    上一篇(https://www.cnblogs.com/meowv/p/12974439.html)完成了全网各大平台的热点新闻数据的抓取,本篇继续围绕抓取完成后的操作做一个提醒.当每次抓取完数据后, ...

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

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

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

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

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

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

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

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

随机推荐

  1. Spring Boot 之 Spring Batch 批处理实践

    实践内容 从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB . 具体实现 1.新建 Spring Boot 应用,依赖如下: <!-- Web 应用 --> & ...

  2. assign 与 深浅拷贝

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖.后面的源对象的属性将类 ...

  3. ql的python学习之路-day11

    前言:本节主要学习python内置的方法 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:qinjiaxi from collections ...

  4. 萌新学习SpringMVC

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 这篇SpringMVC被催了很久了,这阵子由于做 ...

  5. 第一章 Python 基础

    1. 为什么学习 Python? 答题路线:a.python的优点,b.python的应用领域广 具体: 优点 1.python语法非常优雅,简单易学 2.免费开源 3.跨平台,可以自由移植 4.可扩 ...

  6. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

  7. poj1149 经典建模

    http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html 以上内容均为转载 #include<queue> #include< ...

  8. Java通过循环结构和switch实现简易计算器

    Java通过循环结构和switch实现简易计算器 可以循环计算,通过调用函数本身来实现重新计算 package com.shenxiaoyu.method; import java.util.Scan ...

  9. 网络编程杂谈之TCP协议

    TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...

  10. 写给程序员的机器学习入门 (五) - 递归模型 RNN,LSTM 与 GRU

    递归模型的应用场景 在前面的文章中我们看到的多层线性模型能处理的输入数量是固定的,如果一个模型能接收两个输入那么你就不能给它传一个或者三个.而有时候我们需要根据数量不一定的输入来预测输出,例如文本就是 ...