因为多说要挂了,所以 Spruche 进化了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Cononico
V2EX    分享创造

因为多说要挂了,所以 Spruche 进化了

  •  
  •   small class="gray">Cononico 2017-04-02 01:48:12 +08:00 5023 次点击
    这是一个创建于 3194 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前用 Express 写的博客系统 Spruche (德语:“箴言”),因为偷懒,用了多说,前两个星期看见了多说要关闭的通知,吃惊秒,为多说默哀三秒后,意识到掌握核心技术的重要性。接下来抽空给系统写了个支持第三方登陆的 jQuery 评论框插件,同时也给她升了个级。

    Spruche

    Spruche 拥有以下简单的功能与朴实的特性:

    • 文章编辑、删除、置顶、草稿、特色图片、语法高亮,使用 ueditor 编辑器
    • 支持主题
    • 友情链接管理
    • 多说评论导入
    • 支持微博登陆、回复、赞、踩、举报等功能的高颜值 Servant 评论框插件,其样式拷贝 B 站
    • 系统升级提醒
    • 漂亮的默认主题以及手工绘制的错误页面

    展示

    默认主题直接丢个链接:默认主题

    还是给个截图拉长以下 V2EX 的页面: mobile

    评论框上个截图。

    评论框

    有没有觉得很情切很眼熟,没错,样式是拿 B 站的。是的,就是在 Chrome 里按 F12 抄的样式(听说这里特别注重版权许可,我这么明目张胆地抄会不会被人打?会不会被被封号)。

    评论框为啥要叫 Servant 这么中二的名字,因为是账号是从微博那边召唤过来的,就像是召唤英灵一样,对的,我就是你们的 master 。

    别看样式是抄的,评论框该有的功能还是有的:登陆、点赞、踩之类的,迅速过一下配置参数。

    var defaults = { placeholder: '请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。', wbAppKey: '', // 新浪微博开发者引用 appKey commentAble: true, // 是否可以发评论 announcement: '', // 评论框公告 pageNumber: 10, // 每页评论个数 childrenNumber: 10, // 子级评论每页个数 threadKey: '', // 页面唯一 key title: '' // 页面标题 }; 

    后面做得比较搓,主要因为没时间,有时间也要偷个懒。 管理

    环境要求

    因为楼主要用 async ,还要求 MySQL 拥有支持 4 字节 emoji 编码的 utfmb4 ,所以对环境的要求还挺高的:

    • Node >= V7.0
    • MySQL >= 5.5.3

    评论框这么复杂后续也少不了 redis , mysql 跟不上节奏。

    自定义

    模版引擎用的是 ejs ,相关文档和接口定义后续整理。

    写在最后,求颗星星: GitHub

    第 1 条附言    2017-04-02 05:21:35 +08:00
    爱玛,发错图了,抄 B 站的样式的评论框是这张:
    https://www.coolecho.net/upload/images/2017/3/848205310983278592.png
    23 条回复    2017-04-08 11:08:14 +08:00
    Trim21
        1
    Trim21  
       2017-04-02 05:49:59 +08:00
    呃....

    install 后面是不是少了什么..
    Trim21
        2
    Trim21  
       2017-04-02 05:51:31 +08:00
    @Trim21 好吧,我错了..大半夜意识模糊了.
    Systemd
        3
    Systemd  
       2017-04-02 06:50:12 +08:00 via Android
    Sprüche ?
    cocochan
        4
    cocochan  
       2017-04-02 08:47:03 +08:00 via iPhone
    franklinyu
        5
    franklinyu  
       2017-04-02 08:56:21 +08:00
    协议已经是 Apache 了吧, README 没改
    slixurd
        6
    slixurd  
       2017-04-02 11:40:08 +08:00
    鄙视 MySQL 是政治正确么...
    你能跑到单表上亿的数据么,没有上亿的数据说什么 MySQL 跟不上节奏........
    dphdjy
        7
    dphdjy  
       2017-04-02 11:51:15 +08:00
    看图标加 star
    garipan
        8
    garipan  
       2017-04-02 11:54:00 +08:00
    23333333333333
    chuanwu
        9
    chuanwu  
       2017-04-02 12:06:26 +08:00
    楼主你想说的是 utf8mb4 吧?

    还有我不太明白你说评论框这么复杂, mysql 跟不上节奏,你能说下具体的场景么?
    Aspx
        10
    Aspx  
       2017-04-02 12:33:40 +08:00
    还好我这种用静态博客的不需要评论
    Cononico
        11
    Cononico  
    OP
       2017-04-02 12:36:52 +08:00 via iPhone
    @slixurd 什么时候鄙视 mysql 了,不管你跑几个表单有几条记录,频繁改动的数据(比如几个人一直重复在哪里点赞踩)并不适合一开始就往数据库里直接搞。再比如新消息回复的队列,没必要往数据库里扔吧,这次读完了之后下次就不用了,用个 redis 有什么错。虽然博客系统可能没什么人点赞,但用先用缓存固定时间在导入 mysql 有什么错?合适的地方用合适的东西,再说明一下,没有鄙视 mysql ,否则我也不会用 mysql 。
    Cononico
        12
    Cononico  
    OP
       2017-04-02 12:48:39 +08:00 via iPhone
    @chuanwu 对的,漏了个 8 。跟不上节奏,不是说他慢,毕竟一个博客请求很低看不出效果,说的是评论系统中有些地方不太适合直接往里面塞。如消息回复提醒队列,没必要又建一张中间表,那我又得同时操作几张表换来一个 length 可能为 0 的队列,实在有点麻烦,放在缓存中用起来也方便。另外用户读完了,这条记录也用不着了,我不能直接 delete 掉,这对表不好,我只能加个字段证明他没用了,后来一张表里记着一大列用不上的记录。
    slixurd
        13
    slixurd  
       2017-04-02 13:07:36 +08:00
    @Cononico
    数据量小用 MySQL 做消息回复提醒没什么不好的...
    加个中间件只会引入额外的复杂度
    合不合适不能只看功能...
    我觉得 SOA+RPC+服务发现也是很合理的架构....
    但是肯定不会在这个量级这个场景下去做.....
    ivmm
        14
    ivmm  
       2017-04-02 13:11:57 +08:00   2
    如果单独把评论拿出来做,获得的关注度绝对会比整合后的一个博客系统高
    ooTwToo
        15
    ooTwToo  
       2017-04-02 15:14:20 +08:00 via iPhone
    不错啊 ()”

    坨坨肉的 http://comment.moe 也好用
    jexb
        16
    jexb  
       2017-04-02 18:30:16 +08:00 via iPhone
    node.js 是搞笑得
    diefishfish
        17
    diefishfish  
       2017-04-03 15:49:58 +08:00
    @ooTwToo #15 肉肉那个怎么获取文章评论数插入到文章页面里...他个懒癌不更新
    hpu423
        18
    hpu423  
       2017-04-03 20:28:45 +08:00
    不错
    ooTwToo
        19
    ooTwToo  
       2017-04-04 10:04:50 +08:00 via iPhone
    @diefishfish 啊?底部貌似有的
    diefishfish
        20
    diefishfish  
       2017-04-04 10:46:59 +08:00
    @ooTwToo #19 不不不我说的是单独获取出来放在文章标题下面的那种!
    ooTwToo
        21
    ooTwToo  
       2017-04-04 22:19:48 +08:00   1
    @diefishfish 可以通过 js 获取到条数啊
    diefishfish
        22
    diefishfish  
       2017-04-07 21:20:24 +08:00
    @ooTwToo #21 求 js
    ooTwToo
        23
    ooTwToo  
       2017-04-08 11:08:14 +08:00 via iPhone
    @diefishfish 获取元素组的 length
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     874 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 72ms UTC 21:50 PVG 05:50 LAX 13:50 JFK 16:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86