评价区改成「按钮展开表单」,评论支持两级回复
页面默认不出现任何输入框,要写什么就点对应那个按钮: - detail.php:评价区的「写评价 / 修改我的评价 / 评论 / 回复」都做成按钮, 用原生 <details>/<summary> 折叠,点开才展开表单,提交后整页刷新自动收起。 零 JS、键盘可用。没评价过只在顶部有「写评价」;评价过则该按钮消失,改在自己 那条评价下面出现「修改我的评价」。一条评价都没有时显示「还没有评价,等你来评一个。」 - lib/reviews.php:评论改两级平铺。parent_id 为空 = 顶层评论,非空 = 对某条评论的 回复;写「回复的回复」时由 addReviewComment 规范化回顶层评论,所以库里最多两层、 页面永远只缩进一次,来回多少轮都不会越缩越窄。被回复者另存 reply_to_admin_id (存「人」不存评论 id,对方那条被删也不会悬空),页面用「回复 @某某」标出。 deleteReviewComment 删顶层评论时连带清掉它的回复。 - lib/db.php:review_comments 增 parent_id / reply_to_admin_id 两列 + 幂等迁移, 并给 parent_id 建索引。**修一个会让老库升级白屏的顺序 bug**:新列上的 CREATE INDEX 必须排在 ALTER TABLE 补列之后 —— 建表用的是 CREATE TABLE IF NOT EXISTS,对线上 已存在的旧表不生效,索引跑在补列之前会报 no such column: parent_id,整个 initDB 挂掉。全新安装看不出来,是 e2e 的「造旧库再跑一遍初始化」专测抓到的。 - README.md:命名由「评价与讨论」改为「评价与评论」,补上按钮交互、两级平铺、 回复 @某某 与新表字段的说明。 回归:reviews_e2e 84/84、fetch_movie 76/76、storage 196/196;A/B 47 个响应中 仅详情页相关 6 个有差异,且经折叠区块比对确认差异全部限定在评价区内。 线上 PHP 7.4.30 / 8.1.7 双版本迁移与写链路(顶层评论→回复→回复的回复→清理)全部通过。
This commit is contained in:
+19
-1
@@ -119,7 +119,13 @@ function initDB() {
|
||||
)
|
||||
");
|
||||
|
||||
// 评价下的讨论(评论)。
|
||||
// 评价下的讨论(评论)。评论是**两级结构**:
|
||||
// parent_id 为空 → 顶层评论,直接挂在某条评价下;
|
||||
// parent_id 非空 → 对某条评论的回复,值指向「被回复的那条评论」的 id。
|
||||
// 页面展示时所有回复都平铺在它所属的顶层评论之下(不再逐层缩进),
|
||||
// 只把「回复 @谁」写出来;这样无论回复多深,视觉上都只有两层。
|
||||
// reply_to_admin_id → 被回复者(admins.id),用于显示「回复 @某某」。
|
||||
// 它存「人」而不是「评论 id」,所以对方那条评论被删掉也不会留下悬空引用。
|
||||
// feelings 存的是感受 key 的 JSON 数组(如 [\"happy\",\"sad\"]),
|
||||
// emoji 与文案不入库——统一在 lib/reviews.php 的目录里维护,改文案不用动数据。
|
||||
$db->exec("
|
||||
@@ -127,6 +133,8 @@ function initDB() {
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
review_id INTEGER NOT NULL,
|
||||
admin_id INTEGER NOT NULL,
|
||||
parent_id INTEGER,
|
||||
reply_to_admin_id INTEGER,
|
||||
content TEXT NOT NULL,
|
||||
feelings TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -150,6 +158,16 @@ function initDB() {
|
||||
try { $db->exec("ALTER TABLE admins ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
||||
// 新增:评价本身也可以带观后感受(评价表先于该字段上线过一版,故需要迁移)
|
||||
try { $db->exec("ALTER TABLE reviews ADD COLUMN feelings TEXT"); } catch (PDOException $e) {}
|
||||
// 新增:评论支持回复(两级结构,含义见上面 review_comments 建表处的说明)。
|
||||
// 评论表同样先于这两个字段上线过一版,线上是老结构,必须能自动补列。
|
||||
try { $db->exec("ALTER TABLE review_comments ADD COLUMN parent_id INTEGER"); } catch (PDOException $e) {}
|
||||
try { $db->exec("ALTER TABLE review_comments ADD COLUMN reply_to_admin_id INTEGER"); } catch (PDOException $e) {}
|
||||
|
||||
// 删顶层评论时要按 parent_id 找它下面的回复一并清掉,给它建个索引。
|
||||
// 这条索引必须放在上面的「补列」之后:老库的 review_comments 是旧结构、没有
|
||||
// parent_id 列,而上面建表用的是 IF NOT EXISTS(对已存在的表不生效),
|
||||
// 索引若跑在补列之前会直接抛 "no such column: parent_id" 让整个 initDB 挂掉。
|
||||
$db->exec("CREATE INDEX IF NOT EXISTS idx_review_comments_parent ON review_comments(parent_id)");
|
||||
|
||||
// ===== 迁移旧数据 =====
|
||||
// 将 viewers.name 迁移到 persons
|
||||
|
||||
Reference in New Issue
Block a user