欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > >内容正文

asp.net

基于 abp vnext 和 .net core 开发博客项目 -凯发k8官方网

发布时间:2025/1/21 17 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于 abp vnext 和 .net core 开发博客项目 - 博客接口实战篇(二)

转载于:https://github.com/meowv/blog

上篇文章完成了两个接口:文章列表页、文章详情页,本篇继续。

分类列表

图片

分析:这里多了一个统计文章数量的字段,可以直接新建一个模型querycategorydto.cs继承categorydto。

//querycategorydto.cs
namespace meowv.blog.application.contracts.blog
{
public class querycategorydto : categorydto
{
///
/// 总数
///
public int count { get; set; }
}
}
添加查询分类列表接口和缓存接口。

//iblogservice.category.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system.collections.generic;
using system.threading.tasks;

namespace meowv.blog.application.blog
{
public partial interface iblogservice
{
///
/// 查询分类列表
///
///
task> querycategoriesasync();
}
}
//iblogcacheservice.category.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system;
using system.collections.generic;
using system.threading.tasks;

namespace meowv.blog.application.caching.blog
{
public partial interface iblogcacheservice
{
///
/// 查询分类列表
///
///
///
task> querycategoriesasync(func>> factory);
}
}
分别实现这两个接口。

//blogcacheservice.category.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system;
using system.collections.generic;
using system.threading.tasks;
using static meowv.blog.domain.shared.meowvblogconsts;

