wei345 / autumn

映射 AsciiDoc 文件目录为网站,有简单的访问控制,有好用的搜索功能。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Autumn

映射 AsciiDoc 文件目录为网站,有简单的访问控制,有好用的搜索功能。

搜索功能支持单词完全匹配、句子完全匹配、通配符、排除指定词、分类、标签,以及多条件之间与和或的逻辑。

详见 help.adoc

环境需求

  • Java 8+

  • Maven 3.5

  • (可选)Redis 4

快速启动

git clone git@github.com:wei345/autumn.git
cd autumn
bin/start.sh

# 停止
# bin/autumn.sh stop

用浏览器访问 http://localhost:8601

用户名:user,密码: 123456

配置

所有配置项和默认值见 application.properties, 你可以直接修改这个文件,也可以新建 application-local.properties 或 application-prod.properties。

# /path/to/data
autumn.data.dir=<your data directory>
autumn.data.reload-interval-seconds=0
autumn.static-resource.reload-interval-seconds=0
# id username password salt; id ...
autumn.access.users=<your users>
autumn.remember-me.aes-key=<your aes key>
# 启用 Redis
spring.autoconfigure.exclude=

最重要的几项配置是:autumn.data.dirautumn.access.usersautumn.remember-me.aes-key

autumn.data.dir

一个包含 .adoc 文件的目录路径。

.adoc 文件会被转为 HTML,映射为网页。例如 ${autumn.data.dir}/a/b/c.adoc 会被映射为 http://localhost:8601/a/b/c

其他文件会被视为静态文件。例如 ${autumn.data.dir}/a/b/c.png 会被映射为 http://localhost:8601/a/b/c.png

adoc 文件格式示例:
= Title
:created: 2018-02-20 12:59:50 +0800
:modified: 2018-12-03 20:18:42 +0800
:category: at_most_one_category
:tags: tag1, tag2, tag3
:access: owner/user/anon

正文内容

access 用于访问控制,owner/user/anon 分别表示 网站所有者/用户/匿名。

如果不符合以上格式,系统会自动设置默认值。createdmodified 默认值是文件修改时间,access 默认值是 owner

autumn.access.users

生成密码:

mvn -q -DskipTests=false -Dtest=UserServiceTest#generateUser test

输出示例:

1 Username 1B62BCEB123EB08F73BE3970394C23973FADF75CDCEE153A27FD2EC808805ED29BCC77CDCB966E4C775347D55E82753510D9E8154387BB7286D8CBAF9E68324A 75F0FF8B5CF34B050491DBB9F0BBF85F;

Username 可随意修改。

autumn.remember-me.aes-key

生成 AES key:

mvn -q -DskipTests=false -Dtest=io.liuwei.autumn.AesTest#generateKey test

输出示例:

2FDFCEF1DAA8E567549C52C10422BE09A81CC80B0A05BFE8CF75F223BD87DEB6

How it works

  1. 启动时,扫描数据目录所有文件,并读取 .adoc 文件。

  2. 启动时,扫描 classpath:/static,并读取 css, js, help.adoc。

  3. 用户访问页面时,把 .adoc 内容转为 html 并缓存,把 js 合并成一个 all.js 并缓存,把 css 合并成一个 all.css 并缓存,通过模版生成页面 html 返回给浏览器。

缓存

缓存项 何时加载 何时清除

数据目录下所有文件路径

应用启动

重新加载数据目录时刷新

所有文章内容

应用启动

重新加载数据目录时刷新

classpath:/static 里的所有文件内容

应用启动

重新加载 static 目录时刷新

文章列表

被访问

重新加载数据目录

文章 tree JSON

被访问

重新加载数据目录

文章 tree HTML

被访问

重新加载数据目录

all.js

被访问

重新加载 static 目录

all.css

被访问

重新加载 static 目录

help 内容 HTML

被访问

重新加载 static 目录

数据目录下不大于 1M 的文件

被访问

重新加载数据目录,或达到缓存上限

View 渲染结果,包括首页、站点地图页、文章页、搜索结果页、帮助页、登录页

被访问

重新加载数据目录,或达到缓存上限

文章内容 HTML

被访问

达到缓存上限

文章面包屑

被访问

达到缓存上限

搜索 hit

被访问

达到缓存上限

限流计数

被访问

到期失效,或达到缓存上限

rememberMe Cookie 解析结果

被访问

到期失效,或达到缓存上限

文章内容 HTML、文章面包屑和搜索 hit,这几个缓存项的 key 使用了文章的 snapshotId。 snapshotId 是根据文章内容生成的,如果文章内容变化,snapshotId 也会变化, 如果文章内容不变,snapshotId 也不变。所以重新加载数据目录时,不需要清除这些缓存。

…​

有那么多现成的网站工具,为什么还要自己开发?

因为都不顺手。

  • Jekyll 不适合我。我只想公开一部分内容,自己能够看到全部内容,还想要不依赖第三方的好用的搜索功能。

  • WordPress 不适合我。我不喜欢在网页的小窗口内编辑文本,不,大窗口也不喜欢,我更喜欢用强大的文本编辑器编辑文本。

  • DokuWiki 不适合我。同上。

  • 其他,试过一些,也不适合我。

我曾经改造过 DokuWiki,用 git 同步数据,自动刷新索引,把文件扩展名从 .txt 改为 .md, 增加 front matter 支持,Sidebar 可折叠等。DokuWiki 有很多我不需要的功能和逻辑, 对于改造来说都是负担,改造成本很高,考虑到将来要支持 category 和 tags,还有很高的改造成本。

不如自己开发,比改造一个现有的东西更可控更省时间,每一处都按照自己的喜好来做,访问速度更快,用起来更顺手。

About

映射 AsciiDoc 文件目录为网站,有简单的访问控制,有好用的搜索功能。


Languages

Language:Java 64.1%Language:CSS 16.5%Language:JavaScript 15.5%Language:HTML 3.2%Language:Shell 0.8%