从 lyanna 2.0 版之后还没有具体介绍过这个博客应用发生了那些改变,本篇文章介绍到目前 v2.7 里面做的重要改变以及 v3.0 的展望。

专题

在博客应用中常见的聚合页面包含「归档」、「分类」和「标签」,但我一直认为缺点什么,其实从很早前就想尝试实现「专题」这个效果。这是因为我比较喜欢写系列文章,而且我觉得很多文章可以按某种条件归到一起,但是并不是得按照现有的条件排序:如按发布时间升序或者降序。我希望有一种聚合页面可以方便的按照运营者自己的观点去调整文章列表的顺序。

在电商、社交网站,「专题」是一种常见的页面形式。各家各产品的表现形式差别也比较大,但是我们还是可以借鉴其中的 3 个思路:

  1. 专题是一个或者多个文章的聚合页面
  2. 专题和文章一样,也有一个列表
  3. 专题管理后台主要作用除了设置专题介绍等信息,对应文章由运营者从现有文章列表选取

通过一个动态图看看效果:

目前我没把专题做的很重。再感受下后台:

分了已选 / 备选 2 个数据池,可以方便在 2 个池之间拖拽、选择和删除。有一个重要的小贴士,如果你的文章列表很长,例如我博客目前有 160 + 篇文章,从备选列表下面拖拽文章到已选池非常麻烦,所以在这里可以直接点对应文章即可。

Widget

在 V2.7 时添加了 Widget (小部件),这个功能思路来源于 Wordpress,最终目的是可以在博客的 (左 / 右 / 上 / 下) 边栏中添加、排列或删除这些部件。不过目前只支持右侧边栏,感受一下:

现在内置了 aboutme、blogroll、most_viewed、latest_comments、tagcloud、html 等 widget,其实是其中的 html 插件,它给予了极大的自由度,可以方便自定义设置边栏的内容,发挥想象力吧。

需要重点说的有 2 点:

  • widget 相关的配置需要使用新的 config.yaml。使用 YAML 而不是原来的 Python 配置文件 local_settings.py_主要是由于 Python 代码对于描述复杂配置结构表现力太差,而直接写 JSON 可读性和可维护性差。
  • 标签云字体大小我参考了 Nice tagcloud with Hugo 的算法,把它从 Golang 语言翻译成了 Python 又做了一些调整。调整的原因的包含标签数量文章的区间差别不大且很少,有很多个包含标签文章数为 1,具体的写法如下:
<ul class="tagcloud list-inline">                                                                                
    <%                                                                                                             
      per_page = 4  # 主要调整点1                                                                                               
      sorted_tags = sorted(tags, key=lambda x: x[1], reverse=True)                                                 
      max_ = len(sorted_tags[0]) / per_page                                                                        
      min_ = len(sorted_tags[-1]) / per_page                                                                       
    %>                                                                                                             
    % for tag, count in tags:                                                                                      
    <% size = max(math.log(count / per_page) - min_, 1) / ((math.log(max_) - math.log(min_)) or 1) * 4 + 5 %>      # 主要调整点2  
      <li><a target="_blank" href="${ tag.url }" style="font-size: ${ size }pt;">${ tag.name }</a></li>            
    % endfor                                                                                                       
  </ul>

最后欢迎大家提 PR 添加更多的 widget。

kubernetes/Docker Compose 支持

这个还是以学习和本地开发为主,现在已经有线上 kubernetes 版本的博客效果:https://blog.dongwm.com

这 2 个应用在不同区域 (一个北京一个上海) 的 2 个服务器上,数据是不同步的。原因其实不复杂:我目前用的博客服务器是最低配 (1 核 CPU+1G 内存),按 kubernetes 官网说明不符合配置要求,所以在另外一个刚能达到要求的服务器上跑 kubernetes。不过大家手动访问过可以感受到: kubernetes 版本的要慢很多。展望一下,等我不差钱了,买个物理机再把博客迁到 kubernetes 上吧😝

Github Cards

支持在文章中引用 Github User/Repo Card,代码源于 Github Cards ,我对样式做了微调。我的博客的「 关于本站 」这篇文章中有体现:

盘古之白

「盘古之白」简单地说就是对文章内容中的中英文之间自动加空格。这是一个比较强迫症的体验,我其实对这部分没那么大的阅读不适,但是有几个订阅博客内容的朋友都提到过,我想了想对于技术性博客代码、中文、英文混杂加上盘古之白也是有必要的。

具体实现可以翻我写的代码了,除了标题和代码以外的内容都会自动加空格。

重构了 Profile 部分

博客原来决定是否显示右边栏是通过一个叫做SHOW_PROFILE的变量决定的,在它的背后是一个 Profile 的模型,不过这个模型狠鸡肋,虽然是用 atts 包装了一下,但说白了就是写了个本地 JSON 文件。我一直对 Profile 很不满意,觉得它和「User」有冲突。但是当时没想通要怎么实现,这次接着 aboutme 这个 widget 的实现重构了它。

重构内容如下:

  • 去掉了 Profile 部分逻辑
  • 原来 Profile 的头像部分放到了 User 里面
  • aboutme 显示的信息通过配置 (config.yaml) 决定,和 User 模型无关

感受一下:

可以看到更新当前登录管理员 (User) 头像是会改变。另外文章页面可以展示用户信息 (通过SHOW_AUTHOR = True)

展望

在 Python 2.7 的「退休」倒计时结束前,lyanna 也会迎来 v3.0。下面是我想到的一些变化:

  • 使用最新的 Python 3.8 语法海象运算符 (Assignment Expressions)。现在还是 Python 3.8.0,我一般会等下一个小版本发布后再开始正式使用,而 Python 3.8.1 会在 12 月 16 日左右发布,所以届时 lyanna 项目将不再支持 Python 3.8 之前的版本
  • 统一使用 YAML 配置文件,现在只有 widget 部分使用 YAML,之后会完全的使用表现力个会更好的 YAML,当然我也考虑了 TOML,不过最终还是觉得 YAML 更好
  • 命令行工具。类似 hexo cli,提供管理、配置、开发服务器
  • 使用 Electron 构建一个本地的编辑器,可以编辑、管理、同步文章等

后记

其他就是一些小修改了,就不一一提到了。欢迎大家使用 lyanna