- events 起止时间精确到秒(starts_at DATE→DATETIME + ends_at),_datetime.php 复用 - 影院独立成表(cinemas,地方/名称/地址/主题色 + 50 色板),movie_details 归一为 cinema_id - 评价模型 MovieLog 同款:movie_reviews 每账号每片一条(1-10 分+正文+感受 key), movie_review_comments 两级平铺评论(回复的回复规范化到顶层、跨评价回复拦截) - 感受目录迁到 MovieReview::CATALOG(12 种,Emoji 11.0 老码位) - 观影列表改瀑布流(CSS grid 海报墙),详情页五大块 + 灯箱 + 评价区 - 升级路径:v8 老数据自动归一(影院三段按 (family,place,name) 去重建行、 评价回填、中文感受反查英文 key),回填全部幂等;老库补 cinema_id 列+索引+外键 - 修三 bug:建表顺序(cinemas 必须在 movie_details 前,否则全新安装 1215)、 layout 导航用键名当路由(影院链接指向 r=cinemas)、 _datetime.php 分钟循环变量 $m 覆盖宿主模板的观影记录(编辑页简介/备注回填被清空)
87 lines
3.6 KiB
PHP
87 lines
3.6 KiB
PHP
<?php
|
||
// ⚠️ 「系统设置」**不在**顶栏里(用户明确要求):它已经收进右上角头像下拉菜单里了,
|
||
// 顶栏留「首页 / 家谱 / 名册 / 观影」四个日常入口,别再把管理入口顶出来。
|
||
// (v8 起加了「观影」—— MovieLog 整体迁入后的日常入口。)
|
||
$navItems = [
|
||
'home' => ['首页', 'home'],
|
||
'kin' => ['家谱', 'kin'],
|
||
'people' => ['名册', 'people'],
|
||
'movies' => ['观影', 'movies'],
|
||
'cinemas' => ['影院', 'movies/cinemas'],
|
||
];
|
||
// ⚠️ 变量名不要叫 $me:layout 是在 extract($data) **之后**被 require 的,
|
||
// 这里再赋值会把页面传进来的 $me(当前登录者的完整记录)覆盖掉。
|
||
// home.php 用 $me 画「补充亲属关系」链接,被覆盖成 true 之后
|
||
// 链接就变成 people/show&id=0,还顺带在页首打出一条 Warning。
|
||
// 改名前请先确认所有模板都没有依赖这个布尔值。
|
||
$isLoggedIn = \App\Auth::check();
|
||
?>
|
||
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title><?= e($pageTitle) ?> · 家书</title>
|
||
<link rel="icon" href="/favicon.ico">
|
||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||
<link rel="manifest" href="/site.webmanifest">
|
||
<meta name="theme-color" content="#A84A28">
|
||
<link rel="stylesheet" href="<?= e(asset('/assets/css/app.css')) ?>">
|
||
</head>
|
||
<body>
|
||
|
||
<?php if ($isLoggedIn): ?>
|
||
<header class="topbar">
|
||
<div class="topbar-inner">
|
||
<a class="brand" href="<?= e(url('home')) ?>">
|
||
<img src="<?= e(asset('/assets/icons/icon-96.png')) ?>" alt="">
|
||
<span>家书</span>
|
||
</a>
|
||
<nav class="nav">
|
||
<?php foreach ($navItems as $key => list($label, $route)): ?>
|
||
<a class="<?= $pageKey === $key ? 'on' : '' ?>" href="<?= e(url($route)) ?>"><?= e($label) ?></a>
|
||
<?php endforeach; ?>
|
||
</nav>
|
||
<div class="topbar-right">
|
||
<?php /* 姓名 + 头像 = 一个下拉菜单,而不是「点名字改资料」+旁边两个裸链接。
|
||
裸链接在窄屏只能靠 display:none 藏起来(一藏入口就没了),
|
||
收进菜单之后同一个入口在手机上也点得到。
|
||
用 <details> 实现:不需要 JS 就能展开/收起,app.js 只额外补
|
||
"点外面"和"Esc"两件事。 */ ?>
|
||
<details class="menu who-menu">
|
||
<summary class="who" title="我的">
|
||
<img src="<?= e(avatar_url($_SESSION['avatar'] ?? null)) ?>" alt="">
|
||
<span class="who-name"><?= e(\App\Auth::name()) ?></span>
|
||
<?php if (\App\Auth::isGuest()): ?><span class="badge">访客</span><?php endif; ?>
|
||
<i class="caret" aria-hidden="true"></i>
|
||
</summary>
|
||
<div class="menu-list">
|
||
<a href="<?= e(url('settings/me')) ?>">个人设置</a>
|
||
<?php if (\App\Auth::isAdmin()): ?>
|
||
<a href="<?= e(url('settings')) ?>">系统设置</a>
|
||
<?php endif; ?>
|
||
<a href="<?= e(url('auth/password')) ?>">修改密码</a>
|
||
<a class="menu-exit" href="<?= e(url('auth/logout', ['_csrf' => csrf_token()])) ?>">退出登录</a>
|
||
</div>
|
||
</details>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<?php endif; ?>
|
||
|
||
<main class="<?= in_array($pageKey, ['install', 'login'], true) ? 'container-narrow' : 'container' ?>">
|
||
|
||
<?php foreach (take_flash() as $f): ?>
|
||
<div class="flash">
|
||
<div class="flash-item <?= $f['type'] === 'err' ? 'err' : '' ?>"><?= e($f['message']) ?></div>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
|
||
<?php require $tplFile; ?>
|
||
|
||
</main>
|
||
|
||
<script src="<?= e(asset('/assets/js/app.js')) ?>"></script>
|
||
</body>
|
||
</html>
|