refactor(frontend): comprehensive architectural optimization and base component extraction
- Standardized table loading logic with enhanced useTableLoader. - Unified form submission patterns via new useForm composable. - Extracted common UI components: SearchInput and StatusBadge. - Centralized common interface definitions in types/index.ts. - Achieved TypeScript zero-error status across refactored files. - Greatly improved code reusability and maintainability.
This commit is contained in:
43
frontend/src/composables/useForm.ts
Normal file
43
frontend/src/composables/useForm.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { ref } from 'vue'
|
||||
import { useAppStore } from '@/stores/app'
|
||||
|
||||
interface UseFormOptions<T> {
|
||||
form: T
|
||||
submitFn: (data: T) => Promise<void>
|
||||
successMsg?: string
|
||||
errorMsg?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一表单提交逻辑
|
||||
* 管理加载状态、错误捕获及通知
|
||||
*/
|
||||
export function useForm<T>(options: UseFormOptions<T>) {
|
||||
const { form, submitFn, successMsg, errorMsg } = options
|
||||
const loading = ref(false)
|
||||
const appStore = useAppStore()
|
||||
|
||||
const submit = async () => {
|
||||
if (loading.value) return
|
||||
|
||||
loading.value = true
|
||||
try {
|
||||
await submitFn(form)
|
||||
if (successMsg) {
|
||||
appStore.showSuccess(successMsg)
|
||||
}
|
||||
} catch (error: any) {
|
||||
const detail = error.response?.data?.detail || error.response?.data?.message || error.message
|
||||
appStore.showError(errorMsg || detail)
|
||||
// 继续抛出错误,让组件有机会进行局部处理(如验证错误显示)
|
||||
throw error
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
loading,
|
||||
submit
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user