学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
很快啊,pia的一下,博客上线已经一周时间了(网址:http://blog.deali.cn)
阅读量不高,不过对于没有做过SEO的网站来说已经不错了~
这段时间虽然忙不过一直在写代码给博客添砖加瓦~~(Github上的Commit每天不断的)~~
这不,友情链接功能来了~
本文来一步步介绍这个功能的实现。
同时所有项目代码已经上传GitHub,欢迎各位大佬Star/Fork!
先分析一下功能
友情链接,既可以自己手动添加,也可以由访问网站的人申请
其他站长可以申请互换友链,提交申请之后在博客后台可以看到,确认之后就会显示到网站中啦~
这就是初步的功能设计
当然我还想到了一些扩展的功能,比如根据链接的点击量来调整链接的显示顺序~~(百度:听起来怎么那么熟悉)~~
根据需求,需要俩模型
一个是要显示的友情链接,一个是友情链接申请记录
那开始吧
在StarBlog.Data/Models
中创建数据模型
///
/// 友情链接
///
public class Link {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
///
/// 网站名称
///
public string Name { get; set; }
///
/// 介绍
///
public string? Description { get; set; }
///
/// 网址
///
public string Url { get; set; }
///
/// 是否显示
///
public bool Visible { get; set; }
}
还有这个
///
/// 友情链接申请记录
///
public class LinkExchange {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
///
/// 网站名称
///
public string Name { get; set; }
///
/// 介绍
///
public string? Description { get; set; }
///
/// 网址
///
public string Url { get; set; }
///
/// 站长
///
public string WebMaster { get; set; }
///
/// 联系邮箱
///
public string Email { get; set; }
///
/// 是否已验证
/// 友情链接需要验证后才显示在网站上
///
public bool Verified { get; set; } = false;
///
/// 申请时间
///
public DateTime ApplyTime { get; set; } = DateTime.Now;
}
有了模型,接下来完善一下逻辑
在StarBlog.Web/Services
中写逻辑
首先是友情链接的,增删改查除外,还加一个设置可见性的快捷方式
public class LinkService {
private IBaseRepository _repo;
public LinkService(IBaseRepository repo) {
_repo = repo;
}
///
/// 获取全部友情链接
///
/// 只获取显示的链接
///
public List GetAll(bool onlyVisible = true) {
return onlyVisible
? _repo.Where(a => a.Visible).ToList()
: _repo.Select.ToList();
}
public Link? GetById(int id) {
return _repo.Where(a => a.Id == id).First();
}
public Link? GetByName(string name) {
return _repo.Where(a => a.Name == name).First();
}
public Link AddOrUpdate(Link item) {
return _repo.InsertOrUpdate(item);
}
public Link? SetVisibility(int id, bool visible) {
var item = GetById(id);
if (item == null) return null;
item.Visible = visible;
_repo.Update(item);
return GetById(id);
}
public int DeleteById(int id) {
return _repo.Delete(a => a.Id == id);
}
}
这个没啥特别的
继续
管理友情链接申请记录的逻辑,同样也是有增删改查,这部分代码跟上面的一样,省略了
这里只贴设置是否验证的代码
public class LinkExchangeService {
private readonly IBaseRepository \_repo;
private readonly LinkService \_linkService;
public LinkExchangeService(IBaseRepository repo, LinkService linkService) {
\_repo = repo;
\_linkService = linkService;
}
// 设置是否验证
public LinkExchange? SetVerifyStatus(int id, bool status) {
var item = GetById(id);
if (item == null) return null;
item.Verified = status;
\_repo.Update(item);
var link = \_linkService.GetByName(item.Name);
if (status) {
if (link == null) {
\_linkService.AddOrUpdate(new Link {
Name = item.Name,
Description = item.Description,
Url = item.Url,
Visible = true
});
}
else {
\_linkService.SetVisibility(link.Id, true);
}
}
else {
if (link != null) \_linkService.DeleteById(link.Id);
}
return GetById(id);
}
}
在设置是否验证的方法中,实现了:
其他地方就跟上面的友情链接一样了。
写完之后别忘了注册服务
builder.Services.AddScoped();
builder.Services.AddScoped();
虽然管理这些链接的接口我也写了,但目前本系列文章还处在介绍前台的部分,我打算把接口实现放到后面的RESTFul接口开发部分讲~
所以先直接在数据库中添加吧~
数据模型和逻辑都实现了,接下来就是找一个合适的地方显示
参考了几个同类的博客之后,我决定把友链放在主页底部
编辑StarBlog.Web/ViewModels/HomeViewModel.cs
,添加一个新属性
public class HomeViewModel {
///
/// 友情链接
///
public List Links { get; set; } = new();
}
用Bootstrap5的responsive variation来做响应式的友情链接展示