Skip to content

LantingWiki/lanting

Folders and files

NameName
Last commit message
Last commit date

Latest commit

7a96cd6 · Aug 16, 2023
Jun 14, 2021
Jul 12, 2023
Aug 16, 2023
Jul 18, 2023
Jun 18, 2021
Aug 10, 2023
Jul 18, 2023
Sep 13, 2020
Sep 18, 2020
May 28, 2021
Jul 7, 2023
Jul 9, 2023
Sep 18, 2020
Sep 13, 2020
Sep 13, 2020
Jul 12, 2023
Jun 14, 2021
Sep 13, 2020
Aug 10, 2023
Aug 10, 2023
Jul 12, 2023

Repository files navigation

Lanting

Palette: #F4E285 #F4A259 #7A4419 #755C1B

TODOs

[ ] I need to fix the broken APIs, using serverless functions

  • Likes
  • Search words
    • API1 - everytime XX is searched, inc
    • API2 - read all search words and sort and show

[x] chapter要加数量呀 [x] dev env

  • 本地nginx, 能跑起来, 有数据 (archives.json也用本地版本)
  • 点赞数, 要有接口. 要起lanting-server (mysql). 有没有不用的办法... 好像没有. 也可以放弃点赞这个功能
  • search keywords, 有接口
  • Create & Update
    • 电脑上, 用git + mysql机制: single-file -> comment -> yarn archives:compile -> yarn archives:add
    • 手机上, 用tribute页面: https://lanting.wiki/lanting/tribute -> lanting-server

[x] commit mgs prefix [x] 原文图标需要一点空格 [x] 标签, 有一个空 [x] 原文 for Book, 用豆瓣页面吧 [x] Work on server [x] New get latest id [x] 接口很慢. 不要等接口, 先展示 (按ID倒序), 然后re-sort [x] compile archives, 在更新archives.json的时候, 得用DB的origs. 不是本地. 要不然服务器端根本对不了

Workflow

[x] 日期特殊排序 [x] 自己的tag排序 [x] archives就把数据理好 [x] 文章排序? 用星期做种子乱序! -> timestamp + likes [x] 芦柑笔谈 in menu [x] 评分功能, 所有东西进DB吧, DB可以commit进来. mongo适合点? [x] 评分优化性能 [x] 评分筛选 [x] 重做redux tree design. 只存在一个地方, 一个大map. 其他地方记ID, 不记数据. map的subtree给很多地方 [x] 单个article link, title就link到single page [x] 渲染两次问题?? -> 好像没有这个现象了?... 第一次渲染之后就有东西了? [x] 加上ID, 灰一点

Tribute页面 - 添加新archive

  1. 页面上很多input, 不用用户全都手动填

  2. 首先最重要的是第一个field, link. 填了link之后, onblur (也就是lose focus), 就来调我一个后端接口, https://lanting.wiki/api/user/tribute/info?link=https://xxxxxx. 后端会返回

{
  "status": "success",
  "code": "",
  "data": {
    "title": "某某标题",
    "author": "某某作者",
    "publisher": "某某报社",
    "date": "2016-12"
  }
}
  1. 注意如果某个字段没提取出来, 会给null. 比如 title: null. 另外注意date是一个string, 格式yyyy-mm

  2. 这时候, 把收到的几个字段, 如果有值, 就填到下面. 如果没值就没办法了, 留空

  3. 用户会填好其他几个field. 都是string就行, 我后端会处理格式

  4. 填好之后, 发一个post request, https://lanting.wiki/api/user/tribute/save, body里面带着所有field. 完美, 完事

数据源

[x] 批量导入现有的, 所有的过一遍 (这里不需要建comments) [x] 批量导入evernote但是没有comments的 (这里需要建comments) [x] 浏览器里右键save singlefile [x] 之后如果微信等需要存, 就做一个接口. headless browser + singleFile CLI 以上两个都需要同时建comments, 尽量抽metadata

放的路径

[x] orig肯定要放public了 [x] 生成archive.json放assets [x] 随园食单不要直接import了, fetch, 就可以也放到public

obsidian集成

[x] 整个变成一个vault, 应该没问题, 编辑的时候也OK

对应关系

[x] 放在archive.json, 什么后缀名 [x] 从public读, 链接先直接跳到orig, 以后考虑iframe?

聚合

兰亭 - 兰亭文存 芦柑 - 芦柑笔谈 异端 - 异端年刻

Heresy Anthology Lanting Florilegium Soda Manuscripts

clipper

两个用例: 微信上存链接 - 公众号. 电脑上打开页面 - chrome extension [x] 把 joplin 插件代码找到 [x] 还是存到本地不变, 路径变一下, 文件名变一下只需要 ID. ID 哪里来? 去 repo 查. 不要打本地, 打接口, 然后本地 pull 吧 [x] 从第一行解析出标题, 试图解析出 metadata, 解析最后 metadata 里有用的部分. 建对应的 orig 和 comment, metadata都放comment, 都进入compile流程. 通过 ID 来对应. 有了就不建, 等于是补全.

