Python3 实现的社区系统 Icarus v1.1,也请大家找找 BUG - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
fy
V2EX    分享创造

Python3 实现的社区系统 Icarus v1.1,也请大家找找 BUG

  •  
  •   fy
    fy0 2018-09-29 23:17:02 +08:00 4586 次点击
    这是一个创建于 2573 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介


    这是一个由 Python3.6 与 Vue.js 全家桶构建的现代社区系统。

    可能包含以下内容:

    • 大部分内容由一个人单打独斗制成。

    • 同时是一个基本 0 设计的程序员产品。

    • 移动端的支持程度令人感到不安。

    • GitHub 上的 star 按钮,Excited.

    杂乱无章的演示站点: https://t.myrpg.cn

    井然有序的 Repo 页面: https://github.com/fy0/icarus

    版本主题 - 安全


    这个版本着重强化了一下程序的安全性,在新的密码机制下,后端密码将加盐哈希迭代 10 万次后存储。这个迭代次数是相关报告(2017 年)建议数字一万次的十倍。本来计划了更多的次数,但在百万次后我的低压 U 机器发生了明显的卡顿,考虑到个人 VPS 性能更差,因此就没有继续提升迭代次数了。

    前端密码则以固定盐哈希迭代 10 万次后再向后端发送,这是为了防备非 https 环境下的中间人攻击,可以用于一些私人的或者是内网环境下的小破论坛场景,同时后端不再有机会得到明文密码。

    版本主题 2 - 内容聚合


    这个版本对文章列表的展示方式做了几乎完全的重构。从较为传统的“浏览板块列表 - 进入某个板块 - 浏览文章”的模式转为了一个页面布局同时展示板块列表和文章列表的模式。同时对论坛的全部内容做了一个简单的聚合。

    这主要考虑到了:

    1. 拥有大量板块时,让一些层级较深的内容不被淹没
    2. 站点内容较少时,不会显得很空旷
    3. 维护起来简单

    大家可能也看得出来这中间 Flarum 做了非常多的借鉴。其实研究来研究去,我发现此类社区的布局貌似总共就三种:Flarum 这种、V2EX 这种、Discourse 则自成一派。

    我不喜欢 Discourse 那种一横条一横条的风格,V2EX 风格则是太多珠玉在前,自己又想不出什么更加牛逼的布局方式,因此就效仿他人故智了。

    虽然我个人觉得这样更扁平的论坛显得更好,但想必也不是人人满意,不知道大家有什么看法?

    附录:更新日志


    https://t.myrpg.cn/topic/1002

    34 条回复    2018-10-12 01:36:57 +08:00
    fy
        1
    fy  
    OP
       2018-09-29 23:33:36 +08:00
    对了补充两句

    ## 关于 Websocket 连接的移除

    我使用的腾讯云 CDN 似乎仍然不能很好的支持 ws 回源,为了避免暴露服务器地址就砍掉了。

    毕竟传统轮询又不是不能用(滑稽)。

    当然如果可以用了,我还是会加回去,毕竟 ws 能搞不少事情。

    ## 升级指南

    * 通过 backend/misc/upgrade 下的升级脚本完成升级应该没什么问题,建议复制到 backend 目录下执行

    * 由于提醒机制的完全重做,用户的第一次重新登录会刷新提醒列表,会出现多个新提醒

    * 用于密码机制的重做,在默认配置下所有用户都应该通过邮箱重置密码后才能登录。可以手动关闭新的安全密码机制,即 config 中设定`USER_SECURE_AUTH_ENABLE = False` 来继续使用老机制。

    * 其实我估计大概根本没人需要这个升级指南吧……真的有人用了 1.0 版本吗?
    ddup
        2
    ddup  
       2018-09-29 23:50:04 +08:00
    界面不错啊!
    Trim21
        3
    Trim21  
       2018-09-29 23:55:07 +08:00
    还是 aiohttp 的...star 了
    coolesting
        4
    coolesting  
       2018-09-30 00:09:15 +08:00 via Android
    用 vue 做的界面果然高大上,比我的好多了
    luckyswag
        5
    luckyswag  
       2018-09-30 00:21:59 +08:00
    vue 就是
    ArchiTech
        6
    ArchiTech  
       2018-09-30 06:26:06 +08:00
    成果看起来很不错啊,UI 好看速度也快。而且居然是自己一个人做出来的,太厉害了。不过一个人做很辛苦吧,日后要维护起来也不容易,而且还得提供主体插件接口方便别人用的时候可以 customize。。
    我最近也做了个简单的论坛,直接用 nodebb 做的,然后自己写了主题插件,比如首页瀑布流的图片显示 - https://catlog.club/
    allinoneok
        7
    allinoneok  
       2018-09-30 06:51:06 +08:00 via Android   1
    那个载入等待特效看得多了 很烦
    omph
        8
    omph  
       2018-09-30 08:35:05 +08:00   1
    那个载入特效确实太狂放,不舒服
    这样的版面看久了对眼睛不好,因为 UI 没有体现层次感,过分扁平,经常需要眼睛去定位,累
    mathzhaoliang
        9
    mathzhaoliang  
       2018-09-30 08:52:40 +08:00   1
    UI 应该改进,你使用的色彩太多,容易分散用户的注意力,时间长了看起来很累。

    一个好的论坛,好看的界面只是冰山上的那一角,有许多影响个人体验的细节。举个例子,markdown 编辑器支持 mathjax 数学公式吗?
    bucky
        10
    bucky  
       2018-09-30 09:17:12 +08:00   1
    什么字体,太细了,都快看不见了
    fy
        11
    fy  
    OP
       2018-09-30 09:48:34 +08:00
    @allinoneok #7
    我看看怎么搞个更柔和的载入效果,例如说改成评论加载那样的灰色 placeholder。切换板块的时候加载动画比普通页面偏上,这可能也是不协调的缘故之一。我笔记本的 13 寸屏注意不到,换个大屏就比较明显了。

    @omph #8
    说到过分扁平的问题,主要的取舍是关于有没有外框的这么一个设定。我这里选择了没有,再加上个人水平的原因就呈现了这样的结果。我会继续想一想,尽量从各方面做改进。

    @mathzhaoliang #9
    谢谢,我会尽量想办法做调整的。目前想法是进一步先将文章标题突出。板块带来的颜色区分没什么办法,虽然已经通过淡化色彩压制了一下,但好像还是……

    其他的方面只能持续努力了,毕竟这种东西细节太多,无法一蹴而就。markdown 部分的话现在依赖的 SimpleMDE 年久失修非常僵硬,可惜 vue.js 没有 slate.js 这样牛逼的终极文本编辑器解决方案。markdown 语法也就开了一个 gfw 扩展+语法高亮而已。

    =======

    总之感谢大家的反馈吧,我会继续努力改进。

    下版本争取实现一些喜欢、收藏、感谢之类的功能,把华夏特色的手机验证做了,重构一些老的页面,并加入更多与 spam 的对抗策略。
    fy
        12
    fy  
    OP
       2018-09-30 09:51:39 +08:00
    @bucky #10

    额,能否告知系统和浏览器。

    字体设置是已经忘了从哪抄的:font-family: PingFang SC, Lantinghei SC, Microsoft Yahei, Hiragino Sans GB, Microsoft Sans Serif, WenQuanYi Micro Hei, sans, FontAwesome, sans-serif;
    bucky
        13
    bucky  
       2018-09-30 10:19:04 +08:00
    @fy win7 chrome
    nifanle7
        14
    nifanle7  
       2018-09-30 10:22:44 +08:00
    第一次知道 Flarum、Discourse。看了下,UI 都比较舒服,谢谢楼主科普。
    pimin
        15
    pimin  
       2018-09-30 10:32:35 +08:00
    粉了 fy god
    ikw
        16
    ikw  
       2018-09-30 11:32:21 +08:00 via iPhone
    手机点了一下主页,基本处于不能看状态
    fy
        17
    fy  
    OP
       2018-09-30 12:04:33 +08:00
    @pimin #15

    这是我姓名的缩写,可惜我是一个 3000 分老年波特菜鸡选手。并没有因此沾到真正的 fy god 的光。

    @zwpaper #16

    哈哈,这就是令人不安程度的移动端支持啊……后面有更多的时间精力之后会逐渐改善。
    zhzer
        18
    zhzer  
       2018-09-30 12:05:03 +08:00 via Android
    问个面试官专用问题

    这个项目有什么亮点吗?
    run2
        19
    run2  
       2018-09-30 12:22:55 +08:00   1
    就是觉得 UI 有点像 flarum 的 https://discuss.flarum.org/ (好像也是学 nodebb )
    但提到 flarum 和 nodebb 的原因是 tag, 能支持 tag 就好了
    ThunderStruck
        20
    ThunderStruck  
       2018-09-30 13:43:00 +08:00
    爱抚歪我来组成移动端
    hinate
        21
    hinate  
       2018-09-30 14:14:34 +08:00   1
    显示重叠:Chrome 69 macbookpro 13
    hinate
        22
    hinate  
       2018-09-30 14:16:31 +08:00
    @hinate #21 ![]( )
    oukichi
        23
    oukichi  
       2018-09-30 15:32:54 +08:00   1
    用户协议部分样式错了。
    并且我注册失败不知道为什么。我也没有看 HTTP 报文。
    fy
        24
    fy  
    OP
       2018-09-30 15:59:13 +08:00   1
    @zhzer #18

    以面试语气回答:

    1.

    虽然是一个 Yet Another 项目,但是 py 实现的较为有名且至今稳定更新的开源社区项目极少,更不要提 Python3.6 之后广泛应用 async、type hints 等特性的相关实践了。

    2.

    从架构上讲,Icarus 项目代表了一种全新的后端思路,而个人认为这很可能是 web 后端的未来形态,即轻量后端。

    这一思路的核心是将数据表直接对应到 Web API 接口,再结合框架提供的参数类型检查、鉴权机制和一些手动编写的传统 API 接口(主要用来提升用户权限,例如登录),这就能够解决 80%的 CURD 场景了,减少了大量重复工作。

    这也是为什么初期 Icarus 开发进展的非常慢的一个重要原因(至今为止差不多一年了,一个多月前才发布 1.0。另一个重要原因是摸鱼)。

    有一些其他项目同样代表了这一思路,例如 graphql,apistar,postgrest 等等。

    这算是我的一次个人实践,效果基本还可以,美中不足的是数据库访问主要由同步的 peewee 驱动,没能完全发挥异步的优势。但这是时间成本上的考量,可以通过替换中间件来整体解决。

    https://github.com/fy0/slim

    3.

    未来将更加重视安全性与个人隐私。

    已经做了一些工作,例如说使用安全的加密算法并加随机盐,慢哈希,前端密码加密等等。

    还有简单的防爆破: https://github.com/fy0/Icarus/blob/master/backend/config.py#L125-L139

    以及 IP 地址脱敏后才存入数据库。

    以后还将做更多。

    4.

    重视延续性。

    目前对外发布了 2 个版本,当前版本是第二个,但是版本库里有 4 个升级脚本。

    https://github.com/fy0/Icarus/tree/master/backend/misc/upgrade

    其中三个都是未发布时编写的。

    我正打算用 Icarus 搭建一个基于个人兴趣爱好的小站,因此会长期持续维护的。


    @hinate #21

    感谢反馈,我研究一下怎么回事。
    fy
        25
    fy  
    OP
       2018-09-30 16:08:01 +08:00
    @oukichi #23 看了下日志,解决了
    nockyQ
        26
    nockyQ  
       2018-09-30 17:29:36 +08:00
    这样的 fy dog pink 了
    Mitt
        27
    Mitt  
       2018-10-01 12:08:58 +08:00 via iPhone
    可以对手机端显示再优化一下
    natforum
        28
    natforum  
       2018-10-02 15:09:27 +08:00   1
    先不看代码,README 写得不错,果断 star
    9ki
        29
    9ki  
       2018-10-02 19:27:55 +08:00
    不考虑 nuxt.js(SSR) , SPA 对 SEO 不友好...
    9ki
        30
    9ki  
       2018-10-02 19:28:42 +08:00
    "不考虑 nuxt.js(SSR) , SPA 对 SEO 不友好...".replace(",","?")
    suyuyu
        31
    suyuyu  
       2018-10-02 20:59:28 +08:00
    移动端好像还没支持?
    fy
        32
    fy  
    OP
       2018-10-02 23:46:10 +08:00
    @suyuyu #31 对啊,暂时没那么多精力,后续会优化。

    @9ki #29 其实是对百度不友好,同样精力有限,SSR 支持排序很靠后了。
    a132811
        33
    a132811  
       2018-10-07 18:49:14 +08:00
    aiohttp vue node postgreSql 嗯,是我喜欢的技术栈。
    SSR 的话 vue 提供了 Next.js 。我也不喜欢搞 SSR, 还有个方法是 url 请求时,判断如果是爬虫,就直接响应原文(只适合不需要额外渲染的博客这种)
    fy
        34
    fy  
    OP
       2018-10-12 01:36:57 +08:00
    @hinate #22
    @oukichi #23

    已修复。我把 checkbox 从 input 改成 svg 了,理论上会全部浏览器效果统一。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2826 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:14 PVG 22:14 LAX 07:14 JFK 10:14
    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