v8:观影落地(MovieLog 整体迁入统一事件原语)+ 三处 UI 撤除
- Schema v8:events / movie_details / event_attendees / event_photos 四张表, uk_event_source(family_id, source_ref) 作迁移幂等锚 - Movie 模型:时间线/详情/增删改、同行人整组替换、照片逐张管理、感受英→中映射 - ImageSlot 新增 poster(2:3) / ticket(free) / photo(free) 三槽位; free 槽位不裁剪、整图等比缩进框(只缩不放大) - OssDriver::copyObject:同桶 CopyObject(手写 V1 签名,x-oss-* 头按字典序进签名串) - 路由:movies 时间线/详情/新增/编辑/删除/补照片/删照片;同行人按家庭过滤; 访客只读(requireWrite) - UI 撤除:首页「我的一句话」、家谱页「补充我的亲属关系 / 看整个名册」两个按钮; 顶栏加「观影」入口 - 修潜伏 bug:ImageSlot::parseRatio 的正则用 / 作分隔符,字符类里的 / 把模式 提前截断(Unknown modifier ']')—— ratio() 只在上传 POST 里被调到,一直没被观察到 - 线上数据迁移(临时 token 门禁页,用完即删):MovieLog 219 条观影 → events, 14 位观影人新增进名册(带 MovieLog 头像),431 个 OSS 对象同桶拷贝 (movielog/uploads/<dir>/x → family/<dir>/x),review/feelings/影院三段/照片全量搬
This commit is contained in:
@@ -758,3 +758,74 @@ textarea.input { min-height: 76px; resize: vertical; }
|
||||
.ct-row { flex-direction: column; gap: 6px; }
|
||||
.ct-row .ct-label { flex: none; }
|
||||
}
|
||||
|
||||
/* ===== 观影(v8,MovieLog 迁入) ===== */
|
||||
.movie-list { display: flex; flex-direction: column; gap: 10px; }
|
||||
.movie-card {
|
||||
display: flex; gap: 14px; align-items: center;
|
||||
padding: 10px; background: var(--card-bg, #fff);
|
||||
border: 1px solid var(--line); border-radius: 12px;
|
||||
text-decoration: none; color: var(--ink);
|
||||
}
|
||||
.movie-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-l); text-decoration: none; }
|
||||
.m-poster {
|
||||
flex: 0 0 64px; width: 64px; height: 96px; object-fit: cover;
|
||||
border-radius: 8px; background: var(--line-2); display: block;
|
||||
}
|
||||
.m-poster-empty {
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
color: var(--faint, #B9AE9F); font-size: 20px; font-weight: 600;
|
||||
}
|
||||
.m-main { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
|
||||
.m-title { font-weight: 600; font-size: 15px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
|
||||
.rating {
|
||||
background: var(--brand); color: #fff; border-radius: 999px;
|
||||
padding: 1px 8px; font-size: 12px; font-weight: 600;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.rating-lg { font-size: 14px; padding: 2px 10px; }
|
||||
.m-meta { color: var(--muted); font-size: 13px; }
|
||||
.m-who { color: var(--muted); font-size: 12px; }
|
||||
|
||||
.movie-detail { display: grid; grid-template-columns: 220px 1fr; gap: 24px; align-items: start; }
|
||||
.m-poster-col { display: flex; flex-direction: column; gap: 12px; }
|
||||
.m-poster-lg {
|
||||
width: 100%; aspect-ratio: 2 / 3; object-fit: cover;
|
||||
border-radius: 12px; background: var(--line-2); display: flex;
|
||||
align-items: center; justify-content: center;
|
||||
color: var(--faint, #B9AE9F); font-size: 40px; font-weight: 600;
|
||||
}
|
||||
a .m-poster-lg { display: block; }
|
||||
.m-ticket { width: 100%; border-radius: 10px; border: 1px solid var(--line); display: block; }
|
||||
.m-info .m-score { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
|
||||
.badge-feel { background: #F6E3D7; color: var(--brand-ink); }
|
||||
.m-block { margin-top: 16px; }
|
||||
.m-block h3 { font-size: 14px; margin: 0 0 6px; color: var(--muted); font-weight: 500; }
|
||||
.m-block p { margin: 0; font-size: 14px; line-height: 1.7; white-space: normal; }
|
||||
|
||||
.photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; }
|
||||
.photo-cell { position: relative; border-radius: 10px; overflow: hidden; border: 1px solid var(--line); }
|
||||
.photo-cell img { width: 100%; height: 160px; object-fit: cover; display: block; }
|
||||
.photo-del {
|
||||
position: absolute; top: 6px; right: 6px;
|
||||
width: 24px; height: 24px; border-radius: 50%; border: 0;
|
||||
background: rgba(0,0,0,.55); color: #fff; font-size: 16px; line-height: 1;
|
||||
cursor: pointer; padding: 0;
|
||||
}
|
||||
.photo-del:hover { background: var(--red, #C0533F); }
|
||||
.photo-add label { display: block; font-size: 13px; color: var(--muted); margin-bottom: 8px; }
|
||||
.photo-add-row { display: flex; gap: 10px; align-items: center; }
|
||||
.photo-add-row .input { flex: 1; }
|
||||
|
||||
.feel-grid { display: flex; flex-wrap: wrap; gap: 8px 16px; }
|
||||
.feel-item { display: flex; align-items: center; gap: 5px; font-size: 14px; cursor: pointer; }
|
||||
.feel-item input { accent-color: var(--brand); }
|
||||
|
||||
@media (max-width: 720px) {
|
||||
.movie-detail { grid-template-columns: 1fr; }
|
||||
.m-poster-col { flex-direction: row; }
|
||||
.m-poster-col .m-poster-lg, .m-poster-col a:first-child { flex: 0 0 140px; width: 140px; }
|
||||
.m-ticket { width: auto; max-width: 55%; }
|
||||
.photo-grid { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); }
|
||||
.photo-cell img { height: 120px; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user