基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

系列文章

  • 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

  • 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目

  • 基于.NetCore开发博客项目 StarBlog - (3) 模型设计

  • 基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入

  • 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目

  • 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表

  • 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

  • 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示

  • 基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入

  • 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流

  • 基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计

  • 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

  • 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

  • ...

前言

很快啊,pia的一下,博客上线已经一周时间了(网址:http://blog.deali.cn)

阅读量不高,不过对于没有做过SEO的网站来说已经不错了~

这段时间虽然忙不过一直在写代码给博客添砖加瓦(Github上的Commit每天不断的)

这不,友情链接功能来了~

本文来一步步介绍这个功能的实现。

同时所有项目代码已经上传GitHub,欢迎各位大佬Star/Fork!

  • 博客后端+前台项目地址:https://github.com/Deali-Axy/StarBlog

  • 管理后台前端项目地址:https://github.com/Deali-Axy/StarBlog-Admin

先看效果

9ddfce4b0c56824dde079cc6e438c036.png
image

分析

先分析一下功能

友情链接,既可以自己手动添加,也可以由访问网站的人申请

其他站长可以申请互换友链,提交申请之后在博客后台可以看到,确认之后就会显示到网站中啦~

这就是初步的功能设计

当然我还想到了一些扩展的功能,比如根据链接的点击量来调整链接的显示顺序(百度:听起来怎么那么熟悉371b9bc51aa19420f1bb9f0209ca6e41.png

建模

根据需求,需要俩模型

一个是要显示的友情链接,一个是友情链接申请记录

那开始吧

StarBlog.Data/Models中创建数据模型

/// <summary>
/// 友情链接
/// </summary>
public class Link {[Column(IsIdentity = true, IsPrimary = true)]public int Id { get; set; }/// <summary>/// 网站名称/// </summary>public string Name { get; set; }/// <summary>/// 介绍/// </summary>public string? Description { get; set; }/// <summary>/// 网址/// </summary>public string Url { get; set; }/// <summary>/// 是否显示/// </summary>public bool Visible { get; set; }
}

还有这个

/// <summary>
/// 友情链接申请记录
/// </summary>
public class LinkExchange {[Column(IsIdentity = true, IsPrimary = true)]public int Id { get; set; }/// <summary>/// 网站名称/// </summary>public string Name { get; set; }/// <summary>/// 介绍/// </summary>public string? Description { get; set; }/// <summary>/// 网址/// </summary>public string Url { get; set; }/// <summary>/// 站长/// </summary>public string WebMaster { get; set; }/// <summary>/// 联系邮箱/// </summary>public string Email { get; set; }/// <summary>/// 是否已验证/// <para>友情链接需要验证后才显示在网站上</para>/// </summary>public bool Verified { get; set; } = false;/// <summary>/// 申请时间/// </summary>public DateTime ApplyTime { get; set; } = DateTime.Now;
}

Service

有了模型,接下来完善一下逻辑

StarBlog.Web/Services中写逻辑

首先是友情链接的,增删改查除外,还加一个设置可见性的快捷方式

public class LinkService {private IBaseRepository<Link> _repo;public LinkService(IBaseRepository<Link> repo) {_repo = repo;}/// <summary>/// 获取全部友情链接/// </summary>/// <param name="onlyVisible">只获取显示的链接</param>/// <returns></returns>public List<Link> 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<LinkExchange> _repo;private readonly LinkService _linkService;public LinkExchangeService(IBaseRepository<LinkExchange> 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<LinkExchangeService>();
builder.Services.AddScoped<LinkService>();

添加数据

虽然管理这些链接的接口我也写了,但目前本系列文章还处在介绍前台的部分,我打算把接口实现放到后面的RESTFul接口开发部分讲~

所以先直接在数据库中添加吧~

24cebc8f3394c6cce0d9ee7b9d993c69.png
image

页面展示

数据模型和逻辑都实现了,接下来就是找一个合适的地方显示

参考了几个同类的博客之后,我决定把友链放在主页底部

编辑StarBlog.Web/ViewModels/HomeViewModel.cs,添加一个新属性

public class HomeViewModel {/// <summary>/// 友情链接/// </summary>public List<Link> Links { get; set; } = new();
}

用Bootstrap5的responsive variation来做响应式的友情链接展示

<div class="d-grid gap-2 d-md-block"><button class="btn btn-primary" type="button">Button</button><button class="btn btn-primary" type="button">Button</button>
</div>

官网上的例子效果是这样的

122e24ab7ad5870d8a022847217f2938.png
image

勉强还行,不过都是一样的颜色太单调了,我要七彩的!

封装Razor组件

于是封装了一个名为ColorfulButton的Razor组件

先定义ViewModel,用来配置这个组件

StarBlog.Web/ViewModels中新增ColorfulButtonViewModel.cs文件,代码如下

public static class LinkTarget {public const string Blank = "_blank";public const string Parent = "_parent";public const string Self = "_self";public const string Top = "_top";
}public class ColorfulButtonViewModel {public string Name { get; set; }public string Url { get; set; } = "#";public string Target { get; set; } = "_self";
}

然后在StarBlog.Web/Views/Shared/Widgets中新增ColorfulButton.cshtml

把Bootstrap支持的几种按钮颜色放进去,然后每次随机显示一个颜色~

@model ColorfulButtonViewModel@{var rnd = Random.Shared;var colorList = new[] {"btn-outline-primary","btn-outline-secondary","btn-outline-success","btn-outline-danger","btn-outline-warning","btn-outline-info","btn-outline-dark",};var btnColor = colorList[rnd.Next(0, colorList.Length)];
}<a href="@Model.Url" role="button" class="btn btn-sm @btnColor mb-1" target="@Model.Target">@Model.Name
</a>

添加到页面中

组件完成了,最后在主页中实现友情链接的展示

编辑StarBlog.Web/Views/Home/Index.cshtml文件

在最底下(推荐博客板块下方)新增代码

<div class="container px-4 py-3"><h2 class="pb-2 border-bottom">Link Exchange</h2>@if (Model.Links.Count > 0) {<div class="d-grid gap-2 d-md-block">@foreach (var link in Model.Links) {@await Html.PartialAsync("Widgets/ColorfulButton",new ColorfulButtonViewModel { Name = link.Name, Url = link.Url })}</div>}else {@await Html.PartialAsync("Widgets/PlaceholderCard", "友情链接")}
</div>

最终效果就是一开始展示的那样,每次访问都会有不同的颜色,老炫酷了~

搞定

完成了,很简单的一个功能,可以给单调的博客小小增色一下~

同时也欢迎各位站长大佬来交换友链~!

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

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

相关文章

EditPlus 文件查找功能:在指定文件夹,用正则查寻包含指定内容的文件,指定文件类型,并排除特殊文件名文件

单击菜单栏上的【Search】&#xff08;查找&#xff09;&#xff0c;选择【Find in Files】&#xff08;在文件中查找&#xff09;命令&#xff1a; 查找项&#xff1a;正则查找video标签&#xff0c;src为不包含http的mp4 <video src"([^http].*\.mp4)" width&q…

NOIP2016普及组第三题——海港

题目描述 小K是一个海港的海关工作人员&#xff0c;每天都有许多船只到达海港&#xff0c;船上通常有很多来自不同国家的乘客。 小K对这些到达海港的船只非常感兴趣&#xff0c;他按照时间记录下了到达海港的每一艘船只情况&#xff1b;对于第i艘到达的船&#xff0c;他记录了这…

7z-linux下解决中文名乱码的终极办法

为什么80%的码农都做不了架构师&#xff1f;>>> linux上安装7z主要是为了解决中文文件名乱码的问题&#xff0c;压缩率还是其次原因 具体安装看参考网址&#xff0c;建议用源码方式安装 官网下载地址&#xff1a;http://www.7-zip.org/download.html 源文件项目地址…

工具箱之 IKVM.NET 项目新进展

在各种群里经常讨论的一个事情是.NET 如何调用 Java 的实现&#xff0c;最常见的场景之一就是在加解密方面Java提供的密钥&#xff0c;C#无法解密&#xff0c; C#中byte范围是[0,255]&#xff0c;而Java中的byte范围是[-128,127]&#xff0c;由于密码生成器是java所独有的&…

一天一种设计模式之六-----工厂方法模式

2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式。工厂方法模式定义&#xff1a;定义一个用于创建对象的借口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到了他的子类。一般工厂类会有一个工厂的接…

[转]IPython介绍

1. IPython介绍 ipython是一个python的交互式shell&#xff0c;比默认的python shell好用得多&#xff0c;支持变量自动补全&#xff0c;自动缩进&#xff0c;支持bash shell命令&#xff0c;内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python…

.NET MAUI in Mac

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;4分钟&#xff09;概要本篇文章主要分享MAUI在m1芯片的设备上运行和支持情况&#xff0c;将我们写好的MAUI程序编译为支持mac平台的版本。在m1芯片刚刚出来的时候有很多开发工具和应用程序对m1芯片的支持不是很友好&a…

前端开发中的SEO

前端开发中的SEO 什么是SEO SEO由英文Search Engine Optimization缩写而来&#xff0c;中文意译为“搜索引擎优化”。SEO是指从自然搜索结果获得网站流量的技术和过程&#xff0c;是在了解搜索引擎自然排名机制的基础上&#xff0c;对网站进行内部及外部的调整优化&#xff0c;…

C# 自定义并动态切换光标

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;唐宋元明清的博客原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/14873136.html系统有很多光标类型 &#xff1a;Cursors 类 (System.Windows.Input) | Microsoft Docs[1]本章介绍如…

视频播放器for android

写在前面 好久没有写博客了, 中间忙了一堆杂七杂八的事情...工作, 情感, 未来, 人生... 下面是正文 一直要写一个视频播放器, 好练练手. 这个app, 从年前写到现在, 终于算弄出了样子, 0.0版本. (不得不说, googleVPN值得拥有, android developer网站, android sdk samples, sta…

简单粗暴无需拼接下载 blob (ts)视频文件

网上很多视频采用blob来播放视频&#xff0c;查看源码会发现video的src为形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

Shell重定向

Liunx下系统打开的3个文件&#xff0c;即标准输入、标注输出和标准错误输出。用户的shell将键盘设为默认的标准输入&#xff0c;默认的标准输入和标准错误输出为屏幕。也就是说&#xff0c;用户从键盘输入命令&#xff0c;然后将结果和错误消息输入到屏幕所谓的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?

CASS9.2在安装完后,首次启动会提示如下图样提示,应该如何处理?请看以下步骤: 解决步骤: 1、安装完CASS9.2_2014后,首次启动CASS92,会出现如下图所示提示。选择“不加载”。 2、进入AutoCAD系统配置—系统页面 打开系统页面菜单 系统界面截图

VS2015不能修改安装路径问题

能修改安装路径&#xff0c;固态硬盘空间太小&#xff0c;所以不能装在C盘啊。 其中&#xff0c;原因是以前安装过VS2015没有卸载干净&#xff0c;解决方法是&#xff1a;下载Visual Studio Uninstaller卸载完全&#xff08;要以管理员运行哈&#xff09; 下载地址&#xff1a;…

python 绘制分形树

# -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle 20 # 树枝与树干夹角 trunk_min_length 5 # 树干最小长度 trunk_step_length 10 # 树干每次递减长度 trunk_length 80 # 初…

像JAVA一样流畅调试C#源代码?

起因最近在研究ServiceScope的内一些内在运行逻辑,发现相关资料非常少&#xff0c;只有讲IOC相关的文章有说Core时代的官方依赖注入怎么使用。。遂决定还是要去看源代码。这部分源代码在Microsoft.Extensions.DependencyInjection库中&#xff0c;源代码位置在src/libraries[1]…

物化视图VS普通视图

2019独角兽企业重金招聘Python工程师标准>>> 物化视图是一种特殊的物理表&#xff0c;“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表&#xff0c;应用的局限性大&#xff0c;任何对视图的查询&#xff0c;Oracle都实际上转换为视图SQL语句的查…

EditPlust 批量添加自定义工具

先将插件文件***.js文件放到指定目录&#xff0c;比如editplus的安装下新文件夹tools。 &#xff08;下载地址见文末&#xff09; 将下列代码内容另存为tool_u.ini 文件&#xff08;不能改名&#xff09;&#xff0c; 放到EditPlus 的ini文件目录 &#xff08;工具-设置目录 可…

iOS c语言 基本运算符

2019独角兽企业重金招聘Python工程师标准>>> iOS_06_基本运算符 一、算术运算 c语言一共有34种运算符&#xff0c;包括了常见的加减乘除 1.加法运算 # 除了能做加法运算&#xff0c;还能表示正号&#xff1a;5、90 2.减法运算- # 除了能做减法运算&#xff0c;还能表…

Maui学习之路(三)--Winui3深入探讨

Maui的学习之路 --- Winui3深入探讨学习Maui已经有一段时间&#xff0c;随着不断地深入&#xff0c;对Maui有了一些初步的了解。我们都知道Maui为了保持平台原生特性&#xff0c;所以在每一个平台都使用了平台自身的原生开发框架&#xff0c;如在Windows系统使用了Winui3作为UI…