namespace meowv.blog.application.caching.blog.impl
{
public partial class blogcacheservice
{
private const string key_querycategories = “blog:category:querycategories”;

/// /// 查询分类列表/// /// /// public async task>> querycategoriesasync(func>>> factory){return await cache.getoraddasync(key_querycategories, factory, cachestrategy.one_day);} }

}
//blogservice.category.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system.collections.generic;
using system.linq;
using system.threading.tasks;

namespace meowv.blog.application.blog.impl
{
public partial class blogservice
{
///
/// 查询分类列表
///
///
public async task> querycategoriesasync()
{
return await _blogcacheservice.querycategoriesasync(async () =>
{
var result = new serviceresult();

var list = from category in await _categoryrepository.getlistasync()join posts in await _postrepository.getlistasync()on category.id equals posts.categoryidgroup category by new{category.categoryname,category.displayname} into gselect new querycategorydto{categoryname = g.key.categoryname,displayname = g.key.displayname,count = g.count()};result.issuccess(list);return result;});} }

}
缓存就不说了,查询分类列表,联合查询文章和分类两张表,关联字段为categoryid,然后分组,计算出对应的数量,在blogcontroller中添加api。

///
/// 查询分类列表
///
///
[httpget]
[route(“categories”)]
public async task> querycategoriesasync()
{
return await _blogservice.querycategoriesasync();
}

图片

标签列表

图片

分析:和分类列表差不多,新建模型querytagdto.cs继承tagdto。

//querytagdto.cs
namespace meowv.blog.application.contracts.blog
{
public class querytagdto : tagdto
{
///
/// 总数
///
public int count { get; set; }
}
}
添加查询标签列表接口和缓存接口。

//iblogcacheservice.tag.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system;
using system.collections.generic;
using system.threading.tasks;

namespace meowv.blog.application.caching.blog
{
public partial interface iblogcacheservice
{
///
/// 查询标签列表
///
///
///
task> querytagsasync(func>> factory);
}
}
//iblogservice.tag.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system.collections.generic;
using system.threading.tasks;

namespace meowv.blog.application.blog
{
public partial interface iblogservice
{
///
/// 查询标签列表
///
///
task> querytagsasync();
}
}
分别实现这两个接口。

//blogcacheservice.tag.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system;
using system.collections.generic;
using system.threading.tasks;
using static meowv.blog.domain.shared.meowvblogconsts;

namespace meowv.blog.application.caching.blog.impl
{
public partial class blogcacheservice
{
private const string key_querytags = “blog:tag:querytags”;

/// /// 查询标签列表/// /// /// public async task>> querytagsasync(func>>> factory){return await cache.getoraddasync(key_querytags, factory, cachestrategy.one_day);} }

}
//blogservice.tag.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system.collections.generic;
using system.linq;
using system.threading.tasks;

namespace meowv.blog.application.blog.impl
{
public partial class blogservice
{
///
/// 查询标签列表
///
///
public async task> querytagsasync()
{
return await _blogcacheservice.querytagsasync(async () =>
{
var result = new serviceresult();

var list = from tags in await _tagrepository.getlistasync()join post_tags in await _posttagrepository.getlistasync()on tags.id equals post_tags.tagidgroup tags by new{tags.tagname,tags.displayname} into gselect new querytagdto{tagname = g.key.tagname,displayname = g.key.displayname,count = g.count()};result.issuccess(list);return result;});} }

}
查询标签列表需要联合查询tags和post_tags,根据tagid进行关联,然后分组从而获取标签下文章的总数,在blogcontroller中添加api。

///
/// 查询标签列表
///
///
[httpget]
[route(“tags”)]
public async task> querytagsasync()
{
return await _blogservice.querytagsasync();
}

图片

分类名称&文章列表

图片

分析:此页面下包含两个接口,查询分类的名称和当前分类下的文章列表,和文章列表不同的是,它不带分页。分类包含两个字段,分类名称和展示名称,我们要把真正的名称查询出来展示在页面上。

分类名称

不需要给他添加返回模型,直接返回一个string类型即可,同时给一个查询参数name,添加获取分类名称接口和缓存接口。

//iblogservice.category.cs
///
/// 获取分类名称
///
///
///
task getcategoryasync(string name);

//iblogcacheservice.category.cs
///
/// 获取分类名称
///
///
///
///
task getcategoryasync(string name, func> factory);
实现这两个接口。

//blogcacheservice.category.cs

public partial class blogcacheservice
{
private const string key_getcategory = “blog:category:getcategory-{0}”;

/// /// 获取分类名称/// /// /// /// public async task> getcategoryasync(string name, func>> factory){return await cache.getoraddasync(key_getcategory.formatwith(name), factory, cachestrategy.one_day);} }


//blogservice.category.cs
///
/// 获取分类名称
///
///
///
public async task getcategoryasync(string name)
{
return await _blogcacheservice.getcategoryasync(name, async () =>
{
var result = new serviceresult();

var category = await _categoryrepository.findasync(x => x.displayname.equals(name));if (null == category){result.isfailed(responsetext.what_not_exist.formatwith("分类", name));return result;}result.issuccess(category.categoryname);return result; });

}
formatwith()是扩展方法,responsetext.what_not_exist是之前说过的常量,直接查询是否存在当前name的分类,如果不存在给出错误提示,存在的话,则只返回分类名称,在blogcontroller中添加api。

///
/// 获取分类名称
///
///
///
[httpget]
[route(“category”)]
public async task getcategoryasync(([required] string name)
{
return await _blogservice.getcategoryasync(name);
}
[required]attribute 指定参数name必填。

图片

图片

文章列表

通过分类名称查询文章列表和分页查询文章列表返回模型是一样的,只是不用分页,所以直接返回一个列表就可以了,添加通过分类名称查询文章列表和缓存的接口。

//iblogservice.post.cs
///
/// 通过分类名称查询文章列表
///
///
///
task> querypostsbycategoryasync(string name);

//iblogcacheservice.post.cs
///
/// 通过分类名称查询文章列表
///
///
///
///
task> querypostsbycategoryasync(string name, func>> factory);
分别实现这两个接口。

//blogcacheservice.post.cs

public partial class blogcacheservice
{
private const string key_querypostsbycategory = “blog:post:querypostsbycategory-{0}”;

/// /// 通过分类名称查询文章列表/// /// /// /// public async task>> querypostsbycategoryasync(string name, func>>> factory){return await cache.getoraddasync(key_querypostsbycategory.formatwith(name), factory, cachestrategy.one_day);} }


//blogservice.post.cs
///
/// 通过分类名称查询文章列表
///
///
///
public async task> querypostsbycategoryasync(string name)
{
return await _blogcacheservice.querypostsbycategoryasync(name, async () =>
{
var result = new serviceresult();

var list = (from posts in await _postrepository.getlistasync()join categories in await _categoryrepository.getlistasync()on posts.categoryid equals categories.idwhere categories.displayname.equals(name)orderby posts.creationtime descendingselect new postbriefdto{title = posts.title,url = posts.url,year = posts.creationtime.year,creationtime = posts.creationtime.trytodatetime()}).groupby(x => x.year).select(x => new querypostdto{year = x.key,posts = x.tolist()});result.issuccess(list);return result; });

}
这个逻辑和分页查询文章列表是差不多的,联合查询文章表和分类表,关联字段为categoryid,指定查询条件categories.displayname==name,以creationtime倒序排序,年份分组,筛选出所需字段返回,在blogcontroller中添加api。

///
/// 通过分类名称查询文章列表
///
///
///
[httpget]
[route(“posts/category”)]
public async task> querypostsbycategoryasync([required] string name)
{
return await _blogservice.querypostsbycategoryasync(name);
}

图片

标签名称&文章列表

图片

分析:此页面和分类页一样,包含两个接口,查询标签的名称和当前标签下的文章列表。

标签名称

添加获取标签名称接口和缓存接口,gettagasync()。

//iblogservice.tag.cs
///
/// 获取标签名称
///
///
///
task gettagasync(string name);
//iblogcacheservice.tag.cs
///
/// 获取标签名称
///
///
///
///
task gettagasync(string name, func> factory);
实现这两个接口。

//blogcacheservice.tag.cs

public partial class blogcacheservice
{
private const string key_gettag = “blog:tag:gettag-{0}”;

/// /// 获取标签名称/// /// /// /// public async task> gettagasync(string name, func>> factory){return await cache.getoraddasync(key_gettag.formatwith(name), factory, cachestrategy.one_day);} }


//blogservice.tag.cs
///
/// 获取标签名称
///
///
///
public async task gettagasync(string name)
{
return await _blogcacheservice.gettagasync(name, async () =>
{
var result = new serviceresult();

var tag = await _tagrepository.findasync(x => x.displayname.equals(name));if (null == tag){result.isfailed(responsetext.what_not_exist.formatwith("标签", name));return result;}result.issuccess(tag.tagname);return result; });

}
formatwith()是扩展方法,responsetext.what_not_exist是之前说过的常量,直接查询是否存在当前name的分类,如果不存在给出错误提示,存在的话,则只返回分类名称,在blogcontroller中添加api。

///
/// 获取标签名称
///
///
///
[httpget]
[route(“tag”)]
public async task gettagasync(string name)
{
return await _blogservice.gettagasync(name);
}
[required]attribute 指定参数name必填。

图片

图片

文章列表

和上面一模一样的,添加通过标签名称查询文章列表接口和缓存接口。

//iblogservice.post.cs
///
/// 通过标签名称查询文章列表
///
///
///
task> querypostsbytagasync(string name);
//iblogcacheservice.post.cs
///
/// 通过标签名称查询文章列表
///
///
///
///
task> querypostsbytagasync(string name, func>> factory);
分别实现这两个接口。

//blogcacheservice.post.cs

public partial class blogcacheservice
{
private const string key_querypostsbytag = “blog:post:querypostsbytag-{0}”;

/// /// 通过标签名称查询文章列表/// /// /// /// public async task>> querypostsbytagasync(string name, func>>> factory){return await cache.getoraddasync(key_querypostsbytag.formatwith(name), factory, cachestrategy.one_day);} }

//blogservice.post.cs
///
/// 通过标签名称查询文章列表
///
///
///
public async task> querypostsbytagasync(string name)
{
return await _blogcacheservice.querypostsbytagasync(name, async () =>
{
var result = new serviceresult();

var list = (from post_tags in await _posttagrepository.getlistasync()join tags in await _tagrepository.getlistasync()on post_tags.tagid equals tags.idjoin posts in await _postrepository.getlistasync()on post_tags.postid equals posts.idwhere tags.displayname.equals(name)orderby posts.creationtime descendingselect new postbriefdto{title = posts.title,url = posts.url,year = posts.creationtime.year,creationtime = posts.creationtime.trytodatetime()}).groupby(x => x.year).select(x => new querypostdto{year = x.key,posts = x.tolist()});result.issuccess(list);return result; });

}
这个查询有点特殊,联合查询了3张表,先查post_tags和tags,关联字段tagid,再根据postid查询posts,指定查询条件tags.displayname==name,以creationtime倒序排序,年份分组,筛选出所需字段返回,在blogcontroller中添加api。

///
/// 通过标签名称查询文章列表
///
///
///
[httpget]
[route(“posts/tag”)]
public async task> querypostsbytagasync(string name)
{
return await _blogservice.querypostsbytagasync(name);
}

图片

至此,基本上完成了博客前端所需的所有查询接口,就还剩下友链的查询,大家可以自己完成,后面如果需要什么新的接口再回头来写就好了。

开源地址:https://github.com/meowv/blog/tree/blog_tutorial

总结

以上是凯发k8官方网为你收集整理的的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图