knt-shared 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +390 -135
  2. package/dist/components/Description/BasicDescription.vue.d.ts +63 -0
  3. package/dist/components/Description/BasicDescription.vue.d.ts.map +1 -0
  4. package/dist/components/Description/index.d.ts +5 -0
  5. package/dist/components/Description/index.d.ts.map +1 -0
  6. package/dist/components/Description/types.d.ts +97 -0
  7. package/dist/components/Description/types.d.ts.map +1 -0
  8. package/dist/components/Description/useDescription.d.ts +10 -0
  9. package/dist/components/Description/useDescription.d.ts.map +1 -0
  10. package/dist/components/Form/componentMap.d.ts +691 -5
  11. package/dist/components/Form/componentMap.d.ts.map +1 -1
  12. package/dist/components/Form/types.d.ts +6 -3
  13. package/dist/components/Form/types.d.ts.map +1 -1
  14. package/dist/components/Form/useForm.d.ts.map +1 -1
  15. package/dist/components/Modal/BasicModal.vue.d.ts +118 -0
  16. package/dist/components/Modal/BasicModal.vue.d.ts.map +1 -0
  17. package/dist/components/Modal/index.d.ts +5 -0
  18. package/dist/components/Modal/index.d.ts.map +1 -0
  19. package/dist/components/Modal/types.d.ts +163 -0
  20. package/dist/components/Modal/types.d.ts.map +1 -0
  21. package/dist/components/Modal/useModal.d.ts +10 -0
  22. package/dist/components/Modal/useModal.d.ts.map +1 -0
  23. package/dist/components/Modal/useModalInner.d.ts +10 -0
  24. package/dist/components/Modal/useModalInner.d.ts.map +1 -0
  25. package/dist/components/Table/BasicTable.vue.d.ts +123 -0
  26. package/dist/components/Table/BasicTable.vue.d.ts.map +1 -0
  27. package/dist/components/Table/index.d.ts +7 -0
  28. package/dist/components/Table/index.d.ts.map +1 -0
  29. package/dist/components/Table/types.d.ts +337 -0
  30. package/dist/components/Table/types.d.ts.map +1 -0
  31. package/dist/components/Table/useTable.d.ts +23 -0
  32. package/dist/components/Table/useTable.d.ts.map +1 -0
  33. package/dist/components/index.d.ts +3 -0
  34. package/dist/components/index.d.ts.map +1 -1
  35. package/dist/index.cjs.js +2845 -121
  36. package/dist/index.cjs.js.map +1 -1
  37. package/dist/index.esm.js +2847 -123
  38. package/dist/index.esm.js.map +1 -1
  39. package/dist/style.css +98 -0
  40. package/dist/utils/debounce.d.ts +23 -0
  41. package/dist/utils/debounce.d.ts.map +1 -0
  42. package/dist/utils/index.d.ts +1 -0
  43. package/dist/utils/index.d.ts.map +1 -1
  44. package/package.json +12 -11
  45. package/dist/components/Form/BasicForm.vue.d.ts +0 -117
  46. package/dist/components/Form/BasicForm.vue.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/components/Form/componentMap.ts","../src/components/Form/BasicForm.vue","../src/components/Form/useForm.ts","../src/utils/format.ts","../src/utils/validate.ts","../src/hooks/useDebounce.ts","../src/hooks/useLocalStorage.ts","../src/hooks/useToggle.ts"],"sourcesContent":["import { Component } from 'vue';\nimport {\n Input,\n InputNumber,\n InputPassword,\n Textarea,\n Select,\n Radio,\n RadioGroup,\n Checkbox,\n CheckboxGroup,\n Switch,\n Slider,\n Rate,\n DatePicker,\n TimePicker,\n RangePicker,\n Upload,\n Cascader,\n TreeSelect,\n AutoComplete,\n Mention,\n Transfer,\n} from '@arco-design/web-vue';\n\n/**\n * 组件类型映射\n */\nexport type ComponentType =\n | 'Input'\n | 'InputNumber'\n | 'InputPassword'\n | 'Textarea'\n | 'Select'\n | 'Radio'\n | 'RadioGroup'\n | 'Checkbox'\n | 'CheckboxGroup'\n | 'Switch'\n | 'Slider'\n | 'Rate'\n | 'DatePicker'\n | 'TimePicker'\n | 'RangePicker'\n | 'Upload'\n | 'Cascader'\n | 'TreeSelect'\n | 'AutoComplete'\n | 'Mention'\n | 'Transfer';\n\n/**\n * 组件映射表\n * 将字符串类型映射到实际的 Arco Design Vue 组件\n */\nexport const componentMap = new Map<string, Component>();\n\n// 输入类组件\ncomponentMap.set('Input', Input);\ncomponentMap.set('InputNumber', InputNumber);\ncomponentMap.set('InputPassword', InputPassword);\ncomponentMap.set('Textarea', Textarea);\ncomponentMap.set('AutoComplete', AutoComplete);\n\n// 选择类组件\ncomponentMap.set('Select', Select);\ncomponentMap.set('Radio', Radio);\ncomponentMap.set('RadioGroup', RadioGroup);\ncomponentMap.set('Checkbox', Checkbox);\ncomponentMap.set('CheckboxGroup', CheckboxGroup);\ncomponentMap.set('Cascader', Cascader);\ncomponentMap.set('TreeSelect', TreeSelect);\n\n// 日期时间类组件\ncomponentMap.set('DatePicker', DatePicker);\ncomponentMap.set('TimePicker', TimePicker);\ncomponentMap.set('RangePicker', RangePicker);\n\n// 其他组件\ncomponentMap.set('Switch', Switch);\ncomponentMap.set('Slider', Slider);\ncomponentMap.set('Rate', Rate);\ncomponentMap.set('Upload', Upload);\ncomponentMap.set('Mention', Mention);\ncomponentMap.set('Transfer', Transfer);\n\n/**\n * 注册自定义组件\n * @param name 组件名称\n * @param component 组件实例\n */\nexport function registerComponent(name: string, component: Component) {\n componentMap.set(name, component);\n}\n\n/**\n * 获取组件\n * @param name 组件名称或组件实例\n * @returns 组件实例\n */\nexport function getComponent(name: string | Component): Component | undefined {\n if (typeof name === 'string') {\n return componentMap.get(name);\n }\n return name;\n}\n\n/**\n * 需要自动设置 placeholder 的组件类型\n */\nexport const componentsNeedPlaceholder = new Set([\n 'Input',\n 'InputPassword',\n 'Textarea',\n 'AutoComplete',\n]);\n\n/**\n * 需要使用 \"请选择\" placeholder 的组件类型\n */\nexport const componentsNeedSelectPlaceholder = new Set([\n 'Select',\n 'DatePicker',\n 'TimePicker',\n 'RangePicker',\n 'Cascader',\n 'TreeSelect',\n]);\n\n/**\n * 根据组件类型生成默认 placeholder\n * @param component 组件类型\n * @param label 标签文本\n * @returns placeholder 文本\n */\nexport function getPlaceholder(component: string, label: string): string {\n if (componentsNeedPlaceholder.has(component)) {\n return `请输入${label}`;\n }\n if (componentsNeedSelectPlaceholder.has(component)) {\n return `请选择${label}`;\n }\n return '';\n}\n","<template>\n <a-form\n ref=\"formRef\"\n v-bind=\"getBindValue\"\n :model=\"formModel\"\n @submit=\"handleSubmit\"\n >\n <a-row v-bind=\"getRow\">\n <template v-for=\"schema in getVisibleSchemas()\" :key=\"schema.key || schema.field\">\n <a-col v-bind=\"getColProps(schema)\">\n <!-- 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"schema.render(schema, formModel)\" />\n </template>\n <!-- 标准表单项 -->\n <a-form-item\n v-else\n v-bind=\"getFormItemBindValue(schema)\"\n >\n <!-- 自定义组件内容渲染 -->\n <template v-if=\"schema.renderComponentContent\">\n <component :is=\"schema.renderComponentContent(schema, formModel)\" />\n </template>\n <!-- 标准组件渲染 -->\n <component\n v-else\n :is=\"getComponent(schema.component)\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"getPlaceholderText(schema)\"\n v-bind=\"schema.componentProps\"\n />\n </a-form-item>\n </a-col>\n </template>\n\n <!-- 操作按钮区域 -->\n <a-col v-if=\"getActionProps.showActionButtons\" v-bind=\"getActionProps.actionColOptions\">\n <a-form-item>\n <a-space>\n <a-button\n v-if=\"getActionProps.showSubmitButton\"\n type=\"primary\"\n html-type=\"submit\"\n :loading=\"submitLoading\"\n >\n {{ getActionProps.submitButtonText }}\n </a-button>\n <a-button v-if=\"getActionProps.showResetButton\" @click=\"handleReset\">\n {{ getActionProps.resetButtonText }}\n </a-button>\n <slot name=\"actions\" />\n </a-space>\n </a-form-item>\n </a-col>\n </a-row>\n </a-form>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, watch, onMounted, onBeforeUnmount, nextTick, computed, unref } from 'vue';\nimport type { FormInstance } from '@arco-design/web-vue';\nimport { getComponent, getPlaceholder } from './componentMap';\nimport type { FormSchema, BasicFormProps, BasicFormEmits } from './types';\n\ndefineOptions({\n name: 'BasicForm',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicFormProps>(), {\n schemas: () => [],\n layout: 'horizontal',\n labelAlign: 'right',\n autoSetPlaceHolder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '提交',\n resetButtonText: '重置',\n showActionButtons: true,\n disabled: false,\n baseColProps: () => ({ span: 24 }),\n actionColOptions: () => ({ span: 24 }),\n});\n\nconst emit = defineEmits<BasicFormEmits>();\n\nconst formRef = ref<FormInstance>();\nconst formModel = reactive<Record<string, any>>({});\nconst submitLoading = ref(false);\nconst internalSchemas = ref<FormSchema[]>([]);\nconst dynamicProps = ref<Partial<BasicFormProps>>({});\n\n// 获取表单的基本配置(类似 Vben Admin 的 getProps)\nconst getProps = computed((): BasicFormProps => {\n return { ...props, ...dynamicProps.value } as BasicFormProps;\n});\n\n// 获取表单绑定值(类似 Vben Admin 的 getBindValue)\nconst getBindValue = computed(() => {\n const propsData = unref(getProps);\n return {\n layout: propsData.layout,\n size: propsData.size,\n disabled: propsData.disabled,\n labelAlign: propsData.labelAlign,\n autoLabelWidth: propsData.autoLabelWidth,\n labelWidth: propsData.labelWidth,\n labelColProps: propsData.labelColProps,\n wrapperColProps: propsData.wrapperColProps,\n };\n});\n\n// 获取 Row 配置\nconst getRow = computed(() => {\n return {\n gutter: 24,\n };\n});\n\n// 获取操作按钮配置\nconst getActionProps = computed(() => {\n const propsData = unref(getProps);\n return {\n showActionButtons: propsData.showActionButtons !== false,\n showSubmitButton: propsData.showSubmitButton !== false,\n showResetButton: propsData.showResetButton !== false,\n submitButtonText: propsData.submitButtonText || '提交',\n resetButtonText: propsData.resetButtonText || '重置',\n actionColOptions: propsData.actionColOptions || { span: 24 },\n };\n});\n\n// 初始化表单模型\nconst initFormModel = () => {\n if (!props.schemas) return;\n \n props.schemas.forEach((schema) => {\n if (schema.defaultValue !== undefined) {\n formModel[schema.field] = schema.defaultValue;\n }\n });\n};\n\n// 获取可见的 schemas\nconst getVisibleSchemas = () => {\n const schemas = internalSchemas.value.length > 0 ? internalSchemas.value : props.schemas || [];\n return schemas.filter((schema) => {\n if (schema.show === undefined) return true;\n if (typeof schema.show === 'boolean') return schema.show;\n return schema.show(formModel);\n });\n};\n\n// 获取列属性\nconst getColProps = (schema: FormSchema) => {\n const propsData = unref(getProps);\n return schema.colProps || propsData.baseColProps || { span: 24 };\n};\n\n// 获取 FormItem 绑定值(类似 Vben Admin 的方式)\nconst getFormItemBindValue = (schema: FormSchema) => {\n const propsData = unref(getProps);\n \n // 计算禁用状态\n let disabled = propsData.disabled;\n if (schema.disabled !== undefined) {\n disabled = typeof schema.disabled === 'boolean' \n ? schema.disabled \n : schema.disabled(formModel);\n }\n \n return {\n field: schema.field,\n label: schema.label,\n labelColProps: schema.labelColProps || propsData.labelColProps,\n wrapperColProps: schema.wrapperColProps || propsData.wrapperColProps,\n rules: schema.rules,\n disabled,\n help: schema.help,\n extra: schema.extra,\n required: schema.required,\n ...(propsData.baseFormItemProps || {}),\n ...(schema.formItemProps || {}),\n };\n};\n\n// 获取 placeholder\nconst getPlaceholderText = (schema: FormSchema) => {\n const propsData = unref(getProps);\n \n // 如果组件属性中已经设置了 placeholder,则使用它\n if (schema.componentProps?.placeholder) {\n return schema.componentProps.placeholder;\n }\n \n // 如果不自动设置 placeholder,则返回空\n if (!propsData.autoSetPlaceHolder) {\n return '';\n }\n \n // 根据组件类型自动生成 placeholder\n const componentType = typeof schema.component === 'string' ? schema.component : '';\n return getPlaceholder(componentType, schema.label);\n};\n\n// 提交表单\nconst handleSubmit = async (values: Record<string, any>) => {\n try {\n submitLoading.value = true;\n const errors = await formRef.value?.validate();\n if (!errors) {\n emit('submit', values);\n }\n } finally {\n submitLoading.value = false;\n }\n};\n\n// 重置表单\nconst handleReset = () => {\n formRef.value?.resetFields();\n emit('reset');\n};\n\n// 获取字段值\nconst getFieldsValue = (): Record<string, any> => {\n return { ...formModel };\n};\n\n// 设置字段值\nconst setFieldsValue = (values: Record<string, any>) => {\n Object.keys(values).forEach((key) => {\n if (key in formModel) {\n formModel[key] = values[key];\n }\n });\n};\n\n// 重置字段\nconst resetFields = () => {\n formRef.value?.resetFields();\n};\n\n// 验证表单\nconst validate = async () => {\n return formRef.value?.validate();\n};\n\n// 清除验证\nconst clearValidate = (field?: string | string[]) => {\n formRef.value?.clearValidate(field);\n};\n\n// 更新 schema\nconst updateSchema = (schema: Partial<FormSchema> | Partial<FormSchema>[]) => {\n const schemas = Array.isArray(schema) ? schema : [schema];\n schemas.forEach((item) => {\n const index = internalSchemas.value.findIndex((s) => s.field === item.field);\n if (index !== -1) {\n internalSchemas.value[index] = { ...internalSchemas.value[index], ...item };\n }\n });\n};\n\n// 移除 schema\nconst removeSchema = (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field];\n fields.forEach((f) => {\n const index = internalSchemas.value.findIndex((s) => s.field === f);\n if (index !== -1) {\n internalSchemas.value.splice(index, 1);\n delete formModel[f];\n }\n });\n};\n\n// 获取 schema\nconst getSchema = (field?: string): FormSchema | FormSchema[] | undefined => {\n const schemas = internalSchemas.value.length > 0 ? internalSchemas.value : props.schemas || [];\n if (!field) return schemas;\n return schemas.find((s) => s.field === field);\n};\n\n// 重置 schema\nconst resetSchema = (schemas: FormSchema[]) => {\n internalSchemas.value = [...schemas];\n initFormModel();\n};\n\n// 设置 Props(类似 Vben Admin)\nconst setProps = (formProps: Partial<BasicFormProps>) => {\n // 保存动态 props\n dynamicProps.value = { ...dynamicProps.value, ...formProps };\n \n // 更新 schemas\n if (formProps.schemas && Array.isArray(formProps.schemas)) {\n internalSchemas.value = [...formProps.schemas];\n initFormModel();\n }\n};\n\n// 滚动到指定字段\nconst scrollToField = (name: string, options?: ScrollIntoViewOptions) => {\n nextTick(() => {\n const element = document.querySelector(`[data-field=\"${name}\"]`);\n if (element) {\n element.scrollIntoView(options);\n }\n });\n};\n\n// 暴露方法和属性给父组件\ndefineExpose({\n formRef,\n formModel,\n handleSubmit,\n getVisibleSchemas,\n getColProps,\n getFormItemBindValue,\n getPlaceholderText,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n clearValidate,\n updateSchema,\n removeSchema,\n getSchema,\n resetSchema,\n setProps,\n scrollToField,\n});\n\n// 监听 schemas 变化\nconst stopSchemasWatch = watch(\n () => props.schemas,\n (newSchemas) => {\n if (newSchemas) {\n internalSchemas.value = [...newSchemas];\n initFormModel();\n }\n },\n { immediate: true, deep: true }\n);\n\n// 组件挂载后触发注册事件\nonMounted(() => {\n nextTick(() => {\n emit('register', {\n formRef,\n formModel,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n clearValidate,\n updateSchema,\n removeSchema,\n getSchema,\n resetSchema,\n setProps,\n scrollToField,\n handleSubmit,\n });\n });\n});\n\n// 组件卸载前清理\nonBeforeUnmount(() => {\n // 停止监听\n stopSchemasWatch();\n \n // 清空 formModel 中的所有引用\n Object.keys(formModel).forEach(key => {\n delete formModel[key];\n });\n \n // 清空 schemas\n internalSchemas.value = [];\n dynamicProps.value = {};\n});\n</script>\n","import { ref, reactive, unref, nextTick } from 'vue';\nimport type { FormSchema, UseFormOptions, UseFormReturn, BasicFormProps } from './types';\n\n/**\n * useForm Hook\n * 用于创建和管理表单实例(参考 Vben Admin 设计)\n * @param options 表单配置选项\n * @returns [register, formMethods]\n */\nexport function useForm(options: UseFormOptions = {}): [\n (formInstance: any) => void,\n Omit<UseFormReturn, 'register'>\n] {\n const formRef = ref<any>(null);\n const formModel = reactive<Record<string, any>>({});\n const loadedRef = ref(false);\n const propsRef = ref<Partial<BasicFormProps>>({});\n\n // 初始化表单模型\n const initFormModel = () => {\n const schemas = unref(formRef.value?.getSchema?.() || options.schemas || []);\n schemas.forEach((schema: FormSchema) => {\n if (schema.defaultValue !== undefined) {\n formModel[schema.field] = schema.defaultValue;\n }\n });\n };\n\n /**\n * 注册表单实例\n */\n const register = async (formInstance: any) => {\n await nextTick();\n formRef.value = formInstance;\n loadedRef.value = true;\n \n // 如果有初始配置,设置到表单实例\n if (options && Object.keys(options).length > 0) {\n await setProps(options as Partial<BasicFormProps>);\n }\n \n // 初始化表单模型\n initFormModel();\n };\n\n /**\n * 获取表单实例\n */\n const getForm = () => {\n const form = unref(formRef);\n if (!form) {\n console.error('表单实例尚未注册,请确保组件已挂载并正确使用 @register');\n }\n return form;\n };\n\n /**\n * 获取所有字段值\n */\n const getFieldsValue = (): Record<string, any> => {\n const form = getForm();\n if (!form) return {};\n \n if (form.getFieldsValue) {\n return form.getFieldsValue();\n }\n return { ...formModel };\n };\n\n /**\n * 设置字段值\n */\n const setFieldsValue = async (values: Record<string, any>) => {\n const form = getForm();\n if (!form) return;\n \n if (form.setFieldsValue) {\n await form.setFieldsValue(values);\n } else {\n Object.keys(values).forEach((key) => {\n formModel[key] = values[key];\n });\n }\n };\n\n /**\n * 重置表单\n */\n const resetFields = async () => {\n const form = getForm();\n if (!form) return;\n \n if (form.resetFields) {\n await form.resetFields();\n } else if (form.formRef?.value) {\n await form.formRef.value.resetFields();\n }\n };\n\n /**\n * 验证表单\n */\n const validate = async (nameList?: string[]): Promise<any> => {\n const form = getForm();\n if (!form) return Promise.reject('表单实例不存在');\n \n if (form.validate) {\n return await form.validate(nameList);\n } else if (form.formRef?.value) {\n return await form.formRef.value.validate(nameList);\n }\n return Promise.resolve(undefined);\n };\n\n /**\n * 验证指定字段\n */\n const validateFields = async (nameList?: string[]): Promise<any> => {\n return await validate(nameList);\n };\n\n /**\n * 清除验证\n */\n const clearValidate = async (field?: string | string[]) => {\n const form = getForm();\n if (!form) return;\n \n if (form.clearValidate) {\n await form.clearValidate(field);\n } else if (form.formRef?.value) {\n await form.formRef.value.clearValidate(field);\n }\n };\n\n /**\n * 提交表单\n */\n const submit = async (): Promise<any> => {\n const form = getForm();\n if (!form) return;\n \n if (form.handleSubmit) {\n return await form.handleSubmit();\n }\n \n // 默认行为:验证后返回表单值\n await validate();\n return getFieldsValue();\n };\n\n /**\n * 更新 schema\n */\n const updateSchema = async (schema: Partial<FormSchema> | Partial<FormSchema>[]) => {\n const form = getForm();\n if (!form) return;\n \n const schemaList = Array.isArray(schema) ? schema : [schema];\n \n if (form.updateSchema) {\n await form.updateSchema(schemaList);\n }\n };\n\n /**\n * 重置 schema\n */\n const resetSchema = async (schemas: FormSchema[]) => {\n const form = getForm();\n if (!form) return;\n \n if (form.resetSchema) {\n await form.resetSchema(schemas);\n }\n };\n\n /**\n * 移除 schema\n */\n const removeSchemaByField = async (field: string | string[]) => {\n const form = getForm();\n if (!form) return;\n \n const fields = Array.isArray(field) ? field : [field];\n \n if (form.removeSchema) {\n await form.removeSchema(fields);\n }\n \n // 删除表单数据\n fields.forEach((f) => {\n if (f in formModel) {\n delete formModel[f];\n }\n });\n };\n\n /**\n * 添加 schema\n */\n const appendSchemaByField = async (\n schema: FormSchema | FormSchema[],\n prefixField?: string,\n first = false\n ) => {\n const form = getForm();\n if (!form) return;\n \n const schemas = form.getSchema?.() || [];\n const schemaList = Array.isArray(schema) ? schema : [schema];\n \n if (prefixField) {\n const index = schemas.findIndex((s: FormSchema) => s.field === prefixField);\n if (index !== -1) {\n const insertIndex = first ? index : index + 1;\n schemas.splice(insertIndex, 0, ...schemaList);\n }\n } else {\n if (first) {\n schemas.unshift(...schemaList);\n } else {\n schemas.push(...schemaList);\n }\n }\n \n if (form.updateSchema) {\n await form.updateSchema(schemas);\n }\n \n // 初始化新字段的默认值\n schemaList.forEach((s) => {\n if (s.defaultValue !== undefined) {\n formModel[s.field] = s.defaultValue;\n }\n });\n };\n\n /**\n * 获取 schema\n */\n const getSchema = (field?: string): FormSchema | FormSchema[] | undefined => {\n const form = getForm();\n if (!form) return undefined;\n \n if (form.getSchema) {\n return form.getSchema(field);\n }\n \n return undefined;\n };\n\n /**\n * 设置表单 Props\n */\n const setProps = async (formProps: Partial<BasicFormProps>) => {\n // 保存 props 配置\n propsRef.value = { ...propsRef.value, ...formProps };\n \n const form = getForm();\n if (!form) {\n // 如果表单实例还未注册,先保存配置\n return;\n }\n \n if (form.setProps) {\n await form.setProps(formProps);\n }\n };\n\n /**\n * 滚动到指定字段\n */\n const scrollToField = async (name: string, options?: ScrollIntoViewOptions) => {\n const form = getForm();\n if (!form) return;\n \n if (form.scrollToField) {\n await form.scrollToField(name, options);\n }\n };\n\n const formMethods = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n clearValidate,\n submit,\n updateSchema,\n resetSchema,\n removeSchemaByField,\n appendSchemaByField,\n getSchema,\n setProps,\n scrollToField,\n formModel,\n formRef,\n getForm,\n };\n\n return [register, formMethods];\n}\n\n/**\n * 创建表单配置\n * 用于快速创建表单 schema\n */\nexport function createFormSchema(schemas: FormSchema[]): FormSchema[] {\n return schemas.map((schema, index) => ({\n key: schema.key || `${schema.field}_${index}`,\n ...schema,\n }));\n}\n\n/**\n * 合并表单配置\n * 用于合并多个表单配置\n */\nexport function mergeFormSchemas(...schemas: FormSchema[][]): FormSchema[] {\n return schemas.flat();\n}\n","/**\n * 格式化日期\n * @param date 日期对象或时间戳\n * @param format 格式化字符串,默认 'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(\n date: Date | number,\n format: string = 'YYYY-MM-DD HH:mm:ss'\n): string {\n const d = typeof date === 'number' ? new Date(date) : date;\n \n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * 格式化数字,添加千分位分隔符\n * @param num 数字\n * @returns 格式化后的字符串\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString('zh-CN');\n}\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的文件大小字符串\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n","/**\n * 验证邮箱格式\n * @param email 邮箱地址\n * @returns 是否为有效邮箱\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * 验证手机号格式(中国大陆)\n * @param phone 手机号\n * @returns 是否为有效手机号\n */\nexport function isValidPhone(phone: string): boolean {\n const phoneRegex = /^1[3-9]\\d{9}$/;\n return phoneRegex.test(phone);\n}\n\n/**\n * 验证URL格式\n * @param url URL地址\n * @returns 是否为有效URL\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 验证身份证号格式(中国大陆18位)\n * @param idCard 身份证号\n * @returns 是否为有效身份证号\n */\nexport function isValidIdCard(idCard: string): boolean {\n const idCardRegex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\n return idCardRegex.test(idCard);\n}\n\n","import { ref, watch, onBeforeUnmount, type Ref } from 'vue';\n\n/**\n * 防抖Hook\n * @param value 需要防抖的值\n * @param delay 延迟时间(毫秒)\n * @returns 防抖后的值\n */\nfunction useDebounce<T>(value: Ref<T>, delay: number = 300): Ref<T> {\n const debouncedValue = ref<T>(value.value) as Ref<T>;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const updateValue = (newValue: T) => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n debouncedValue.value = newValue;\n }, delay);\n };\n\n watch(\n value,\n (newValue) => {\n updateValue(newValue);\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n\n return debouncedValue;\n}\n\nexport default useDebounce;\n","import { ref, watch, type Ref } from 'vue';\n\n/**\n * 本地存储Hook\n * @param key 存储的key\n * @param initialValue 初始值\n * @returns [存储的值, 设置值的函数]\n */\nfunction useLocalStorage<T>(key: string, initialValue: T) {\n // 初始化时读取localStorage\n let initialStoredValue: T;\n try {\n const item = window.localStorage.getItem(key);\n initialStoredValue = item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n initialStoredValue = initialValue;\n }\n\n const storedValue = ref<T>(initialStoredValue) as Ref<T>;\n\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue.value) : value;\n storedValue.value = valueToStore;\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n } catch (error) {\n console.error(`Error setting localStorage key \"${key}\":`, error);\n }\n };\n\n // 监听变化并同步到localStorage\n watch(\n storedValue,\n (newValue: any) => {\n try {\n window.localStorage.setItem(key, JSON.stringify(newValue));\n } catch (error) {\n console.error(`Error syncing localStorage key \"${key}\":`, error);\n }\n },\n { deep: true }\n );\n\n return [storedValue, setValue] as const;\n}\n\nexport default useLocalStorage;\n","import { ref } from 'vue';\n\n/**\n * 布尔值切换Hook\n * @param initialValue 初始值\n * @returns [当前值, 切换函数, 设置为true函数, 设置为false函数]\n */\nfunction useToggle(initialValue: boolean = false) {\n const value = ref(initialValue);\n\n const toggle = () => {\n value.value = !value.value;\n };\n\n const setTrue = () => {\n value.value = true;\n };\n\n const setFalse = () => {\n value.value = false;\n };\n\n return [value, toggle, setTrue, setFalse] as const;\n}\n\nexport default useToggle;\n"],"names":["_openBlock","_createBlock","_mergeProps","_createVNode","_createElementBlock","_Fragment","_renderList","_resolveDynamicComponent","_unref","_normalizeProps","_createTextVNode","_toDisplayString","_renderSlot","options"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/components/Form/componentMap.ts","../src/components/Form/BasicForm.vue","../src/components/Form/useForm.ts","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/config-provider/context.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/_utils/global-config.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/_utils/is.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/_virtual/plugin-vue_export-helper.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-question-circle/icon-question-circle.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-question-circle/index.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-refresh/icon-refresh.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-refresh/index.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-settings/icon-settings.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-settings/index.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-line-height/icon-line-height.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-line-height/index.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-fullscreen-exit/icon-fullscreen-exit.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-fullscreen-exit/index.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-fullscreen/icon-fullscreen.js","../node_modules/.pnpm/@arco-design+web-vue@2.57.0_vue@3.5.26_typescript@5.9.3_/node_modules/@arco-design/web-vue/es/icon/icon-fullscreen/index.js","../src/utils/debounce.ts","../src/hooks/useLocalStorage.ts","../src/components/Table/BasicTable.vue","../src/components/Table/useTable.ts","../src/components/Modal/BasicModal.vue","../src/components/Modal/useModal.ts","../src/components/Modal/useModalInner.ts","../src/components/Description/BasicDescription.vue","../src/components/Description/useDescription.ts","../src/utils/format.ts","../src/utils/validate.ts","../src/hooks/useDebounce.ts","../src/hooks/useToggle.ts"],"sourcesContent":["import { Component } from 'vue';\nimport {\n Input,\n InputNumber,\n InputPassword,\n Textarea,\n Select,\n Radio,\n RadioGroup,\n Checkbox,\n CheckboxGroup,\n Switch,\n Slider,\n Rate,\n DatePicker,\n TimePicker,\n RangePicker,\n Upload,\n Cascader,\n TreeSelect,\n AutoComplete,\n Mention,\n Transfer,\n} from '@arco-design/web-vue';\n\n/**\n * 组件映射表(使用对象以获得更好的类型推断)\n * 将字符串类型映射到实际的 Arco Design Vue 组件\n */\nexport const componentMap = {\n Input,\n InputNumber,\n InputPassword,\n Textarea,\n AutoComplete,\n Select,\n Radio,\n RadioGroup,\n Checkbox,\n CheckboxGroup,\n Cascader,\n TreeSelect,\n DatePicker,\n TimePicker,\n RangePicker,\n Switch,\n Slider,\n Rate,\n Upload,\n Mention,\n Transfer,\n} as const;\n\n/**\n * 组件类型(从 componentMap 自动推导)\n */\nexport type ComponentType = keyof typeof componentMap;\n\n/**\n * 自定义组件映射表(用于注册自定义组件)\n */\nconst customComponentMap = new Map<string, Component>();\n\n/**\n * 注册自定义组件\n * @param name 组件名称\n * @param component 组件实例\n */\nexport function registerComponent(name: string, component: Component) {\n customComponentMap.set(name, component);\n}\n\n/**\n * 获取组件\n * @param name 组件名称或组件实例\n * @returns 组件实例\n */\nexport function getComponent(name: string | Component): Component | undefined {\n if (typeof name === 'string') {\n // 先从内置组件中查找\n if (name in componentMap) {\n return componentMap[name as ComponentType];\n }\n // 再从自定义组件中查找\n return customComponentMap.get(name);\n }\n return name;\n}\n\n/**\n * 需要自动设置 placeholder 的组件类型\n */\nexport const componentsNeedPlaceholder = new Set([\n 'Input',\n 'InputPassword',\n 'Textarea',\n 'AutoComplete',\n]);\n\n/**\n * 需要使用 \"请选择\" placeholder 的组件类型\n */\nexport const componentsNeedSelectPlaceholder = new Set([\n 'Select',\n 'DatePicker',\n 'TimePicker',\n 'RangePicker',\n 'Cascader',\n 'TreeSelect',\n]);\n\n/**\n * 根据组件类型生成默认 placeholder\n * @param component 组件类型\n * @param label 标签文本\n * @returns placeholder 文本\n */\nexport function getPlaceholder(component: string, label: string): string {\n if (componentsNeedPlaceholder.has(component)) {\n return `请输入${label}`;\n }\n if (componentsNeedSelectPlaceholder.has(component)) {\n return `请选择${label}`;\n }\n return '';\n}\n","<template>\n <a-form\n ref=\"formRef\"\n v-bind=\"getBindValue\"\n :model=\"formModel\"\n @submit=\"handleSubmit\"\n >\n <a-row v-bind=\"getRow\">\n <template\n v-for=\"schema in getVisibleSchemas\"\n :key=\"schema.key || schema.field\"\n >\n <a-col v-bind=\"getColProps(schema)\" :data-field=\"schema.field\">\n <!-- 自定义渲染 -->\n <template v-if=\"schema.render\">\n <component :is=\"schema.render(schema, formModel)\" />\n </template>\n <!-- 标准表单项 -->\n <a-form-item v-else v-bind=\"getFormItemBindValue(schema)\">\n <!-- 自定义组件内容渲染 -->\n <template v-if=\"schema.renderComponentContent\">\n <component\n :is=\"schema.renderComponentContent(schema, formModel)\"\n />\n </template>\n <!-- 标准组件渲染 -->\n <component\n v-else\n :is=\"getComponent(schema.component)\"\n v-model=\"formModel[schema.field]\"\n :placeholder=\"getPlaceholderText(schema)\"\n v-bind=\"schema.componentProps\"\n />\n </a-form-item>\n </a-col>\n </template>\n\n <!-- 操作按钮区域 -->\n <a-col\n v-if=\"getActionProps.showActionButtons\"\n v-bind=\"getActionProps.actionColOptions\"\n >\n <a-form-item v-bind=\"getActionProps.actionFormItemProps\">\n <a-space>\n <a-button\n v-if=\"getActionProps.showSubmitButton\"\n type=\"primary\"\n html-type=\"submit\"\n :loading=\"submitLoading\"\n >\n {{ getActionProps.submitButtonText }}\n </a-button>\n <a-button\n v-if=\"getActionProps.showResetButton\"\n @click=\"handleReset\"\n >\n {{ getActionProps.resetButtonText }}\n </a-button>\n <slot name=\"actions\" />\n </a-space>\n </a-form-item>\n </a-col>\n </a-row>\n </a-form>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n reactive,\n watch,\n onMounted,\n onBeforeUnmount,\n nextTick,\n computed,\n unref,\n} from 'vue';\nimport type {FormInstance} from '@arco-design/web-vue';\nimport {getComponent, getPlaceholder} from './componentMap';\nimport type {FormSchema, BasicFormProps, BasicFormEmits} from './types';\n\ndefineOptions({\n name: 'BasicForm',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicFormProps>(), {\n schemas: () => [],\n layout: 'horizontal',\n labelAlign: 'right',\n autoSetPlaceHolder: true,\n showSubmitButton: true,\n showResetButton: true,\n submitButtonText: '提交',\n resetButtonText: '重置',\n showActionButtons: true,\n disabled: false,\n baseColProps: () => ({span: 24}),\n actionColOptions: () => ({span: 24}),\n});\n\nconst emit = defineEmits<BasicFormEmits>();\n\nconst formRef = ref<FormInstance>();\nconst formModel = reactive<Record<string, any>>({});\nconst submitLoading = ref(false);\nconst internalSchemas = ref<FormSchema[]>([]);\nconst dynamicProps = ref<Partial<BasicFormProps>>({});\n\n// 获取表单的基本配置(类似 Vben Admin 的 getProps)\nconst getProps = computed((): BasicFormProps => {\n return {...props, ...dynamicProps.value} as BasicFormProps;\n});\n\n// 获取表单绑定值(类似 Vben Admin 的 getBindValue)\nconst getBindValue = computed(() => {\n const propsData = unref(getProps);\n return {\n layout: propsData.layout,\n size: propsData.size,\n disabled: propsData.disabled,\n labelAlign: propsData.labelAlign,\n autoLabelWidth: propsData.autoLabelWidth,\n labelWidth: propsData.labelWidth,\n labelColProps: propsData.labelColProps,\n wrapperColProps: propsData.wrapperColProps,\n };\n});\n\n// 获取 Row 配置\nconst getRow = computed(() => {\n return {\n gutter: 24,\n };\n});\n\n// 获取操作按钮配置\nconst getActionProps = computed(() => {\n const propsData = unref(getProps);\n return {\n showActionButtons: propsData.showActionButtons !== false,\n showSubmitButton: propsData.showSubmitButton !== false,\n showResetButton: propsData.showResetButton !== false,\n submitButtonText: propsData.submitButtonText || '提交',\n resetButtonText: propsData.resetButtonText || '重置',\n actionColOptions: propsData.actionColOptions || {span: 24},\n actionFormItemProps: propsData.actionFormItemProps || {},\n };\n});\n\n// 初始化表单模型\nconst initFormModel = () => {\n const schemas = internalSchemas.value.length > 0 \n ? internalSchemas.value \n : props.schemas || [];\n \n if (!schemas.length) return;\n\n // 清理不在 schemas 中的字段\n const schemaFields = new Set(schemas.map(s => s.field));\n Object.keys(formModel).forEach(key => {\n if (!schemaFields.has(key)) {\n delete formModel[key];\n }\n });\n\n // 初始化或更新字段\n schemas.forEach((schema) => {\n if (!(schema.field in formModel)) {\n formModel[schema.field] = schema.defaultValue !== undefined \n ? schema.defaultValue \n : undefined;\n }\n });\n};\n\n// 获取可见的 schemas(使用 computed 优化性能)\nconst getVisibleSchemas = computed(() => {\n const schemas =\n internalSchemas.value.length > 0\n ? internalSchemas.value\n : props.schemas || [];\n return schemas.filter((schema) => {\n if (schema.show === undefined) return true;\n if (typeof schema.show === 'boolean') return schema.show;\n return schema.show(formModel);\n });\n});\n\n// 获取列属性\nconst getColProps = (schema: FormSchema) => {\n const propsData = unref(getProps);\n return schema.colProps || propsData.baseColProps || {span: 24};\n};\n\n// 获取 FormItem 绑定值(类似 Vben Admin 的方式)\nconst getFormItemBindValue = (schema: FormSchema) => {\n const propsData = unref(getProps);\n\n // 计算禁用状态\n let disabled = propsData.disabled;\n if (schema.disabled !== undefined) {\n disabled =\n typeof schema.disabled === 'boolean'\n ? schema.disabled\n : schema.disabled(formModel);\n }\n\n return {\n field: schema.field,\n label: schema.label,\n labelColProps: schema.labelColProps || propsData.labelColProps,\n wrapperColProps: schema.wrapperColProps || propsData.wrapperColProps,\n rules: schema.rules,\n disabled,\n help: schema.help,\n extra: schema.extra,\n required: schema.required,\n ...(propsData.baseFormItemProps || {}),\n ...(schema.formItemProps || {}),\n };\n};\n\n// 获取 placeholder\nconst getPlaceholderText = (schema: FormSchema) => {\n const propsData = unref(getProps);\n\n // 如果组件属性中已经设置了 placeholder,则使用它\n if (schema.componentProps?.placeholder) {\n return schema.componentProps.placeholder;\n }\n\n // 如果不自动设置 placeholder,则返回空\n if (!propsData.autoSetPlaceHolder) {\n return '';\n }\n\n // 根据组件类型自动生成 placeholder\n const componentType =\n typeof schema.component === 'string' ? schema.component : '';\n return getPlaceholder(componentType, schema.label);\n};\n\n// 提交表单\nconst handleSubmit = async (data: {\n values: Record<string, any>;\n errors?: Record<string, any>;\n}) => {\n try {\n submitLoading.value = true;\n\n // 如果有验证错误,不触发 submit\n if (data.errors) {\n console.warn('表单验证失败:', data.errors);\n return;\n }\n\n // 验证通过,触发 submit 事件\n emit('submit', data.values);\n } finally {\n submitLoading.value = false;\n }\n};\n\n// 重置表单\nconst handleReset = () => {\n formRef.value?.resetFields();\n emit('reset');\n};\n\n// 获取字段值\nconst getFieldsValue = (): Record<string, any> => {\n return {...formModel};\n};\n\n// 设置字段值\nconst setFieldsValue = (values: Record<string, any>) => {\n Object.keys(values).forEach((key) => {\n // 检查字段是否在 schema 中定义\n const schemas = internalSchemas.value.length > 0 \n ? internalSchemas.value \n : props.schemas || [];\n const hasField = schemas.some(s => s.field === key);\n \n if (hasField) {\n formModel[key] = values[key];\n } else {\n console.warn(`字段 \"${key}\" 不在表单 schema 中`);\n }\n });\n};\n\n// 重置字段\nconst resetFields = () => {\n formRef.value?.resetFields();\n};\n\n// 验证表单\nconst validate = async () => {\n return formRef.value?.validate();\n};\n\n// 清除验证\nconst clearValidate = (field?: string | string[]) => {\n formRef.value?.clearValidate(field);\n};\n\n// 更新 schema\nconst updateSchema = (schema: Partial<FormSchema> | Partial<FormSchema>[]) => {\n const schemas = Array.isArray(schema) ? schema : [schema];\n schemas.forEach((item) => {\n const index = internalSchemas.value.findIndex(\n (s) => s.field === item.field\n );\n if (index !== -1) {\n const oldSchema = internalSchemas.value[index];\n internalSchemas.value[index] = {...oldSchema, ...item};\n \n // 如果更新了 defaultValue 且字段值未被修改,则更新字段值\n if (item.defaultValue !== undefined && \n formModel[item.field!] === oldSchema.defaultValue) {\n formModel[item.field!] = item.defaultValue;\n }\n }\n });\n};\n\n// 移除 schema\nconst removeSchema = (field: string | string[]) => {\n const fields = Array.isArray(field) ? field : [field];\n fields.forEach((f) => {\n const index = internalSchemas.value.findIndex((s) => s.field === f);\n if (index !== -1) {\n internalSchemas.value.splice(index, 1);\n delete formModel[f];\n }\n });\n};\n\n// 获取 schema\nconst getSchema = (field?: string): FormSchema | FormSchema[] | undefined => {\n const schemas =\n internalSchemas.value.length > 0\n ? internalSchemas.value\n : props.schemas || [];\n if (!field) return schemas;\n return schemas.find((s) => s.field === field);\n};\n\n// 重置 schema\nconst resetSchema = (schemas: FormSchema[]) => {\n internalSchemas.value = [...schemas];\n initFormModel();\n};\n\n// 设置 Props(类似 Vben Admin)\nconst setProps = (formProps: Partial<BasicFormProps>) => {\n // 保存动态 props\n dynamicProps.value = {...dynamicProps.value, ...formProps};\n\n // 更新 schemas\n if (formProps.schemas && Array.isArray(formProps.schemas)) {\n internalSchemas.value = [...formProps.schemas];\n initFormModel();\n }\n};\n\n// 滚动到指定字段\nconst scrollToField = (name: string, options?: ScrollIntoViewOptions) => {\n nextTick(() => {\n const element = document.querySelector(`[data-field=\"${name}\"]`);\n if (element) {\n element.scrollIntoView(options);\n }\n });\n};\n\n// 暴露方法和属性给父组件\ndefineExpose({\n formRef,\n formModel,\n handleSubmit,\n getVisibleSchemas: () => getVisibleSchemas.value,\n getColProps,\n getFormItemBindValue,\n getPlaceholderText,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n clearValidate,\n updateSchema,\n removeSchema,\n getSchema,\n resetSchema,\n setProps,\n scrollToField,\n});\n\n// 监听 schemas 变化(优化:只在数组引用变化时触发)\nconst stopSchemasWatch = watch(\n () => props.schemas,\n (newSchemas) => {\n if (newSchemas) {\n internalSchemas.value = [...newSchemas];\n initFormModel();\n }\n },\n {immediate: true}\n);\n\n// 组件挂载后触发注册事件\nonMounted(() => {\n nextTick(() => {\n emit('register', {\n formRef,\n formModel,\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n clearValidate,\n updateSchema,\n removeSchema,\n getSchema,\n resetSchema,\n setProps,\n scrollToField,\n handleSubmit,\n });\n });\n});\n\n// 组件卸载前清理\nonBeforeUnmount(() => {\n // 停止监听\n stopSchemasWatch();\n\n // 清空 formModel 中的所有引用\n Object.keys(formModel).forEach((key) => {\n delete formModel[key];\n });\n\n // 清空 schemas\n internalSchemas.value = [];\n dynamicProps.value = {};\n});\n</script>\n","import { ref, reactive, unref, nextTick } from 'vue';\nimport type { FormSchema, UseFormOptions, UseFormReturn, BasicFormProps } from './types';\n\n/**\n * useForm Hook\n * 用于创建和管理表单实例(参考 Vben Admin 设计)\n * @param options 表单配置选项\n * @returns [register, formMethods]\n */\nexport function useForm(options: UseFormOptions = {}): [\n (formInstance: any) => void,\n Omit<UseFormReturn, 'register'>\n] {\n const formRef = ref<any>(null);\n const formModel = reactive<Record<string, any>>({});\n const loadedRef = ref(false);\n const propsRef = ref<Partial<BasicFormProps>>({});\n\n // 初始化表单模型\n const initFormModel = () => {\n const schemas = unref(formRef.value?.getSchema?.() || options.schemas || []);\n schemas.forEach((schema: FormSchema) => {\n if (schema.defaultValue !== undefined) {\n formModel[schema.field] = schema.defaultValue;\n }\n });\n };\n\n /**\n * 注册表单实例\n */\n const register = async (formInstance: any) => {\n await nextTick();\n formRef.value = formInstance;\n loadedRef.value = true;\n \n // 如果有初始配置,设置到表单实例\n if (options && Object.keys(options).length > 0) {\n await setProps(options as Partial<BasicFormProps>);\n }\n \n // 初始化表单模型\n initFormModel();\n };\n\n /**\n * 获取表单实例(抛出错误版本)\n */\n const getForm = () => {\n const form = unref(formRef);\n if (!form) {\n const error = '表单实例尚未注册,请确保组件已挂载并正确使用 @register';\n console.error(error);\n throw new Error(error);\n }\n return form;\n };\n\n /**\n * 安全获取表单实例(不抛出错误)\n */\n const getFormSafe = () => {\n return unref(formRef);\n };\n\n /**\n * 获取所有字段值\n */\n const getFieldsValue = (): Record<string, any> => {\n const form = getFormSafe();\n if (!form) return {};\n \n if (form.getFieldsValue) {\n return form.getFieldsValue();\n }\n return { ...formModel };\n };\n\n /**\n * 设置字段值\n */\n const setFieldsValue = async (values: Record<string, any>) => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.setFieldsValue) {\n await form.setFieldsValue(values);\n } else {\n Object.keys(values).forEach((key) => {\n formModel[key] = values[key];\n });\n }\n };\n\n /**\n * 重置表单\n */\n const resetFields = async () => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.resetFields) {\n await form.resetFields();\n } else if (form.formRef?.value) {\n await form.formRef.value.resetFields();\n }\n };\n\n /**\n * 验证表单\n */\n const validate = async (nameList?: string[]): Promise<any> => {\n const form = getFormSafe();\n if (!form) return Promise.reject('表单实例不存在');\n \n if (form.validate) {\n return await form.validate(nameList);\n } else if (form.formRef?.value) {\n return await form.formRef.value.validate(nameList);\n }\n return Promise.resolve(undefined);\n };\n\n /**\n * 验证指定字段\n */\n const validateFields = async (nameList?: string[]): Promise<any> => {\n return await validate(nameList);\n };\n\n /**\n * 清除验证\n */\n const clearValidate = async (field?: string | string[]) => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.clearValidate) {\n await form.clearValidate(field);\n } else if (form.formRef?.value) {\n await form.formRef.value.clearValidate(field);\n }\n };\n\n /**\n * 提交表单\n */\n const submit = async (): Promise<any> => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.handleSubmit) {\n return await form.handleSubmit();\n }\n \n // 默认行为:验证后返回表单值\n await validate();\n return getFieldsValue();\n };\n\n /**\n * 更新 schema\n */\n const updateSchema = async (schema: Partial<FormSchema> | Partial<FormSchema>[]) => {\n const form = getFormSafe();\n if (!form) return;\n \n const schemaList = Array.isArray(schema) ? schema : [schema];\n \n if (form.updateSchema) {\n await form.updateSchema(schemaList);\n }\n };\n\n /**\n * 重置 schema\n */\n const resetSchema = async (schemas: FormSchema[]) => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.resetSchema) {\n await form.resetSchema(schemas);\n }\n };\n\n /**\n * 移除 schema\n */\n const removeSchemaByField = async (field: string | string[]) => {\n const form = getFormSafe();\n if (!form) return;\n \n const fields = Array.isArray(field) ? field : [field];\n \n if (form.removeSchema) {\n await form.removeSchema(fields);\n }\n \n // 删除表单数据\n fields.forEach((f) => {\n if (f in formModel) {\n delete formModel[f];\n }\n });\n };\n\n /**\n * 添加 schema\n */\n const appendSchemaByField = async (\n schema: FormSchema | FormSchema[],\n prefixField?: string,\n first = false\n ) => {\n const form = getFormSafe();\n if (!form) return;\n \n const currentSchemas = form.getSchema?.() || [];\n const schemas = Array.isArray(currentSchemas) ? [...currentSchemas] : []; // 创建副本\n const schemaList = Array.isArray(schema) ? schema : [schema];\n \n if (prefixField) {\n const index = schemas.findIndex((s: FormSchema) => s.field === prefixField);\n if (index === -1) {\n console.warn(`字段 \"${prefixField}\" 不存在,无法插入 schema`);\n return;\n }\n const insertIndex = first ? index : index + 1;\n schemas.splice(insertIndex, 0, ...schemaList);\n } else {\n if (first) {\n schemas.unshift(...schemaList);\n } else {\n schemas.push(...schemaList);\n }\n }\n \n // 使用 resetSchema 而不是 updateSchema\n if (form.resetSchema) {\n await form.resetSchema(schemas);\n }\n \n // 初始化新字段的默认值\n schemaList.forEach((s) => {\n if (s.defaultValue !== undefined) {\n formModel[s.field] = s.defaultValue;\n }\n });\n };\n\n /**\n * 获取 schema\n */\n const getSchema = (field?: string): FormSchema | FormSchema[] | undefined => {\n const form = getFormSafe();\n if (!form) return undefined;\n \n if (form.getSchema) {\n return form.getSchema(field);\n }\n \n return undefined;\n };\n\n /**\n * 设置表单 Props\n */\n const setProps = async (formProps: Partial<BasicFormProps>) => {\n // 保存 props 配置\n propsRef.value = { ...propsRef.value, ...formProps };\n \n const form = getFormSafe();\n if (!form) {\n // 如果表单实例还未注册,先保存配置\n return;\n }\n \n if (form.setProps) {\n await form.setProps(formProps);\n }\n };\n\n /**\n * 滚动到指定字段\n */\n const scrollToField = async (name: string, options?: ScrollIntoViewOptions) => {\n const form = getFormSafe();\n if (!form) return;\n \n if (form.scrollToField) {\n await form.scrollToField(name, options);\n }\n };\n\n const formMethods = {\n getFieldsValue,\n setFieldsValue,\n resetFields,\n validate,\n validateFields,\n clearValidate,\n submit,\n updateSchema,\n resetSchema,\n removeSchemaByField,\n appendSchemaByField,\n getSchema,\n setProps,\n scrollToField,\n formModel,\n formRef,\n getForm,\n };\n\n return [register, formMethods];\n}\n\n/**\n * 创建表单配置\n * 用于快速创建表单 schema\n */\nexport function createFormSchema(schemas: FormSchema[]): FormSchema[] {\n return schemas.map((schema, index) => ({\n key: schema.key || `${schema.field}_${index}`,\n ...schema,\n }));\n}\n\n/**\n * 合并表单配置\n * 用于合并多个表单配置\n */\nexport function mergeFormSchemas(...schemas: FormSchema[][]): FormSchema[] {\n return schemas.flat();\n}\n","const configProviderInjectionKey = Symbol(\"ArcoConfigProvider\");\nexport { configProviderInjectionKey };\n","import { getCurrentInstance, inject } from \"vue\";\nimport { configProviderInjectionKey } from \"../config-provider/context.js\";\nconst COMPONENT_PREFIX = \"A\";\nconst CLASS_PREFIX = \"arco\";\nconst GLOBAL_CONFIG_NAME = \"$arco\";\nconst getComponentPrefix = (options) => {\n var _a;\n return (_a = options == null ? void 0 : options.componentPrefix) != null ? _a : COMPONENT_PREFIX;\n};\nconst setGlobalConfig = (app, options) => {\n var _a;\n if (options && options.classPrefix) {\n app.config.globalProperties[GLOBAL_CONFIG_NAME] = {\n ...(_a = app.config.globalProperties[GLOBAL_CONFIG_NAME]) != null ? _a : {},\n classPrefix: options.classPrefix\n };\n }\n};\nconst getPrefixCls = (componentName) => {\n var _a, _b, _c;\n const instance = getCurrentInstance();\n const configProvider = inject(configProviderInjectionKey, void 0);\n const prefix = (_c = (_b = configProvider == null ? void 0 : configProvider.prefixCls) != null ? _b : (_a = instance == null ? void 0 : instance.appContext.config.globalProperties[GLOBAL_CONFIG_NAME]) == null ? void 0 : _a.classPrefix) != null ? _c : CLASS_PREFIX;\n if (componentName) {\n return `${prefix}-${componentName}`;\n }\n return prefix;\n};\nexport { getComponentPrefix, getPrefixCls, setGlobalConfig };\n","const opt = Object.prototype.toString;\nfunction isArray(obj) {\n return opt.call(obj) === \"[object Array]\";\n}\nfunction isNull(obj) {\n return opt.call(obj) === \"[object Null]\";\n}\nfunction isBoolean(obj) {\n return opt.call(obj) === \"[object Boolean]\";\n}\nfunction isObject(obj) {\n return opt.call(obj) === \"[object Object]\";\n}\nconst isPromise = (obj) => {\n return opt.call(obj) === \"[object Promise]\";\n};\nfunction isString(obj) {\n return opt.call(obj) === \"[object String]\";\n}\nfunction isNumber(obj) {\n return opt.call(obj) === \"[object Number]\" && obj === obj;\n}\nfunction isUndefined(obj) {\n return obj === void 0;\n}\nfunction isFunction(obj) {\n return typeof obj === \"function\";\n}\nfunction isEmptyObject(obj) {\n return isObject(obj) && Object.keys(obj).length === 0;\n}\nfunction isExist(obj) {\n return obj || obj === 0;\n}\nfunction isWindow(el) {\n return el === window;\n}\nconst isComponentInstance = (value) => {\n return (value == null ? void 0 : value.$) !== void 0;\n};\nconst isQuarter = (fromat) => {\n return /\\[Q]Q/.test(fromat);\n};\nfunction isDayjs(time) {\n return isObject(time) && \"$y\" in time && \"$M\" in time && \"$D\" in time && \"$d\" in time && \"$H\" in time && \"$m\" in time && \"$s\" in time;\n}\nexport { isArray, isBoolean, isComponentInstance, isDayjs, isEmptyObject, isExist, isFunction, isNull, isNumber, isObject, isPromise, isQuarter, isString, isUndefined, isWindow };\n","var _export_sfc = (sfc, props) => {\n for (const [key, val] of props) {\n sfc[key] = val;\n }\n return sfc;\n};\nexport { _export_sfc as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconQuestionCircle\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-question-circle`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6s18 8.059 18 18Z\" }, null, -1),\n createElementVNode(\"path\", { d: \"M24.006 31v4.008m0-6.008L24 28c0-3 3-4 4.78-6.402C30.558 19.195 28.288 15 23.987 15c-4.014 0-5.382 2.548-5.388 4.514v.465\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconQuestionCircle = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconQuestionCircle as default };\n","import _IconQuestionCircle from \"./icon-question-circle.js\";\nconst IconQuestionCircle = Object.assign(_IconQuestionCircle, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconQuestionCircle.name, _IconQuestionCircle);\n }\n});\nexport { IconQuestionCircle as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconRefresh\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-refresh`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M38.837 18C36.463 12.136 30.715 8 24 8 15.163 8 8 15.163 8 24s7.163 16 16 16c7.455 0 13.72-5.1 15.496-12M40 8v10H30\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconRefresh = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconRefresh as default };\n","import _IconRefresh from \"./icon-refresh.js\";\nconst IconRefresh = Object.assign(_IconRefresh, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconRefresh.name, _IconRefresh);\n }\n});\nexport { IconRefresh as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconSettings\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-settings`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M18.797 6.732A1 1 0 0 1 19.76 6h8.48a1 1 0 0 1 .964.732l1.285 4.628a1 1 0 0 0 1.213.7l4.651-1.2a1 1 0 0 1 1.116.468l4.24 7.344a1 1 0 0 1-.153 1.2L38.193 23.3a1 1 0 0 0 0 1.402l3.364 3.427a1 1 0 0 1 .153 1.2l-4.24 7.344a1 1 0 0 1-1.116.468l-4.65-1.2a1 1 0 0 0-1.214.7l-1.285 4.628a1 1 0 0 1-.964.732h-8.48a1 1 0 0 1-.963-.732L17.51 36.64a1 1 0 0 0-1.213-.7l-4.65 1.2a1 1 0 0 1-1.116-.468l-4.24-7.344a1 1 0 0 1 .153-1.2L9.809 24.7a1 1 0 0 0 0-1.402l-3.364-3.427a1 1 0 0 1-.153-1.2l4.24-7.344a1 1 0 0 1 1.116-.468l4.65 1.2a1 1 0 0 0 1.213-.7l1.286-4.628Z\" }, null, -1),\n createElementVNode(\"path\", { d: \"M30 24a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconSettings = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconSettings as default };\n","import _IconSettings from \"./icon-settings.js\";\nconst IconSettings = Object.assign(_IconSettings, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconSettings.name, _IconSettings);\n }\n});\nexport { IconSettings as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconLineHeight\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-line-height`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M4 8h14.5M33 8H18.5m0 0v34\" }, null, -1),\n createElementVNode(\"path\", {\n d: \"M39 9.5 37 13h4l-2-3.5ZM39 38.5 37 35h4l-2 3.5Z\",\n fill: \"currentColor\",\n stroke: \"none\"\n }, null, -1),\n createElementVNode(\"path\", { d: \"M39 13h2l-2-3.5-2 3.5h2Zm0 0v22m0 0h2l-2 3.5-2-3.5h2Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconLineHeight = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconLineHeight as default };\n","import _IconLineHeight from \"./icon-line-height.js\";\nconst IconLineHeight = Object.assign(_IconLineHeight, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconLineHeight.name, _IconLineHeight);\n }\n});\nexport { IconLineHeight as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconFullscreenExit\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-fullscreen-exit`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M35 6v8a1 1 0 0 0 1 1h8M13 6v8a1 1 0 0 1-1 1H4m31 27v-8a1 1 0 0 1 1-1h8m-31 9v-8a1 1 0 0 0-1-1H4\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconFullscreenExit = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconFullscreenExit as default };\n","import _IconFullscreenExit from \"./icon-fullscreen-exit.js\";\nconst IconFullscreenExit = Object.assign(_IconFullscreenExit, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconFullscreenExit.name, _IconFullscreenExit);\n }\n});\nexport { IconFullscreenExit as default };\n","import { defineComponent, computed, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode } from \"vue\";\nimport { getPrefixCls } from \"../../_utils/global-config.js\";\nimport { isNumber } from \"../../_utils/is.js\";\nimport _export_sfc from \"../../_virtual/plugin-vue_export-helper.js\";\nconst _sfc_main = defineComponent({\n name: \"IconFullscreen\",\n props: {\n size: {\n type: [Number, String]\n },\n strokeWidth: {\n type: Number,\n default: 4\n },\n strokeLinecap: {\n type: String,\n default: \"butt\",\n validator: (value) => {\n return [\"butt\", \"round\", \"square\"].includes(value);\n }\n },\n strokeLinejoin: {\n type: String,\n default: \"miter\",\n validator: (value) => {\n return [\"arcs\", \"bevel\", \"miter\", \"miter-clip\", \"round\"].includes(value);\n }\n },\n rotate: Number,\n spin: Boolean\n },\n emits: {\n click: (ev) => true\n },\n setup(props, { emit }) {\n const prefixCls = getPrefixCls(\"icon\");\n const cls = computed(() => [prefixCls, `${prefixCls}-fullscreen`, { [`${prefixCls}-spin`]: props.spin }]);\n const innerStyle = computed(() => {\n const styles = {};\n if (props.size) {\n styles.fontSize = isNumber(props.size) ? `${props.size}px` : props.size;\n }\n if (props.rotate) {\n styles.transform = `rotate(${props.rotate}deg)`;\n }\n return styles;\n });\n const onClick = (ev) => {\n emit(\"click\", ev);\n };\n return {\n cls,\n innerStyle,\n onClick\n };\n }\n});\nconst _hoisted_1 = [\"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", {\n viewBox: \"0 0 48 48\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n stroke: \"currentColor\",\n class: normalizeClass(_ctx.cls),\n style: normalizeStyle(_ctx.innerStyle),\n \"stroke-width\": _ctx.strokeWidth,\n \"stroke-linecap\": _ctx.strokeLinecap,\n \"stroke-linejoin\": _ctx.strokeLinejoin,\n onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))\n }, _cache[1] || (_cache[1] = [\n createElementVNode(\"path\", { d: \"M42 17V9a1 1 0 0 0-1-1h-8M6 17V9a1 1 0 0 1 1-1h8m27 23v8a1 1 0 0 1-1 1h-8M6 31v8a1 1 0 0 0 1 1h8\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconFullscreen = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconFullscreen as default };\n","import _IconFullscreen from \"./icon-fullscreen.js\";\nconst IconFullscreen = Object.assign(_IconFullscreen, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconFullscreen.name, _IconFullscreen);\n }\n});\nexport { IconFullscreen as default };\n","/**\n * 防抖函数返回类型(带 cancel 方法)\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel: () => void;\n}\n\n/**\n * 防抖函数\n * @param func 需要防抖的函数\n * @param wait 延迟时间(毫秒)\n * @param immediate 是否立即执行\n * @returns 防抖后的函数(带 cancel 方法)\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number = 300,\n immediate: boolean = false\n): DebouncedFunction<T> {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = function (this: any, ...args: Parameters<T>) {\n const context = this;\n\n const later = () => {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n\n const callNow = immediate && !timeout;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(later, wait);\n\n if (callNow) {\n func.apply(context, args);\n }\n } as DebouncedFunction<T>;\n\n // 添加 cancel 方法\n debounced.cancel = () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * 节流函数\n * @param func 需要节流的函数\n * @param wait 延迟时间(毫秒)\n * @returns 节流后的函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number = 300\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n let previous: number = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const context = this;\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\n\n","import { ref, watch, type Ref } from 'vue';\n\n/**\n * 本地存储Hook\n * @param key 存储的key\n * @param initialValue 初始值\n * @returns [存储的值, 设置值的函数]\n */\nfunction useLocalStorage<T>(key: string, initialValue: T) {\n // 初始化时读取localStorage\n let initialStoredValue: T;\n try {\n const item = window.localStorage.getItem(key);\n initialStoredValue = item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n initialStoredValue = initialValue;\n }\n\n const storedValue = ref<T>(initialStoredValue) as Ref<T>;\n\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue.value) : value;\n storedValue.value = valueToStore;\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n } catch (error) {\n console.error(`Error setting localStorage key \"${key}\":`, error);\n }\n };\n\n // 监听变化并同步到localStorage\n watch(\n storedValue,\n (newValue: any) => {\n try {\n window.localStorage.setItem(key, JSON.stringify(newValue));\n } catch (error) {\n console.error(`Error syncing localStorage key \"${key}\":`, error);\n }\n },\n { deep: true }\n );\n\n return [storedValue, setValue] as const;\n}\n\nexport default useLocalStorage;\n","<template>\n <div class=\"basic-table-wrapper\">\n <!-- 查询表单 -->\n <div v-if=\"getSearchConfig.show\" class=\"basic-table-search\">\n <BasicForm\n ref=\"searchFormRef\"\n v-bind=\"getSearchFormProps\"\n @submit=\"handleSearch\"\n @reset=\"handleReset\"\n />\n <a-divider class=\"!mt-0\" />\n </div>\n\n <!-- 工具栏 -->\n <div v-if=\"getToolbarConfig.show\" class=\"basic-table-toolbar\">\n <div class=\"toolbar-left\">\n <slot name='tableTitle'>\n <div v-if=\"getToolbarConfig.title\" class=\"toolbar-title\">\n {{ getToolbarConfig.title }}\n </div>\n </slot>\n </div>\n <div class=\"toolbar-right\">\n <a-space>\n <!-- 自定义操作按钮 -->\n <template v-if=\"getToolbarConfig.actions && getToolbarConfig.actions.length > 0\">\n <a-button\n v-for=\"(action, index) in getToolbarConfig.actions\"\n :key=\"index\"\n v-show=\"action.show !== false\"\n @click=\"action.onClick\"\n v-bind=\"action\"\n >\n <template v-if=\"action.icon\" #icon>\n <component :is=\"action.icon\" />\n </template>\n {{ action.label }}\n </a-button>\n </template>\n \n <!-- 刷新按钮 -->\n <a-tooltip v-if=\"getToolbarConfig.showRefresh\" content=\"刷新\">\n <a-button @click=\"handleRefresh\" aria-label=\"刷新表格\">\n <template #icon>\n <icon-refresh />\n </template>\n </a-button>\n </a-tooltip>\n\n <!-- 全屏按钮 -->\n <a-tooltip v-if=\"getToolbarConfig.showFullscreen\" :content=\"isFullscreen ? '退出全屏' : '全屏'\">\n <a-button @click=\"handleFullscreen\" :aria-label=\"isFullscreen ? '退出全屏' : '全屏显示'\">\n <template #icon>\n <icon-fullscreen-exit v-if=\"isFullscreen\" />\n <icon-fullscreen v-else />\n </template>\n </a-button>\n </a-tooltip>\n \n <!-- 密度设置 -->\n <a-dropdown v-if=\"getToolbarConfig.showDensity\" @select=\"handleDensityChange\">\n <a-tooltip content=\"密度\">\n <a-button aria-label=\"设置表格密度\">\n <template #icon>\n <icon-line-height />\n </template>\n </a-button>\n </a-tooltip>\n <template #content>\n <a-doption value=\"mini\">紧凑</a-doption>\n <a-doption value=\"small\">偏小</a-doption>\n <a-doption value=\"medium\">默认</a-doption>\n <a-doption value=\"large\">宽松</a-doption>\n </template>\n </a-dropdown>\n \n <!-- 列设置 -->\n <a-popover v-if=\"getToolbarConfig.showColumnSetting\" trigger=\"click\" position=\"br\">\n <a-tooltip content=\"列设置\">\n <a-button aria-label=\"设置显示列\">\n <template #icon>\n <icon-settings />\n </template>\n </a-button>\n </a-tooltip>\n <template #content>\n <div class=\"column-setting\">\n <a-checkbox-group v-model=\"checkedColumns\" @change=\"handleColumnChange\">\n <div v-for=\"col in settingColumns\" :key=\"col.dataIndex\" class=\"column-setting-item\">\n <a-checkbox :value=\"col.dataIndex\">\n {{ col.title }}\n </a-checkbox>\n </div>\n </a-checkbox-group>\n </div>\n </template>\n </a-popover>\n </a-space>\n </div>\n </div>\n \n <!-- 表格 -->\n <a-table\n ref=\"tableRef\"\n v-bind=\"getBindValues\"\n :columns=\"getViewColumns\"\n :data=\"dataSource\"\n :loading=\"loadingRef\"\n :pagination=\"getPaginationConfig\"\n :row-selection=\"getRowSelectionConfig\"\n :expandable=\"getMergedProps.expandable\"\n :scroll=\"getScrollConfig\"\n :draggable=\"getMergedProps.draggable\"\n :bordered=\"getMergedProps.bordered\"\n :stripe=\"getMergedProps.stripe\"\n :show-header=\"getMergedProps.showHeader\"\n :size=\"tableSizeRef\"\n :row-key=\"getRowKeyProp\"\n @change=\"handleTableChange\"\n @page-change=\"handlePageChange\"\n @page-size-change=\"handlePageSizeChange\"\n @select=\"handleSelect\"\n @select-all=\"handleSelectAll\"\n @expand=\"handleExpand\"\n @row-click=\"handleRowClick\"\n @row-dblclick=\"handleRowDblclick\"\n @cell-click=\"handleCellClick\"\n >\n <!-- 自定义列插槽 -->\n <template v-for=\"col in getViewColumns.filter(c => c.slotName)\" :key=\"col.dataIndex\" #[col.slotName!]=\"slotProps\">\n <!-- 索引列 -->\n <template v-if=\"col.slotName === '__index__'\">\n {{ getIndexNumber(slotProps.rowIndex) }}\n </template>\n <!-- 操作列 -->\n <template v-else-if=\"col.slotName === 'action'\">\n <slot name=\"action\" :record=\"slotProps.record\">\n <a-space>\n <template v-for=\"action in getActionButtons(slotProps.record)\" :key=\"action.label\">\n <a-popconfirm\n v-if=\"action.popConfirm\"\n :content=\"action.popConfirm.title\"\n :ok-text=\"action.popConfirm.okText\"\n :cancel-text=\"action.popConfirm.cancelText\"\n @ok=\"action.popConfirm.onConfirm?.(slotProps.record)\"\n @cancel=\"action.popConfirm.onCancel\"\n >\n <a-link\n :status=\"(action.color as 'success' | 'warning' | 'danger' | undefined)\"\n :disabled=\"getActionDisabled(action, slotProps.record)\"\n @click.stop\n >\n <template v-if=\"action.icon\" #icon>\n <component :is=\"action.icon\" />\n </template>\n {{ action.label }}\n </a-link>\n </a-popconfirm>\n \n <a-link\n v-else\n :status=\"(action.color as 'success' | 'warning' | 'danger' | undefined)\"\n :disabled=\"getActionDisabled(action, slotProps.record)\"\n @click=\"handleActionClick(action, slotProps.record)\"\n >\n <template v-if=\"action.icon\" #icon>\n <component :is=\"action.icon\" />\n </template>\n {{ action.label }}\n </a-link>\n </template>\n </a-space>\n </slot>\n </template>\n <!-- 用户自定义插槽 -->\n <slot v-else-if=\"$slots[col.dataIndex as string]\" :name=\"col.dataIndex\" v-bind=\"slotProps\" />\n <!-- customRender 渲染 -->\n <component v-else-if=\"col.customRender\" :is=\"renderCustomCell(col, slotProps)\" />\n <!-- format 格式化 -->\n <template v-else-if=\"col.format\">\n {{ col.format(slotProps.record[col.dataIndex!], slotProps.record, slotProps.rowIndex) }}\n </template>\n </template>\n </a-table>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount, nextTick, h } from 'vue';\nimport type { VNode } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport { Message } from '@arco-design/web-vue';\nimport {\n IconRefresh,\n IconSettings,\n IconLineHeight,\n IconFullscreen,\n IconFullscreenExit,\n} from '@arco-design/web-vue/es/icon';\nimport { BasicForm } from '../Form';\nimport { debounce } from '../../utils/debounce';\nimport useLocalStorage from '../../hooks/useLocalStorage';\nimport type { BasicColumn, BasicTableProps, BasicTableEmits, ActionItem, TablePaginationConfig, TableSearchConfig, TableToolbarConfig } from './types';\n\n// 常量定义\nconst DEBOUNCE_DELAY = {\n REFRESH: 300,\n SEARCH: 500,\n} as const;\n\n// 插槽属性类型\ninterface SlotProps {\n record: TableData;\n column: BasicColumn;\n rowIndex: number;\n}\n\n// 错误代码类型\ntype ErrorCode = 'NETWORK_ERROR' | 'TIMEOUT' | 'INVALID_RESPONSE' | 'UNKNOWN_ERROR';\n\n// 错误类型定义\ninterface FetchError {\n code?: ErrorCode;\n message: string;\n data?: any;\n originalError?: any;\n}\n\n// 错误代码枚举\nconst ERROR_CODES: Record<ErrorCode, ErrorCode> = {\n NETWORK_ERROR: 'NETWORK_ERROR',\n TIMEOUT: 'TIMEOUT',\n INVALID_RESPONSE: 'INVALID_RESPONSE',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n};\n\ndefineOptions({\n name: 'BasicTable',\n});\n\nconst props = withDefaults(defineProps<BasicTableProps>(), {\n columns: () => [],\n data: () => [],\n loading: false,\n size: 'medium',\n bordered: true,\n stripe: false,\n showHeader: true,\n rowKey: 'id',\n immediate: true,\n showIndexColumn: false,\n showActionColumn: false,\n autoHeight: false,\n});\n\nconst emit = defineEmits<BasicTableEmits>();\n\n// 表格引用\nconst tableRef = ref();\nconst searchFormRef = ref();\n\n// 内部 props(可修改)\nconst innerPropsRef = ref<Partial<BasicTableProps>>({});\n\n// 数据源\nconst dataSource = ref<TableData[]>([]);\nconst loadingRef = ref(false);\nconst tableSizeRef = ref(props.size);\nconst isFullscreen = ref(false);\nconst selectedRowKeys = ref<(string | number)[]>([]);\nconst selectedRows = ref<TableData[]>([]);\n\n// 列设置持久化\nconst getStorageKey = () => {\n return props.tableId ? `table-column-setting-${props.tableId}` : null;\n};\n\nconst [storedColumns, setStoredColumns] = useLocalStorage<string[]>(\n getStorageKey() || 'table-column-setting-default',\n []\n);\n\nconst checkedColumns = ref<string[]>(storedColumns.value);\n\n// 监听 checkedColumns 变化并持久化\nwatch(checkedColumns, (newValue) => {\n if (getStorageKey()) {\n setStoredColumns(newValue);\n }\n});\n\n// 全屏状态监听\nconst handleFullscreenChange = () => {\n isFullscreen.value = !!document.fullscreenElement;\n};\n\n// 分页配置\nconst paginationRef = ref<TablePaginationConfig>({\n current: 1,\n pageSize: 10,\n total: 0,\n showTotal: true,\n showJumper: true,\n showPageSize: true,\n pageSizeOptions: [5, 10, 20, 50, 100],\n});\n\n// 查询参数\nconst searchParams = ref<Record<string, any>>({});\n\n// 合并 props(优先使用 innerPropsRef 中的值)\nconst getMergedProps = computed(() => {\n return { ...props, ...innerPropsRef.value };\n});\n\n// 初始化分页配置\nconst initPagination = () => {\n const mergedProps = getMergedProps.value;\n const pagination = mergedProps.pagination;\n if (pagination && typeof pagination === 'object') {\n paginationRef.value = {\n ...paginationRef.value,\n ...pagination,\n };\n }\n};\n\n// 初始化数据(合并 watch 优化性能)\nwatch(\n () => [props.data, props.loading] as const,\n ([data, loading]) => {\n if (data) {\n dataSource.value = data;\n // 在数据模式下(没有配置 api),更新分页的 total\n if (paginationRef.value && !getMergedProps.value.api) {\n paginationRef.value.total = data.length;\n }\n }\n loadingRef.value = loading;\n },\n { immediate: true }\n);\n\n// 监听 pagination props 变化\nwatch(\n () => getMergedProps.value.pagination,\n (newPagination) => {\n if (newPagination && typeof newPagination === 'object') {\n paginationRef.value = {\n ...paginationRef.value,\n ...newPagination,\n };\n }\n },\n { immediate: true, deep: true }\n);\n\n// 工具栏配置\nconst getToolbarConfig = computed((): TableToolbarConfig => {\n const mergedProps = getMergedProps.value;\n const toolbar = mergedProps.toolbar;\n if (toolbar === false) {\n return { show: false };\n }\n return {\n show: true,\n showRefresh: true,\n showColumnSetting: true,\n showFullscreen: true,\n showDensity: true,\n ...toolbar,\n };\n});\n\n// 查询配置\nconst getSearchConfig = computed((): TableSearchConfig => {\n const mergedProps = getMergedProps.value;\n const search = mergedProps.search;\n if (search === false) {\n return { show: false };\n }\n return {\n show: true,\n layout: 'inline',\n showCollapse: true,\n defaultCollapseRows: 1,\n showResetButton: true,\n showSubmitButton: true,\n submitButtonText: '查询',\n resetButtonText: '重置',\n ...search,\n };\n});\n\n// 查询表单属性\nconst getSearchFormProps = computed(() => {\n const config = getSearchConfig.value;\n const formProps = config.formProps || {};\n\n return {\n schemas: config.schemas || [],\n layout: config.layout,\n showSubmitButton: config.showSubmitButton,\n showResetButton: config.showResetButton,\n submitButtonText: config.submitButtonText,\n resetButtonText: config.resetButtonText,\n // 其他 formProps(先展开,后面会被覆盖)\n ...formProps,\n // 合并 baseFormItemProps(保留默认值)\n baseFormItemProps: {\n ...formProps.baseFormItemProps,\n style: {\n marginRight: 0,\n ...(formProps.baseFormItemProps?.style || {})\n }\n },\n \n // 合并 actionFormItemProps(保留默认值)\n actionFormItemProps: {\n ...formProps.actionFormItemProps,\n style: {\n marginRight: 0,\n ...(formProps.actionFormItemProps?.style || {})\n }\n },\n \n // 合并 actionColOptions(保留默认值)\n actionColOptions: {\n ...formProps.actionColOptions,\n style: {\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'center',\n ...(formProps.actionColOptions?.style || {})\n }\n },\n };\n});\n\n// 分页配置\nconst getPaginationConfig = computed(() => {\n const mergedProps = getMergedProps.value;\n if (mergedProps.pagination === false) {\n return false;\n }\n // 注意:paginationRef 的值应该优先(运行时动态变化的值)\n return {\n ...mergedProps.pagination,\n ...paginationRef.value,\n };\n});\n\n// 行选择配置\nconst getRowSelectionConfig = computed(() => {\n const mergedProps = getMergedProps.value;\n if (!mergedProps.rowSelection) {\n return undefined;\n }\n return {\n selectedRowKeys: selectedRowKeys.value,\n ...mergedProps.rowSelection,\n };\n});\n\n// 滚动配置\nconst getScrollConfig = computed(() => {\n const mergedProps = getMergedProps.value;\n if (mergedProps.scroll) {\n return mergedProps.scroll;\n }\n if (mergedProps.autoHeight) {\n return { y: 'auto' };\n }\n if (mergedProps.maxHeight) {\n return { y: mergedProps.maxHeight };\n }\n return undefined;\n});\n\n// 行 key 属性(传递给 ArcoDesign Table)\nconst getRowKeyProp = computed(() => {\n const mergedProps = getMergedProps.value;\n // ArcoDesign Vue Table 的 rowKey 只接受字符串\n if (typeof mergedProps.rowKey === 'string') {\n return mergedProps.rowKey;\n }\n return 'id'; // 默认使用 'id'\n});\n\n// 获取行 key 的函数(用于内部逻辑)\nconst getRowKey = (record: TableData): string | number => {\n const mergedProps = getMergedProps.value;\n if (typeof mergedProps.rowKey === 'function') {\n return mergedProps.rowKey(record);\n }\n return record[mergedProps.rowKey as string];\n};\n\n// 可见列\nconst getViewColumns = computed(() => {\n const mergedProps = getMergedProps.value;\n let columns = [...mergedProps.columns];\n \n // 添加索引列\n if (mergedProps.showIndexColumn) {\n const indexColumn: BasicColumn = {\n title: '序号',\n dataIndex: '__index__',\n width: 80,\n align: 'center',\n fixed: 'left',\n slotName: '__index__',\n ...mergedProps.indexColumnProps,\n };\n columns.unshift(indexColumn);\n }\n \n // 添加操作列\n if (mergedProps.showActionColumn && mergedProps.actionColumn) {\n const actionColumn: BasicColumn = {\n title: mergedProps.actionColumn.title || '操作',\n dataIndex: 'action',\n width: mergedProps.actionColumn.width || 150,\n fixed: mergedProps.actionColumn.fixed || 'right',\n align: 'center',\n slotName: 'action',\n };\n columns.push(actionColumn);\n }\n \n // 过滤隐藏列(只有在列设置功能开启且用户已经做过选择时才过滤)\n if (getToolbarConfig.value.showColumnSetting && checkedColumns.value.length > 0) {\n columns = columns.filter((col) => {\n // 索引列和操作列始终显示\n if (col.dataIndex === '__index__' || col.dataIndex === 'action') {\n return true;\n }\n // 没有 dataIndex 的列始终显示\n if (!col.dataIndex) return true;\n // 检查是否在选中列表中\n return checkedColumns.value.includes(col.dataIndex as string);\n });\n }\n \n // 过滤 show 为 false 的列\n columns = columns.filter((col) => col.show !== false);\n \n // 为需要自定义渲染的列自动添加 slotName\n columns = columns.map((col) => {\n if (!col.slotName && (col.customRender || col.format)) {\n return { ...col, slotName: col.dataIndex as string };\n }\n return col;\n });\n \n return columns;\n});\n\n// 列设置选项\nconst settingColumns = computed(() => {\n const mergedProps = getMergedProps.value;\n return mergedProps.columns.filter((col) => {\n if (typeof col.ifShow === 'function') {\n return col.ifShow(col);\n }\n return col.ifShow !== false && col.dataIndex;\n });\n});\n\n// 表格绑定值\nconst getBindValues = computed(() => {\n const mergedProps = getMergedProps.value;\n const { columns, data, loading, pagination, search, toolbar, api, beforeFetch, afterFetch, onFetchError, immediate, showIndexColumn, indexColumnProps, showActionColumn, actionColumn, rowKey, expandable, scroll, draggable, bordered, stripe, showHeader, size, rowSelection, ...rest } = mergedProps;\n return rest;\n});\n\n// 获取索引号\nconst getIndexNumber = (rowIndex: number) => {\n const pagination = getPaginationConfig.value;\n if (pagination === false) {\n return rowIndex + 1;\n }\n return (pagination.current! - 1) * pagination.pageSize! + rowIndex + 1;\n};\n\n/**\n * 渲染自定义单元格\n * @param col 列配置\n * @param slotProps 插槽属性\n * @returns VNode 或 null\n */\nconst renderCustomCell = (col: BasicColumn, slotProps: SlotProps): VNode | null => {\n if (!col.customRender) return null;\n \n const result = col.customRender(slotProps);\n \n // 处理 null 或 undefined\n if (result === null || result === undefined) {\n return null;\n }\n \n // 检查是否为 VNode(Vue 3 的 VNode 有 type 属性)\n if (typeof result === 'object' && result !== null && 'type' in result) {\n return result as VNode;\n }\n \n // 字符串或数字,包装成文本节点\n return h('span', String(result));\n};\n\n// 获取操作按钮\nconst getActionButtons = (record: TableData): ActionItem[] => {\n const mergedProps = getMergedProps.value;\n if (!mergedProps.actionColumn?.actions) {\n return [];\n }\n const actions = mergedProps.actionColumn.actions(record);\n return actions.filter((action) => {\n if (typeof action.show === 'function') {\n return action.show(record);\n }\n return action.show !== false;\n });\n};\n\n// 获取操作按钮禁用状态\nconst getActionDisabled = (action: ActionItem, record: TableData): boolean => {\n if (typeof action.disabled === 'function') {\n return action.disabled(record);\n }\n return action.disabled || false;\n};\n\n// 处理操作按钮点击\nconst handleActionClick = (action: ActionItem, record: TableData) => {\n if (action.onClick) {\n action.onClick(record);\n }\n};\n\n// 处理表格变化(排序、筛选等)\nconst handleTableChange = (_pagination: any, sorter: any, filters: any) => {\n emit('change', paginationRef.value, sorter, filters);\n};\n\n// 处理页码变化\nconst handlePageChange = (page: number) => {\n if (paginationRef.value) {\n paginationRef.value.current = page;\n }\n \n // 如果配置了 API,重新加载数据\n if (getMergedProps.value.api) {\n fetchData();\n }\n};\n\n// 处理每页条数变化\nconst handlePageSizeChange = (pageSize: number) => {\n if (paginationRef.value) {\n paginationRef.value.pageSize = pageSize;\n paginationRef.value.current = 1; // 重置到第一页\n }\n \n // 如果配置了 API,重新加载数据\n if (getMergedProps.value.api) {\n fetchData();\n }\n};\n\n// 扁平化对象(处理嵌套对象)\nconst flattenObject = (obj: Record<string, any>, prefix = ''): Record<string, any> => {\n const result: Record<string, any> = {};\n \n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n const newKey = prefix ? `${prefix}.${key}` : key;\n \n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {\n // 递归处理嵌套对象\n Object.assign(result, flattenObject(value, newKey));\n } else {\n result[newKey] = value; // 修复:使用 newKey 而不是 key\n }\n }\n }\n \n return result;\n};\n\n// 过滤空值(null、undefined、空字符串)\nconst filterEmptyValues = (obj: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n \n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n \n // 过滤掉 null、undefined、空字符串\n if (value !== null && value !== undefined && value !== '') {\n // 如果是数组,保留(即使是空数组)\n // 如果是数字 0,保留\n // 如果是布尔值 false,保留\n result[key] = value;\n }\n }\n }\n \n return result;\n};\n\n// 处理查询\nconst handleSearch = async (values: Record<string, any>) => {\n // 扁平化 values(去除嵌套结构)\n const flatValues = flattenObject(values);\n \n // 过滤空值(null、undefined、空字符串)\n const filteredValues = filterEmptyValues(flatValues);\n \n searchParams.value = filteredValues;\n \n // 重置到第一页\n if (paginationRef.value) {\n paginationRef.value.current = 1;\n }\n \n emit('search', filteredValues);\n \n if (getSearchConfig.value.onSearch) {\n getSearchConfig.value.onSearch(filteredValues);\n }\n \n // 如果配置了 API,使用防抖重新加载数据\n if (getMergedProps.value.api) {\n await debouncedFetchData();\n }\n};\n\n// 处理重置\nconst handleReset = async () => {\n searchParams.value = {};\n \n // 重置到第一页\n if (paginationRef.value) {\n paginationRef.value.current = 1;\n }\n \n emit('reset');\n \n if (getSearchConfig.value.onReset) {\n getSearchConfig.value.onReset();\n }\n \n // 如果配置了 API,重新加载数据(不需要防抖)\n if (getMergedProps.value.api) {\n await fetchData();\n }\n};\n\n// 处理密度变化\nconst handleDensityChange = (value: string | number | Record<string, any> | undefined) => {\n tableSizeRef.value = value as 'mini' | 'small' | 'medium' | 'large';\n};\n\n// 处理列设置变化\nconst handleColumnChange = (values: (string | number | boolean)[]) => {\n checkedColumns.value = values as string[];\n};\n\n// 处理全屏\nconst handleFullscreen = async () => {\n const wrapper = document.querySelector('.basic-table-wrapper') as HTMLElement;\n if (!wrapper) return;\n \n try {\n if (!isFullscreen.value) {\n // 进入全屏\n if (wrapper.requestFullscreen) {\n await wrapper.requestFullscreen();\n }\n } else {\n // 退出全屏\n if (document.exitFullscreen && document.fullscreenElement) {\n await document.exitFullscreen();\n }\n }\n } catch (error) {\n console.error('全屏操作失败:', error);\n Message.error('全屏操作失败');\n }\n};\n\n// 处理行选择\nconst handleSelect = (rowKeys: (string | number)[], rowKey: string | number, record: TableData) => {\n selectedRowKeys.value = rowKeys;\n selectedRows.value = dataSource.value.filter((item: TableData) => rowKeys.includes(getRowKey(item)));\n emit('select', rowKeys, rowKey, record);\n};\n\n// 处理全选\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n selectedRowKeys.value = dataSource.value.map((item: TableData) => getRowKey(item));\n selectedRows.value = [...dataSource.value];\n } else {\n selectedRowKeys.value = [];\n selectedRows.value = [];\n }\n emit('selectAll', checked);\n};\n\n// 处理展开\nconst handleExpand = (record: TableData, expanded: boolean) => {\n emit('expand', record, expanded);\n};\n\n// 处理行点击\nconst handleRowClick = (record: TableData, event: Event) => {\n emit('row-click', record, event);\n};\n\n// 处理行双击\nconst handleRowDblclick = (record: TableData, event: Event) => {\n emit('row-dblclick', record, event);\n};\n\n// 处理单元格点击\nconst handleCellClick = (record: TableData, column: BasicColumn, event: Event) => {\n emit('cell-click', record, column, event);\n};\n\n/**\n * 获取表格数据\n * 支持 API 请求、参数处理、错误处理等\n */\nconst fetchData = async () => {\n const mergedProps = getMergedProps.value;\n if (!mergedProps.api) return;\n \n try {\n loadingRef.value = true;\n \n let params: any = {\n ...searchParams.value,\n };\n \n // 添加分页参数\n if (paginationRef.value) {\n params.page = paginationRef.value.current;\n params.pageSize = paginationRef.value.pageSize;\n }\n \n // 请求前处理\n if (mergedProps.beforeFetch) {\n params = mergedProps.beforeFetch(params);\n }\n \n const result = await mergedProps.api(params);\n \n // 严格验证 API 响应格式\n if (!result || typeof result !== 'object') {\n throw {\n code: ERROR_CODES.INVALID_RESPONSE,\n message: 'API 响应格式无效:返回值不是对象',\n data: result,\n } as FetchError;\n }\n \n if (!('data' in result)) {\n throw {\n code: ERROR_CODES.INVALID_RESPONSE,\n message: 'API 响应格式无效:缺少 data 字段',\n data: result,\n } as FetchError;\n }\n \n if (!Array.isArray(result.data)) {\n console.warn('API 响应格式警告:data 字段不是数组,已转换为空数组');\n }\n \n if (!('total' in result) || typeof result.total !== 'number') {\n console.warn('API 响应格式警告:total 字段缺失或类型错误,已设置为 0');\n }\n \n let data = Array.isArray(result.data) ? result.data : [];\n let total = typeof result.total === 'number' ? result.total : 0;\n \n // 数据一致性检查\n if (total < data.length) {\n console.warn(`数据一致性警告:total(${total}) 小于 data.length(${data.length})`);\n }\n \n // 请求后处理\n if (mergedProps.afterFetch) {\n const processed = mergedProps.afterFetch(result);\n data = Array.isArray(processed.data) ? processed.data : data;\n total = typeof processed.total === 'number' ? processed.total : total;\n }\n \n dataSource.value = data;\n \n if (paginationRef.value) {\n paginationRef.value.total = total;\n }\n \n emit('fetch-success', data);\n } catch (error) {\n console.error('表格数据加载失败:', error);\n \n // 详细的错误处理\n let errorMessage = '数据加载失败';\n let errorCode = ERROR_CODES.UNKNOWN_ERROR;\n \n if (error instanceof Error) {\n errorMessage = error.message;\n // 检查是否为网络错误\n if (error.message.includes('network') || error.message.includes('fetch')) {\n errorCode = ERROR_CODES.NETWORK_ERROR;\n } else if (error.message.includes('timeout')) {\n errorCode = ERROR_CODES.TIMEOUT;\n }\n } else if (typeof error === 'object' && error !== null) {\n const err = error as FetchError;\n errorMessage = err.message || errorMessage;\n errorCode = err.code || errorCode;\n }\n \n // 根据错误类型显示不同的提示\n if (errorCode === ERROR_CODES.NETWORK_ERROR) {\n Message.error('网络连接失败,请检查网络设置');\n } else if (errorCode === ERROR_CODES.TIMEOUT) {\n Message.error('请求超时,请稍后重试');\n } else if (errorCode === ERROR_CODES.INVALID_RESPONSE) {\n Message.error(`数据格式错误: ${errorMessage}`);\n } else {\n Message.error(`数据加载失败: ${errorMessage}`);\n }\n \n // 清空数据\n dataSource.value = [];\n if (paginationRef.value) {\n paginationRef.value.total = 0;\n }\n \n // 构造错误对象\n const fetchError: FetchError = {\n code: errorCode,\n message: errorMessage,\n originalError: error,\n };\n \n emit('fetch-error', fetchError);\n \n if (mergedProps.onFetchError) {\n mergedProps.onFetchError(fetchError);\n }\n } finally {\n loadingRef.value = false;\n }\n};\n\n// 使用防抖优化刷新操作\nconst handleRefresh = debounce(async () => {\n await fetchData();\n}, DEBOUNCE_DELAY.REFRESH);\n\n// 使用防抖优化查询操作\nconst debouncedFetchData = debounce(async () => {\n await fetchData();\n}, DEBOUNCE_DELAY.SEARCH);\n\n// 初始化列设置\nconst initColumnSetting = () => {\n // 如果有持久化的列设置,使用持久化的值\n if (getStorageKey() && storedColumns.value.length > 0) {\n checkedColumns.value = storedColumns.value;\n } else {\n // 否则使用默认值\n checkedColumns.value = settingColumns.value\n .filter((col) => !col.defaultHidden)\n .map((col) => col.dataIndex as string);\n }\n};\n\n// 暴露方法给外部\nconst getDataSource = () => dataSource.value;\nconst setDataSource = async (data: TableData[]) => {\n dataSource.value = data;\n // 在数据模式下,更新分页的 total\n if (paginationRef.value && !getMergedProps.value.api) {\n paginationRef.value.total = data.length;\n }\n};\nconst reload = async (opt?: { page?: number }) => {\n if (opt?.page) {\n paginationRef.value.current = opt.page;\n }\n await fetchData();\n};\nconst refresh = async () => {\n await fetchData();\n};\nconst getSelectRows = () => selectedRows.value;\nconst getSelectRowKeys = () => selectedRowKeys.value;\nconst clearSelectedRowKeys = () => {\n selectedRowKeys.value = [];\n selectedRows.value = [];\n};\nconst setSelectedRowKeys = (keys: (string | number)[]) => {\n selectedRowKeys.value = keys;\n selectedRows.value = dataSource.value.filter((item: TableData) => keys.includes(getRowKey(item)));\n};\nconst deleteSelectRowByKey = (key: string | number) => {\n dataSource.value = dataSource.value.filter((item: TableData) => getRowKey(item) !== key);\n selectedRowKeys.value = selectedRowKeys.value.filter((k) => k !== key);\n selectedRows.value = selectedRows.value.filter((item: TableData) => getRowKey(item) !== key);\n};\nconst getPaginationInfo = () => getPaginationConfig.value;\nconst setPagination = async (info: Partial<TablePaginationConfig>) => {\n paginationRef.value = { ...paginationRef.value, ...info };\n};\nconst getSize = () => tableSizeRef.value;\nconst setSize = (size: 'mini' | 'small' | 'medium' | 'large') => {\n tableSizeRef.value = size;\n};\nconst updateColumns = async (columns: BasicColumn[]) => {\n innerPropsRef.value.columns = columns;\n};\nconst getColumns = () => getMergedProps.value.columns;\nconst setProps = async (newProps: Partial<BasicTableProps>) => {\n innerPropsRef.value = { ...innerPropsRef.value, ...newProps };\n \n // 如果设置了 size,同时更新 tableSizeRef\n if (newProps.size) {\n tableSizeRef.value = newProps.size;\n }\n};\nconst setLoading = (loading: boolean) => {\n loadingRef.value = loading;\n};\nconst getSearchFormValues = () => {\n return searchFormRef.value?.getFieldsValue?.() || {};\n};\nconst setSearchFormValues = async (values: Record<string, any>) => {\n await searchFormRef.value?.setFieldsValue?.(values);\n};\nconst expandAll = () => {\n // ArcoDesign Table 暂不支持\n};\nconst collapseAll = () => {\n // ArcoDesign Table 暂不支持\n};\n\ndefineExpose({\n getDataSource,\n setDataSource,\n reload,\n refresh,\n getSelectRows,\n getSelectRowKeys,\n clearSelectedRowKeys,\n setSelectedRowKeys,\n deleteSelectRowByKey,\n getPaginationInfo,\n setPagination,\n getSize,\n setSize,\n updateColumns,\n getColumns,\n setProps,\n setLoading,\n getSearchFormValues,\n setSearchFormValues,\n expandAll,\n collapseAll,\n tableRef,\n searchFormRef,\n});\n\n// 组件挂载\nonMounted(async () => {\n await nextTick();\n \n // 初始化分页配置\n initPagination();\n \n // 初始化列设置\n initColumnSetting();\n \n // 添加全屏状态监听\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n \n // 再次等待,确保所有子组件(包括 BasicForm)都已挂载\n await nextTick();\n \n // 注册表格实例\n const tableInstance = {\n getDataSource,\n setDataSource,\n reload,\n refresh,\n getSelectRows,\n getSelectRowKeys,\n clearSelectedRowKeys,\n setSelectedRowKeys,\n deleteSelectRowByKey,\n getPaginationInfo,\n setPagination,\n getSize,\n setSize,\n updateColumns,\n getColumns,\n setProps,\n setLoading,\n getSearchFormValues,\n setSearchFormValues,\n expandAll,\n collapseAll,\n tableRef,\n searchFormRef,\n };\n \n // 获取查询表单实例(如果存在)\n // 重要:不要在这里判断 getSearchConfig.value.show,因为此时 innerPropsRef 可能还没有被 useTable 更新\n // 而是创建一个动态的 formInstance 对象,在调用时才去获取 searchFormRef.value\n const formInstance = {\n getFieldsValue: () => searchFormRef.value?.getFieldsValue?.() || {},\n setFieldsValue: (values: Record<string, any>) => searchFormRef.value?.setFieldsValue?.(values),\n resetFields: () => searchFormRef.value?.resetFields?.(),\n validate: () => searchFormRef.value?.validate?.(),\n validateFields: () => searchFormRef.value?.validate?.(), // BasicForm 没有单独的 validateFields,使用 validate\n clearValidate: (field?: string | string[]) => searchFormRef.value?.clearValidate?.(field),\n submit: () => searchFormRef.value?.handleSubmit?.(),\n updateSchema: (schema: any) => searchFormRef.value?.updateSchema?.(schema),\n resetSchema: (schemas: any[]) => searchFormRef.value?.resetSchema?.(schemas),\n removeSchemaByField: (field: string | string[]) => searchFormRef.value?.removeSchema?.(field), // 实际方法名是 removeSchema\n appendSchemaByField: () => {\n // BasicForm 没有 appendSchemaByField,可以通过 updateSchema 或 setProps 实现\n console.warn('appendSchemaByField 方法暂不支持,请使用 updateSchema 或 setProps');\n },\n getSchema: (field?: string) => searchFormRef.value?.getSchema?.(field),\n setProps: (formProps: any) => searchFormRef.value?.setProps?.(formProps),\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => \n searchFormRef.value?.scrollToField?.(name, options),\n };\n \n emit('register', tableInstance, formInstance);\n \n // 如果配置了立即加载且有 API,则加载数据\n const mergedProps = getMergedProps.value;\n if (mergedProps.immediate && mergedProps.api) {\n await fetchData();\n }\n});\n\n/**\n * 组件卸载前清理\n * 清理事件监听器、定时器、数据等,防止内存泄漏\n */\nonBeforeUnmount(() => {\n // 移除全屏状态监听\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n \n // 如果当前处于全屏状态,退出全屏\n if (document.fullscreenElement) {\n document.exitFullscreen().catch((error) => {\n console.error('退出全屏失败:', error);\n });\n }\n \n // 清理防抖定时器\n handleRefresh.cancel();\n debouncedFetchData.cancel();\n \n // 清理数据,释放内存\n dataSource.value = [];\n selectedRowKeys.value = [];\n selectedRows.value = [];\n searchParams.value = {};\n checkedColumns.value = [];\n \n // 清理 refs\n innerPropsRef.value = {};\n tableRef.value = null;\n searchFormRef.value = null;\n});\n</script>\n\n<style scoped>\n.basic-table-wrapper {\n background: var(--color-bg-2);\n border-radius: 4px;\n padding: 16px;\n}\n\n.basic-table-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n /* padding: 12px 0; */\n margin-bottom: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n}\n\n.toolbar-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--color-text-1);\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n}\n\n.basic-table-search {\n /* margin-bottom: 16px; */\n /* padding: 16px; */\n background: var(--color-bg-1);\n border-radius: 4px;\n}\n\n.column-setting {\n width: 200px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.column-setting-item {\n padding: 8px 0;\n}\n</style>\n\n","import { ref, unref, nextTick } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn, UseTableOptions, UseTableReturn, BasicTableProps, TablePaginationConfig } from './types';\nimport type { UseFormReturn } from '../Form/types';\n\n/**\n * useTable Hook\n * 用于创建和管理表格实例(参考 Vben Admin 设计)\n * @param options 表格配置选项\n * @returns [register, tableMethods]\n */\nexport function useTable(options: UseTableOptions = {}): [\n (tableInstance: any, formInstance?: any) => void,\n Omit<UseTableReturn, 'register'>\n] {\n const tableRef = ref<any>(null);\n const formRef = ref<any>(null);\n const loadedRef = ref(false);\n const dataSourceRef = ref<TableData[]>([]);\n const propsRef = ref<Partial<BasicTableProps>>({});\n\n /**\n * 注册表格实例\n * @param tableInstance 表格实例\n * @param formInstance 查询表单实例(可选)\n */\n const register = async (tableInstance: any, formInstance?: any) => {\n await nextTick();\n\n tableRef.value = tableInstance;\n formRef.value = formInstance;\n loadedRef.value = true;\n \n // 如果有初始配置,设置到表格实例\n if (options && Object.keys(options).length > 0) {\n await setProps(options as Partial<BasicTableProps>);\n }\n \n // 如果配置了立即加载\n if (options.immediate) {\n // 如果有 API,则通过 API 加载数据\n if (options.api) {\n await reload();\n }\n // 如果直接传入了 data,则设置数据\n else if (options.data && options.data.length > 0) {\n await setDataSource(options.data);\n }\n }\n };\n\n /**\n * 获取表格实例\n */\n const getTable = () => {\n const table = unref(tableRef);\n if (!table) {\n console.error('表格实例尚未注册,请确保组件已挂载并正确使用 @register');\n }\n return table;\n };\n\n /**\n * 获取表格数据\n */\n const getDataSource = (): TableData[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getDataSource) {\n return table.getDataSource();\n }\n return unref(dataSourceRef) || [];\n };\n\n /**\n * 设置表格数据\n */\n const setDataSource = async (data: TableData[]) => {\n const table = getTable();\n if (!table) return;\n \n dataSourceRef.value = data;\n if (table.setDataSource) {\n await table.setDataSource(data);\n }\n };\n\n /**\n * 重新加载数据\n */\n const reload = async (opt?: { page?: number }) => {\n const table = getTable();\n if (!table) return;\n \n if (table.reload) {\n await table.reload(opt);\n }\n };\n\n /**\n * 刷新数据(保持当前页)\n */\n const refresh = async () => {\n const table = getTable();\n if (!table) return;\n \n if (table.refresh) {\n await table.refresh();\n } else {\n await reload();\n }\n };\n\n /**\n * 获取选中行\n */\n const getSelectRows = (): TableData[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getSelectRows) {\n return table.getSelectRows();\n }\n return [];\n };\n\n /**\n * 获取选中行 keys\n */\n const getSelectRowKeys = (): (string | number)[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getSelectRowKeys) {\n return table.getSelectRowKeys();\n }\n return [];\n };\n\n /**\n * 清空选中行\n */\n const clearSelectedRowKeys = () => {\n const table = getTable();\n if (!table) return;\n \n if (table.clearSelectedRowKeys) {\n table.clearSelectedRowKeys();\n }\n };\n\n /**\n * 设置选中行\n */\n const setSelectedRowKeys = (keys: (string | number)[]) => {\n const table = getTable();\n if (!table) return;\n \n if (table.setSelectedRowKeys) {\n table.setSelectedRowKeys(keys);\n }\n };\n\n /**\n * 删除选中行\n */\n const deleteSelectRowByKey = (key: string | number) => {\n const table = getTable();\n if (!table) return;\n \n if (table.deleteSelectRowByKey) {\n table.deleteSelectRowByKey(key);\n }\n };\n\n /**\n * 获取分页信息\n */\n const getPaginationInfo = (): TablePaginationConfig | false => {\n const table = getTable();\n if (!table) return false;\n \n if (table.getPaginationInfo) {\n return table.getPaginationInfo();\n }\n return false;\n };\n\n /**\n * 设置分页信息\n */\n const setPagination = async (info: Partial<TablePaginationConfig>) => {\n const table = getTable();\n if (!table) return;\n \n if (table.setPagination) {\n await table.setPagination(info);\n }\n };\n\n /**\n * 获取表格大小\n */\n const getSize = (): 'mini' | 'small' | 'medium' | 'large' => {\n const table = getTable();\n if (!table) return 'medium';\n \n if (table.getSize) {\n return table.getSize();\n }\n return 'medium';\n };\n\n /**\n * 设置表格大小\n */\n const setSize = (size: 'mini' | 'small' | 'medium' | 'large') => {\n const table = getTable();\n if (!table) return;\n \n if (table.setSize) {\n table.setSize(size);\n }\n };\n\n /**\n * 更新列配置\n */\n const updateColumns = async (columns: BasicColumn[]) => {\n const table = getTable();\n if (!table) return;\n \n if (table.updateColumns) {\n await table.updateColumns(columns);\n }\n };\n\n /**\n * 获取列配置\n */\n const getColumns = (): BasicColumn[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getColumns) {\n return table.getColumns();\n }\n return [];\n };\n\n /**\n * 设置表格 Props\n */\n const setProps = async (props: Partial<BasicTableProps>) => {\n // 保存 props 配置\n propsRef.value = { ...propsRef.value, ...props };\n \n const table = getTable();\n if (!table) {\n // 如果表格实例还未注册,先保存配置\n return;\n }\n \n if (table.setProps) {\n await table.setProps(props);\n }\n };\n\n /**\n * 设置加载状态\n */\n const setLoading = (loading: boolean) => {\n const table = getTable();\n if (!table) return;\n \n if (table.setLoading) {\n table.setLoading(loading);\n }\n };\n\n /**\n * 获取查询表单值\n */\n const getSearchFormValues = (): Record<string, any> => {\n const table = getTable();\n if (!table) return {};\n \n if (table.getSearchFormValues) {\n return table.getSearchFormValues();\n }\n return {};\n };\n\n /**\n * 设置查询表单值\n */\n const setSearchFormValues = async (values: Record<string, any>) => {\n const table = getTable();\n if (!table) return;\n \n if (table.setSearchFormValues) {\n await table.setSearchFormValues(values);\n }\n };\n\n /**\n * 展开所有行\n */\n const expandAll = () => {\n const table = getTable();\n if (!table) return;\n \n if (table.expandAll) {\n table.expandAll();\n }\n };\n\n /**\n * 收起所有行\n */\n const collapseAll = () => {\n const table = getTable();\n if (!table) return;\n \n if (table.collapseAll) {\n table.collapseAll();\n }\n };\n\n /**\n * 获取查询表单实例\n * 返回表单实例,可以直接调用表单的所有方法\n */\n const getForm = (): Omit<UseFormReturn, 'register'> | undefined => {\n const form = unref(formRef);\n if (!form) {\n console.warn('[useTable] 查询表单实例尚未注册,请确保表格配置了查询表单 (search.show = true)');\n return undefined;\n }\n \n // 检查表单实例的方法是否可用\n // 因为 formInstance 中的方法都是动态调用 searchFormRef.value 的\n // 如果 searchFormRef.value 为 undefined,方法调用会失败\n const testMethod = form.getFieldsValue;\n if (!testMethod || typeof testMethod !== 'function') {\n console.warn('[useTable] 查询表单实例方法不可用');\n return undefined;\n }\n \n return form;\n };\n\n const tableMethods = {\n getDataSource,\n setDataSource,\n reload,\n refresh,\n getSelectRows,\n getSelectRowKeys,\n clearSelectedRowKeys,\n setSelectedRowKeys,\n deleteSelectRowByKey,\n getPaginationInfo,\n setPagination,\n getSize,\n setSize,\n updateColumns,\n getColumns,\n setProps,\n setLoading,\n getSearchFormValues,\n setSearchFormValues,\n expandAll,\n collapseAll,\n getForm,\n tableRef,\n getTable,\n };\n\n return [register, tableMethods];\n}\n\n/**\n * 创建表格列配置\n * 用于快速创建表格列\n */\nexport function createTableColumns(columns: BasicColumn[]): BasicColumn[] {\n return columns.map((column, index) => ({\n key: column.key || column.dataIndex || `column_${index}`,\n ...column,\n }));\n}\n\n/**\n * 合并表格列配置\n * 用于合并多个列配置\n */\nexport function mergeTableColumns(...columns: BasicColumn[][]): BasicColumn[] {\n return columns.flat();\n}\n\n","<template>\n <a-modal\n v-bind=\"getBindValue\"\n :visible=\"visibleRef\"\n @update:visible=\"handleVisibleChange\"\n @ok=\"handleOk\"\n @cancel=\"handleCancel\"\n >\n <!-- 自定义标题插槽 -->\n <template v-if=\"$slots.title\" #title>\n <slot name=\"title\" />\n </template>\n <template v-else-if=\"getProps.title\" #title>\n <div style=\"position: relative; width: 100%\">\n <span\n :style=\"{display: 'block', textAlign: getProps.titleAlign}\"\n :class=\"['block']\"\n >\n {{ getProps.title }}\n </span>\n <div\n :class=\"['modal-title-actions', getProps.closable ? 'has-close' : '']\"\n >\n <template v-if=\"getProps.helpMessage\">\n <a-tooltip\n v-if=\"Array.isArray(getProps.helpMessage)\"\n position=\"top\"\n >\n <icon-question-circle class=\"cursor-help text-gray-400\" />\n <template #content>\n <div v-for=\"(msg, index) in getProps.helpMessage\" :key=\"index\">\n {{ msg }}\n </div>\n </template>\n </a-tooltip>\n <a-tooltip v-else position=\"top\">\n <icon-question-circle class=\"cursor-help text-gray-400\" />\n <template #content>\n {{ getProps.helpMessage }}\n </template>\n </a-tooltip>\n </template>\n <div v-if=\"getProps.canFullscreen\">\n <icon-fullscreen\n v-if=\"!fullscreenRef\"\n class=\"cursor-pointer\"\n @click=\"handleFullscreen\"\n />\n <icon-fullscreen-exit\n v-else\n class=\"cursor-pointer\"\n @click=\"handleFullscreen\"\n />\n </div>\n </div>\n </div>\n </template>\n\n <!-- Loading 状态 -->\n <a-spin\n v-if=\"getProps.loading\"\n :tip=\"getProps.loadingTip\"\n :loading=\"true\"\n :style=\"spinStyle\"\n class=\"w-full\"\n >\n <div\n v-if=\"getProps.useWrapper\"\n :style=\"wrapperStyle\"\n class=\"modal-wrapper\"\n >\n <slot />\n </div>\n <slot v-else />\n </a-spin>\n <!-- 正常内容 -->\n <template v-else>\n <div\n v-if=\"getProps.useWrapper\"\n :style=\"wrapperStyle\"\n class=\"modal-wrapper\"\n >\n <slot />\n </div>\n <slot v-else />\n </template>\n\n <!-- 自定义底部插槽 -->\n <!-- 情况1: 如果有自定义 footer 插槽,使用自定义的 -->\n <template v-if=\"$slots.footer\" #footer>\n <slot name=\"footer\" />\n </template>\n <!-- 情况2: 如果 showFooter 不为 false,显示默认的按钮footer -->\n <template v-else-if=\"getProps.showFooter !== false\" #footer>\n <div\n :style=\"{\n pointerEvents: getProps.loading ? 'none' : 'auto',\n opacity: getProps.loading ? 0.6 : 1,\n }\"\n >\n <a-space>\n <slot name=\"insertFooter\" />\n <a-button\n v-if=\"getProps.showCancelBtn\"\n v-bind=\"getCancelButtonProps\"\n @click=\"handleCancel\"\n >\n {{ getProps.cancelText || '取消' }}\n </a-button>\n <slot name=\"centerFooter\" />\n <a-button\n v-if=\"getProps.showOkBtn\"\n v-bind=\"getOkButtonProps\"\n type=\"primary\"\n @click=\"handleOk\"\n >\n {{ getProps.okText || '确定' }}\n </a-button>\n <slot name=\"appendFooter\" />\n </a-space>\n </div>\n </template>\n <!-- 情况3: 如果 showFooter 为 false,提供空的 footer 插槽来隐藏 footer -->\n <template v-else #footer />\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n watch,\n unref,\n nextTick,\n onMounted,\n CSSProperties,\n} from 'vue';\nimport {\n IconQuestionCircle,\n IconFullscreen,\n IconFullscreenExit,\n} from '@arco-design/web-vue/es/icon';\nimport type {BasicModalProps, ModalEmits, ModalMethods} from './types';\n\ndefineOptions({\n name: 'BasicModal',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicModalProps>(), {\n visible: false,\n defaultVisible: false,\n width: 520,\n mask: true,\n maskClosable: true,\n closable: true,\n okText: '确定',\n cancelText: '取消',\n titleAlign: 'center',\n showCancelBtn: true,\n showOkBtn: true,\n canFullscreen: false,\n defaultFullscreen: false,\n loading: false,\n useWrapper: true,\n wrapperFooterOffset: 0,\n centered: false,\n showFooter: true,\n draggable: false,\n footer: true,\n});\n\nconst emit = defineEmits<ModalEmits>();\n\nconst visibleRef = ref(false);\nconst fullscreenRef = ref(false);\nconst confirmLoading = ref(false);\nconst modalLoading = ref(false);\nconst propsRef = ref<Partial<BasicModalProps>>({});\n\n// 获取合并后的属性\nconst getProps = computed((): BasicModalProps => {\n return {...props, ...unref(propsRef)} as BasicModalProps;\n});\n\n// 获取绑定到 a-modal 的属性\nconst getBindValue = computed(() => {\n const propsData = unref(getProps);\n return {\n width: fullscreenRef.value ? '100%' : propsData.width,\n fullscreen: fullscreenRef.value,\n maskClosable: propsData.maskClosable,\n closable: propsData.closable,\n unmountOnClose: propsData.unmountOnClose,\n alignCenter: propsData.alignCenter || propsData.centered,\n simple: propsData.simple,\n hideTitle: propsData.hideTitle,\n renderToBody: propsData.renderToBody,\n popupContainer: propsData.popupContainer,\n maskStyle: propsData.maskStyle,\n modalStyle: getModalStyle.value,\n modalClass: propsData.modalClass,\n escToClose: propsData.escToClose,\n draggable: propsData.draggable,\n mask: propsData.mask,\n top: propsData.top,\n footer: propsData.footer === false ? false : undefined,\n titleAlign: propsData.titleAlign,\n };\n});\n\n// 获取弹窗样式\nconst getModalStyle = computed((): CSSProperties => {\n const propsData = unref(getProps);\n const style: CSSProperties = {...propsData.modalStyle};\n\n if (propsData.height) {\n style.height =\n typeof propsData.height === 'number'\n ? `${propsData.height}px`\n : propsData.height;\n }\n\n if (propsData.minHeight) {\n style.minHeight =\n typeof propsData.minHeight === 'number'\n ? `${propsData.minHeight}px`\n : propsData.minHeight;\n }\n\n if (fullscreenRef.value) {\n style.height = '100vh';\n style.width = '100vw';\n }\n\n return style;\n});\n\n// Wrapper 样式\nconst wrapperStyle = computed((): CSSProperties => {\n const propsData = unref(getProps);\n const style: CSSProperties = {};\n\n if (propsData.height) {\n const height =\n typeof propsData.height === 'number'\n ? propsData.height\n : parseInt(propsData.height);\n style.maxHeight = `${height - propsData.wrapperFooterOffset!}px`;\n style.overflowY = 'auto';\n }\n\n return style;\n});\n\n// Spin 样式\nconst spinStyle = computed((): CSSProperties => {\n const propsData = unref(getProps);\n const style: CSSProperties = {\n minHeight: propsData.minHeight\n ? typeof propsData.minHeight === 'number'\n ? `${propsData.minHeight}px`\n : propsData.minHeight\n : '200px',\n pointerEvents: 'none', // 禁用所有交互\n };\n\n return style;\n});\n\n// 获取取消按钮属性\nconst getCancelButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.cancelButtonProps,\n };\n});\n\n// 获取确认按钮属性\nconst getOkButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.okButtonProps,\n loading: confirmLoading.value || propsData.okLoading,\n };\n});\n\n// 处理可见性变化\nconst handleVisibleChange = (visible: boolean) => {\n visibleRef.value = visible;\n emit('update:visible', visible);\n emit('visible-change', visible);\n};\n\n// 处理确认(内部实现)\nconst handleOkInternal = async () => {\n const propsData = unref(getProps);\n\n // 防止重复点击:如果正在 loading 或已经在处理中,直接返回\n if (confirmLoading.value || propsData.loading) {\n return;\n }\n\n // 如果有 onBeforeOk,先执行\n if (propsData.onBeforeOk) {\n confirmLoading.value = true;\n try {\n await new Promise((resolve, reject) => {\n propsData.onBeforeOk!((closed: boolean) => {\n if (closed) {\n resolve(true);\n } else {\n reject(false);\n }\n });\n });\n emit('ok');\n handleVisibleChange(false);\n } catch (e) {\n // 不关闭\n } finally {\n confirmLoading.value = false;\n }\n return;\n }\n\n // 如果有 closeFunc,执行它\n if (propsData.closeFunc) {\n confirmLoading.value = true;\n try {\n const canClose = await propsData.closeFunc();\n if (canClose) {\n emit('ok');\n handleVisibleChange(false);\n }\n } finally {\n confirmLoading.value = false;\n }\n return;\n }\n\n emit('ok');\n handleVisibleChange(false);\n};\n\n// 处理确认(移除防抖,直接使用)\nconst handleOk = handleOkInternal;\n\n// 处理取消\nconst handleCancel = async () => {\n const propsData = unref(getProps);\n\n // 如果有 onBeforeCancel,先执行\n if (propsData.onBeforeCancel) {\n try {\n await new Promise((resolve, reject) => {\n propsData.onBeforeCancel!((closed: boolean) => {\n if (closed) {\n resolve(true);\n } else {\n reject(false);\n }\n });\n });\n emit('cancel');\n handleVisibleChange(false);\n } catch (e) {\n // 不关闭\n }\n return;\n }\n\n emit('cancel');\n handleVisibleChange(false);\n};\n\n// 处理全屏\nconst handleFullscreen = () => {\n fullscreenRef.value = !fullscreenRef.value;\n};\n\n// 设置 Modal Props\nconst setModalProps = (modalProps: Partial<BasicModalProps>) => {\n propsRef.value = {...unref(propsRef), ...modalProps};\n};\n\n// 打开弹窗\nconst openModal = () => {\n handleVisibleChange(true);\n};\n\n// 关闭弹窗\nconst closeModal = () => {\n handleVisibleChange(false);\n};\n\n// 修改确认按钮的 loading 状态\nconst changeOkLoading = (loading: boolean) => {\n confirmLoading.value = loading;\n};\n\n// 修改 modal 的 loading 状态\nconst changeLoading = (loading: boolean) => {\n modalLoading.value = loading;\n setModalProps({loading});\n};\n\n// 获取 Modal Props\nconst getModalProps = (): BasicModalProps => {\n // 确保返回当前实际的 visible 状态\n return {...unref(getProps), visible: visibleRef.value};\n};\n\n// 暴露方法给外部\nconst modalMethods: ModalMethods = {\n setModalProps,\n openModal,\n closeModal,\n changeOkLoading,\n changeLoading,\n getModalProps,\n};\n\ndefineExpose(modalMethods);\n\n// 监听 visible 变化\nwatch(\n () => props.visible,\n (val) => {\n visibleRef.value = val;\n },\n {immediate: true}\n);\n\n// 监听 defaultFullscreen\nwatch(\n () => props.defaultFullscreen,\n (val) => {\n fullscreenRef.value = val || false;\n },\n {immediate: true}\n);\n\n// 组件挂载后触发注册事件\nonMounted(() => {\n nextTick(() => {\n emit('register', modalMethods);\n });\n});\n</script>\n\n<style scoped>\n.modal-wrapper {\n padding: 0;\n}\n\n.modal-title-actions {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 0.5rem;\n pointer-events: auto;\n}\n\n.modal-title-actions.has-close {\n right: 1.5rem;\n}\n\n.cursor-help {\n cursor: help;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.text-gray-400 {\n color: #9ca3af;\n}\n\n.w-full {\n width: 100%;\n}\n</style>\n","import { ref, unref } from 'vue';\nimport type { BasicModalProps, UseModalReturnType, ModalMethods, Nullable } from './types';\n\n/**\n * useModal Hook\n * 用于外部组件调用 Modal(参考 Vben Admin 设计)\n * @param props Modal 初始配置\n * @returns [register, modalMethods]\n */\nexport function useModal(props?: Partial<BasicModalProps>): UseModalReturnType {\n const modalRef = ref<Nullable<ModalMethods>>(null);\n const loadedRef = ref(false);\n\n /**\n * 注册 Modal 实例\n */\n const register = (modalInstance: ModalMethods) => {\n modalRef.value = modalInstance;\n loadedRef.value = true;\n\n // 如果有初始配置,设置到 Modal 实例\n if (props && Object.keys(props).length > 0) {\n setModalProps(props);\n }\n };\n\n /**\n * 获取 Modal 实例\n */\n const getModal = (): ModalMethods | null => {\n const modal = unref(modalRef);\n if (!modal) {\n console.error('Modal 实例尚未注册,请确保组件已挂载并正确使用 @register');\n return null;\n }\n return modal;\n };\n\n /**\n * 打开/关闭弹窗\n * @param visible 是否显示\n * @param data 传递到子组件的数据\n */\n const openModal = <T = any>(visible = true, data?: T) => {\n const modal = getModal();\n if (!modal) return;\n\n // 如果有数据需要传递,先设置到 props 中(在打开弹窗之前)\n if (data !== undefined) {\n modal.setModalProps({ _data: data } as any);\n }\n\n if (visible) {\n modal.openModal();\n } else {\n modal.closeModal();\n }\n };\n\n /**\n * 关闭弹窗\n */\n const closeModal = () => {\n const modal = getModal();\n if (!modal) return;\n\n modal.closeModal();\n };\n\n /**\n * 设置 Modal Props\n */\n const setModalProps = (modalProps: Partial<BasicModalProps>) => {\n const modal = getModal();\n if (!modal) return;\n\n modal.setModalProps(modalProps);\n };\n\n /**\n * 获取 Modal 是否可见\n */\n const getVisible = (): boolean => {\n const modal = getModal();\n if (!modal) return false;\n\n return modal.getModalProps().visible || false;\n };\n\n return [\n register,\n {\n openModal,\n closeModal,\n setModalProps,\n getVisible,\n },\n ];\n}\n\n","import { ref, unref, getCurrentInstance, onUnmounted } from 'vue';\nimport type { BasicModalProps, UseModalInnerReturnType, ModalMethods, Nullable } from './types';\n\n/**\n * useModalInner Hook\n * 用于独立的 Modal 内部调用(参考 Vben Admin 设计)\n * @param callbackFn 回调函数,用于接收 openModal 传递的数据\n * @returns [register, modalMethods]\n */\nexport function useModalInner<T = any>(\n callbackFn?: (data: T) => void\n): UseModalInnerReturnType {\n const modalRef = ref<Nullable<ModalMethods>>(null);\n const loadedRef = ref(false);\n const instance = getCurrentInstance();\n\n if (!instance) {\n throw new Error('useModalInner 必须在 setup 函数中调用');\n }\n\n /**\n * 注册 Modal 实例\n * 这个函数会自动处理两件事:\n * 1. 注册到 useModalInner 内部,用于监听数据变化\n * 2. 通过 emit 透传给父组件,让父组件的 useModal 能控制 Modal\n */\n const register = (modalInstance: ModalMethods) => {\n // 防止重复注册\n if (unref(loadedRef) && modalInstance === unref(modalRef)) return;\n\n modalRef.value = modalInstance;\n loadedRef.value = true;\n\n // 设置 visible 变化的监听\n // 当 Modal 打开时,触发回调函数\n instance.proxy?.$watch(\n () => getModalProps().visible,\n (visible: boolean | undefined) => {\n if (visible && callbackFn) {\n // 这里可以从外部传入数据\n // 数据可以通过 setModalProps 的方式传递\n const props = getModalProps();\n callbackFn((props as any)._data as T);\n }\n }\n );\n\n // 自动透传 register 事件给父组件\n // 这样父组件的 useModal 才能正确接收到 Modal 实例\n instance.emit?.('register', modalInstance);\n };\n\n /**\n * 获取 Modal 实例\n */\n const getModal = (): ModalMethods | null => {\n const modal = unref(modalRef);\n if (!modal) {\n console.error('Modal 实例尚未注册,请确保组件已挂载并正确使用 @register');\n return null;\n }\n return modal;\n };\n\n /**\n * 关闭弹窗\n */\n const closeModal = () => {\n const modal = getModal();\n if (!modal) return;\n\n modal.closeModal();\n };\n\n /**\n * 修改确认按钮的 loading 状态\n */\n const changeOkLoading = (loading: boolean) => {\n const modal = getModal();\n if (!modal) return;\n\n modal.changeOkLoading(loading);\n };\n\n /**\n * 修改 modal 的 loading 状态\n */\n const changeLoading = (loading: boolean) => {\n const modal = getModal();\n if (!modal) return;\n\n modal.changeLoading(loading);\n };\n\n /**\n * 设置 Modal Props\n */\n const setModalProps = (props: Partial<BasicModalProps>) => {\n const modal = getModal();\n if (!modal) return;\n\n modal.setModalProps(props);\n };\n\n /**\n * 获取 Modal Props\n */\n const getModalProps = (): BasicModalProps => {\n const modal = getModal();\n if (!modal) return {} as BasicModalProps;\n\n return modal.getModalProps();\n };\n\n // 组件卸载时清理\n onUnmounted(() => {\n modalRef.value = null;\n loadedRef.value = false;\n });\n\n return [\n register,\n {\n closeModal,\n changeOkLoading,\n changeLoading,\n setModalProps,\n getModalProps,\n },\n ];\n}\n","<template>\n <div class=\"basic-description\">\n <div\n v-if=\"getProps.title || $slots.title || $slots.extra\"\n class=\"description-header\"\n >\n <div class=\"description-title\">\n <!-- 自定义标题插槽 -->\n <slot v-if=\"$slots.title\" name=\"title\" />\n <template v-else-if=\"getProps.title\">\n <span>{{ getProps.title }}</span>\n <template v-if=\"getProps.helpMessageOptions?.helpMessage\">\n <a-tooltip\n v-if=\"Array.isArray(getProps.helpMessageOptions.helpMessage)\"\n position=\"top\"\n >\n <icon-question-circle class=\"ml-2 cursor-help text-gray-400\" />\n <template #content>\n <div\n v-for=\"(msg, index) in getProps.helpMessageOptions.helpMessage\"\n :key=\"index\"\n >\n {{ msg }}\n </div>\n </template>\n </a-tooltip>\n <a-tooltip v-else position=\"top\">\n <icon-question-circle class=\"ml-2 cursor-help text-gray-400\" />\n <template #content>\n {{ getProps.helpMessageOptions.helpMessage }}\n </template>\n </a-tooltip>\n </template>\n </template>\n </div>\n <div v-if=\"getProps.extra || $slots.extra\" class=\"description-extra\">\n <slot v-if=\"$slots.extra\" name=\"extra\" />\n <span v-else>{{ getProps.extra }}</span>\n </div>\n </div>\n\n <a-descriptions v-bind=\"getBindValue\">\n <a-descriptions-item\n v-for=\"item in getSchema\"\n :key=\"item.field\"\n :label=\"item.label\"\n :span=\"item.span\"\n >\n <template #label>\n <div :style=\"getLabelStyle(item)\">\n {{ item.label }}\n </div>\n </template>\n <template #default>\n <div :style=\"getContentStyle(item)\">\n <!-- 自定义渲染 -->\n <template v-if=\"item.render\">\n <RenderContent\n :render=\"item.render\"\n :value=\"getFieldValue(item.field)\"\n :data=\"getProps.data || {}\"\n />\n </template>\n <!-- 默认渲染 -->\n <template v-else>\n {{ getFieldValue(item.field) }}\n </template>\n </div>\n </template>\n </a-descriptions-item>\n </a-descriptions>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {ref, computed, unref, onMounted, nextTick, h, defineComponent} from 'vue';\nimport type {CSSProperties, PropType} from 'vue';\nimport {IconQuestionCircle} from '@arco-design/web-vue/es/icon';\nimport type {\n BasicDescriptionProps,\n DescriptionEmits,\n DescriptionMethods,\n DescItem,\n Recordable,\n} from './types';\n\ndefineOptions({\n name: 'BasicDescription',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicDescriptionProps>(), {\n column: 3,\n size: 'medium',\n bordered: true,\n layout: 'horizontal',\n labelAlign: 'left',\n align: 'left',\n colon: true,\n});\n\nconst emit = defineEmits<DescriptionEmits>();\n\nconst propsRef = ref<Partial<BasicDescriptionProps>>({});\n\n// RenderContent 组件用于渲染自定义内容\ninterface RenderContentProps {\n render: (val: any, data: Recordable) => any;\n value: any;\n data: Recordable;\n}\n\nconst RenderContent = defineComponent({\n props: {\n render: {\n type: Function as PropType<RenderContentProps['render']>,\n required: true,\n },\n value: {\n type: [String, Number, Object, Array, Boolean] as PropType<any>,\n default: undefined,\n },\n data: {\n type: Object as PropType<Recordable>,\n default: () => ({}),\n },\n },\n setup(props: RenderContentProps) {\n return () => {\n const result = props.render(props.value, props.data);\n if (typeof result === 'string' || typeof result === 'number') {\n return h('span', result);\n }\n return result;\n };\n },\n});\n\n// 获取合并后的属性\nconst getProps = computed((): BasicDescriptionProps => {\n return {...props, ...unref(propsRef)} as BasicDescriptionProps;\n});\n\n// 获取绑定到 a-descriptions 的属性\nconst getBindValue = computed(() => {\n const propsData = unref(getProps);\n return {\n column: propsData.column,\n size: propsData.size,\n bordered: propsData.bordered,\n layout: propsData.layout,\n labelAlign: propsData.labelAlign,\n align: propsData.align,\n colon: propsData.colon,\n style: propsData.style,\n class: propsData.class,\n };\n});\n\n// 获取需要显示的 schema\nconst getSchema = computed(() => {\n const propsData = unref(getProps);\n const schema = propsData.schema || [];\n const data = propsData.data || {};\n\n return schema.filter((item) => {\n // 如果有 show 函数,根据函数返回值判断是否显示\n if (item.show && typeof item.show === 'function') {\n return item.show(data);\n }\n return true;\n });\n});\n\n// 获取字段值(支持嵌套字段访问,如 'user.name')\nconst getFieldValue = (field: string) => {\n const propsData = unref(getProps);\n const data = propsData.data || {};\n \n // 支持嵌套字段访问\n if (field.includes('.')) {\n return field.split('.').reduce((obj: any, key: string) => {\n return obj?.[key];\n }, data);\n }\n \n return data[field];\n};\n\n// 获取标签样式\nconst getLabelStyle = (item: DescItem): CSSProperties => {\n const style: CSSProperties = {...item.labelStyle};\n if (item.labelMinWidth) {\n style.minWidth = `${item.labelMinWidth}px`;\n }\n return style;\n};\n\n// 获取内容样式\nconst getContentStyle = (item: DescItem): CSSProperties => {\n const style: CSSProperties = {...item.contentStyle};\n if (item.contentMinWidth) {\n style.minWidth = `${item.contentMinWidth}px`;\n }\n return style;\n};\n\n// 设置 Description Props\nconst setDescriptionProps = (\n descriptionProps: Partial<BasicDescriptionProps>\n) => {\n propsRef.value = {...unref(propsRef), ...descriptionProps};\n};\n\n// 获取 Description Props\nconst getDescriptionProps = (): BasicDescriptionProps => {\n return unref(getProps);\n};\n\n// 暴露方法给外部\nconst descriptionMethods: DescriptionMethods = {\n setDescriptionProps,\n getDescriptionProps,\n};\n\ndefineExpose(descriptionMethods);\n\n// 组件挂载后触发注册事件\nonMounted(() => {\n nextTick(() => {\n emit('register', descriptionMethods);\n });\n});\n</script>\n\n<style scoped>\n.basic-description {\n width: 100%;\n}\n\n.description-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.description-title {\n font-size: 16px;\n font-weight: 600;\n display: flex;\n align-items: center;\n}\n\n.description-extra {\n font-size: 14px;\n color: var(--color-text-3, #86909c);\n}\n\n.ml-2 {\n margin-left: 8px;\n}\n\n.cursor-help {\n cursor: help;\n}\n\n.text-gray-400 {\n color: var(--color-text-3, #86909c);\n}\n</style>\n","import { ref, unref } from 'vue';\nimport type { BasicDescriptionProps, UseDescriptionReturnType, DescriptionMethods } from './types';\n\n/**\n * useDescription Hook\n * 用于外部组件调用 Description(参考 Vben Admin 设计)\n * @param props Description 初始配置\n * @returns [register, descriptionMethods]\n */\nexport function useDescription(props?: Partial<BasicDescriptionProps>): UseDescriptionReturnType {\n const descriptionRef = ref<Nullable<DescriptionMethods>>(null);\n const loadedRef = ref(false);\n\n /**\n * 注册 Description 实例\n */\n const register = (descriptionInstance: DescriptionMethods) => {\n descriptionRef.value = descriptionInstance;\n loadedRef.value = true;\n\n // 如果有初始配置,设置到 Description 实例\n if (props && Object.keys(props).length > 0) {\n setDescriptionProps(props);\n }\n };\n\n /**\n * 获取 Description 实例\n */\n const getDescription = (): DescriptionMethods => {\n const description = unref(descriptionRef);\n if (!description) {\n throw new Error('Description 实例尚未注册,请确保组件已挂载并正确使用 @register');\n }\n return description;\n };\n\n /**\n * 设置 Description Props\n */\n const setDescriptionProps = (descriptionProps: Partial<BasicDescriptionProps>) => {\n try {\n const description = getDescription();\n description.setDescriptionProps(descriptionProps);\n } catch (error) {\n console.error('设置 Description Props 失败:', error);\n }\n };\n\n /**\n * 获取 Description Props\n */\n const getDescriptionProps = (): BasicDescriptionProps => {\n try {\n const description = getDescription();\n return description.getDescriptionProps();\n } catch (error) {\n console.error('获取 Description Props 失败:', error);\n return {} as BasicDescriptionProps;\n }\n };\n\n return [\n register,\n {\n setDescriptionProps,\n getDescriptionProps,\n },\n ];\n}\n\n/**\n * 类型定义:可为空的泛型\n */\ntype Nullable<T> = T | null;\n\n","/**\n * 格式化日期\n * @param date 日期对象或时间戳\n * @param format 格式化字符串,默认 'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(\n date: Date | number,\n format: string = 'YYYY-MM-DD HH:mm:ss'\n): string {\n const d = typeof date === 'number' ? new Date(date) : date;\n \n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * 格式化数字,添加千分位分隔符\n * @param num 数字\n * @returns 格式化后的字符串\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString('zh-CN');\n}\n\n/**\n * 格式化文件大小\n * @param bytes 字节数\n * @returns 格式化后的文件大小字符串\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\n","/**\n * 验证邮箱格式\n * @param email 邮箱地址\n * @returns 是否为有效邮箱\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * 验证手机号格式(中国大陆)\n * @param phone 手机号\n * @returns 是否为有效手机号\n */\nexport function isValidPhone(phone: string): boolean {\n const phoneRegex = /^1[3-9]\\d{9}$/;\n return phoneRegex.test(phone);\n}\n\n/**\n * 验证URL格式\n * @param url URL地址\n * @returns 是否为有效URL\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 验证身份证号格式(中国大陆18位)\n * @param idCard 身份证号\n * @returns 是否为有效身份证号\n */\nexport function isValidIdCard(idCard: string): boolean {\n const idCardRegex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\n return idCardRegex.test(idCard);\n}\n\n","import { ref, watch, onBeforeUnmount, type Ref } from 'vue';\n\n/**\n * 防抖Hook\n * @param value 需要防抖的值\n * @param delay 延迟时间(毫秒)\n * @returns 防抖后的值\n */\nfunction useDebounce<T>(value: Ref<T>, delay: number = 300): Ref<T> {\n const debouncedValue = ref<T>(value.value) as Ref<T>;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const updateValue = (newValue: T) => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n debouncedValue.value = newValue;\n }, delay);\n };\n\n watch(\n value,\n (newValue) => {\n updateValue(newValue);\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n\n return debouncedValue;\n}\n\nexport default useDebounce;\n","import { ref } from 'vue';\n\n/**\n * 布尔值切换Hook\n * @param initialValue 初始值\n * @returns [当前值, 切换函数, 设置为true函数, 设置为false函数]\n */\nfunction useToggle(initialValue: boolean = false) {\n const value = ref(initialValue);\n\n const toggle = () => {\n value.value = !value.value;\n };\n\n const setTrue = () => {\n value.value = true;\n };\n\n const setFalse = () => {\n value.value = false;\n };\n\n return [value, toggle, setTrue, setFalse] as const;\n}\n\nexport default useToggle;\n"],"names":["_openBlock","_createBlock","_mergeProps","_createVNode","_createElementBlock","_Fragment","_renderList","_resolveDynamicComponent","_unref","_normalizeProps","_guardReactiveProps","_createTextVNode","_toDisplayString","_renderSlot","options","_export_sfc","_sfc_main","_hoisted_1","_sfc_render","opt","_hoisted_2","_hoisted_3","_createElementVNode","_hoisted_4","_hoisted_5","_withDirectives","_createSlots","_vShow","_withCtx","$slots","_normalizeStyle","_normalizeClass","props"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]}