写了一个极简、无需 JS 的论坛

论坛截图

开发初衷

上周在 HN 上看到 agreper - Minimal, no-JS web forum software,原作者用 Pyhon 开发的,我试用了这个论坛,发现这个项目挺适合学习 Laravel 开发的:

  • 完全不用 JS,只用基本的 HTML/CSS,不考虑复杂的现代化前端
  • 只考虑基本的论坛需求(管理面板、用户注册登陆、发帖)

问题和收获

1. 多个表单验证问题

一个管理面板页面中同时十几个表单,但表单验证失败时,需要提示错误信息 @error('title') 以及填充旧输入时 old('title') 都会冲突。

起初我尝试每一个字段是用独一无二的名称 form1_titleModel::create 的时再把名字改回去,这正是不方便。

使用 MessageBag 能解决 @error('title', 'login') 的冲突:

$request->validateWithBag('login', ...);
$request->validateWithBag('register', ...);

但是 old('title') 还是不行,还需要自己判断:

<input name="title" value="{{ $errors->login->any() ? old('title') : '' }}">

2. 渲染评论树

评论和评论由 parent_id 联系起来,会自动构成一个树🌲,如何在 HTML 把树状结构表现出来卡了我很久。

完美的做法是把评论从数据库读出来,构建一个树(递归),然后用 Blade 模版渲染(同样是递归):

<ul>
    <li>
        Comment #1
        <ul>
            <li>
                Comment #2
                <ul>
                    <li>
                        Comment #3
                    </li>
                </ul>
            <li>
        </ul>
    <li>
</ul>

目前的做法是 flat tree + depth,空白模拟层次结构:

<div style="margin-left: {{ 0 * 20 }}px">
Comment #1
</div>
<div style="margin-left: {{ 1 * 20 }}px">
Comment #2
</div>
<div style="margin-left: {{ 2 * 20 }}px">
Comment #3
</div>

3. 注册登陆和授权

根据我之前的经验,按文档建议使用 Laravel Breeze 的话,特别麻烦:

  • 依赖我不需要的 Vite、TailwindCSS
  • 我不需要使用邮箱,自然邮箱确认、重置密码等就不需要了
  • 加了非常多代码,一二十条路由,不懂的话也不敢删除

这次我手动实现,发现非常简单,文档非常清楚。需要什么就加什么,基本没有多余功能。

授权的概念是第一次接触,果然用一次过就有底了,不会只觉得复杂难懂。

4. Done is better than perfect

我写程序的时候,经常纠结前端的样式、代码的最佳实践等事情上,耗费了大量时间和精力,常常导致项目中途而废,是在太可惜了。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16

看起来非常不错!

2年前 评论

历史倒退了啊

2年前 评论
xuchunyang (楼主) 2年前
萧潇 (作者) 2年前

帖子可以发图片不(自己上传)

2年前 评论
xuchunyang (楼主) 2年前
yzbfeng (作者) 2年前
我写程序的时候,经常纠结前端的样式、代码的最佳实践等事情上,耗费了大量时间和精力,常常导致项目中途而废,是在太可惜了。

这句话是很多后端工程师的心声吧。

2年前 评论
porygonCN 2年前
小丑路人 2年前
sinmu 2年前
  • :+1:体验了下,操作响应速度可以,功能流畅,样式比shell 控制台好。
2年前 评论

因吹斯汀

2年前 评论

没有找到能发帖的地方啊

2年前 评论
xuchunyang (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!