feat(public): 主题切换修复 + 卡片图标服务端本地缓存

- 主题切换:菜单改为 fixed 定位并弹出在父菜单右侧;FIXED_THEMES 扩为 9 主题并统一校验;
  子菜单点击无响应修复(合并 IIFE 作用域使 applyTheme 对点击处理器可见);删除死代码。
- 卡片图标:新增 GET /site/icon/<domain>?letter=X 接口,首次请求由服务端拉取 favicon
  并缓存到 data/icon/(运行时自动建目录,已加 .gitignore),之后直接读本地不再重复拉取;
  拉取失败或内网/不可达网址自动生成「站点名称首字母」SVG 头像兜底,杜绝空白图标。
- 模型 Nav.to_dict 新增 domain/scheme/letter/color 计算字段,供卡片与图标接口复用。
This commit is contained in:
bwstudio
2026-09-07 19:14:50 +08:00
parent e10ef5f243
commit 246564fdb3
6 changed files with 295 additions and 36 deletions
+7 -1
View File
@@ -8,7 +8,13 @@
{%- if mine is not none %} data-mine="{{ mine }}"{% endif %}
{%- if item.is_external %} target="_blank" rel="noopener noreferrer"{% endif %}>
<div class="icon-wrap">
<i class="layui-icon {{ item.icon }}"></i>
<span class="nav-letter" style="background:{{ item.color }}">{{ item.letter }}</span>
{% if item.domain %}
{# 图标走本地缓存接口 /site/icon/<domain>,由服务端拉取并落盘到 data/icon/,失败自动生成字母头像 #}
<img class="nav-favicon" alt="" loading="lazy" referrerpolicy="no-referrer"
data-domain="{{ item.domain }}" data-letter="{{ item.letter }}"
style="display:none">
{% endif %}
</div>
<div class="card-body">
<div class="title-row">