新增评价与讨论:打分 1-10 + 观后感受 emoji
- 规则:只要有登录账号就能评价,与「是不是观影人」无关;评价归属 admins - 数据层 lib/reviews.php: · reviews(movie_id + admin_id 唯一索引,一个账号一部电影只一条) · review_comments(feelings 存感受 key 的 JSON 数组) · 感受目录 feelingCatalog():12 种,每种一个专属 emoji,文案与 emoji 不入库 - detail.php 新增「💬 评价与讨论」:1-10 打分(原生 radio,无 JS 也能用)、 评价正文、评价列表、每条评价下的讨论与多选感受、均分概况 - index.php:有评价的电影卡片显示 ⭐ 均分 - delete.php:删电影时显式清理评价与讨论(SQLite 外键级联默认未开启) - 顺带修一个隐患:delete.php 取一行后没关游标,读锁一直挂着, 后续同一连接上的 DELETE 拿不到写锁,页面会卡满 60 秒
This commit is contained in:
@@ -50,6 +50,16 @@
|
||||
- **安全约束**:不允许删除最后一个管理员,也不允许删除自己。
|
||||
- **个人资料**:修改自己的用户名与密码(需验证旧密码)。
|
||||
|
||||
### 评价与讨论
|
||||
- **谁可以评价**:**只要有登录账号就能评价**,与「是不是观影人」无关——没一起去看过的人也能打分、写评价、参与讨论。评价的归属是账号(`admins`),不是观影人(`persons`)。
|
||||
- **打分 1-10**:详情页「💬 评价与讨论」区块里点数字即可打分,右侧实时显示「7 分 · 不错」;打分用的是原生单选框,禁用 JS 也能照常提交。
|
||||
- **写评价**:一段正文(最多 5000 字)。**每个账号对每部电影只有一条评价**,再次提交即修改,页面上会标注「已编辑」。
|
||||
- **讨论**:任意账号都能在任意一条评价下面参与讨论(正文最多 1000 字)。
|
||||
- **观后感受(可多选)**:发讨论时可以勾选自己的观后感受,每种感受一个专属 emoji:😄 开心、🥹 感动、🥰 温暖、🤩 激动、🤔 深思、😰 紧张、😨 恐惧、😲 震惊、😢 难受、😠 气愤、😴 无聊、😵 困惑。勾选多少个都行,展示时按固定顺序排列。
|
||||
- 感受只把 key(如 `happy`)存进数据库,emoji 与文案统一在 `lib/reviews.php` 的 `feelingCatalog()` 里维护,**以后换 emoji / 改文案都不用动数据**。
|
||||
- **评分概况**:详情页标题栏显示「N 条评价 · 均分 X」;首页列表卡片上有评价的电影会显示 `⭐ 均分`。
|
||||
- **删除**:只能删除**自己**的评价与讨论;删除评价时其下的讨论一并删除。删除电影时也会清掉对应的评价与讨论(SQLite 默认未开启外键级联,由程序手动清理)。
|
||||
|
||||
### 基础数据维护
|
||||
- **影院管理**:增删改查,支持「所在地方 / 影院名称 / 详细地址」三段式信息,内置 50 种预设配色,每个影院可用专属颜色区分;删除已被引用的影院时会给出醒目提示并要求二次确认(关联电影的影院字段将被置空)。
|
||||
- **观影人管理**:增删改查,支持头像裁剪上传与专属配色;已被电影引用的观影人不允许直接删除。
|
||||
@@ -96,6 +106,7 @@ MovieLog_Server/
|
||||
│ │ └── meta.php # 实例元数据鉴权(ECS RAM 角色 / CVM CAM 角色)与本机地域查询
|
||||
│ ├── auth.php # 登录校验、管理员账号增删改
|
||||
│ ├── movies.php # 电影/影院读取、搜索,以及表单关联数据的解析
|
||||
│ ├── reviews.php # 评价与讨论:打分 1-10、正文、讨论、观后感受目录(emoji)
|
||||
│ └── stats.php # 统计仪表板与年度报告查询
|
||||
├── index.php # 首页:观影列表(瀑布流)+ 快捷搜索
|
||||
├── add.php # 添加电影
|
||||
@@ -130,7 +141,7 @@ MovieLog_Server/
|
||||
└── avatars/ # 观影人头像
|
||||
```
|
||||
|
||||
> 页面只需 `require_once 'config.php'`,`lib/` 下的模块会由引导文件统一加载,并保证依赖顺序(db → helpers → auth → movies → stats)。
|
||||
> 页面只需 `require_once 'config.php'`,`lib/` 下的模块会由引导文件统一加载,并保证依赖顺序(db → settings → storage → helpers → auth → movies → reviews → stats)。
|
||||
|
||||
---
|
||||
|
||||
@@ -146,6 +157,8 @@ MovieLog_Server/
|
||||
| `persons` | 观影人 | `name`(唯一)、`color`、`avatar` |
|
||||
| `viewers` | 电影 ↔ 观影人关联 | `movie_id`、`person_id`、`name`(历史遗留字段) |
|
||||
| `movie_photos` | 电影多图 | `movie_id`、`photo_path`、`created_at` |
|
||||
| `reviews` | 电影评价 | `movie_id`、`admin_id`(评价人是账号,不是观影人)、`rating`(1-10)、`content`、`created_at`、`updated_at`;**`(movie_id, admin_id)` 上有唯一索引**,保证一个账号一部电影只一条 |
|
||||
| `review_comments` | 评价下的讨论 | `review_id`、`admin_id`、`content`、`feelings`(感受 key 的 JSON 数组,如 `["happy","sad"]`)、`created_at` |
|
||||
| `settings` | 键值配置与缓存 | `name`(唯一)、`value`。存存储驱动选择、各云厂商配置、图片访问方式等;**云厂商密钥以 `enc:v1:gcm:` 前缀密文落库**(密钥文件 `db/.settings.key`,首次保存时自动生成,**丢失后密文不可恢复**) |
|
||||
|
||||
`settings` 中除配置外的运行时缓存键(都可安全清空,程序会自动重建):
|
||||
@@ -156,7 +169,9 @@ MovieLog_Server/
|
||||
| `cache_ecs_region` | 本机 ECS 所在地域(用于判断内网 endpoint 是否可用) | 1 小时 |
|
||||
| `cache_oss_internal` | 内网 endpoint 可用性判定结论 | 可用 1 小时 / 不可用 30 分钟 |
|
||||
|
||||
外键约束:`movies.cinema_id → cinemas.id`(`ON DELETE SET NULL`)、`viewers.movie_id → movies.id`(`ON DELETE CASCADE`)、`movie_photos.movie_id → movies.id`(`ON DELETE CASCADE`)。
|
||||
外键约束:`movies.cinema_id → cinemas.id`(`ON DELETE SET NULL`)、`viewers.movie_id → movies.id`(`ON DELETE CASCADE`)、`movie_photos.movie_id → movies.id`(`ON DELETE CASCADE`)、`reviews.movie_id → movies.id`(`ON DELETE CASCADE`)、`review_comments.review_id → reviews.id`(`ON DELETE CASCADE`)。
|
||||
|
||||
> SQLite 默认是**关闭**外键约束的(`PRAGMA foreign_keys` 未开启),上面这些 `ON DELETE CASCADE` 实际不会生效。因此删除电影、删除评价时,程序都会**显式地把子表数据一并清掉**(见 `delete.php` 与 `lib/reviews.php`),不要依赖级联。
|
||||
|
||||
**历史数据迁移**:`initDB()` 会自动把早期版本存在 `viewers.name` 里的姓名去重后写入 `persons`,并回填 `viewers.person_id`,老库可直接升级。
|
||||
|
||||
@@ -249,6 +264,18 @@ server {
|
||||
2. 进入「年度报告」,页面顶部切换年份即可查看。
|
||||
3. 未绑定观影人时报告为空并给出提示。
|
||||
|
||||
### 打分、写评价与参与讨论
|
||||
|
||||
1. 打开任意一部电影的详情页,滚到最下面的「💬 评价与讨论」。
|
||||
2. **打分**:点「我的评分」后面的 1-10 任意一个数字(选中会变橙色),旁边实时显示「几分 · 怎么样」。
|
||||
3. **写评价**:在下面文本框里写正文,点「📝 发表评价」。
|
||||
- 已经评价过时,这一块会变成「✏️ 修改我的评价」,按钮是「💾 保存修改」——同一部电影不会留下两条你的评价。
|
||||
4. **参与讨论**:在别人的(或自己的)任意一条评价下面,写一句话,顺手勾几个**观后感受**(😄 🥹 🥰 🤩 🤔 😰 😨 😲 😢 😠 😴 😵,可多选),点「💬 发表讨论」。
|
||||
- 讨论会带上评价人的头像、昵称,以及你选的感受 emoji。
|
||||
5. **删除**:自己发的评价和讨论,右侧有删除按钮(别人的没有);删评价时下面的讨论会一起删掉。
|
||||
|
||||
> 评价人是**登录账号**。家里几个人各有一个账号时,同一部电影可以各自打分,标题栏会显示「N 条评价 · 均分 X」。
|
||||
|
||||
### CSV 批量导入
|
||||
|
||||
CSV **共 9 列,顺序固定**:
|
||||
|
||||
Reference in New Issue
Block a user