StarBlog - 2023年底更新内容一览
前言
先说一下我对 StarBlog 这个系列的文章的规划吧,在 StarBlog 的 1.x 版本,我会同步更新两个系列的文章
- 博客前台+接口开发笔记 (即当前已发布的这一系列文章)
- 博客Vue后台开发笔记 (后续开始持续发布)
最近很久没有更新 StarBlog 系列的文章,事实上我之前已经把【博客Vue后台开发笔记】基本完成了,但我想把 StarBlog 1.x版本的功能完善之后,把【前台+接口开发笔记】这系列完成之后,再开始更新【vue后台开发笔记】
所以最近一段时间对本项目的后端、前端代码做了很多修改,包括性能优化、UI调整、功能完善等,本文做一个简单的记录。(当然优化和改进是无止境的,欢迎各位同学提交 issues 和 pr!)
前台UI调整
本次更新我对前台和后台的UI都做了一些调整,对用户来说,UI调整是感知程度最强的,所以放在第一个介绍。
文章列表
文章列表界面的调整包括右上角的文章排序选项和重新设计的文章列表。
旧的文章列表直接使用 Bootstrap4 样式的 Card,card-header 里放置文章的分类名称,然后 card-body 里是文章标题和梗概,丑是丑了点,但更主要的问题是没有文章发布时间等额外信息,查看起来不太直观。旧版UI如下图:

新的文章列表如图,右上角增加了文章排序,可以根据标题、发表时间、更新时间进行正序/倒序的排序。
文章列表里的元素也做了重新设计,加入了封面图、发表时间、阅读量等信息元素,细节方面,每个文章卡片我加入了一点点阴影效果,文章梗概的文字使用了小号字体与 text-muted 样式,更好地与标题区分开来。

导航栏
在前面的文章列表UI里,可以看到顶部的导航栏也换了,这个修改没法说比旧版更好,只能说为了自适应移动设备做出了一些妥协。原本的导航栏还有图标,有更丰富的视觉效果,但是对移动端的兼容比较有限,各个导航菜单没法隐藏到侧边栏里,会平铺占用大量空间;新版的就是普通的Bootstrap风格导航栏,平平无奇,但可以自适应得比较好。
自适应模式下的旧版导航栏

自适应模式下的新版导航栏

后台UI调整
管理后台是审美的重灾区
目前使用的这套管理后台,是基于我之前的一个 SpringCloud 项目的管理后台修改而来
因为历史问题,有一些比较奇怪和难看的样式,在这次更新中,我一并修改了
相比之前,现在的后台UI顺眼多了
原本是这样的

现在是这样的

单纯看主界面还不是很明显
这次主要调整了背景颜色和简化各个界面的布局,可以看到导航栏也精简了很多按钮,只剩下一个用户按钮了。
全新的文章编辑界面
本次我重新设计了文章编辑界面
顶部增加了 breadcrumb
如果处在编辑模式,标题右侧模仿博客园的设计,新增了文章的链接,可以点击直接跳转到文章页面

底部是文章信息与各种设置
新增的 slug 功能可以缩短文章的链接地址,这个功能比较小,所以之前没有单独写一篇文章介绍。设置了 slug 之后,可以通过 starblog.com/p/slug 来访问文章。
下方的文章选项,可以设置文章的发表状态、标记、简介等,没什么特别需要介绍的。

文章分类支持多层级选择

文章管理
先看旧版的,难看的背景,莫名其妙的边距,总结就是难看

新版界面,页面干净很多,然后文章的筛选功能也增强了,现在除了搜索和分类筛选,还可以根据发表状态、文章标记来筛选文章。

其他页面也一样,是类似的修改思路,我就不一一贴图片和介绍了。
上传文章
原本整个UI都在左边,各个控件的宽度也没有一致,现在都改成居中了,控件样式也做了统一。

