v28 第 28 批(12 条):名册分组改标签 / 资源合并为两按钮 / 首页定位与主题色 / 笔记富文本双模式
其中 4 条是**上批遗漏的真 bug**(1/4/8/9),根因已逐条定位:
1. 首页日程没定位到红线 —— 真根因:刻度区间**不含当前时刻** → $showNow=false
→ 红线**整个不渲染**,而定位脚本用同一个越界比例算目标,被 clamp 到底部。
修:把当前小时并进区间端点(现在必然落在区间内)。
2. 「看整月」→「更多日程」+ 日程主题色;3. 「手头在做」→「近期任务」、
「任务看板」→「全部任务」+ 任务主题色(注入 --hd-c,不再写死白底)。
4. 任务复选框提示还在 —— 真根因:**JS 在点击后**给状态徽标挂 title
(`badge.setAttribute('title',…)`),上批只去了静态渲染,静态断言永远抓不到。
5. 名册「分组」→「标签」(用户:一个人可能既是小学同学又是初中同学,没法分组):
新增 person_tags(每人一份、一人多标签),名册改**平铺 + 顶部标签筛选**;
🔴 迁移用**一次性哨兵**(第一版用 NOT EXISTS,实测被"用户清空标签"绕过 → 旧分组名被灌回)。
6. 名册卡片按钮加语义底色。
7. 资源四按钮 → **编辑 / 删除**两颗:三块内容进一个带页签的弹框(信息/附件/共享)。
8. 财务多选数字不变 —— 真根因:前端发 `kinds=a,b`(逗号串),服务端 `(array)` 收成
单元素 → 求交为空 → **静默回落整本账**。修:两种形状都收。
9. 微信读书偶发很慢 —— 真根因:syncNow 扫 60 本 × 每本 1~3 次网关调用(单次超时 20s),
全同步阻塞在列表页请求里。修:总时长预算 + 单次超时 8s + 自动/手动分批。
10. 新增全局可见的联想接口库(6 个实测可用来源)+ 三种新解析类型。
11. 导航右上角「设置」:默认进"添加网址 + 全部网址",四类设置收进 ?set=1 视图。
12. 笔记:段落/清单支持 Markdown(自研渲染器,**不允许原始 HTML**),
实时预览走服务端(前后端只一份规则);底部附件上传;清单多级;
列表改**定尺寸卡片网格**(溢出显示摘要、图片缩放下方);按用户要求**去掉标签侧栏**。
This commit is contained in:
@@ -198,6 +198,59 @@ function nav_parse_suggest(string $type, string $body, string $q): array
|
||||
}
|
||||
break;
|
||||
|
||||
// ---- v28 用户第 10 条新增的三个联想来源(见 Nav::SUGGEST_LIBRARY)----
|
||||
case 'sogou':
|
||||
// {"query":"x","items":["a","b"]}
|
||||
// ⚠️ 与旧的 `sogou_ajaj` 分开:那条是 GBK 老接口(现已不解析),
|
||||
// 这条是新的 suggestion.sogou.com,返回 utf-8 JSON。
|
||||
$j = json_decode($body, true);
|
||||
if (is_array($j) && !empty($j['items']) && is_array($j['items'])) {
|
||||
$out = $j['items'];
|
||||
}
|
||||
break;
|
||||
|
||||
case 'zhihu':
|
||||
// {"data":[{"query":".."}]} 或 {"suggest":[{"query":".."}]}
|
||||
$j = json_decode($body, true);
|
||||
if (is_array($j)) {
|
||||
foreach (['data', 'suggest'] as $k) {
|
||||
if (!empty($j[$k]) && is_array($j[$k])) {
|
||||
foreach ($j[$k] as $it) {
|
||||
if (is_array($it)) {
|
||||
foreach (['query', 'title', 'name'] as $f) {
|
||||
if (isset($it[$f]) && is_string($it[$f])) { $out[] = $it[$f]; break; }
|
||||
}
|
||||
} elseif (is_string($it)) {
|
||||
$out[] = $it;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'bili':
|
||||
// {"code":0,"data":{"tag":[{"value":".."}]}}
|
||||
// 也兼容 {"result":[{"term":".."}]}
|
||||
$j = json_decode($body, true);
|
||||
if (is_array($j)) {
|
||||
if (!empty($j['data']['tag']) && is_array($j['data']['tag'])) {
|
||||
foreach ($j['data']['tag'] as $it) {
|
||||
if (is_array($it) && isset($it['value'])) { $out[] = $it['value']; }
|
||||
}
|
||||
} elseif (!empty($j['result']) && is_array($j['result'])) {
|
||||
foreach ($j['result'] as $it) {
|
||||
if (is_array($it)) {
|
||||
foreach (['term', 'name', 'value'] as $f) {
|
||||
if (isset($it[$f]) && is_string($it[$f])) { $out[] = $it[$f]; break; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// 通用兜底:先试 JSON,再退化正则(照搬)
|
||||
$j = json_decode($body, true);
|
||||
|
||||
Reference in New Issue
Block a user