v41 第 41 批:流水线提速 + 12 项界面/交互开发 + DAV 彻底修复

DAV(用户「务必彻底解决」):
- 真根因是 home-set 层级错:CalDav::HOME_PATH 原为 /dav/calendars/、
  CardDav 原为 /carddav/addressbooks/,而日历本/通讯录的 href 在
  /dav/N.ics/ 与 /carddav/N.vcf/ —— home-set 下面一本都没有。
  Thunderbird 按 home-set 前缀认成员,于是「找不到日历本 / 找不到联系人」。
  改为 /dav/ 与 /carddav/(所有既有 URL 一字不变,老配置不作废)。
- 又发现并修掉 Depth:0 违反 RFC 4918:原实现无论 depth 都列出全部子集合,
  且第一条 response 是日历本(不含 current-user-principal)。改为按 depth 分流,
  Depth:0 只回资源自身、Depth:1 才列出子集合。

界面与交互:
- 观影:新建影院弹窗层级修正 + 详细地址;照片左右按钮悬停不再位移;
  弹框底栏改「确定 / 取消」。
- 旅程:新建旅程改弹窗并按观影式排版;详情页四个动作按钮按用户指定顺序与配色;
  编辑与新增行程弹窗化(单容器 + AJAX);行程时间控件改 AntD(精确到分);
  参与人默认带上自己;车次号/车牌号紧跟交通方式词。
- 资源:新建/编辑改弹窗 + 观影式排版 + 新建时即定共享人。
- 纪念日:新建改弹框 + 观影式排版。

验证:
- e2e 1510/0;v41 十二项真机 48/0;DAV 反向验证 8/0;
  部署断言空跑 337/0;模板 div 深度三形态穷举 33 组全配平。
- 线上 DAV 终验(--resolve 真实入口 + 真 DAV 口令)12/0;
  线上确认 Depth:0 恰好 1 个 response。
This commit is contained in:
2026-10-11 10:12:11 +08:00
parent f9e30bd7d8
commit 7544fb9f6a
19 changed files with 1616 additions and 342 deletions
+25
View File
@@ -658,6 +658,31 @@ final class Trip
$st->execute([$eventId]);
$rows = $st->fetchAll();
$ids = array_map('intval', array_column($rows, 'id'));
/* 🔴 v41(用户 2026-10-10 第 8 条):行程行要把「自驾的车牌号」直接跟在
「自驾」两个字后面 ⇒ 这里一次性把用到的车辆**车牌**挂上去。
⚠️ 用一条 IN 查询而不是逐行 JOIN:一张"十几段"的行程单逐行查会把
N 次往返变成 N 次;车辆是低频引用(多数段没有车),
IN 一次就够。
⚠️ 字段名 `vehicle_plate` 与 `Vehicle::label` 的取向不同:
label 是给"选车下拉"用的(车牌 + 名称,方便辨认),
详情页要的是**车牌号本身**(用户原话就是"车牌号")。 */
$vehIds = array_values(array_filter(array_map(
static fn($n) => (int)($n['vehicle_id'] ?? 0), $rows)));
if ($vehIds) {
$vin = implode(',', array_fill(0, count(array_unique($vehIds)), '?'));
$sv = Database::get()->prepare(
"SELECT id, plate FROM vehicles WHERE id IN ($vin)"
);
$sv->execute(array_values(array_unique($vehIds)));
$plates = [];
foreach ($sv->fetchAll() as $v) {
$plates[(int)$v['id']] = (string)$v['plate'];
}
foreach ($rows as &$nv) {
$nv['vehicle_plate'] = $plates[(int)($nv['vehicle_id'] ?? 0)] ?? '';
}
unset($nv);
}
// 一次性把全部节点的附件取出来(逐节点查会让"十几段的旅程"变成几十次查询)
$attach = [];
foreach ($ids as $nid) {