mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-05-14 20:08:42 +08:00
refactor(backend): 重构后端异常处理和模型管理
- 新增自定义异常类 BizException、NoteError 和 ProviderError - 优化了模型管理相关的逻辑,包括加载、删除和测试连接等功能 - 改进了 Douyin 下载器的错误处理 - 调整了任务重试逻辑和笔记生成的异常处理- 更新了相关组件和页面以适应新的异常处理机制
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
import { create } from 'zustand'
|
||||
import { devtools } from 'zustand/middleware'
|
||||
import { fetchModels, addModel, fetchEnableModels, fetchEnableModelById, deleteModelById } from '@/services/model.ts'
|
||||
import {
|
||||
fetchModels,
|
||||
addModel,
|
||||
fetchEnableModels,
|
||||
fetchEnableModelById,
|
||||
deleteModelById
|
||||
} from '@/services/model'
|
||||
|
||||
interface IModel {
|
||||
id: string
|
||||
@@ -11,81 +17,93 @@ interface IModel {
|
||||
root: string
|
||||
}
|
||||
|
||||
interface IModelListItem {
|
||||
id: string
|
||||
provider_id: string
|
||||
model_name: string
|
||||
created_at?: string
|
||||
}
|
||||
|
||||
interface ModelStore {
|
||||
models: IModel[]
|
||||
modelList: []
|
||||
modelList: IModelListItem[]
|
||||
loading: boolean
|
||||
selectedModel: string
|
||||
|
||||
loadModels: (providerId: string) => Promise<void>
|
||||
loadModelsById: (providerId: string) => Promise<IModelListItem[]>
|
||||
loadEnabledModels: () => Promise<void>
|
||||
loadModelsById : (providerId: string) => Promise<void>
|
||||
addNewModel: (providerId: string, modelId: string) => Promise<void>
|
||||
setSelectedModel: (modelId: string) => void
|
||||
deleteModel: (modelId: number) => Promise<void>
|
||||
setSelectedModel: (modelId: string) => void
|
||||
clearModels: () => void
|
||||
}
|
||||
|
||||
export const useModelStore = create<ModelStore>()(
|
||||
devtools(set => ({
|
||||
devtools((set) => ({
|
||||
models: [],
|
||||
modelList: [],
|
||||
loading: false,
|
||||
selectedModel: '',
|
||||
modelList: [],
|
||||
|
||||
// 获取所有可用模型 (全局可用模型列表)
|
||||
loadEnabledModels: async () => {
|
||||
try {
|
||||
set({ loading: true })
|
||||
const res = await fetchEnableModels()
|
||||
if (res.data.code === 0 && res.data.data.length > 0) {
|
||||
set({ modelList: res.data.data })
|
||||
} else {
|
||||
set({ modelList: [] })
|
||||
console.error('模型列表加载失败')
|
||||
}
|
||||
const list = await fetchEnableModels()
|
||||
set({ modelList: list })
|
||||
} catch (error) {
|
||||
set({ modelList: [] })
|
||||
console.error('加载模型出错', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteModel: async (modelId: number) => {
|
||||
await deleteModelById( modelId)
|
||||
},
|
||||
// 加载模型列表
|
||||
loadModels: async (providerId: string) => {
|
||||
try {
|
||||
set({ loading: true })
|
||||
const res = await fetchModels(providerId)
|
||||
if (res.data.code === 0 && res.data.data.models.data.length > 0) {
|
||||
set({ models: res.data.data.models.data })
|
||||
} else if (res.data.code === 0 && res.data.data.models.length > 0) {
|
||||
set({ models: res.data.data.models.data })
|
||||
} else {
|
||||
set({ models: [] })
|
||||
console.error('模型列表加载失败')
|
||||
}
|
||||
} catch (error) {
|
||||
set({ models: [] })
|
||||
console.error('加载模型出错', error)
|
||||
console.error('加载可用模型失败', error)
|
||||
} finally {
|
||||
set({ loading: false })
|
||||
}
|
||||
},
|
||||
loadModelsById: async (providerId: string)=>{
|
||||
const models = await fetchEnableModelById(providerId)
|
||||
if (models.data.code === 0) {
|
||||
console.log('模型列表加载成功:', models.data)
|
||||
return models.data.data
|
||||
|
||||
// 通过 provider 获取该供应商的模型列表
|
||||
loadModels: async (providerId: string) => {
|
||||
try {
|
||||
set({ loading: true })
|
||||
const res = await fetchModels(providerId)
|
||||
|
||||
let models: IModel[] = []
|
||||
|
||||
// 兼容 SyncPage 分页对象与普通数组两种格式
|
||||
if (Array.isArray(res.models)) {
|
||||
models = res.models
|
||||
} else if (res.models?.data && Array.isArray(res.models.data)) {
|
||||
models = res.models.data
|
||||
}
|
||||
|
||||
set({ models })
|
||||
} catch (error) {
|
||||
set({ models: [] })
|
||||
console.error('加载模型列表失败', error)
|
||||
} finally {
|
||||
set({ loading: false })
|
||||
}
|
||||
},
|
||||
// 新增模型
|
||||
},
|
||||
|
||||
// 单独获取某个供应商下已启用模型
|
||||
loadModelsById: async (providerId: string) => {
|
||||
try {
|
||||
const models = await fetchEnableModelById(providerId)
|
||||
console.log('获取供应商模型成功:', models)
|
||||
return models
|
||||
} catch (error) {
|
||||
console.error('加载供应商模型失败', error)
|
||||
return []
|
||||
}
|
||||
},
|
||||
|
||||
// 新增模型逻辑
|
||||
addNewModel: async (providerId: string, modelId: string) => {
|
||||
try {
|
||||
const res = await addModel({ provider_id: providerId, model_name: modelId })
|
||||
|
||||
if (res.code === 0) {
|
||||
console.log('新增模型成功:', modelId)
|
||||
// ✅ 新增成功以后,前端直接追加一条到 models 列表
|
||||
set(state => ({
|
||||
set((state) => ({
|
||||
models: [
|
||||
...state.models,
|
||||
{
|
||||
@@ -99,17 +117,30 @@ export const useModelStore = create<ModelStore>()(
|
||||
],
|
||||
}))
|
||||
} else {
|
||||
console.error('新增模型失败')
|
||||
console.error('新增模型失败', res.msg)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('添加模型出错', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 设置选中的模型
|
||||
setSelectedModel: modelId => set({ selectedModel: modelId }),
|
||||
// 删除模型
|
||||
deleteModel: async (modelId: number) => {
|
||||
try {
|
||||
await deleteModelById(modelId)
|
||||
// 删除后更新本地状态(可选)
|
||||
set((state) => ({
|
||||
models: state.models.filter((model) => model.id !== modelId.toString())
|
||||
}))
|
||||
} catch (error) {
|
||||
console.error('删除模型失败', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 清空
|
||||
clearModels: () => set({ models: [], selectedModel: '' }),
|
||||
// 切换选中模型
|
||||
setSelectedModel: (modelId: string) => set({ selectedModel: modelId }),
|
||||
|
||||
// 清空
|
||||
clearModels: () => set({ models: [], selectedModel: '', modelList: [] }),
|
||||
}))
|
||||
)
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
import { create } from 'zustand'
|
||||
import { IProvider } from '@/types'
|
||||
import { IProvider, IResponse } from '@/types'
|
||||
import {
|
||||
addProvider,
|
||||
getProviderById,
|
||||
@@ -38,10 +38,9 @@ export const useProviderStore = create<ProviderStore>((set, get) => ({
|
||||
// 设置整个 provider 列表
|
||||
setAllProviders: providers => set({ provider: providers }),
|
||||
loadProviderById: async (id: string) => {
|
||||
const res = await getProviderById(id)
|
||||
if (res.data.code === 0) {
|
||||
const item = res.data.data
|
||||
console.log('Provider ', item)
|
||||
const res:IResponse<IProvider> = await getProviderById(id)
|
||||
|
||||
const item = res
|
||||
return {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
@@ -51,9 +50,7 @@ export const useProviderStore = create<ProviderStore>((set, get) => ({
|
||||
type: item.type,
|
||||
enabled: item.enabled,
|
||||
}
|
||||
} else {
|
||||
console.log('Provider not found')
|
||||
}
|
||||
|
||||
},
|
||||
addNewProvider: async (provider: IProvider) => {
|
||||
const payload = {
|
||||
@@ -96,16 +93,18 @@ export const useProviderStore = create<ProviderStore>((set, get) => ({
|
||||
getProviderList: () => get().provider,
|
||||
fetchProviderList: async () => {
|
||||
try {
|
||||
const res = await getProviderList()
|
||||
if (res.data.code === 0) {
|
||||
const res = await getProviderList()
|
||||
|
||||
set({
|
||||
provider: res.data.data.map(
|
||||
provider: res.map(
|
||||
(item: {
|
||||
id: string
|
||||
name: string
|
||||
logo: string
|
||||
api_key: string
|
||||
base_url: string
|
||||
type: string
|
||||
enabled: number
|
||||
}) => {
|
||||
return {
|
||||
id: item.id,
|
||||
@@ -119,7 +118,6 @@ export const useProviderStore = create<ProviderStore>((set, get) => ({
|
||||
}
|
||||
),
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching provider list:', error)
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { create } from 'zustand'
|
||||
import { persist } from 'zustand/middleware'
|
||||
import { delete_task, generateNote } from '@/services/note.ts'
|
||||
import { v4 as uuidv4 } from 'uuid'
|
||||
import toast from 'react-hot-toast'
|
||||
|
||||
|
||||
export type TaskStatus = 'PENDING' | 'RUNNING' | 'SUCCESS' | 'FAILD'
|
||||
@@ -157,14 +158,19 @@ export const useTaskStore = create<TaskStore>()(
|
||||
return get().tasks.find(task => task.id === currentTaskId) || null
|
||||
},
|
||||
retryTask: async (id: string, payload?: any) => {
|
||||
|
||||
if (!id){
|
||||
toast.error('任务不存在')
|
||||
return
|
||||
}
|
||||
const task = get().tasks.find(task => task.id === id)
|
||||
console.log('retry',task)
|
||||
if (!task) return
|
||||
|
||||
const newFormData = payload || task.formData
|
||||
|
||||
await generateNote({
|
||||
task_id: id,
|
||||
...newFormData,
|
||||
task_id: id,
|
||||
})
|
||||
|
||||
set(state => ({
|
||||
|
||||
Reference in New Issue
Block a user