这里的文章分类选择同样支持多层级结构选择。
动画
大部分页面之前都没有什么动画,加载数据的时候是空白的,加载完成就直接呈现了,很生硬。
现在我给它们都加入了加载动画,感觉舒服多了;还有一个是UI细节继续调整。
这些动画体现在一切需要网络交互的界面上,比如文章列表、保存文章、上传文章这些界面,实现也很简单,ElementUI的大部分组件都可以通过添加 loading 属性来实现加载动画。
性能优化
性能瓶颈大部分在数据库IO上,还有一些是在内存管理方面,主要是和博客提供的图片功能有关。
分页
数据库这块的优化感知最强的是修改分页的实现,之前我是直接使用了 X.PagedList 组件来实现分页,但之前的写法有点问题,先把全部数据加载出来之后再分页,数据量大的时候性能就非常差了,现在全部改成了数据库分页。
目前使用的 ORM 是 FreeSQL ,可以通过 ISelect.Page 方法实现分页,生成出来的 SQL 应该是带类似 offset 和 limit 的,这是在数据库层面实现的分页,比读取全部数据再分页的性能会好很多。
PS:如果数据量更大的话,这种方式也不灵了,但目前这不在本项目的考虑范围内。
X.PagedList 这个组件依然可以继续使用,只不过只用它的元数据就行,一个典型的代码块如下
IPagedList<Post> pagedList = new StaticPagedList<Post>(
await querySet.Page(param.Page, param.PageSize).Include(a => a.Category).ToListAsync(),
param.Page, param.PageSize, Convert.ToInt32(await querySet.CountAsync())
);
使用的时候分别读取其中的数据和分页元数据
return new ApiResponsePaged<Post> {
Message = "Get posts list",
Data = pagedList.ToList(),
Pagination = pagedList.ToPaginationMetadata()
};
修改的代码量不大,迁移成本很小。
图片库
本项目提供了随机图片接口,经过实测这个功能会占用比较多的内存,这可能是和这个功能的设计有关,因为需要根据传入的参数来调整、裁剪图片到合适的尺寸再返回,这个过程是在内存中实现的。
我看到 ImageSharp 的中间件里提供了一种思路,通过在本地缓存图片,以后再遇到相同参数的图片时就直接从文件系统读取返回,这可以节省一些内存,不过又带来了新的问题,会占用一些磁盘空间,特别是图片库很大的情况下,所以我目前还没有用这种思路来改造这个功能。
PS:内存都白菜价了,不会有人的服务器还没128G内存吧?
业务逻辑
- 保存和添加文章时检查slug是否可用
// 新建时
if (!string.IsNullOrWhiteSpace(dto.Slug) && !await _postService.CheckSlugAvailable(dto.Slug)) {
return ApiResponse.BadRequest("指定的 slug 已经被其他文章使用!");
}
// 更新时
if (!string.IsNullOrWhiteSpace(dto.Slug)) {
if (dto.Slug!= post.Slug && !await _postService.CheckSlugAvailable(dto.Slug)) {
return ApiResponse.BadRequest("指定的 slug 已经被其他文章使用!");
}
}
- 文章列表接口终于完善了,可以根据是否管理员来筛选不同状态的文章。(评论列表同样)
// 已登录则设置为管理员模式
// todo 后续改成根据角色确定管理员
var adminMode = User.Identity?.IsAuthenticated ?? false;
var pagedList = await _postService.GetPagedList(param, adminMode);
- 修改文章的时候可以同时修改文章标记和草稿状态,这个太简单就不附上代码了
bugfix
这没啥好说的,详见 github commits

