Skip to content

Commit cd11b77

Browse files
authored
Merge pull request #57 from Dynamite2003/issues
fix several issues including avatar display and password reset
2 parents 0db4954 + 919b03c commit cd11b77

15 files changed

Lines changed: 1287 additions & 219 deletions

File tree

frontend/package-lock.json

Lines changed: 54 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"dependencies": {
1212
"@tailwindcss/typography": "^0.5.19",
1313
"@uiw/react-md-editor": "^4.0.4",
14+
"framer-motion": "^12.23.26",
1415
"lucide-react": "^0.552.0",
1516
"next": "15.5.4",
1617
"pdfjs-dist": "^3.11.174",

frontend/src/app/academic/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ export default function AcademicSearchPage() {
529529
onChange={(event) => setQuestion(event.target.value)}
530530
placeholder="与 AI 助手对话,提出你的研究问题…"
531531
rows={3}
532-
className="w-full resize-none rounded-3xl border border-slate-200 bg-transparent px-5 pb-12 pr-16 pt-3 text-sm leading-relaxed text-slate-900 placeholder:text-slate-500 transition focus:border-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:opacity-60 dark:border-slate-600 dark:bg-transparent dark:text-slate-100 dark:placeholder:text-slate-400"
532+
className="w-full resize-none rounded-3xl border border-slate-200 bg-white/95 px-5 pb-12 pr-16 pt-3 text-sm leading-relaxed text-slate-900 placeholder:text-slate-500 shadow-[0_10px_40px_-25px_rgba(15,23,42,0.5)] transition focus:border-blue-400 focus:bg-white focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:opacity-60 dark:border-slate-600 dark:bg-slate-900/85 dark:text-slate-100 dark:placeholder:text-slate-400"
533533
disabled={loading}
534534
onKeyDown={(e) => {
535535
if (e.key === 'Enter' && !e.shiftKey) {
@@ -681,7 +681,7 @@ export default function AcademicSearchPage() {
681681
onChange={(event) => setQuestion(event.target.value)}
682682
placeholder="描述你的研究问题、关键词或阅读意图…"
683683
rows={4}
684-
className="w-full resize-none rounded-3xl border border-slate-200 bg-transparent px-5 pb-16 pr-16 pt-4 text-sm leading-relaxed text-slate-900 placeholder:text-slate-500 transition focus:border-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:opacity-60 dark:border-slate-600 dark:bg-transparent dark:text-slate-100 dark:placeholder:text-slate-400"
684+
className="w-full resize-none rounded-3xl border border-slate-200 bg-white/95 px-5 pb-16 pr-16 pt-4 text-sm leading-relaxed text-slate-900 placeholder:text-slate-500 shadow-[0_10px_50px_-25px_rgba(15,23,42,0.4)] transition focus:border-blue-400 focus:bg-white focus:outline-none focus:ring-2 focus:ring-blue-200 disabled:opacity-60 dark:border-slate-600 dark:bg-slate-900/80 dark:text-slate-100 dark:placeholder:text-slate-400"
685685
disabled={loading}
686686
/>
687687

frontend/src/app/auth/page.tsx

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use client";
22

33
import { AuthForm } from "@/components/auth-form";
4+
import InsightWorkflow from "@/components/marketing/insight-workflow";
45

56
export default function AuthPage() {
67
return (
@@ -10,20 +11,8 @@ export default function AuthPage() {
1011
>
1112
<main className="flex min-h-screen items-center px-2 py-10 lg:px-4">
1213
<section className="hidden flex-1 items-center justify-end pr-0 lg:flex xl:pr-0">
13-
<div
14-
className="relative h-[68vh] w-full max-w-6xl overflow-hidden rounded-[2.5rem] border border-white/20 bg-transparent shadow-[0_60px_120px_-60px_rgba(15,23,42,0.65)]"
15-
style={{ aspectRatio: "30 / 18" }}
16-
>
17-
<video
18-
className="h-full w-full object-cover"
19-
autoPlay
20-
loop
21-
muted
22-
playsInline
23-
>
24-
<source src="/videos/auth.mp4" type="video/mp4" />
25-
您的浏览器不支持 HTML5 视频播放。
26-
</video>
14+
<div className="relative h-[72vh] w-full">
15+
<InsightWorkflow />
2716
</div>
2817
</section>
2918

frontend/src/app/notes/page.tsx

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -192,61 +192,82 @@ export default function NotesPage() {
192192
<p className="text-xs uppercase tracking-wide text-slate-500">笔记分类</p>
193193
<p className="text-base font-semibold text-slate-900 dark:text-slate-100">文件夹</p>
194194
</div>
195-
<span className="rounded-lg border border-slate-200 px-2.5 py-1 text-[11px] font-medium text-slate-600 dark:border-slate-600 dark:text-slate-300">
196-
{folderGroups.length}
197-
</span>
195+
<Link
196+
href="/notes/new"
197+
className="rounded-lg border border-slate-200 px-2.5 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-50 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-700/60"
198+
>
199+
+ 新建
200+
</Link>
198201
</div>
202+
<p className="mt-1 text-[11px] text-slate-400 dark:text-slate-500">
203+
{folderGroups.length} 个分类,支持展开查看论文及其关联笔记
204+
</p>
199205
{loading ? (
200206
<div className="py-8 text-center text-sm text-slate-500 dark:text-slate-400">加载中...</div>
201207
) : (!folderGroups.some((group) => group.papers.length > 0) && unlinkedNotes.length === 0) ? (
202208
<div className="py-8 text-center text-sm text-slate-500 dark:text-slate-400">还没有笔记,先创建一条吧。</div>
203209
) : (
204-
<div className="space-y-3">
210+
<div className="mt-4 space-y-2">
205211
{folderGroups.map(({ folder, papers: folderPapers, noteCount }) => {
206212
const folderKey = `folder-${folder.id}`;
207213
const isFolderOpen = expandedGroups[folderKey] ?? true;
214+
const folderSummary = `${folderPapers.length} 论文 / ${noteCount} 笔记`;
208215
return (
209-
<div
210-
key={folderKey}
211-
className="overflow-hidden rounded-xl border border-slate-200 bg-white/80 shadow-sm dark:border-slate-700 dark:bg-slate-800/70 dark:shadow-none"
212-
>
216+
<div key={folderKey} className="space-y-2">
213217
<button
214218
type="button"
215219
onClick={() => toggleGroup(folderKey)}
216-
className="flex w-full items-center justify-between px-3 py-2 text-left text-sm font-medium text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
220+
className={`w-full rounded-xl border px-4 py-3 text-left transition ${
221+
isFolderOpen
222+
? "border-blue-500 bg-blue-50 text-blue-700 shadow-sm dark:border-blue-400 dark:bg-blue-900/40 dark:text-blue-100"
223+
: "border-transparent bg-white/70 text-slate-700 hover:border-slate-200 hover:bg-white dark:bg-slate-800/40 dark:text-slate-200 dark:hover:border-slate-600"
224+
}`}
217225
>
218-
<span className="flex items-center gap-2">
219-
<span
220-
className="h-2 w-2 rounded-full"
221-
style={{ backgroundColor: folder.color ?? "#cbd5f5" }}
222-
/>
223-
<span className="truncate">{folder.name}</span>
224-
</span>
225-
<span className="flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400">
226-
<span>
227-
{folderPapers.length} 论文 / {noteCount} 笔记
226+
<div className="flex items-center justify-between text-sm font-medium">
227+
<div className="flex items-center gap-2">
228+
<span
229+
className="h-2.5 w-2.5 rounded-full"
230+
style={{ backgroundColor: folder.color ?? "#cbd5f5" }}
231+
/>
232+
<span className="truncate">{folder.name}</span>
233+
</div>
234+
<span className="flex items-center gap-2 text-xs text-slate-500 dark:text-slate-300">
235+
{folderSummary}
236+
<svg
237+
className={`h-3 w-3 transition ${isFolderOpen ? "rotate-90" : ""}`}
238+
viewBox="0 0 20 20"
239+
fill="none"
240+
stroke="currentColor"
241+
strokeWidth="2"
242+
strokeLinecap="round"
243+
strokeLinejoin="round"
244+
>
245+
<path d="M6 4l6 6-6 6" />
246+
</svg>
228247
</span>
229-
<span className={`transition ${isFolderOpen ? "rotate-90" : ""}`}></span>
230-
</span>
248+
</div>
231249
</button>
232250

233251
{isFolderOpen && (
234-
<div className="divide-y divide-slate-200 dark:divide-slate-800">
252+
<div className="rounded-xl border border-slate-200 bg-white/80 p-2 shadow-sm dark:border-slate-700 dark:bg-slate-900/40 dark:shadow-none">
235253
{folderPapers.length === 0 && (
236254
<div className="px-3 py-2 text-xs text-slate-500 dark:text-slate-400">该文件夹暂无论文</div>
237255
)}
238256
{folderPapers.map(({ paper, notes: paperNotes }) => {
239257
const paperKey = `paper-${paper.id}`;
240258
const isPaperOpen = expandedGroups[paperKey] ?? false;
241259
return (
242-
<div key={paperKey} className="bg-white/60 dark:bg-slate-800/40">
260+
<div
261+
key={paperKey}
262+
className="rounded-lg border border-transparent bg-white/60 dark:bg-slate-800/40"
263+
>
243264
<button
244265
type="button"
245266
onClick={() => toggleGroup(paperKey)}
246-
className="flex w-full items-center justify-between px-3 py-2 text-left text-sm text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
267+
className="flex w-full items-center justify-between px-3 py-2 text-left text-xs font-medium text-slate-800 transition hover:bg-blue-50 dark:text-slate-100 dark:hover:bg-slate-800/60"
247268
>
248269
<span className="truncate">{paper.original_filename}</span>
249-
<span className="flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400">
270+
<span className="flex items-center gap-2 text-[11px] text-slate-500 dark:text-slate-400">
250271
<span>{paperNotes.length}</span>
251272
<span className={`transition ${isPaperOpen ? "rotate-90" : ""}`}></span>
252273
</span>
@@ -261,7 +282,9 @@ export default function NotesPage() {
261282
className="flex w-full items-center justify-between px-3 py-2 text-left text-xs text-slate-700 transition hover:bg-slate-50 dark:text-slate-200 dark:hover:bg-slate-800/50"
262283
>
263284
<span className="truncate">{note.title}</span>
264-
<span className="text-[11px] text-slate-400 dark:text-slate-500">{formatDate(note.updated_at)}</span>
285+
<span className="text-[11px] text-slate-400 dark:text-slate-500">
286+
{formatDate(note.updated_at)}
287+
</span>
265288
</button>
266289
))}
267290
</div>
@@ -279,20 +302,36 @@ export default function NotesPage() {
279302
})}
280303

281304
{unlinkedNotes.length > 0 && (
282-
<div className="overflow-hidden rounded-xl border border-slate-200 bg-white/80 shadow-sm dark:border-slate-700 dark:bg-slate-800/70 dark:shadow-none">
305+
<div className="space-y-2">
283306
<button
284307
type="button"
285308
onClick={() => toggleGroup("unlinked")}
286-
className="flex w-full items-center justify-between px-3 py-2 text-left text-sm font-medium text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
309+
className={`w-full rounded-xl border px-4 py-3 text-left transition ${
310+
expandedGroups["unlinked"]
311+
? "border-emerald-500 bg-emerald-50 text-emerald-700 shadow-sm dark:border-emerald-400 dark:bg-emerald-900/30 dark:text-emerald-100"
312+
: "border-transparent bg-white/70 text-slate-700 hover:border-slate-200 hover:bg-white dark:bg-slate-800/40 dark:text-slate-200 dark:hover:border-slate-600"
313+
}`}
287314
>
288-
<span className="truncate">未关联论文</span>
289-
<span className="flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400">
290-
<span>{unlinkedNotes.length}</span>
291-
<span className={`transition ${expandedGroups["unlinked"] ? "rotate-90" : ""}`}></span>
292-
</span>
315+
<div className="flex items-center justify-between text-sm font-medium">
316+
<span className="truncate">未关联论文</span>
317+
<span className="flex items-center gap-2 text-xs text-slate-500 dark:text-slate-300">
318+
{unlinkedNotes.length}
319+
<svg
320+
className={`h-3 w-3 transition ${expandedGroups["unlinked"] ? "rotate-90" : ""}`}
321+
viewBox="0 0 20 20"
322+
fill="none"
323+
stroke="currentColor"
324+
strokeWidth="2"
325+
strokeLinecap="round"
326+
strokeLinejoin="round"
327+
>
328+
<path d="M6 4l6 6-6 6" />
329+
</svg>
330+
</span>
331+
</div>
293332
</button>
294333
{expandedGroups["unlinked"] && (
295-
<div className="divide-y divide-slate-200 dark:divide-slate-800">
334+
<div className="rounded-xl border border-slate-200 bg-white/80 p-2 shadow-sm dark:border-slate-700 dark:bg-slate-900/40 dark:shadow-none">
296335
{unlinkedNotes.map((note) => (
297336
<button
298337
key={note.id}

0 commit comments

Comments
 (0)