评价区改成「按钮展开表单」,评论支持两级回复
页面默认不出现任何输入框,要写什么就点对应那个按钮: - 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:
@@ -50,16 +50,21 @@
|
||||
- **安全约束**:不允许删除最后一个管理员,也不允许删除自己。
|
||||
- **个人资料**:修改自己的用户名与密码(需验证旧密码)。
|
||||
|
||||
### 评价与讨论
|
||||
### 评价与评论
|
||||
- **谁可以评价**:**只要有登录账号就能评价**,与「是不是观影人」无关——没一起去看过的人也能打分、写评价、参与讨论。评价的归属是账号(`admins`),不是观影人(`persons`)。
|
||||
- **打分 1-10**:详情页「💬 评价与讨论」区块里点数字即可打分,右侧实时显示「7 分 · 不错」;打分用的是原生单选框,禁用 JS 也能照常提交。
|
||||
- **页面上默认不出现任何输入框**:详情页「💬 评价与评论」区块上来只展示已有内容;要写什么就点对应那个按钮——「📝 写评价」「✏️ 修改我的评价」「💬 评论」「↩ 回复」,点开才当场展开表单,提交后页面刷新、表单自动收起。折叠用的是原生 `<details>/<summary>`,**不依赖 JS**,键盘也能操作。
|
||||
- **打分 1-10**:展开写评价表单后点数字即可打分,右侧实时显示「7 分 · 不错」;打分用的是原生单选框,禁用 JS 也能照常提交。
|
||||
- **写评价**:一段正文(最多 5000 字)。**每个账号对每部电影只有一条评价**,再次提交即修改,页面上会标注「已编辑」。
|
||||
- **讨论**:任意账号都能在任意一条评价下面参与讨论(正文最多 1000 字)。
|
||||
- **观后感受(可多选)**:**写评价时**和**发讨论时**都可以勾选自己的观后感受,每种感受一个专属 emoji:😄 开心、💖 感动、🥰 温暖、🤩 激动、🤔 深思、😰 紧张、😨 恐惧、😲 震惊、😢 难受、😠 气愤、😴 无聊、😵 困惑。勾选多少个都行(最多 6 个),展示时按固定顺序排列。
|
||||
- 没评价过时,区块顶部只有一个「📝 写评价」按钮;评价过之后这个按钮就消失了,改成在**自己那条评价下面**出现「✏️ 修改我的评价」。
|
||||
- 一条评价都没有时,区块里只显示一句「还没有评价,等你来评一个。」
|
||||
- **评论与回复**:任意账号都能在任意一条评价下评论,也能**回复任意一条评论**(正文最多 1000 字)。
|
||||
- 每条评价下面有「💬 评论」按钮,每条评论下面有「↩ 回复」按钮,同样**点开才出现输入框**。
|
||||
- 评论是**两级平铺**结构:回复统一平铺在它所属的顶层评论之下(不再逐层缩进),只把「回复 @某某」写出来。所以**回复的回复也只会落在同一层**,无论来回多少轮,视觉上永远只有两层,页面不会越缩越窄。
|
||||
- **观后感受(可多选)**:**写评价时**和**发评论 / 回复时**都可以勾选自己的观后感受,每种感受一个专属 emoji:😄 开心、💖 感动、🥰 温暖、🤩 激动、🤔 深思、😰 紧张、😨 恐惧、😲 震惊、😢 难受、😠 气愤、😴 无聊、😵 困惑。勾选多少个都行(最多 6 个),展示时按固定顺序排列。
|
||||
- 评价上的感受会显示在这条评价正文下面;修改评价时原来勾的会自动带上,取消勾选即清空。
|
||||
- 感受只把 key(如 `happy`)存进数据库(`reviews.feelings` / `review_comments.feelings`),emoji 与文案统一在 `lib/reviews.php` 的 `feelingCatalog()` 里维护,**以后换 emoji / 改文案都不用动数据**。
|
||||
- **评分概况**:详情页标题栏显示「N 条评价 · 均分 X」;首页列表卡片上有评价的电影会显示 `⭐ 均分`。
|
||||
- **删除**:只能删除**自己**的评价与讨论;删除评价时其下的讨论一并删除。删除电影时也会清掉对应的评价与讨论(SQLite 默认未开启外键级联,由程序手动清理)。
|
||||
- **删除**:只能删除**自己**的评价与评论;删除一条顶层评论时它下面的回复一并删除,删除评价时其下的评论全部删除。删除电影时也会清掉对应的评价与评论(SQLite 默认未开启外键级联,由程序手动清理)。
|
||||
|
||||
### 基础数据维护
|
||||
- **影院管理**:增删改查,支持「所在地方 / 影院名称 / 详细地址」三段式信息,内置 50 种预设配色,每个影院可用专属颜色区分;删除已被引用的影院时会给出醒目提示并要求二次确认(关联电影的影院字段将被置空)。
|
||||
@@ -107,7 +112,7 @@ MovieLog_Server/
|
||||
│ │ └── meta.php # 实例元数据鉴权(ECS RAM 角色 / CVM CAM 角色)与本机地域查询
|
||||
│ ├── auth.php # 登录校验、管理员账号增删改
|
||||
│ ├── movies.php # 电影/影院读取、搜索,以及表单关联数据的解析
|
||||
│ ├── reviews.php # 评价与讨论:打分 1-10、正文、讨论、观后感受目录(emoji)
|
||||
│ ├── reviews.php # 评价与评论:打分 1-10、正文、评论与两级回复、观后感受目录(emoji)
|
||||
│ └── stats.php # 统计仪表板与年度报告查询
|
||||
├── index.php # 首页:观影列表(瀑布流)+ 快捷搜索
|
||||
├── add.php # 添加电影
|
||||
@@ -159,7 +164,7 @@ MovieLog_Server/
|
||||
| `viewers` | 电影 ↔ 观影人关联 | `movie_id`、`person_id`、`name`(历史遗留字段) |
|
||||
| `movie_photos` | 电影多图 | `movie_id`、`photo_path`、`created_at` |
|
||||
| `reviews` | 电影评价 | `movie_id`、`admin_id`(评价人是账号,不是观影人)、`rating`(1-10)、`content`、`feelings`(写评价时选的观后感受,同样是 JSON 数组)、`created_at`、`updated_at`;**`(movie_id, admin_id)` 上有唯一索引**,保证一个账号一部电影只一条 |
|
||||
| `review_comments` | 评价下的讨论 | `review_id`、`admin_id`、`content`、`feelings`(感受 key 的 JSON 数组,如 `["happy","sad"]`)、`created_at` |
|
||||
| `review_comments` | 评价下的评论与回复(两级平铺) | `review_id`、`admin_id`、`content`、`feelings`(感受 key 的 JSON 数组,如 `["happy","sad"]`)、`parent_id`(**空 = 顶层评论;非空 = 对某条顶层评论的回复**——写回复的回复时会被规范化回顶层评论,库里永远不会更深)、`reply_to_admin_id`(被回复者的 `admins.id`,用于显示「回复 @某某」;存「人」而非评论 id,对方那条被删也不会悬空)、`created_at`;`parent_id` 上有索引(删顶层评论时要按它找回复一并清掉) |
|
||||
| `settings` | 键值配置与缓存 | `name`(唯一)、`value`。存存储驱动选择、各云厂商配置、图片访问方式等;**云厂商密钥以 `enc:v1:gcm:` 前缀密文落库**(密钥文件 `db/.settings.key`,首次保存时自动生成,**丢失后密文不可恢复**) |
|
||||
|
||||
`settings` 中除配置外的运行时缓存键(都可安全清空,程序会自动重建):
|
||||
@@ -265,16 +270,17 @@ server {
|
||||
2. 进入「年度报告」,页面顶部切换年份即可查看。
|
||||
3. 未绑定观影人时报告为空并给出提示。
|
||||
|
||||
### 打分、写评价与参与讨论
|
||||
### 打分、写评价与参与评论
|
||||
|
||||
1. 打开任意一部电影的详情页,滚到最下面的「💬 评价与讨论」。
|
||||
2. **打分**:点「我的评分」后面的 1-10 任意一个数字(选中会变橙色),旁边实时显示「几分 · 怎么样」。
|
||||
3. **写评价**:在下面文本框里写正文;再到「我看完的感受(可多选)」里勾几个感受 emoji,点「📝 发表评价」。
|
||||
- 已经评价过时,这一块会变成「✏️ 修改我的评价」,按钮是「💾 保存修改」——同一部电影不会留下两条你的评价,**原来勾的感受会自动带上**,取消勾选就是清掉。
|
||||
1. 打开任意一部电影的详情页,滚到最下面的「💬 评价与评论」。**这一块默认全是内容、没有一个输入框**,想写什么就点哪个按钮。
|
||||
2. **写评价**:没评价过时,点顶部的「📝 写评价」展开表单 → 点「我的评分」后面的 1-10 任意一个数字(选中会变橙色,旁边实时显示「几分 · 怎么样」)→ 写正文 → 在「我看完的感受(可多选)」里勾几个感受 emoji → 点「📝 发表评价」。
|
||||
- 评价过之后「📝 写评价」就没了,改成在**自己那条评价下面**出现「✏️ 修改我的评价」,点开同样是这套表单,按钮变成「💾 保存修改」;同一部电影不会留下两条你的评价,**原来勾的感受会自动带上**,取消勾选就是清掉。
|
||||
- 评价保存后,感受会以只读小标签显示在这条评价正文下面。
|
||||
4. **参与讨论**:在别人的(或自己的)任意一条评价下面,写一句话,同样可以勾选感受,点「💬 发表讨论」。
|
||||
- 讨论会带上评价人的头像、昵称,以及你选的感受 emoji。
|
||||
5. **删除**:自己发的评价和讨论,右侧有删除按钮(别人的没有);删评价时下面的讨论会一起删掉。
|
||||
3. **评论**:在任意一条评价下面点「💬 评论」,展开输入框,可以勾选感受,点「💬 发表评论」。
|
||||
4. **回复评论**:在任意一条评论下面点「↩ 回复」,展开输入框,点「↩ 发表回复」。
|
||||
- 页面在回复上方标出「回复 @某某」。**回复的回复也只会平铺在同一层**,不会一层层往右缩进。
|
||||
- 评论会带上作者的头像、昵称,以及你选的感受 emoji。
|
||||
5. **删除**:自己发的评价和评论,右侧有删除按钮(别人的没有);删一条顶层评论时它下面的回复会一起删掉,删评价时下面的评论全部删掉。
|
||||
|
||||
> 评价人是**登录账号**。家里几个人各有一个账号时,同一部电影可以各自打分,标题栏会显示「N 条评价 · 均分 X」。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user