学习 nodejs,初步写了个简版论坛 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
hyyou2010
V2EX    分享创造

学习 nodejs,初步写了个简版论坛

  •  1
     
  •   hyyou2010 2019-09-09 15:0758 +08:00 4062 次点击
    这是一个创建于 2299 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个论坛程序是前一段时间学习 koa2 的实践作品,技术栈是“koa2+react+mongodb”,已部署到: http://65.49.193.60:3001

    已经初步实现的功能:

    发帖 /删除 /更改 /置顶 /点赞 /匿名
    接龙 /投票
    登录注册 /修改密码 /通过邮件重置密码 /GitHub 登录
    用户角色( admin/bm/user 三级)及用户管理
    上传头像及修改
    中英文界面切换
    markdown 编辑
    板块可配置
    保存退出时状态

    尚未实现功能:

    搜索
    私信
    @
    图片或文件上传
    后台管理

    client: https://github.com/maxyou/purebbs
    server: https://github.com/maxyou/purebbs-server

    出于学习的目的,尽量不使用第三方 UI 库,所以界面比较原始。头次写论坛程序,不足之处太多,欢迎朋友们提出批评建议。
    13 条回复    2019-09-17 17:54:52 +08:00
    hyyou2010
        1
    hyyou2010  
    OP
       2019-09-09 15:10:03 +08:00
    1, 出于学习目的,从 koa2 和 egg 中选了前者,但直接用 koa2 需要自己去找中间件,找库,找轮子,比较麻烦且难以最优。比如文件上传,日志,session 等等,都找了好几个库来试,也不好把握以后扩展是否可以。所以未来做正式项目还得找比较完善的框架,比如 nestjs 或 eggjs 之类。

    2, 第三方的 ui 库,如 materail-ui 或 antd 多少比较重,特别是前者,对程序主体影响比较大,所以最好尽量少用,初中期不使用,在后期可以考虑。这样非常灵活,以后可以根据选择不同的 ui 库。

    3, 小项目不要使用大第三方库。比如界面的语言切换,考察过相关的 i18n 库,几乎看不懂,太完善,太庞大,太麻烦了,最后仍然使用 redux.store 简单处理。这点也说明使用完善的框架比使用 koa2 要强太多了。

    4, 在项目基本完成之后才把前端代码转换为 typescript 的,所以不全面,且不太地道。从代码查错说效果还是很不错的,以后考虑常用。可能后端才是应该尽量用 typescript,毕竟后端出错的危害要远远大过前端出错。以后尽量一开始就使用,后面再改比较繁琐。

    5,有的问题不身临其境就感受不到。比如,更换头像后,头像链接将指向新头像的那个新地址,这个小设计给后续编程造成了极大的麻烦。比如头像链接就无法直接存放在 post 或 comment 信息里面,因为用户更换头像后之前的头像链接失效。临时的处置是,数据库先查询 post 及 comment,然后 aggregate 查询 user 数据表以获取最新头像链接。vote 及 lineup 也一样麻烦。最后采取的方案是,头像链接地址始终不变,新头像替换旧头像时沿用旧头像的文件名。这可能导致客户端头像不刷新,需要加随机数来帮忙刷新,但最后考虑到这不是高频操作,还是 reload 客户端更为干净。

    6,有的功能细节意外的多,比如匿名功能,需要考虑:post 与 comment 的匿名,我的匿名与他人匿名的差异,oauth 登录用户的匿名,投票与接龙的匿名,投票人及接龙人的匿名,所有情况下鼠标在头像上悬停时的不同提示,此外匿名时的隐匿信息不应该传递到客户端,必须在服务端就过滤好。如此这样,这工作量是出奇的多。这里说明编码之前的产品需求与设计是很重要的,可以发现工作量意外大的一环。
    hyyou2010
        2
    hyyou2010  
    OP
       2019-09-09 15:14:17 +08:00
    另外,其他的好办,但不知搜索功能怎样做。

    看过 elasticsearch,看得头大,比较麻烦,难道数据库每一步操作都要同步到 elastic 数据库?或者不需实时更新,过一定时间更新一次?这点没搞明白,请知情同学介绍一下。
    zgcwkj
        3
    zgcwkj  
       2019-09-09 17:09:39 +08:00
    支持大佬!既然是初学,为什么不是 express 呢?
    hewelzei
        4
    hewelzei  
       2019-09-09 17:31:46 +08:00
    同在学习 Koa2,后端使用 Typescript + Rollup,开发体验确实非常好,最近也在学 Graphql 这方向的技术栈
    hyyou2010
        5
    hyyou2010  
    OP
       2019-09-09 18:21:59 +08:00
    @zgcwkj 学技术怕过时,所以选 koa2,当然实际上 express 简洁明快并不过时
    @hewelzei 未来也想应用 GraphGL,没来得及
    weixiangzhe
        6
    weixiangzhe  
       2019-09-09 20:59:02 +08:00 via iPhone
    也想些一个 但是一直提不起干劲啊 赞
    Chaos11
        7
    Chaos11  
       2019-09-10 09:36:30 +08:00
    po 主是后端?
    hyyou2010
        8
    hyyou2010  
    OP
       2019-09-10 11:32:58 +08:00
    @Chaos11 都沾点皮毛,正打算加强点后端
    duola
        9
    duola  
       2019-09-10 12:23:31 +08:00
    mongodb 实时同步到 elasticsearch。
    hyyou2010
        10
    hyyou2010  
    OP
       2019-09-10 12:41:52 +08:00
    @duola 谢谢,我去学习一下这个实时同步
    dfourc
        11
    dfourc  
       2019-09-11 16:35:28 +08:00
    不错,我也想琢磨一个。,
    boboyangmoumou
        12
    boboyangmoumou  
       2019-09-16 09:56:50 +08:00
    可以,顶一个
    hyyou2010
        13
    hyyou2010  
    OP
       2019-09-17 17:54:52 +08:00
    唉,敏感时节,部署的论坛被墙了,需要翻。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3068 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:06 PVG 20:06 LAX 04:06 JFK 07:06
    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