feat(frontend): 新增多版本笔记功能,并做了向下兼容。

- 新增关于页面组件,介绍项目背景、功能和使用方法
- 重构笔记生成逻辑,支持多版本笔记
- 新增笔记版本选择、复制和导出功能
-优化笔记界面布局和交互
- 调整部分组件样式,提升用户体验
This commit is contained in:
黄建武
2025-05-04 11:00:54 +08:00
parent c492f0780b
commit 97f153646f
29 changed files with 1499 additions and 407 deletions

View File

@@ -1,6 +1,8 @@
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
import { delete_task, generateNote } from '@/services/note.ts'
import { v4 as uuidv4 } from 'uuid'
export type TaskStatus = 'PENDING' | 'RUNNING' | 'SUCCESS' | 'FAILD'
@@ -26,10 +28,17 @@ export interface Transcript {
raw: any
segments: Segment[]
}
export interface Markdown {
ver_id: string
content: string
style: string
model_name: string
created_at: string
}
export interface Task {
id: string
markdown: string
markdown: string|Markdown [] //为了兼容之前的笔记
transcript: Transcript
status: TaskStatus
audioMeta: AudioMeta
@@ -64,6 +73,7 @@ export const useTaskStore = create<TaskStore>()(
currentTaskId: null,
addPendingTask: (taskId: string, platform: string, formData: any) =>
set(state => ({
tasks: [
{
@@ -95,24 +105,82 @@ export const useTaskStore = create<TaskStore>()(
})),
updateTaskContent: (id, data) =>
set(state => ({
tasks: state.tasks.map(task => (task.id === id ? { ...task, ...data } : task)),
})),
set(state => ({
tasks: state.tasks.map(task => {
if (task.id !== id) return task
if (task.status === 'SUCCESS' && data.status === 'SUCCESS') return task
// 如果是 markdown 字符串,封装为版本
if (typeof data.markdown === 'string') {
const prev = task.markdown
const newVersion: Markdown = {
ver_id: `${task.id}-${uuidv4()}`,
content: data.markdown,
style: task.formData.style || '',
model_name: task.formData.model_name || '',
created_at: new Date().toISOString(),
}
let updatedMarkdown: Markdown[]
if (Array.isArray(prev)) {
updatedMarkdown = [newVersion, ...prev]
} else {
updatedMarkdown = [
newVersion,
...(typeof prev === 'string' && prev
? [{
ver_id: `${task.id}-${uuidv4()}`,
content: prev,
style: task.formData.style || '',
model_name: task.formData.model_name || '',
created_at: new Date().toISOString(),
}]
: []),
]
}
return {
...task,
...data,
markdown: updatedMarkdown,
}
}
return { ...task, ...data }
}),
})),
getCurrentTask: () => {
const currentTaskId = get().currentTaskId
return get().tasks.find(task => task.id === currentTaskId) || null
},
retryTask: async (id: string) => {
const task = get().tasks.find(task => task.id === id).formData
retryTask: async (id: string, payload?: any) => {
const task = get().tasks.find(task => task.id === id)
if (!task) return
const newFormData = payload || task.formData
await generateNote({
task_id: id,
...task,
...newFormData,
})
set(state => ({
tasks: state.tasks.map(task => (task.id === id ? { ...task, status: 'PENDING' } : task)),
tasks: state.tasks.map(t =>
t.id === id
? {
...t,
formData: newFormData, // ✅ 显式更新 formData
status: 'PENDING',
}
: t
),
}))
},
removeTask: async id => {
const task = get().tasks.find(t => t.id === id)