最好网站开发公司,深圳南头高端网站建设,长春是几线城市2020,皮革 东莞网站建设系列文章使用 abp cli 搭建项目给项目瘦身#xff0c;让它跑起来完善与美化#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API#xff0c;包装返回模型再说Swagger#xff0c;分组、描述、小绿锁接入GitHub#xff0c;用JWT保护你的API异常处理和… 系列文章使用 abp cli 搭建项目给项目瘦身让它跑起来完善与美化Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API包装返回模型再说Swagger分组、描述、小绿锁接入GitHub用JWT保护你的API异常处理和日志记录使用Redis缓存数据集成Hangfire实现定时任务处理用AutoMapper搞定对象映射定时任务最佳实战一定时任务最佳实战二定时任务最佳实战三博客接口实战篇一博客接口实战篇二博客接口实战篇三博客接口实战篇四上篇文章完成了文章详情页数据查询和清除缓存的功能。本篇继续完成分类、标签、友情链接的后台操作接口还是那句话这些纯CRUD的内容建议还是自己动手完成比较好本篇将不再啰嗦直接贴代码以供参考。分类添加接口查询分类列表QueryCategoriesForAdminAsync()、新增分类InsertCategoryAsync(...)、更新分类UpdateCategoryAsync(...)、删除分类DeleteCategoryAsync(...)#region Categories/// summary
/// 查询分类列表
/// /summary
/// returns/returns
TaskServiceResultIEnumerableQueryCategoryForAdminDto QueryCategoriesForAdminAsync();/// summary
/// 新增分类
/// /summary
/// param nameinput/param
/// returns/returns
TaskServiceResult InsertCategoryAsync(EditCategoryInput input);/// summary
/// 更新分类
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
TaskServiceResult UpdateCategoryAsync(int id, EditCategoryInput input);/// summary
/// 删除分类
/// /summary
/// param nameid/param
/// returns/returns
TaskServiceResult DeleteCategoryAsync(int id);#endregion Categories
查询分类列表需要返回的模型类QueryCategoryForAdminDto.cs。//QueryCategoryForAdminDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{public class QueryCategoryForAdminDto : QueryCategoryDto{/// summary/// 主键/// /summarypublic int Id { get; set; }}
}
新增分类和更新分类需要的输入参数EditCategoryInput.cs直接继承CategoryDto即可。//EditCategoryInput.cs
namespace Meowv.Blog.Application.Contracts.Blog.Params
{public class EditCategoryInput : CategoryDto{}
}
分别实现这几个接口。/// summary
/// 查询分类列表
/// /summary
/// returns/returns
public async TaskServiceResultIEnumerableQueryCategoryForAdminDto QueryCategoriesForAdminAsync()
{var result new ServiceResultIEnumerableQueryCategoryForAdminDto();var posts await _postRepository.GetListAsync();var categories _categoryRepository.GetListAsync().Result.Select(x new QueryCategoryForAdminDto{Id x.Id,CategoryName x.CategoryName,DisplayName x.DisplayName,Count posts.Count(p p.CategoryId x.Id)});result.IsSuccess(categories);return result;
}
/// summary
/// 新增分类
/// /summary
/// param nameinput/param
/// returns/returns
public async TaskServiceResult InsertCategoryAsync(EditCategoryInput input)
{var result new ServiceResult();var category ObjectMapper.MapEditCategoryInput, Category(input);await _categoryRepository.InsertAsync(category);result.IsSuccess(ResponseText.INSERT_SUCCESS);return result;
}
这里需要一条AutoMapper配置将EditCategoryInput转换为Category忽略Id字段。CreateMapEditCategoryInput, Category().ForMember(x x.Id, opt opt.Ignore());
/// summary
/// 更新分类
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
public async TaskServiceResult UpdateCategoryAsync(int id, EditCategoryInput input)
{var result new ServiceResult();var category await _categoryRepository.GetAsync(id);category.CategoryName input.CategoryName;category.DisplayName input.DisplayName;await _categoryRepository.UpdateAsync(category);result.IsSuccess(ResponseText.UPDATE_SUCCESS);return result;
}
/// summary
/// 删除分类
/// /summary
/// param nameid/param
/// returns/returns
public async TaskServiceResult DeleteCategoryAsync(int id)
{var result new ServiceResult();var category await _categoryRepository.FindAsync(id);if (null category){result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith(Id, id));return result;}await _categoryRepository.DeleteAsync(id);result.IsSuccess(ResponseText.DELETE_SUCCESS);return result;
}
在BlogController.Admin.cs中添加接口。#region Categories/// summary
/// 查询分类列表
/// /summary
/// returns/returns
[HttpGet]
[Authorize]
[Route(admin/categories)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResultIEnumerableQueryCategoryForAdminDto QueryCategoriesForAdminAsync()
{return await _blogService.QueryCategoriesForAdminAsync();
}/// summary
/// 新增分类
/// /summary
/// param nameinput/param
/// returns/returns
[HttpPost]
[Authorize]
[Route(category)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult InsertCategoryAsync([FromBody] EditCategoryInput input)
{return await _blogService.InsertCategoryAsync(input);
}/// summary
/// 更新分类
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
[HttpPut]
[Authorize]
[Route(category)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult UpdateCategoryAsync([Required] int id, [FromBody] EditCategoryInput input)
{return await _blogService.UpdateCategoryAsync(id, input);
}/// summary
/// 删除分类
/// /summary
/// param nameid/param
/// returns/returns
[HttpDelete]
[Authorize]
[Route(category)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult DeleteCategoryAsync([Required] int id)
{return await _blogService.DeleteCategoryAsync(id);
}#endregion Categories
标签添加接口查询标签列表QueryTagsForAdminAsync()、新增标签InsertTagAsync(...)、更新标签UpdateTagAsync(...)、删除标签DeleteTagAsync(...)#region Tags/// summary
/// 查询标签列表
/// /summary
/// returns/returns
TaskServiceResultIEnumerableQueryTagForAdminDto QueryTagsForAdminAsync();/// summary
/// 新增标签
/// /summary
/// param nameinput/param
/// returns/returns
TaskServiceResult InsertTagAsync(EditTagInput input);/// summary
/// 更新标签
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
TaskServiceResult UpdateTagAsync(int id, EditTagInput input);/// summary
/// 删除标签
/// /summary
/// param nameid/param
/// returns/returns
TaskServiceResult DeleteTagAsync(int id);#endregion Tags
查询标签列表需要返回的模型类QueryTagForAdminDto.cs。//QueryTagForAdminDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{public class QueryTagForAdminDto : QueryTagDto{/// summary/// 主键/// /summarypublic int Id { get; set; }}
}
新增标签和更新标签需要的输入参数EditTagInput.cs直接继承TagDto即可。//EditTagInput.cs
namespace Meowv.Blog.Application.Contracts.Blog.Params
{public class EditTagInput : TagDto{}
}
分别实现这几个接口。/// summary
/// 查询标签列表
/// /summary
/// returns/returns
public async TaskServiceResultIEnumerableQueryTagForAdminDto QueryTagsForAdminAsync()
{var result new ServiceResultIEnumerableQueryTagForAdminDto();var post_tags await _postTagRepository.GetListAsync();var tags _tagRepository.GetListAsync().Result.Select(x new QueryTagForAdminDto{Id x.Id,TagName x.TagName,DisplayName x.DisplayName,Count post_tags.Count(p p.TagId x.Id)});result.IsSuccess(tags);return result;
}
/// summary
/// 新增标签
/// /summary
/// param namedto/param
/// returns/returns
public async TaskServiceResult InsertTagAsync(EditTagInput input)
{var result new ServiceResult();var tag ObjectMapper.MapEditTagInput, Tag(input);await _tagRepository.InsertAsync(tag);result.IsSuccess(ResponseText.INSERT_SUCCESS);return result;
}
这里需要一条AutoMapper配置将EditCategoryInput转换为Tag忽略Id字段。CreateMapEditTagInput, Tag().ForMember(x x.Id, opt opt.Ignore());
/// summary
/// 更新标签
/// /summary
/// param nameid/param
/// param namedto/param
/// returns/returns
public async TaskServiceResult UpdateTagAsync(int id, EditTagInput input)
{var result new ServiceResult();var tag await _tagRepository.GetAsync(id);tag.TagName input.TagName;tag.DisplayName input.DisplayName;await _tagRepository.UpdateAsync(tag);result.IsSuccess(ResponseText.UPDATE_SUCCESS);return result;
}
/// summary
/// 删除标签
/// /summary
/// param nameid/param
/// returns/returns
public async TaskServiceResult DeleteTagAsync(int id)
{var result new ServiceResult();var tag await _tagRepository.FindAsync(id);if (null tag){result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith(Id, id));return result;}await _tagRepository.DeleteAsync(id);await _postTagRepository.DeleteAsync(x x.TagId id);result.IsSuccess(ResponseText.DELETE_SUCCESS);return result;
}
在BlogController.Admin.cs中添加接口。#region Tags/// summary
/// 查询标签列表
/// /summary
/// returns/returns
[HttpGet]
[Authorize]
[Route(admin/tags)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResultIEnumerableQueryTagForAdminDto QueryTagsForAdminAsync()
{return await _blogService.QueryTagsForAdminAsync();
}/// summary
/// 新增标签
/// /summary
/// param nameinput/param
/// returns/returns
[HttpPost]
[Authorize]
[Route(tag)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult InsertTagAsync([FromBody] EditTagInput input)
{return await _blogService.InsertTagAsync(input);
}/// summary
/// 更新标签
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
[HttpPut]
[Authorize]
[Route(tag)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult UpdateTagAsync([Required] int id, [FromBody] EditTagInput input)
{return await _blogService.UpdateTagAsync(id, input);
}/// summary
/// 删除标签
/// /summary
/// param nameid/param
/// returns/returns
[HttpDelete]
[Authorize]
[Route(tag)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult DeleteTagAsync([Required] int id)
{return await _blogService.DeleteTagAsync(id);
}#endregion Tags
友链添加接口查询友链列表QueryFriendLinksForAdminAsync()、新增友链InsertFriendLinkAsync(...)、更新友链UpdateFriendLinkAsync(...)、删除友链DeleteFriendLinkAsync(...)#region FriendLinks/// summary
/// 查询友链列表
/// /summary
/// returns/returns
TaskServiceResultIEnumerableQueryFriendLinkForAdminDto QueryFriendLinksForAdminAsync();/// summary
/// 新增友链
/// /summary
/// param nameinput/param
/// returns/returns
TaskServiceResult InsertFriendLinkAsync(EditFriendLinkInput input);/// summary
/// 更新友链
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
TaskServiceResult UpdateFriendLinkAsync(int id, EditFriendLinkInput input);/// summary
/// 删除友链
/// /summary
/// param nameid/param
/// returns/returns
TaskServiceResult DeleteFriendLinkAsync(int id);#endregion FriendLinks
查询友链列表需要返回的模型类QueryFriendLinkForAdminDto.cs。//QueryFriendLinkForAdminDto.cs
namespace Meowv.Blog.Application.Contracts.Blog
{public class QueryFriendLinkForAdminDto : FriendLinkDto{/// summary/// 主键/// /summarypublic int Id { get; set; }}
}
新增友链和更新友链需要的输入参数EditFriendLinkInput.cs直接继承FriendLinkDto即可。//EditFriendLinkInput .cs
namespace Meowv.Blog.Application.Contracts.Blog.Params
{public class EditFriendLinkInput : FriendLinkDto{}
}
分别实现这几个接口。/// summary
/// 查询友链列表
/// /summary
/// returns/returns
public async TaskServiceResultIEnumerableQueryFriendLinkForAdminDto QueryFriendLinksForAdminAsync()
{var result new ServiceResultIEnumerableQueryFriendLinkForAdminDto();var friendLinks await _friendLinksRepository.GetListAsync();var dto ObjectMapper.MapListFriendLink, IEnumerableQueryFriendLinkForAdminDto(friendLinks);result.IsSuccess(dto);return result;
}
/// summary
/// 新增友链
/// /summary
/// param nameinput/param
/// returns/returns
public async TaskServiceResult InsertFriendLinkAsync(EditFriendLinkInput input)
{var result new ServiceResult();var friendLink ObjectMapper.MapEditFriendLinkInput, FriendLink(input);await _friendLinksRepository.InsertAsync(friendLink);// 执行清除缓存操作await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);result.IsSuccess(ResponseText.INSERT_SUCCESS);return result;
}
/// summary
/// 更新友链
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
public async TaskServiceResult UpdateFriendLinkAsync(int id, EditFriendLinkInput input)
{var result new ServiceResult();var friendLink await _friendLinksRepository.GetAsync(id);friendLink.Title input.Title;friendLink.LinkUrl input.LinkUrl;await _friendLinksRepository.UpdateAsync(friendLink);// 执行清除缓存操作await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);result.IsSuccess(ResponseText.UPDATE_SUCCESS);return result;
}
/// summary
/// 删除友链
/// /summary
/// param nameid/param
/// returns/returns
public async TaskServiceResult DeleteFriendLinkAsync(int id)
{var result new ServiceResult();var friendLink await _friendLinksRepository.FindAsync(id);if (null friendLink){result.IsFailed(ResponseText.WHAT_NOT_EXIST.FormatWith(Id, id));return result;}await _friendLinksRepository.DeleteAsync(id);// 执行清除缓存操作await _blogCacheService.RemoveAsync(CachePrefix.Blog_FriendLink);result.IsSuccess(ResponseText.DELETE_SUCCESS);return result;
}
其中查询友链列表和新增友链中有两条AutoMapper配置。CreateMapFriendLink, QueryFriendLinkForAdminDto();CreateMapEditFriendLinkInput, FriendLink().ForMember(x x.Id, opt opt.Ignore());
在BlogController.Admin.cs中添加接口。#region FriendLinks/// summary
/// 查询友链列表
/// /summary
/// returns/returns
[HttpGet]
[Authorize]
[Route(admin/friendlinks)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResultIEnumerableQueryFriendLinkForAdminDto QueryFriendLinksForAdminAsync()
{return await _blogService.QueryFriendLinksForAdminAsync();
}/// summary
/// 新增友链
/// /summary
/// param nameinput/param
/// returns/returns
[HttpPost]
[Authorize]
[Route(friendlink)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult InsertFriendLinkAsync([FromBody] EditFriendLinkInput input)
{return await _blogService.InsertFriendLinkAsync(input);
}/// summary
/// 更新友链
/// /summary
/// param nameid/param
/// param nameinput/param
/// returns/returns
[HttpPut]
[Authorize]
[Route(friendlink)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult UpdateFriendLinkAsync([Required] int id, [FromBody] EditFriendLinkInput input)
{return await _blogService.UpdateFriendLinkAsync(id, input);
}/// summary
/// 删除友链
/// /summary
/// param nameid/param
/// returns/returns
[HttpDelete]
[Authorize]
[Route(friendlink)]
[ApiExplorerSettings(GroupName Grouping.GroupName_v2)]
public async TaskServiceResult DeleteFriendLinkAsync([Required] int id)
{return await _blogService.DeleteFriendLinkAsync(id);
}#endregion
Next截止本篇基于 abp vNext 和 .NET Core 开发博客项目 系列的后台API部分便全部开发完成了。本博客项目系列是我一边写代码一边记录后的成果并不是开发完成后再拿出来写的涉及到东西也不是很多对于新手入门来说应该是够了的如果你从中有所收获请多多转发分享。在此希望大家可以关注一下我的微信公众号『阿星Plus』文章将会首发在公众号中。现在有了API大家可以选择自己熟悉的方式去开发前端界面比如目前我博客的线上版本就是用的 ASP.NET Core Web 感兴趣的可以去 release 分支查看。关于前端部分看到有人呼吁vue说实话前端技术不是很厉害本职主要是后端开发可能达不到预期效果。所以我准备入坑 Blazor ????接下来就现学现卖吧一起学习一起做项目一起进步加油????开源地址https://github.com/Meowv/Blog/tree/blog_tutorial搭配下方课程学习更佳 ↓ ↓ ↓