feat: 完成头像上传、站点主题配置与UI优化

- 新增附件模型与上传服务,拆分头像上传/管理逻辑
- 重构用户资料接口,移除直接修改头像字段,改用专用上传接口
- 添加站点公开设置API与管理员外观配置页
- 全局替换hover背景为accent-soft,优化交互一致性
- 完善头像组件,支持图片加载失败回退与src更新重置
- 新增用户状态事件总线,解决同页头像更新不及时问题
- 调整依赖包顺序与CI依赖版本
- 重构板块列表接口,新增帖子计数
- 迁移账号设置到用户主页tab,合并重复代码
This commit is contained in:
2026-09-15 01:06:12 +08:00
parent f58b2af993
commit 24c6dea38c
48 changed files with 2513 additions and 432 deletions

View File

@@ -217,12 +217,15 @@ h1, h2, h3, h4 {
.btn-primary {
background: var(--accent);
color: var(--accent-on);
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.12), 0 2px 8px rgba(59, 91, 219, 0.22);
/* 阴影色跟随动态主题色(color-mix 引用令牌,换肤自动生效) */
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.12),
0 2px 8px color-mix(in srgb, var(--accent) 26%, transparent);
}
.btn-primary:hover:not(:disabled) {
background: var(--accent-hi);
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(16, 24, 40, 0.1), 0 8px 20px rgba(59, 91, 219, 0.3);
box-shadow: 0 2px 6px rgba(16, 24, 40, 0.1),
0 8px 20px color-mix(in srgb, var(--accent) 34%, transparent);
}
.btn-primary:active:not(:disabled) {
transform: translateY(0);
@@ -463,11 +466,12 @@ h1, h2, h3, h4 {
color: var(--accent);
transform: translateY(-1px);
}
/* 当前页:与全站选中态一致的主题色淡化底(而非实心填充) */
.pager-btn.is-current,
.pager-btn.is-current:hover {
background: var(--accent);
border-color: var(--accent);
color: var(--accent-on);
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
font-weight: 700;
}
@@ -559,8 +563,8 @@ h1, h2, h3, h4 {
font-weight: 700;
}
/* 首页左栏「板块目录」卡片:与面包屑的纯文字位置指引区分,
承载板块介绍与讨论量等发现型信息,点击在工作台内筛选帖子流 */
/* 首页左栏「全部讨论 / 板块目录」卡片:与面包屑的纯文字位置指引区分,
承载讨论量等发现型信息,点击在工作台内筛选帖子流 */
.j13-bcard {
display: flex;
align-items: center;
@@ -580,10 +584,19 @@ h1, h2, h3, h4 {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.j13-bcard[aria-current="page"] {
border-color: var(--accent);
/* 选中态:全站统一使用主题色淡化底(--nav-active-bg,随站点主题色联动),
与 raillink / chip / tab / 顶部导航 pill 的选中表达保持一致 */
.j13-bcard[aria-current="page"],
.j13-bcard[aria-current="page"]:hover {
border-color: var(--nav-active-line);
background: var(--nav-active-bg);
}
.j13-bcard-name {
color: var(--ink);
}
.j13-bcard[aria-current="page"] .j13-bcard-name {
color: var(--nav-active-ink);
}
.j13-bcard-ico {
width: 34px;
height: 34px;
@@ -595,16 +608,6 @@ h1, h2, h3, h4 {
font-weight: 800;
flex-shrink: 0;
}
.j13-bcard-desc {
display: block;
margin-top: 2px;
font-size: 11.5px;
line-height: 1.4;
color: var(--ink-3);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
@media (prefers-reduced-motion: reduce) {
.j13-bcard {
transition: none;
@@ -762,8 +765,10 @@ h1, h2, h3, h4 {
border-radius: 10px;
transition: background 0.16s ease;
}
.j13-rank:hover {
background: var(--panel-2);
/* 榜单行:无选中态的导航项,悬停/聚焦统一使用主题色淡化底 */
.j13-rank:hover,
.j13-rank:focus-visible {
background: var(--accent-soft);
}
.j13-rank .j13-rank-no {
width: 18px;