不知不觉竟然已经有了 475 个 commits 了!真是太勤奋了(有刷commit的嫌疑)
小结
OK,就是这些啦,这估计也是2023年 StarBlog 项目的最后一次功能更新,接着我会继续更新文章,争取在今年里把【博客前台+接口开发笔记】系列完结掉!~~(然后我就可以来做新项目了)~
PS:当然 StarBlog 也会持续更新的,目前已有初步的 2.x 版本开发计划,我打算对架构进行一些调整以更好增加其他新功能,同时使用 Blazor 和 Next.js 来重写两套管理后台,练手的同时看看 Blazor 和前端开发的各自优劣。
在这里给大家拜个早年!敬请期待后续的新项目
StarBlog - 2023年底更新内容一览的更多相关文章
- (数据科学学习手札124)pandas 1.3版本主要更新内容一览
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,pandas发布了其1.3版本 ...
- Win10桌面预览版14316更新内容大全
下载更新: 安装之后右下角: Win10桌面预览版14316更新内容: Windows上运行乌班图Bash:通过设置开启开发者模式,更新和安全>面向开发人员.然后搜索"Wi ...
- 版本控制工具Vault v7.0更新内容曝光【慧都独家】
SourceGear公司原定于2013年第三季度发布Vault 7.0版本.近日SourceGear就新版本的更新内容就行了发布,相信Vault 7.0版本也会于不久后面世. 那么Vault 7.0版 ...
- 没有苹果电脑打包iOS平台的 Ionic 2程序——《Ionic 2 实例开发》更新内容
没有苹果电脑打包iOS平台的 Ionic 2程序--<Ionic 2 实例开发>更新内容春节刚过,祝各位新的一年里万事如意,一帆风顺.<Ionic 2 实例开发>在这段时间里更 ...
- 【原创翻译】ArcGis Android 10.2.4更新内容简介
翻译不当和错误之处敬请指出 更新内容官方描述 https://developers.arcgis.com/android/guide/release-notes-10-2-4.htm 10.2.4的版 ...
- 如何安装/更新ruby,安装cocoapods,为开发做好准备!(2016年12月07日更新内容)
一:首先来说一下如何安装/更新ruby: 一般情况下,即使是新买的Mac电脑也会安装有ruby,可以在终端中键入一下命令查看ruby版本 ruby -v 正常情况下下面会打印出ruby的版本信息,如果 ...
- phpcms网站迁移无法更新内容提示Table 'led_com.lz_' doesn't exist的解决方法
新接的一位客户说要把旧phpcms网站迁移到新的服务器并更换新域名,这对ytkah是小菜一碟,但往往事与愿违,忽略了一些细节会很惨的.进入新站后台怎么都无法生成内容,提示Table 'led_com. ...
- 自然语言处理工具hanlp 1.7.3版本更新内容一览
HanLP 1.7.3 发布了.HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用.HanLP 具备功能完善.性能高效.架构清晰.语料时新.可自定义的特 ...
- phpcms批量更新内容页只更新一点就返回问题
phpcms批量更新内容页只更新一点就返回问题 给caches目录增加写入权限
- JTable更新内容的方法
JTable更新内容的方法 DefaultTableModel dtm=new DefaultTableModel(data,head);//定义表格模型 jt.setModel(dtm);或jt=n ...
随机推荐
- AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通
本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...
- 细聊C# AsyncLocal如何在异步间进行数据流转
前言 在异步编程中,处理异步操作之间的数据流转是一个比较常用的操作.C#异步编程提供了一个强大的工具来解决这个问题,那就是AsyncLocal.它是一个线程本地存储的机制,可以在异步操作之间传递数据. ...
- ATtiny88初体验(五):ADC
ATtiny88初体验(五):ADC ADC模块介绍 ATtiny88单片机包含一个10bit分辨率的ADC模块,拥有8个通道,最大采样率15kSPS,转换时间14us.ATtiny88的ADC参考电 ...
- ios添加库文件
- ffmpeg 在xp和server2003/2008/2012上修复无法定位GetNumaNodeProcessorMaskEx的问题
问题 在给开发一个手机视频网站时需要用到ffmpeg截取视频缩略图, 把项目提交到服务器(server2003/ server2008)上时, 发现在调用命令时会出现错误"无法定位GetNu ...
- Mac m2使用实现微信小程序抓包
Mac m2使用实现微信小程序抓包 最近换了MacBook Pro,芯片是M2 Pro,很多东西跟windows是不一样的,所以重新配置相应环境,这里介绍一下微信小程序抓包的方法. 使用burp+pr ...
- PGO in Go 1.21
原文在这里. 由 Michael Pratt 发布于 2023年9月5日 在2023年早些时候,Go 1.20发布了供用户测试的概要版本的基于性能分析的优化(PGO).经过解决预览版已知的限制,并得益 ...
- DAY005_异或运算
运算规则 二进制:相同为0 相异为1 十进制:相同为0 任何数字和0异或都是它本身 不利用额外变量交换两个数 数组中一种数字出现了奇数次,其他数都出现了偶数次,怎么得到这个出现了奇数次的数 将所有的数 ...
- Java 21 新特性:switch的模式匹配
在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本.之后在JDK 18.JDK 19.JDK 20中又都进行了更新和完善.如今 ...
- destoon关于archiver归档的性能优化
今天在处理一个项目时候发现archiver单个模块归档超过百万数据,打开速度就特慢,所以打开archiver下index.php文件进行分析,发现有句sql作怪 1 $result = $db-> ...
