v24 第 9 批:名册九条(分组按钮/加入名册/生日月日/地址四级/千人性能/拖动修复/删除人员/返回名册/Semi DatePicker)
- #131 名册卡片加「分组」按钮(details+radio,显示当前分组,选中即改) - #132 修复「从已有人里加入名册」无反应 - #133 生日只显示月和日(阳历 MM-DD / 农历中文名),PersonQuery::birthdaysOf 取代 birthdayOf - #134 地址结构化为 国家/省/市/区+详细:regions 表(3429 行全国区划)+ Region.php + ?r=regions 级联接口 + 表单 .addr-grid + 老地址回填(Schema v16) - #135 千人名册性能:.person content-visibility:auto + 名册页 ob_gzhandler (实测 服务端 1.15s/3.8MB → 0.17s/87KB;客户端导航→load 1.35s → 0.37s) - #136 拖动排序改 Pointer Events(Chrome 下 HTML5 DnD 在 DOM 变动时断) - #137 个人详情页底部「删除人员」 - #138 编辑资料页加「返回名册」 - #139 所有日期选择换 Semi Design DatePicker(渐进增强:原生四字段保 POST 契约, 懒加载 vendor semi UMD,值回写原字段;工作经历 type=month 一并升级;宣纸主题对齐) 验证:e2e 785/0、batch9 37/0、upgrade 126/0、picker 28/0、mobile 688/0、interact 97/0、 batch_e 91/0、import 21/0、douban 22/0、drag 5/0、semi-integrate 28/0、semi-probe 17/0、 geom 5/5;部署后线上自检 16/16(含 4 个 semi 资源 200 + regions 路由)。
This commit is contained in:
@@ -54,6 +54,12 @@ $ctHints = [
|
||||
<div class="page-head">
|
||||
<h1><?= $isEdit ? ($isSelf ? '我的资料' : '编辑成员') : '添加成员' ?></h1>
|
||||
<span class="sub"><?= $isEdit ? e($person['name']) : '填姓名就行,其他都可以以后再补' ?></span>
|
||||
<?php /* 用户 2026-10-04 第 8 条:编辑资料的页面也要能**回到名册**。
|
||||
编辑时是从名册点进来的,改完最常做的下一件事就是回名册找下一个人 ——
|
||||
没有这个按钮就只能靠浏览器后退(而提交保存之后后退会退到旧页面上)。 */ ?>
|
||||
<div class="actions">
|
||||
<a class="btn btn-ghost btn-sm" href="<?= e(url('people')) ?>">返回名册</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" enctype="multipart/form-data"
|
||||
@@ -249,10 +255,69 @@ $ctHints = [
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php /* 用户 2026-10-04 第 4 条:地址拆成**国家 / 省 / 市 / 区 / 详细地址**五级。
|
||||
前四级是级联下拉(数据在 regions 表里,全国 3429 条),
|
||||
最后一级 `address` 就是原来的自由文本 —— 没那么详细时**只填到区**即可,
|
||||
四个下拉里没选的那些存 NULL,不会留下一堆空串。
|
||||
⚠️ 没有 JS 也能用:省/市/区三个下拉在服务端就把**当前这一条链**的选项渲染好了,
|
||||
JS 只负责"换了省就把市和区跟着换"(见 assets/js/app.js 的 addr 段)。 */ ?>
|
||||
<div class="field full">
|
||||
<label for="address">住址</label>
|
||||
<input class="input" id="address" name="address"
|
||||
value="<?= e(old('address', $person['address'] ?? '')) ?>" placeholder="可留空">
|
||||
<label for="addr_province">住址</label>
|
||||
<div class="addr-grid" data-addr
|
||||
data-src="<?= e(url('regions')) ?>">
|
||||
<span class="addr-cell">
|
||||
<span class="addr-k">国家</span>
|
||||
<input class="input" id="addr_country" name="addr_country"
|
||||
value="<?= e(old('addr_country', $person['addr_country'] ?? '')) ?>"
|
||||
placeholder="中国" autocomplete="country-name">
|
||||
</span>
|
||||
<span class="addr-cell">
|
||||
<span class="addr-k">省 / 自治区</span>
|
||||
<select class="select" id="addr_province" name="addr_province" data-addr-lvl="1">
|
||||
<option value="">(不填)</option>
|
||||
<?php foreach (\App\Region::provinces() as $rg): ?>
|
||||
<option value="<?= e($rg['name']) ?>" data-code="<?= e($rg['code']) ?>"
|
||||
<?= old('addr_province', $person['addr_province'] ?? '') === $rg['name'] ? 'selected' : '' ?>>
|
||||
<?= e($rg['name']) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</span>
|
||||
<span class="addr-cell">
|
||||
<span class="addr-k">市</span>
|
||||
<?php $cityCode = \App\Region::codeOfName(old('addr_province', $person['addr_province'] ?? ''), 1); ?>
|
||||
<select class="select" id="addr_city" name="addr_city" data-addr-lvl="2"
|
||||
data-code="<?= e($cityCode) ?>">
|
||||
<option value="">(不填)</option>
|
||||
<?php foreach (\App\Region::childrenOf($cityCode) as $rg): ?>
|
||||
<option value="<?= e($rg['name']) ?>" data-code="<?= e($rg['code']) ?>"
|
||||
<?= old('addr_city', $person['addr_city'] ?? '') === $rg['name'] ? 'selected' : '' ?>>
|
||||
<?= e($rg['name']) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</span>
|
||||
<span class="addr-cell">
|
||||
<span class="addr-k">区 / 县</span>
|
||||
<?php $distCode = \App\Region::codeOfName(old('addr_city', $person['addr_city'] ?? ''), 2); ?>
|
||||
<select class="select" id="addr_district" name="addr_district" data-addr-lvl="3"
|
||||
data-code="<?= e($distCode) ?>">
|
||||
<option value="">(不填)</option>
|
||||
<?php foreach (\App\Region::childrenOf($distCode) as $rg): ?>
|
||||
<option value="<?= e($rg['name']) ?>"
|
||||
<?= old('addr_district', $person['addr_district'] ?? '') === $rg['name'] ? 'selected' : '' ?>>
|
||||
<?= e($rg['name']) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</span>
|
||||
<span class="addr-cell addr-cell-wide">
|
||||
<span class="addr-k">详细地址</span>
|
||||
<input class="input" id="address" name="address"
|
||||
value="<?= e(old('address', $person['address'] ?? '')) ?>"
|
||||
placeholder="街道门牌、小区楼号……没有就留空" autocomplete="street-address">
|
||||
</span>
|
||||
</div>
|
||||
<span class="tip">
|
||||
没有详细地址时只填到「区 / 县」就行 —— 四级里没选的那些不会显示。
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<?php /* 用户 2026-10-03 第 5 条:备注分两种 ——
|
||||
|
||||
Reference in New Issue
Block a user