feat(admin): 登录改页内弹窗 + P1 站点设置(页头/侧栏)

- 登录:LoginDialog(Modal)替代 /login 页面;/login 重定向回首页
- 设置接口:GET /api/settings 公开读、PATCH 需登录 + version 乐观锁(409/400)
- setting 表存 site JSON:页头(启用/速度/条目+标签+色调)、侧栏(hidden/order)
- /admin:Tabs 页头/侧栏,条目增删与上下移,保存后首页生效
- 首页应用设置:ticker 文本占位符与速度、侧栏顺序与显隐
- 测试 42 passed(settings 5 例)
This commit is contained in:
stash
2026-10-29 12:52:29 +08:00
parent dea7781b86
commit 9ae5a455c5
14 changed files with 1205 additions and 195 deletions
+17 -7
View File
@@ -3,15 +3,25 @@ import { createRoot } from 'react-dom/client'
import '@stash/ui/style.css'
import './index.css'
import App from './App.tsx'
import { LoginPage } from './components/auth/LoginPage'
import { AdminPage } from './components/admin/AdminPage'
/**
* 入口分流:登录页是独立壳(不挂 Layout / 侧栏 / 搜索),
* 且必须在 App 的 `useViewRoute` 把地址规范化之前判定,
* 所以放在这里用首次加载的 pathname 决定,而不是放进 App 里。
* 入口分流:
* - `/admin`:设置页独立壳;
* - `/login`:老地址,直接回首页(登录已改为页内弹窗);
* - 其它:正常站点。
*
* 判定放在这里而不是 App 里,是因为 App 的 `useViewRoute` 会把地址规范化,
* 组件内部再读 pathname 已经晚了。
*/
const isLoginPage = window.location.pathname === '/login'
const path = window.location.pathname
createRoot(document.getElementById('root')!).render(
<StrictMode>{isLoginPage ? <LoginPage /> : <App />}</StrictMode>,
if (path === '/login') {
window.location.replace('/')
}
const root = createRoot(document.getElementById('root')!)
root.render(
<StrictMode>{path === '/admin' ? <AdminPage /> : <App />}</StrictMode>,
)