:feat 新增模型配置页面和相关功能

- 新增模型配置页面组件和路由
- 实现模型配置表单和相关逻辑- 添加全局配置入口和功能- 优化首页布局和样式- 新增 404 页面组件
- 更新部分组件样式和结构
This commit is contained in:
Jefferyhcool
2025-04-22 17:01:02 +08:00
parent 2aad103a77
commit bb974b0b89
95 changed files with 7723 additions and 1697 deletions

View File

@@ -0,0 +1,67 @@
import { create } from 'zustand'
import { IProvider } from '@/types'
import { getProviderList } from '@/services/model.ts'
interface ProviderStore {
provider: IProvider[]
setProvider: (provider: IProvider) => void
setAllProviders: (providers: IProvider[]) => void
getProviderById: (id: number) => IProvider | undefined
getProviderList: () => IProvider[]
fetchProviderList: () => Promise<void>
}
export const useProviderStore = create<ProviderStore>((set, get) => ({
provider: [],
// 添加或更新一个 provider
setProvider: newProvider =>
set(state => {
const exists = state.provider.find(p => p.id === newProvider.id)
if (exists) {
return {
provider: state.provider.map(p => (p.id === newProvider.id ? newProvider : p)),
}
} else {
return { provider: [...state.provider, newProvider] }
}
}),
// 设置整个 provider 列表
setAllProviders: providers => set({ provider: providers }),
// 按 id 获取单个 provider
getProviderById: id => get().provider.find(p => p.id === id),
getProviderList: () => get().provider,
fetchProviderList: async () => {
try {
const res = await getProviderList()
if (res.data.code === 0) {
set({
provider: res.data.data.map(
(item: {
id: string
name: string
logo: string
api_key: string
base_url: string
}) => {
return {
id: item.id,
name: item.name,
logo: item.logo,
apiKey: item.api_key,
baseUrl: item.base_url,
type: item.type,
}
}
),
})
}
} catch (error) {
console.error('Error fetching provider list:', error)
}
},
}))

View File

@@ -1,124 +1,120 @@
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
import {delete_task} from "@/services/note.ts";
import { delete_task } from '@/services/note.ts'
export type TaskStatus = 'PENDING' | 'RUNNING' | 'SUCCESS' | 'FAILD'
export interface AudioMeta {
cover_url: string
duration: number
file_path: string
platform: string
raw_info: any
title: string
video_id: string
cover_url: string
duration: number
file_path: string
platform: string
raw_info: any
title: string
video_id: string
}
export interface Segment {
start: number
end: number
text: string
start: number
end: number
text: string
}
export interface Transcript {
full_text: string
language: string
raw: any
segments: Segment[]
full_text: string
language: string
raw: any
segments: Segment[]
}
export interface Task {
id: string
markdown: string
transcript: Transcript
status: TaskStatus
audioMeta: AudioMeta
createdAt: string
id: string
markdown: string
transcript: Transcript
status: TaskStatus
audioMeta: AudioMeta
createdAt: string
}
interface TaskStore {
tasks: Task[]
currentTaskId: string | null
platform:string|null
addPendingTask: (taskId: string, platform: string) => void
updateTaskContent: (id: string, data: Partial<Omit<Task, "id" | "createdAt">>) => void
removeTask: (id: string) => void
clearTasks: () => void
setCurrentTask: (taskId: string | null) => void
getCurrentTask: () => Task | null
tasks: Task[]
currentTaskId: string | null
addPendingTask: (taskId: string, platform: string) => void
updateTaskContent: (id: string, data: Partial<Omit<Task, 'id' | 'createdAt'>>) => void
removeTask: (id: string) => void
clearTasks: () => void
setCurrentTask: (taskId: string | null) => void
getCurrentTask: () => Task | null
}
export const useTaskStore = create<TaskStore>()(
persist(
(set,get) => ({
tasks: [],
currentTaskId: null,
persist(
(set, get) => ({
tasks: [],
currentTaskId: null,
addPendingTask: (taskId: string,platform: string) =>
set((state) => ({
tasks: [
{
id: taskId,
status: "PENDING",
markdown: "",
platform:platform,
transcript: {
full_text: "",
language: "",
raw: null,
segments: [],
},
createdAt: new Date().toISOString(),
audioMeta: {
cover_url: "",
duration: 0,
file_path: "",
platform: '',
raw_info: null,
title: "",
video_id: "",
},
},
...state.tasks,
],
currentTaskId: taskId, // 默认设置为当前任务
})),
updateTaskContent: (id, data) =>
set((state) => ({
tasks: state.tasks.map((task) =>
task.id === id ? { ...task, ...data } : task
),
})),
getCurrentTask: () => {
const currentTaskId = get().currentTaskId
return get().tasks.find((task) => task.id === currentTaskId) || null
addPendingTask: (taskId: string, platform: string) =>
set(state => ({
tasks: [
{
id: taskId,
status: 'PENDING',
markdown: '',
platform: platform,
transcript: {
full_text: '',
language: '',
raw: null,
segments: [],
},
createdAt: new Date().toISOString(),
audioMeta: {
cover_url: '',
duration: 0,
file_path: '',
platform: '',
raw_info: null,
title: '',
video_id: '',
},
},
removeTask: async (id) => {
const task = get().tasks.find((t) => t.id === id)
...state.tasks,
],
currentTaskId: taskId, // 默认设置为当前任务
})),
// 更新 Zustand 状态
set((state) => ({
tasks: state.tasks.filter((task) => task.id !== id),
currentTaskId: state.currentTaskId === id ? null : state.currentTaskId,
}))
updateTaskContent: (id, data) =>
set(state => ({
tasks: state.tasks.map(task => (task.id === id ? { ...task, ...data } : task)),
})),
getCurrentTask: () => {
const currentTaskId = get().currentTaskId
return get().tasks.find(task => task.id === currentTaskId) || null
},
removeTask: async id => {
const task = get().tasks.find(t => t.id === id)
// 调用后端删除接口(如果找到了任务)
if (task) {
await delete_task({
video_id: task.audioMeta.video_id,
platform: task.platform,
})
}
},
// 更新 Zustand 状态
set(state => ({
tasks: state.tasks.filter(task => task.id !== id),
currentTaskId: state.currentTaskId === id ? null : state.currentTaskId,
}))
clearTasks: () => set({ tasks: [], currentTaskId: null }),
setCurrentTask: (taskId) => set({ currentTaskId: taskId }),
}),
{
name: 'task-storage',
// 调用后端删除接口(如果找到了任务)
if (task) {
await delete_task({
video_id: task.audioMeta.video_id,
platform: task.platform,
})
}
)
},
clearTasks: () => set({ tasks: [], currentTaskId: null }),
setCurrentTask: taskId => set({ currentTaskId: taskId }),
}),
{
name: 'task-storage',
}
)
)