From 013c9fb9291c27acf795fb3c8bf774b7b3ea9f56 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 17 Oct 2026 12:14:01 +0800 Subject: [PATCH] feat: profile page + resume builder (section reorder/enable, word/pdf export) --- app/src/App.tsx | 4 + app/src/components/layout/Header.tsx | 2 +- app/src/components/layout/Sidebar.tsx | 10 +- app/src/lib/api.ts | 24 +- app/src/lib/resume.ts | 115 ++++++ app/src/lib/types.ts | 11 + app/src/pages/profile/ProfilePage.tsx | 159 +++++++++ app/src/pages/resume/ResumePage.tsx | 192 ++++++++++ app/src/styles/theme.css | 9 + ...Page-C1b4lA6U.js => AdminPage-BaQEpWYv.js} | 6 +- ...-DXHOffrT.js => DashboardPage-CjgGmY48.js} | 2 +- ...age-Dg2cHuPb.js => GradesPage-z1WFXi5G.js} | 2 +- .../www/assets/ProfilePage-CkPa7A_5.js | 6 + ...ge-SWQGoFnM.js => RecordsPage-5m_vENBY.js} | 2 +- sync-server/www/assets/ResumePage-Cw9JFOLR.js | 16 + ...e--aDgN2hs.js => TaxonomyPage-DCmvpNAQ.js} | 2 +- ...Page-D-jmUY6r.js => TypesPage-BdTJ69cp.js} | 2 +- .../{card-Cg1yGhg4.js => card-DdglV9lU.js} | 2 +- sync-server/www/assets/index-BheMcaGY.css | 1 + sync-server/www/assets/index-C89WOjDi.js | 322 ----------------- sync-server/www/assets/index-DbEUVhiT.css | 1 - sync-server/www/assets/index-DkrEeFZh.js | 332 ++++++++++++++++++ ...GWDt7hB.js => mammoth.browser-BCMiIhTD.js} | 2 +- ...Chart-CDXdKvrQ.js => useChart-DNtmZa2Q.js} | 2 +- sync-server/www/index.html | 4 +- 25 files changed, 891 insertions(+), 339 deletions(-) create mode 100644 app/src/lib/resume.ts create mode 100644 app/src/pages/profile/ProfilePage.tsx create mode 100644 app/src/pages/resume/ResumePage.tsx rename sync-server/www/assets/{AdminPage-C1b4lA6U.js => AdminPage-BaQEpWYv.js} (97%) rename sync-server/www/assets/{DashboardPage-DXHOffrT.js => DashboardPage-CjgGmY48.js} (94%) rename sync-server/www/assets/{GradesPage-Dg2cHuPb.js => GradesPage-z1WFXi5G.js} (99%) create mode 100644 sync-server/www/assets/ProfilePage-CkPa7A_5.js rename sync-server/www/assets/{RecordsPage-SWQGoFnM.js => RecordsPage-5m_vENBY.js} (99%) create mode 100644 sync-server/www/assets/ResumePage-Cw9JFOLR.js rename sync-server/www/assets/{TaxonomyPage--aDgN2hs.js => TaxonomyPage-DCmvpNAQ.js} (97%) rename sync-server/www/assets/{TypesPage-D-jmUY6r.js => TypesPage-BdTJ69cp.js} (98%) rename sync-server/www/assets/{card-Cg1yGhg4.js => card-DdglV9lU.js} (89%) create mode 100644 sync-server/www/assets/index-BheMcaGY.css delete mode 100644 sync-server/www/assets/index-C89WOjDi.js delete mode 100644 sync-server/www/assets/index-DbEUVhiT.css create mode 100644 sync-server/www/assets/index-DkrEeFZh.js rename sync-server/www/assets/{mammoth.browser-BGWDt7hB.js => mammoth.browser-BCMiIhTD.js} (99%) rename sync-server/www/assets/{useChart-CDXdKvrQ.js => useChart-DNtmZa2Q.js} (92%) diff --git a/app/src/App.tsx b/app/src/App.tsx index 27d448a..9b4f25b 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -10,6 +10,8 @@ const GradesPage = lazy(() => import('@/pages/grades/GradesPage').then(m => ({ d const TypesPage = lazy(() => import('@/pages/types/TypesPage').then(m => ({ default: m.TypesPage }))); const TaxonomyPage = lazy(() => import('@/pages/taxonomy/TaxonomyPage').then(m => ({ default: m.TaxonomyPage }))); const AdminPage = lazy(() => import('@/pages/admin/AdminPage').then(m => ({ default: m.AdminPage }))); +const ProfilePage = lazy(() => import('@/pages/profile/ProfilePage').then(m => ({ default: m.ProfilePage }))); +const ResumePage = lazy(() => import('@/pages/resume/ResumePage').then(m => ({ default: m.ResumePage }))); function PageLoading() { return
加载中…
; @@ -27,6 +29,8 @@ export default function App() { }>} /> }>} /> }>} /> + }>} /> + }>} /> } /> diff --git a/app/src/components/layout/Header.tsx b/app/src/components/layout/Header.tsx index 3785dad..5ed9e57 100644 --- a/app/src/components/layout/Header.tsx +++ b/app/src/components/layout/Header.tsx @@ -29,7 +29,7 @@ export function Header({ onMenu }: { onMenu?: () => void }) { }; return ( -
+
diff --git a/app/src/components/layout/Sidebar.tsx b/app/src/components/layout/Sidebar.tsx index af471ee..db2caa4 100644 --- a/app/src/components/layout/Sidebar.tsx +++ b/app/src/components/layout/Sidebar.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { NavLink } from 'react-router-dom'; import { useQuery, useQueryClient } from '@tanstack/react-query'; -import { CalendarDays, Rows3, ChartColumn, GraduationCap, Shapes, SlidersHorizontal, LogIn, LogOut, ShieldCheck, Cloud } from 'lucide-react'; +import { CalendarDays, Rows3, ChartColumn, GraduationCap, Shapes, SlidersHorizontal, LogIn, LogOut, ShieldCheck, Cloud, User, ScrollText } from 'lucide-react'; import { serverMe, clearToken, getToken } from '@/lib/api'; import { LoginDialog } from '@/components/auth/LoginDialog'; import { cn } from '@/lib/utils'; @@ -16,6 +16,13 @@ const NAV = [ { to: '/dashboard', label: '统计', icon: ChartColumn }, ], }, + { + section: '个人', + items: [ + { to: '/profile', label: '个人信息', icon: User }, + { to: '/resume', label: '我的简历', icon: ScrollText }, + ], + }, { section: '配置', items: [ @@ -52,6 +59,7 @@ export function Sidebar({ open, onClose }: { open: boolean; onClose: () => void return (