初始化本地仓库

This commit is contained in:
2026-08-31 11:33:59 +08:00
commit 663f74b633
2390 changed files with 402918 additions and 0 deletions
@@ -0,0 +1,234 @@
<template>
<SearchBar
ref="formRef"
:show-reset="formSchemaRef.showResetButton"
:show-search="formSchemaRef.showSubmitButton"
:show-expand="formSchemaRef.showExpandButton"
:items="cItems"
v-model="searchFormState"
@search="handleSearch"
@reset="handleReset"
>
<template v-for="schema in filteredSchema" :key="schema.prop" #[schema.prop]>
<component
:ref="(obj: any) => setComponentRef(schema.prop, obj)"
:is="getComponent(schema.component)"
v-model:value="searchFormState[schema.prop]"
v-bind="schema.componentProps"
></component>
</template>
</SearchBar>
</template>
<script setup lang="ts">
import SearchBar from '@/components/core/forms/art-search-bar/index.vue'
import { FormInstance, FormItemSchema, FormSchema } from '../form'
import { getComponent, hasComponent } from '../form/component-map'
const props = withDefaults(
defineProps<{
formSchema: FormSchema
formMethods?: any
}>(),
{
formSchema: () => {
return {
schema: []
}
}
}
)
const emit = defineEmits<{
(e: 'submit', values: any): void
(e: 'reset'): void
(e: 'register', formInstance: FormInstance): void
(e: 'change', values: any): void
}>()
const formSchemaRef = ref<FormSchema>(props.formSchema)
const componentRef = reactive<Record<string, any>>({})
const setComponentRef = (field: string, ref: any) => {
componentRef[field] = ref
}
const handleSearch = () => {
emit('submit', searchFormState)
}
const handleReset = () => {
emit('reset')
}
const formRef = ref()
const searchFormState = reactive<any>({})
const cItems = computed(() => {
return (
props.formSchema.schema?.map((item: any) => {
return {
...item,
key: item.prop,
type: item.component,
span: item.colSpan,
props: item.componentProps
}
}) || []
)
})
// 过滤出有有效组件的schema
const filteredSchema = computed(() => {
return (props.formSchema.schema || []).filter((schema: any) => hasComponent(schema.component))
})
// 提取公共的表单实例方法到一个常量对象
const formInstanceMethods: FormInstance = {
// Element Plus 表单的原生方法
validate(callback?: (valid: boolean, fields?: any) => void) {
return formRef.value?.validate(callback)
},
validateField(props?: string | string[], callback?: (valid: boolean, fields?: any) => void) {
if (formRef.value?.validateField) {
return formRef.value.validateField(props, callback)
}
return Promise.resolve()
},
resetFields(props?: string | string[]) {
formRef.value?.resetFields(props)
// 重置特定字段后,为这些字段重新设置默认值(如果它们没有被设置)
if (props) {
const propList = Array.isArray(props) ? props : [props]
const schema = formSchemaRef.value.schema || []
propList.forEach((prop) => {
const item = schema.find((s) => s.prop === prop)
if (item && searchFormState[prop] === undefined) {
searchFormState[prop] = item.defaultValue !== undefined ? item.defaultValue : undefined
}
})
}
},
clearValidate(props?: string | string[]) {
formRef.value?.clearValidate(props)
},
scrollToField(prop: string) {
formRef.value?.scrollToField(prop)
},
// 自定义方法
getValues() {
// 通过schema来遍历key获取表单值(包含show隐藏但仍存在于DOM中的字段)
const values: Record<string, any> = {}
const schema = props.formSchema.schema || []
schema.forEach((item) => {
// 处理ifShow字段(js控制是否渲染)
const shouldRender =
item.ifShow === undefined ||
(typeof item.ifShow === 'function'
? item.ifShow(searchFormState, props.formMethods)
: item.ifShow)
// 只有在DOM中渲染的字段才获取值(无论是否CSS隐藏)
if (shouldRender) {
values[item.prop] = searchFormState[item.prop]
}
})
return Promise.resolve(values)
},
getFormRef() {
return formRef.value
},
setValues(fields, filterFields, shouldValidate) {
return new Promise<void>((resolve) => {
// 获取 schema 中定义的所有字段名
const schemaProps = (props.formSchema.schema || []).map((item) => item.prop)
// 处理字段值设置
Object.keys(fields).forEach((key) => {
// 如果启用过滤,则只设置在 schema 中定义的字段
if (!filterFields || schemaProps.includes(key)) {
searchFormState[key] = fields[key]
}
})
// 如果需要触发验证
if (shouldValidate) {
formRef.value
?.validate()
.then(() => {
resolve()
})
.catch(() => {
resolve()
})
} else {
resolve()
}
})
},
// 获取字段组件实例
getFieldComponentRef(field: string) {
return componentRef[field]
},
// 设置组件状态(props)
setState(state: FormSchema) {
return new Promise((resolve) => {
formSchemaRef.value = {
...formSchemaRef.value,
...state
}
nextTick(() => {
resolve()
})
})
},
getState(): Promise<FormSchema> {
return new Promise((resolve) => {
resolve(formSchemaRef.value)
})
},
updateSchema(data: Partial<FormItemSchema> | Partial<FormItemSchema>[]) {
return new Promise<void>((resolve) => {
// 确保 data 是数组格式
const updateData = Array.isArray(data) ? data : [data]
// 创建一个 prop 到 schema 项的映射,方便查找
const schemaMap = new Map<string, FormItemSchema>()
formSchemaRef.value.schema?.forEach((item) => {
schemaMap.set(item.prop, item)
})
// 更新对应的 schema 项
updateData.forEach((item) => {
if (item.prop && schemaMap.has(item.prop)) {
const index = formSchemaRef.value.schema!.findIndex(
(schemaItem) => schemaItem.prop === item.prop
)
if (index !== -1) {
// 合并原有的配置和新的配置
formSchemaRef.value.schema![index] = {
...formSchemaRef.value.schema![index],
...item
}
// 如果更新了defaultValue且当前字段值为undefined,则设置默认值
if (
Object.prototype.hasOwnProperty.call(item, 'defaultValue') &&
searchFormState[item.prop] === undefined
) {
searchFormState[item.prop] = item.defaultValue
}
}
}
})
nextTick(() => {
resolve()
})
})
}
}
// 注册表单实例
onMounted(() => {
emit('register', formInstanceMethods)
})
</script>
<style lang="less" scoped></style>