新增 OIDC/SSO、邮件验证码与 Gitea 项目同步,并强化 Feed 与管理后台。

作为 OIDC Provider 对接 Gitea;注册支持邮件验证码/验证码;侧栏同步公开仓库;Feed 分页、文章大纲、标签云与站点品牌设置。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-31 16:58:22 +08:00
parent 9487c8ab02
commit 822eef96be
83 changed files with 8578 additions and 1222 deletions

View File

@@ -10,6 +10,9 @@ import { useOverlayA11y } from '../hooks/useOverlayA11y';
import { notify } from '@/lib/notify';
import { cn } from '@/lib/utils';
import BackToTop from '../components/BackToTop';
import { loginPath } from '../utils/authRedirect';
import { useSiteBranding } from '../hooks/useSiteBranding';
import SiteBrandMark from '../components/SiteBrandMark';
const NAV = [
{ to: '/admin/dashboard', label: '仪表盘', icon: LayoutDashboard },
@@ -24,6 +27,7 @@ const NAV = [
export default function AdminLayout() {
const { user, loading } = useAuth();
const { theme, toggle } = useTheme();
const { branding } = useSiteBranding();
const isNarrow = useMediaQuery('(max-width: 768px)');
const [navOpen, setNavOpen] = useState(false);
const nav = useNavigate();
@@ -38,7 +42,7 @@ export default function AdminLayout() {
useEffect(() => {
if (loading) return;
if (!user) {
nav('/login');
nav(loginPath('/admin/dashboard'));
return;
}
if (user.role !== 'admin') {
@@ -91,9 +95,9 @@ export default function AdminLayout() {
{navOpen ? <X size={18} aria-hidden /> : <Menu size={18} aria-hidden />}
</button>
)}
<div className="admin-topbar-mark"></div>
<SiteBrandMark branding={branding} className="admin-topbar-mark" />
<div>
<div className="admin-topbar-title"></div>
<div className="admin-topbar-title">{branding.name}</div>
<div className="admin-topbar-sub"></div>
</div>
</div>