综合webclipper, 第一图片怎么处理, 第二css是不是OK, 第三下下来之后触发什么

数据

[x]批量现有的导过来 [ ] archive.json会不会越来越大. 如果会, 就把remarks字段也用fetch. 前X个char在archives.json, 展开的时候fetch. 怎么判断有没有更多 (除了加property, flag)? 看字数行不行. 如果现在的是小于50, 比如49. 就没有. 如果50整, 就有. 怎么解决刚好50的comment? 我能想到的只有砍掉一个char... 哦! 有主意了. 加一个. 弄成51个. 所以凡是[1, 49], [51, Inf], 都是不用展开的

  • 加一个API, 用于获取一个文章的full comment. 如果之前拿到的是前50个char, 就可以用这个API来获取
  • 这样的话搜索就不能用前端, 需要走后端接口了. 后端返回的东西会有点复杂. 还要highlight, 有点麻烦了

compile

[x] compile-archives产出一个 json, metadata [x] 少了一些字段, 等orig好了才能好. 还有就是找不到没有的情况 [x] 实际量大的数据主要去实际.md 里面找

筛选

分页的话也要给文本搜索框, 不分页先不要 不喜欢立刻生效的, 可以给个选了tag之后的确认按钮 [x] 缩上去, 放上面

展示文章

[x] 照着抄先. 给个评星功能? [x] 分chapter [x] 本纪 [x] 随园食单

部署

[x] 包, 小小小 [x] 按需加载, archives.json不打包

styles

[x] ant card body [x] padding: 16px 0;

[x] collapse header [x] padding: 0; [x] font-size: 20px; [x] line-height: 1;

后端架构

重来一遍. 又是当初几个步骤. 等于是ver2.0:

  • add
    • 现有的文章的迁移
    • 从PC上, 添加文章
    • 从Mobile上, 添加文章
  • save 两种形式
    • 一种是存好的html文件, 上传html + 发送metadata, 服务端会把html文件再上传到OSS (并正确命名), 然后metadata + OSS链接存到mysql里. 然后更新archives json obj缓存
    • 一种是没有存好的html, 发送原url + 发送metadata, 服务端会先存好html, 然后把html文件再上传到OSS (并正确命名), 然后metadata + OSS链接存到mysql里. 然后更新archives json obj缓存
  • data structure
    • 在mysql, 有一个表. 数据可以需要经常备份经常dump
      • 主表是archives表
      • 还需要tag表, author表, publisher表. 把现有数据导进去作为示例, 就能理解看懂了
  • query
    • 上来就处理好一个archives json obj, 存在内存里, 用于发给前端

mysql

把现在的metadata装到一个表里. 把静态文件的部分存一个链接或者说是object id, 能去云服务里找到

S3

html静态文件的部分, 存到object store一类的里面. 设为private, 访问的时候用access key -> 或者public, 也行

存文章

不管是本地还是远程, 还是手机, 都用网页来存. 存了的网页可以preview, 如果preview结果不对, 允许手动上传 (还允许上传多个) 存的时候摒弃现在的git commit的方式, 而是做 上传 -> mysql -> OK 这样ID也是从数据库来

读文章

为了前端速度, 现在还是可以打包到前端. 也就是 mysql -> 生成一个json -> 打到包里 走API吧, 保证最新

上传源文件到 OSS. repo 里也存一份只用来存档, 来判断有没有, 页面直接拼 URL -> 可以! markdown这边, 改下代码想办法让图片跟markdown塞在一起吧 -> 用OSS那份非https的?

  • 连上mysql (没在navicat里面加过, 怀疑可能bind 127 IP). 晚点可以再关了, 现在不用
  • 备份数据库的routine (用scheduled task + 上传OSS)
  • OSS / CDN会有https的问题, 怎么办? 因为阿里云如果要上https, 需要每三个月上传我的certbot证书. 或者也许阿里云有更新证书的API, 但是调起来比较麻烦吧. 可以用nginx做反向代理, 不改url的那种. 但是这样速度上可能慢, 不是跟没搞一样吗. 唯一一个是数据源唯一了. 不行, 还是买阿里云证书吧... 烦哦 没有https问题... 允许跨域就行了
  • 建表. 我知道可以加索引, 懒还没加

上OSS

[x] compile archives.json的时候, orig不能走本地了. 走DB

想想步骤和需要的改变

  1. 所有archive, orig + archives.json
  2. 所有代码, 就上传build / dist就可以了

发布流程 (代码):

  • yarn deploy -> build, index.html上ec2, 剩下上oss

添加流程PC:

  • 用旧流程保存html, 到origs. 保存comments
  • 跑yarn archive:compile, 还是会更新archives.json, 会添加comments, 但是不会加orig. 因为gitignore了
  • yarn archive:upload, 会上传所有. 然后deploy那里的routine不会上传, 因为dist里只会复制2个文件. 这样, 就对了. 代码和archive data分开了. 加archive的时候, 上传archive; 改代码的时候, 上传代码. 只是上传dest位置混在一起罢了