knt-shared 1.4.5 → 1.4.7
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.
- package/dist/components/Modal/BasicModal.vue.d.ts +28 -10
- package/dist/components/Modal/BasicModal.vue.d.ts.map +1 -1
- package/dist/components/Modal/types.d.ts +83 -35
- package/dist/components/Modal/types.d.ts.map +1 -1
- package/dist/components/Modal/useModal.d.ts.map +1 -1
- package/dist/components/Modal/useModalInner.d.ts.map +1 -1
- package/dist/components/Table/BasicTable.vue.d.ts.map +1 -1
- package/dist/components/Table/useTable.d.ts.map +1 -1
- package/dist/index.cjs.js +98 -36
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +98 -36
- package/dist/index.esm.js.map +1 -1
- package/dist/style.css +15 -15
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../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-exclamation-circle/icon-exclamation-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-exclamation-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-plus/icon-plus.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-plus/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-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-eye/icon-eye.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-eye/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-upload/icon-upload.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-upload/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-delete/icon-delete.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-delete/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","../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-mute/icon-mute.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-mute/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-pause/icon-pause.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-pause/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-play-arrow/icon-play-arrow.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-play-arrow/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-sound/icon-sound.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-sound/index.js","../src/components/Upload/components/SortableFileItem.vue","../src/components/Upload/components/SortableFileList.vue","../src/components/Upload/components/VideoPreview.vue","../src/components/Upload/components/VideoPreviewModal.vue","../src/components/Upload/BasicUpload.vue","../src/components/Upload/useUpload.ts","../src/components/Form/componentMap.ts","../src/components/ReadonlyField/utils.ts","../src/components/ReadonlyField/renderers.ts","../src/components/ReadonlyField/BasicReadonlyField.vue","../src/components/ReadonlyField/useReadonlyField.ts","../src/components/Form/BasicForm.vue","../src/components/Form/useForm.ts","../src/utils/debounce.ts","../src/components/TextEllipsis/BasicTextEllipsis.vue","../src/hooks/useLocalStorage.ts","../src/components/Table/components/componentMap.ts","../src/components/Table/components/hooks/useTrim.ts","../src/components/Table/components/utils.ts","../src/components/Table/components/hooks/useComponentProps.ts","../src/components/Table/components/hooks/useEditCellValue.ts","../src/components/Table/components/hooks/formatters.ts","../src/components/Table/components/hooks/useEditFormat.ts","../src/components/Table/components/EditCell.vue","../src/components/Table/hooks/useEditValidation.ts","../src/components/Table/hooks/useTableEdit.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/utils/diff.ts","../src/hooks/useDebounce.ts","../src/hooks/useToggle.ts"],"sourcesContent":["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: \"IconExclamationCircle\",\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}-exclamation-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: \"M24 28V14m0 16v4M6 24c0-9.941 8.059-18 18-18s18 8.059 18 18-8.059 18-18 18S6 33.941 6 24Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconExclamationCircle = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconExclamationCircle as default };\n","import _IconExclamationCircle from \"./icon-exclamation-circle.js\";\nconst IconExclamationCircle = Object.assign(_IconExclamationCircle, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconExclamationCircle.name, _IconExclamationCircle);\n }\n});\nexport { IconExclamationCircle 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: \"IconPlus\",\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}-plus`, { [`${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: \"M5 24h38M24 5v38\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPlus = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPlus as default };\n","import _IconPlus from \"./icon-plus.js\";\nconst IconPlus = Object.assign(_IconPlus, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPlus.name, _IconPlus);\n }\n});\nexport { IconPlus 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: \"IconEye\",\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}-eye`, { [`${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\", {\n \"clip-rule\": \"evenodd\",\n d: \"M24 37c6.627 0 12.627-4.333 18-13-5.373-8.667-11.373-13-18-13-6.627 0-12.627 4.333-18 13 5.373 8.667 11.373 13 18 13Z\"\n }, null, -1),\n createElementVNode(\"path\", { d: \"M29 24a5 5 0 1 1-10 0 5 5 0 0 1 10 0Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconEye = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconEye as default };\n","import _IconEye from \"./icon-eye.js\";\nconst IconEye = Object.assign(_IconEye, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconEye.name, _IconEye);\n }\n});\nexport { IconEye 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: \"IconUpload\",\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}-upload`, { [`${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: \"M14.93 17.071 24.001 8l9.071 9.071m-9.07 16.071v-25M40 35v6H8v-6\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconUpload = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconUpload as default };\n","import _IconUpload from \"./icon-upload.js\";\nconst IconUpload = Object.assign(_IconUpload, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconUpload.name, _IconUpload);\n }\n});\nexport { IconUpload 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: \"IconDelete\",\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}-delete`, { [`${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: \"M5 11h5.5m0 0v29a1 1 0 0 0 1 1h25a1 1 0 0 0 1-1V11m-27 0H16m21.5 0H43m-5.5 0H32m-16 0V7h16v4m-16 0h16M20 18v15m8-15v15\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconDelete = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconDelete as default };\n","import _IconDelete from \"./icon-delete.js\";\nconst IconDelete = Object.assign(_IconDelete, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconDelete.name, _IconDelete);\n }\n});\nexport { IconDelete 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","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: \"IconMute\",\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}-mute`, { [`${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: \"m19 11.5 4.833-4.35a.1.1 0 0 1 .167.075V17m-14-1H7.1a.1.1 0 0 0-.1.1v15.8a.1.1 0 0 0 .1.1H14l9.833 8.85a.1.1 0 0 0 .167-.075V31m6.071-14.071C32.535 19.393 34 23 32.799 26m2.929-14.728C41.508 17.052 42.5 25 39.123 32M6.5 6.5l35 35\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconMute = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconMute as default };\n","import _IconMute from \"./icon-mute.js\";\nconst IconMute = Object.assign(_IconMute, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconMute.name, _IconMute);\n }\n});\nexport { IconMute 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: \"IconPause\",\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}-pause`, { [`${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: \"M14 12h4v24h-4zM30 12h4v24h-4z\" }, null, -1),\n createElementVNode(\"path\", {\n fill: \"currentColor\",\n stroke: \"none\",\n d: \"M14 12h4v24h-4zM30 12h4v24h-4z\"\n }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPause = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPause as default };\n","import _IconPause from \"./icon-pause.js\";\nconst IconPause = Object.assign(_IconPause, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPause.name, _IconPause);\n }\n});\nexport { IconPause 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: \"IconPlayArrow\",\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}-play-arrow`, { [`${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: \"M12.533 7.965A1 1 0 0 0 11 8.81v30.377a1 1 0 0 0 1.533.846L36.656 24.84a1 1 0 0 0 0-1.692L12.533 7.965Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPlayArrow = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPlayArrow as default };\n","import _IconPlayArrow from \"./icon-play-arrow.js\";\nconst IconPlayArrow = Object.assign(_IconPlayArrow, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPlayArrow.name, _IconPlayArrow);\n }\n});\nexport { IconPlayArrow 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: \"IconSound\",\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}-sound`, { [`${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: \"m14 16 10-9v34l-10-9H6V16h8Z\" }, null, -1),\n createElementVNode(\"path\", { d: \"M31.071 16.929c3.905 3.905 3.905 10.237 0 14.142M36.727 11.272c7.03 7.03 7.03 18.426 0 25.456\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconSound = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconSound as default };\n","import _IconSound from \"./icon-sound.js\";\nconst IconSound = Object.assign(_IconSound, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconSound.name, _IconSound);\n }\n});\nexport { IconSound as default };\n","<template>\n <div\n class=\"sortable-file-item\"\n :class=\"{\n 'is-dragging': isDragging,\n 'is-over': isOver,\n 'is-uploading': file.status === 'uploading',\n 'is-error': file.status === 'error',\n 'is-disabled': disabled,\n 'is-video': isVideoFile(file),\n }\"\n :draggable=\"!disabled\"\n :style=\"{\n width: `${cardSize}px`,\n height: `${cardSize}px`,\n }\"\n @dragstart=\"handleDragStart\"\n @dragend=\"handleDragEnd\"\n >\n <!-- 图片预览 -->\n <img v-if=\"file.url\" :src=\"file.url\" :alt=\"file.name\" class=\"file-image\" />\n\n <!-- 上传进度 -->\n <div v-if=\"file.status === 'uploading'\" class=\"upload-progress\">\n <a-progress :percent=\"file.percent || 0\" size=\"mini\" />\n </div>\n\n <!-- 操作遮罩 -->\n <div v-if=\"file.status === 'done'\" class=\"file-mask\">\n <div class=\"file-actions\">\n <icon-eye class=\"action-icon\" @click=\"handlePreview\" />\n <icon-delete v-if=\"!disabled\" class=\"action-icon\" @click=\"handleRemove\" />\n </div>\n </div>\n\n <!-- 错误提示 -->\n <div v-if=\"file.status === 'error'\" class=\"error-tip\">\n <icon-exclamation-circle />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { IconEye, IconDelete, IconExclamationCircle } from '@arco-design/web-vue/es/icon';\n import type { UploadFileItem } from '../types';\n\n defineOptions({\n name: 'SortableFileItem',\n });\n\n interface SortableFileItemProps {\n /** 文件对象 */\n file: UploadFileItem;\n /** 是否正在拖拽 */\n isDragging: boolean;\n /** 是否为拖拽目标 */\n isOver: boolean;\n /** 卡片尺寸 */\n cardSize: number;\n /** 是否禁用(readonly 或 disabled 状态下为 true) */\n disabled: boolean;\n }\n\n interface SortableFileItemEmits {\n (e: 'dragstart', event: DragEvent): void;\n (e: 'dragend', event: DragEvent): void;\n (e: 'preview', file: UploadFileItem): void;\n (e: 'remove', file: UploadFileItem): void;\n }\n\n const props = withDefaults(defineProps<SortableFileItemProps>(), {\n isDragging: false,\n isOver: false,\n cardSize: 80,\n disabled: false,\n });\n\n const emit = defineEmits<SortableFileItemEmits>();\n\n /**\n * 判断文件是否为视频\n */\n const isVideoFile = (file: UploadFileItem): boolean => {\n if (!file.url && !file.name) return false;\n const fileName = file.name || '';\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v'];\n return videoExtensions.some(ext => fileName.toLowerCase().endsWith(ext));\n };\n\n /**\n * 拖拽开始\n */\n const handleDragStart = (event: DragEvent) => {\n if (props.disabled) {\n event.preventDefault();\n return;\n }\n emit('dragstart', event);\n };\n\n /**\n * 拖拽结束\n */\n const handleDragEnd = (event: DragEvent) => {\n emit('dragend', event);\n };\n\n /**\n * 预览文件\n */\n const handlePreview = () => {\n emit('preview', props.file);\n };\n\n /**\n * 删除文件\n */\n const handleRemove = () => {\n if (!props.disabled) {\n emit('remove', props.file);\n }\n };\n</script>\n\n<style scoped>\n .sortable-file-item {\n position: relative;\n overflow: hidden;\n border: 1px solid var(--color-border-2);\n border-radius: 4px;\n cursor: move;\n transition: all 0.3s;\n user-select: none;\n background-color: var(--color-fill-1);\n }\n\n /* 禁用状态 */\n .sortable-file-item.is-disabled {\n cursor: default;\n opacity: 0.6;\n }\n\n .file-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* 视频文件样式 */\n .sortable-file-item.is-video {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n .sortable-file-item.is-video .file-image {\n opacity: 0;\n }\n\n .sortable-file-item.is-video::before {\n content: '▶';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 32px;\n color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n pointer-events: none;\n }\n\n /* 拖拽中状态 */\n .sortable-file-item.is-dragging {\n opacity: 0.5;\n transform: scale(0.95);\n border-color: rgb(var(--primary-6));\n }\n\n /* 拖拽目标状态 */\n .sortable-file-item.is-over {\n border: 2px dashed rgb(var(--primary-6));\n background-color: var(--color-primary-light-1);\n }\n\n /* 操作遮罩 */\n .file-mask {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s;\n }\n\n .sortable-file-item:hover .file-mask {\n opacity: 1;\n }\n\n .file-actions {\n display: flex;\n gap: 12px;\n }\n\n .action-icon {\n color: white;\n font-size: 18px;\n cursor: pointer;\n transition: transform 0.2s;\n }\n\n .action-icon:hover {\n transform: scale(1.2);\n }\n\n /* 上传进度 */\n .upload-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 8px;\n background-color: rgba(255, 255, 255, 0.95);\n }\n\n /* 上传中状态 */\n .sortable-file-item.is-uploading {\n cursor: default;\n }\n\n /* 错误状态 */\n .sortable-file-item.is-error {\n border-color: rgb(var(--danger-6));\n }\n\n .error-tip {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: rgb(var(--danger-6));\n font-size: 26px;\n }\n</style>\n","<template>\n <div class=\"sortable-file-list\">\n <SortableFileItem\n v-for=\"(file, index) in fileList\"\n :key=\"file.uid\"\n :file=\"file\"\n :card-size=\"cardSize\"\n :disabled=\"disabled\"\n :is-dragging=\"dragState.dragIndex === index\"\n :is-over=\"dragState.overIndex === index\"\n @dragstart=\"handleDragStart($event, index)\"\n @dragover.prevent=\"handleDragOver($event, index)\"\n @drop=\"handleDrop($event, index)\"\n @dragend=\"handleDragEnd\"\n @preview=\"handlePreview\"\n @remove=\"handleRemove\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { reactive } from 'vue';\n import SortableFileItem from './SortableFileItem.vue';\n import type { UploadFileItem, DragState } from '../types';\n\n defineOptions({\n name: 'SortableFileList',\n });\n\n interface SortableFileListProps {\n /** 文件列表 */\n fileList: UploadFileItem[];\n /** 卡片尺寸 */\n cardSize: number;\n /** 是否禁用(readonly 或 disabled 状态下为 true) */\n disabled: boolean;\n }\n\n interface SortableFileListEmits {\n (e: 'update:fileList', fileList: UploadFileItem[]): void;\n (e: 'sortChange', fileList: UploadFileItem[]): void;\n (e: 'preview', file: UploadFileItem): void;\n (e: 'remove', file: UploadFileItem): void;\n }\n\n const props = withDefaults(defineProps<SortableFileListProps>(), {\n fileList: () => [],\n cardSize: 80,\n disabled: false,\n });\n\n const emit = defineEmits<SortableFileListEmits>();\n\n // 拖拽状态管理\n const dragState = reactive<DragState>({\n dragIndex: null,\n overIndex: null,\n });\n\n /**\n * 拖拽开始\n */\n const handleDragStart = (event: DragEvent, index: number) => {\n if (props.disabled) {\n event.preventDefault();\n return;\n }\n\n dragState.dragIndex = index;\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('text/plain', String(index));\n };\n\n /**\n * 拖拽经过\n */\n const handleDragOver = (event: DragEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n event.preventDefault();\n dragState.overIndex = index;\n event.dataTransfer!.dropEffect = 'move';\n };\n\n /**\n * 放置处理\n */\n const handleDrop = (event: DragEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n event.preventDefault();\n\n const fromIndex = dragState.dragIndex;\n const toIndex = index;\n\n if (fromIndex === null || fromIndex === toIndex) {\n return;\n }\n\n // 重新排列文件列表\n const newFileList = [...props.fileList];\n const [movedItem] = newFileList.splice(fromIndex, 1);\n newFileList.splice(toIndex, 0, movedItem);\n\n emit('update:fileList', newFileList);\n emit('sortChange', newFileList);\n\n // 清理状态\n dragState.dragIndex = null;\n dragState.overIndex = null;\n };\n\n /**\n * 拖拽结束\n */\n const handleDragEnd = () => {\n dragState.dragIndex = null;\n dragState.overIndex = null;\n };\n\n /**\n * 预览文件\n */\n const handlePreview = (file: UploadFileItem) => {\n emit('preview', file);\n };\n\n /**\n * 删除文件\n */\n const handleRemove = (file: UploadFileItem) => {\n emit('remove', file);\n };\n</script>\n\n<style scoped>\n .sortable-file-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n</style>\n","<template>\n <div class=\"video-preview\" :class=\"{ fullscreen: isFullscreen }\">\n <div class=\"video-container\" @click=\"togglePlay\">\n <video\n ref=\"videoRef\"\n :src=\"videoUrl\"\n :autoplay=\"playerOptions?.autoplay\"\n :loop=\"playerOptions?.loop\"\n :muted=\"isMuted\"\n :preload=\"playerOptions?.preload || 'metadata'\"\n @loadedmetadata=\"handleLoadedMetadata\"\n @timeupdate=\"handleTimeUpdate\"\n @play=\"isPlaying = true\"\n @pause=\"isPlaying = false\"\n @ended=\"handleEnded\"\n @volumechange=\"handleVolumeChange\"\n />\n \n <!-- 播放按钮覆盖层 -->\n <div v-if=\"!isPlaying && !isLoading\" class=\"play-overlay\">\n <div class=\"play-button\">\n <icon-play-arrow :size=\"48\" />\n </div>\n </div>\n\n <!-- 加载中 -->\n <div v-if=\"isLoading\" class=\"loading-overlay\">\n <a-spin :size=\"48\" />\n </div>\n </div>\n\n <!-- 自定义控制条 -->\n <div v-if=\"playerOptions?.controls !== false\" class=\"video-controls\" @click.stop>\n <div class=\"progress-bar-container\" @click=\"handleProgressClick\">\n <div class=\"progress-bar\">\n <div class=\"progress-bar-loaded\" :style=\"{ width: `${loadedPercent}%` }\" />\n <div class=\"progress-bar-played\" :style=\"{ width: `${playedPercent}%` }\" />\n <div\n class=\"progress-bar-handle\"\n :style=\"{ left: `${playedPercent}%` }\"\n @mousedown=\"handleProgressMouseDown\"\n />\n </div>\n </div>\n\n <div class=\"controls-bottom\">\n <div class=\"controls-left\">\n <!-- 播放/暂停 -->\n <button class=\"control-button\" @click=\"togglePlay\">\n <icon-pause v-if=\"isPlaying\" :size=\"20\" />\n <icon-play-arrow v-else :size=\"20\" />\n </button>\n\n <!-- 音量 -->\n <div class=\"volume-control\" @mouseenter=\"showVolumeSlider = true\" @mouseleave=\"showVolumeSlider = false\">\n <button class=\"control-button\" @click=\"toggleMute\">\n <icon-mute v-if=\"isMuted || volume === 0\" :size=\"20\" />\n <icon-sound v-else :size=\"20\" />\n </button>\n <div v-show=\"showVolumeSlider\" class=\"volume-slider-container\">\n <input\n v-model.number=\"volume\"\n type=\"range\"\n min=\"0\"\n max=\"100\"\n class=\"volume-slider\"\n @input=\"handleVolumeInput\"\n />\n </div>\n </div>\n\n <!-- 时间显示 -->\n <span class=\"time-display\">\n {{ formatTime(currentTime) }} / {{ formatTime(duration) }}\n </span>\n </div>\n\n <div class=\"controls-right\">\n <!-- 播放速度 -->\n <a-dropdown :popup-max-height=\"false\">\n <button class=\"control-button\">\n {{ playbackRate }}x\n </button>\n <template #content>\n <a-doption\n v-for=\"rate in playbackRates\"\n :key=\"rate\"\n :value=\"rate\"\n @click=\"setPlaybackRate(rate)\"\n >\n {{ rate }}x\n </a-doption>\n </template>\n </a-dropdown>\n\n <!-- 全屏 -->\n <button class=\"control-button\" @click=\"toggleFullscreen\">\n <icon-fullscreen-exit v-if=\"isFullscreen\" :size=\"20\" />\n <icon-fullscreen v-else :size=\"20\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue';\n import {\n IconPlayArrow,\n IconPause,\n IconSound,\n IconMute,\n IconFullscreen,\n IconFullscreenExit,\n } from '@arco-design/web-vue/es/icon';\n\n interface VideoPlayerOptions {\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n }\n\n interface VideoPreviewProps {\n videoUrl: string;\n playerOptions?: VideoPlayerOptions;\n }\n\n defineOptions({\n name: 'VideoPreview',\n });\n\n const props = withDefaults(defineProps<VideoPreviewProps>(), {\n playerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<{\n play: [];\n pause: [];\n ended: [];\n timeupdate: [time: number];\n }>();\n\n // 视频元素引用\n const videoRef = ref<HTMLVideoElement>();\n\n // 播放状态\n const isPlaying = ref(false);\n const isLoading = ref(true);\n const currentTime = ref(0);\n const duration = ref(0);\n const loadedPercent = ref(0);\n\n // 音量控制\n const volume = ref(100);\n const isMuted = ref(props.playerOptions?.muted || false);\n const showVolumeSlider = ref(false);\n\n // 播放速度\n const playbackRate = ref(1);\n const playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2];\n\n // 全屏状态\n const isFullscreen = ref(false);\n\n // 进度条拖拽\n const isDraggingProgress = ref(false);\n\n // 计算播放进度百分比\n const playedPercent = computed(() => {\n if (duration.value === 0) return 0;\n return (currentTime.value / duration.value) * 100;\n });\n\n /**\n * 格式化时间显示\n */\n const formatTime = (seconds: number): string => {\n if (!isFinite(seconds)) return '00:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n };\n\n /**\n * 切换播放/暂停\n */\n const togglePlay = () => {\n if (!videoRef.value) return;\n\n if (isPlaying.value) {\n videoRef.value.pause();\n emit('pause');\n } else {\n videoRef.value.play();\n emit('play');\n }\n };\n\n /**\n * 切换静音\n */\n const toggleMute = () => {\n if (!videoRef.value) return;\n isMuted.value = !isMuted.value;\n videoRef.value.muted = isMuted.value;\n };\n\n /**\n * 音量调节\n */\n const handleVolumeInput = (event: Event) => {\n if (!videoRef.value) return;\n const target = event.target as HTMLInputElement;\n const newVolume = Number(target.value);\n volume.value = newVolume;\n videoRef.value.volume = newVolume / 100;\n if (newVolume > 0 && isMuted.value) {\n isMuted.value = false;\n }\n };\n\n /**\n * 设置播放速度\n */\n const setPlaybackRate = (rate: number) => {\n if (!videoRef.value) return;\n playbackRate.value = rate;\n videoRef.value.playbackRate = rate;\n };\n\n /**\n * 切换全屏\n */\n const toggleFullscreen = async () => {\n const container = videoRef.value?.parentElement?.parentElement;\n if (!container) return;\n\n try {\n if (!isFullscreen.value) {\n if (container.requestFullscreen) {\n await container.requestFullscreen();\n } else if ((container as any).webkitRequestFullscreen) {\n await (container as any).webkitRequestFullscreen();\n } else if ((container as any).mozRequestFullScreen) {\n await (container as any).mozRequestFullScreen();\n } else if ((container as any).msRequestFullscreen) {\n await (container as any).msRequestFullscreen();\n }\n } else {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n } else if ((document as any).webkitExitFullscreen) {\n await (document as any).webkitExitFullscreen();\n } else if ((document as any).mozCancelFullScreen) {\n await (document as any).mozCancelFullScreen();\n } else if ((document as any).msExitFullscreen) {\n await (document as any).msExitFullscreen();\n }\n }\n } catch (error) {\n console.error('全屏切换失败:', error);\n }\n };\n\n /**\n * 进度条点击\n */\n const handleProgressClick = (event: MouseEvent) => {\n if (!videoRef.value) return;\n const target = event.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n const percent = (event.clientX - rect.left) / rect.width;\n videoRef.value.currentTime = percent * duration.value;\n };\n\n /**\n * 进度条拖拽开始\n */\n const handleProgressMouseDown = (event: MouseEvent) => {\n event.preventDefault();\n isDraggingProgress.value = true;\n document.addEventListener('mousemove', handleProgressMouseMove);\n document.addEventListener('mouseup', handleProgressMouseUp);\n };\n\n /**\n * 进度条拖拽中\n */\n const handleProgressMouseMove = (event: MouseEvent) => {\n if (!isDraggingProgress.value || !videoRef.value) return;\n const container = videoRef.value.parentElement?.parentElement?.querySelector('.progress-bar-container') as HTMLElement;\n if (!container) return;\n \n const rect = container.getBoundingClientRect();\n let percent = (event.clientX - rect.left) / rect.width;\n percent = Math.max(0, Math.min(1, percent));\n videoRef.value.currentTime = percent * duration.value;\n };\n\n /**\n * 进度条拖拽结束\n */\n const handleProgressMouseUp = () => {\n isDraggingProgress.value = false;\n document.removeEventListener('mousemove', handleProgressMouseMove);\n document.removeEventListener('mouseup', handleProgressMouseUp);\n };\n\n /**\n * 视频元数据加载完成\n */\n const handleLoadedMetadata = () => {\n if (!videoRef.value) return;\n duration.value = videoRef.value.duration;\n isLoading.value = false;\n };\n\n /**\n * 时间更新\n */\n const handleTimeUpdate = () => {\n if (!videoRef.value || isDraggingProgress.value) return;\n currentTime.value = videoRef.value.currentTime;\n \n // 更新缓冲进度\n if (videoRef.value.buffered.length > 0) {\n const bufferedEnd = videoRef.value.buffered.end(videoRef.value.buffered.length - 1);\n loadedPercent.value = (bufferedEnd / duration.value) * 100;\n }\n \n emit('timeupdate', currentTime.value);\n };\n\n /**\n * 视频播放结束\n */\n const handleEnded = () => {\n isPlaying.value = false;\n emit('ended');\n };\n\n /**\n * 音量变化\n */\n const handleVolumeChange = () => {\n if (!videoRef.value) return;\n volume.value = videoRef.value.volume * 100;\n isMuted.value = videoRef.value.muted;\n };\n\n /**\n * 监听全屏变化\n */\n const handleFullscreenChange = () => {\n isFullscreen.value = !!(\n document.fullscreenElement ||\n (document as any).webkitFullscreenElement ||\n (document as any).mozFullScreenElement ||\n (document as any).msFullscreenElement\n );\n };\n\n // 监听 videoUrl 变化\n watch(\n () => props.videoUrl,\n () => {\n isLoading.value = true;\n currentTime.value = 0;\n duration.value = 0;\n isPlaying.value = false;\n }\n );\n\n onMounted(() => {\n // 监听全屏变化事件\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n document.addEventListener('webkitfullscreenchange', handleFullscreenChange);\n document.addEventListener('mozfullscreenchange', handleFullscreenChange);\n document.addEventListener('MSFullscreenChange', handleFullscreenChange);\n });\n\n onUnmounted(() => {\n // 清理事件监听\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n document.removeEventListener('webkitfullscreenchange', handleFullscreenChange);\n document.removeEventListener('mozfullscreenchange', handleFullscreenChange);\n document.removeEventListener('MSFullscreenChange', handleFullscreenChange);\n document.removeEventListener('mousemove', handleProgressMouseMove);\n document.removeEventListener('mouseup', handleProgressMouseUp);\n });\n\n // 暴露方法\n defineExpose({\n play: () => videoRef.value?.play(),\n pause: () => videoRef.value?.pause(),\n togglePlay,\n toggleMute,\n setPlaybackRate,\n toggleFullscreen,\n });\n</script>\n\n<style scoped>\n .video-preview {\n width: 100%;\n max-width: 100%;\n background: #000;\n border-radius: 4px;\n overflow: hidden;\n position: relative;\n }\n\n .video-preview.fullscreen {\n border-radius: 0;\n }\n\n .video-container {\n position: relative;\n width: 100%;\n background: #000;\n cursor: pointer;\n }\n\n video {\n width: 100%;\n height: auto;\n display: block;\n max-height: 70vh;\n }\n\n .fullscreen video {\n max-height: 100vh;\n }\n\n .play-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.3);\n transition: opacity 0.3s;\n }\n\n .play-button {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #000;\n transition: transform 0.2s;\n }\n\n .play-button:hover {\n transform: scale(1.1);\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n }\n\n .video-controls {\n background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);\n padding: 12px;\n position: relative;\n }\n\n .progress-bar-container {\n padding: 8px 0;\n cursor: pointer;\n margin-bottom: 8px;\n }\n\n .progress-bar {\n height: 4px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 2px;\n position: relative;\n overflow: visible;\n }\n\n .progress-bar-loaded {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: rgba(255, 255, 255, 0.5);\n border-radius: 2px;\n transition: width 0.2s;\n }\n\n .progress-bar-played {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--color-primary-light-4, #165dff);\n border-radius: 2px;\n transition: width 0.1s;\n }\n\n .progress-bar-handle {\n position: absolute;\n top: 50%;\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .progress-bar-container:hover .progress-bar-handle {\n opacity: 1;\n }\n\n .controls-bottom {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .controls-left,\n .controls-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .control-button {\n background: transparent;\n border: none;\n color: #fff;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background 0.2s;\n font-size: 14px;\n min-width: 32px;\n height: 32px;\n }\n\n .control-button:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n\n .volume-control {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .volume-slider-container {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n padding: 12px 8px;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n\n .volume-slider {\n writing-mode: vertical-lr; \n direction: rtl;\n width: 4px;\n height: 80px;\n padding: 0;\n margin: 0;\n }\n\n .volume-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n cursor: pointer;\n }\n\n .volume-slider::-moz-range-thumb {\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n cursor: pointer;\n border: none;\n }\n\n .time-display {\n color: #fff;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: none;\n }\n\n /* 响应式 */\n @media (max-width: 768px) {\n .play-button {\n width: 60px;\n height: 60px;\n }\n\n .control-button {\n min-width: 28px;\n height: 28px;\n }\n\n .time-display {\n font-size: 12px;\n }\n }\n</style>\n","<template>\n <a-modal\n :visible=\"visible\"\n :footer=\"false\"\n :simple=\"true\"\n :mask-closable=\"true\"\n :esc-to-close=\"true\"\n width=\"auto\"\n :modal-class=\"'video-preview-modal'\"\n @cancel=\"handleClose\"\n >\n <template #title>\n <div class=\"video-modal-title\">\n <span class=\"file-name\">{{ fileName || '视频预览' }}</span>\n </div>\n </template>\n \n <div class=\"video-modal-content\">\n <VideoPreview\n v-if=\"videoUrl\"\n :video-url=\"videoUrl\"\n :player-options=\"playerOptions\"\n @play=\"handlePlay\"\n @pause=\"handlePause\"\n @ended=\"handleEnded\"\n />\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\n import { watch } from 'vue';\n import VideoPreview from './VideoPreview.vue';\n\n interface VideoPlayerOptions {\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n }\n\n interface VideoPreviewModalProps {\n visible: boolean;\n videoUrl: string;\n fileName?: string;\n playerOptions?: VideoPlayerOptions;\n }\n\n interface VideoPreviewModalEmits {\n (e: 'update:visible', value: boolean): void;\n (e: 'play'): void;\n (e: 'pause'): void;\n (e: 'ended'): void;\n }\n\n defineOptions({\n name: 'VideoPreviewModal',\n });\n\n const props = withDefaults(defineProps<VideoPreviewModalProps>(), {\n visible: false,\n videoUrl: '',\n fileName: '',\n playerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<VideoPreviewModalEmits>();\n\n /**\n * 关闭模态框\n */\n const handleClose = () => {\n emit('update:visible', false);\n };\n\n /**\n * 播放事件\n */\n const handlePlay = () => {\n emit('play');\n };\n\n /**\n * 暂停事件\n */\n const handlePause = () => {\n emit('pause');\n };\n\n /**\n * 播放结束事件\n */\n const handleEnded = () => {\n emit('ended');\n };\n\n // 监听 visible 变化,当关闭时停止播放\n watch(\n () => props.visible,\n (newVisible) => {\n if (!newVisible) {\n // 模态框关闭时可以进行清理操作\n }\n }\n );\n</script>\n\n<style>\n .video-preview-modal .arco-modal {\n max-width: 90vw;\n max-height: 90vh;\n }\n\n .video-preview-modal .arco-modal-header {\n border-bottom: 1px solid var(--color-border-2);\n padding: 16px 20px;\n }\n\n .video-preview-modal .arco-modal-body {\n padding: 0;\n max-height: calc(90vh - 60px);\n overflow: hidden;\n }\n</style>\n\n<style scoped>\n .video-modal-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n }\n\n .file-name {\n font-size: 16px;\n font-weight: 500;\n color: var(--color-text-1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 600px;\n }\n\n .video-modal-content {\n width: 100%;\n min-width: 400px;\n max-width: 90vw;\n background: #000;\n }\n\n @media (max-width: 768px) {\n .video-modal-content {\n min-width: auto;\n }\n\n .file-name {\n font-size: 14px;\n max-width: 250px;\n }\n }\n</style>\n","<template>\n <div class=\"basic-upload\">\n <!-- 当不启用拖拽排序或非 picture-card 模式时,使用原生 Arco Upload -->\n <a-upload\n v-if=\"!shouldUseSortable\"\n ref=\"uploadRef\"\n v-bind=\"getBindValue\"\n :file-list=\"fileListRef\"\n :custom-request=\"handleCustomRequest\"\n @change=\"handleChange\"\n @before-upload=\"handleBeforeUpload\"\n @progress=\"handleProgress\"\n @preview=\"handlePreview\"\n >\n <template v-if=\"!hideUploadButton\" #upload-button>\n <slot name=\"upload-button\">\n <template v-if=\"getProps.listType === 'picture-card'\">\n <div\n class=\"upload-card-button\"\n :style=\"{\n width: cardSizeValue,\n height: cardSizeValue,\n }\"\n >\n <icon-plus :size=\"16\" />\n <div v-if=\"getProps.uploadButtonText\" class=\"upload-text\">\n {{ getProps.uploadButtonText }}\n </div>\n </div>\n </template>\n <template v-else>\n <a-button :type=\"getProps.uploadButtonType || 'primary'\">\n <template #icon>\n <icon-upload />\n </template>\n {{ getProps.uploadButtonText || '上传文件' }}\n </a-button>\n </template>\n </slot>\n </template>\n\n <!-- 自定义上传区域内容 -->\n <template v-if=\"$slots.default\" #default>\n <slot />\n </template>\n\n <!-- 提示信息 -->\n <template v-if=\"getProps.tip || $slots.tip\" #tip>\n <slot name=\"tip\">\n <div class=\"upload-tip\">{{ getProps.tip }}</div>\n </slot>\n </template>\n\n <!-- 自定义文件列表项 -->\n <template v-if=\"$slots.file\" #file=\"{ file }\">\n <slot name=\"file\" :file=\"file\" />\n </template>\n </a-upload>\n\n <!-- 当启用拖拽排序且为 picture-card 模式时,使用自定义可拖拽列表 -->\n <div v-else class=\"sortable-upload-container\">\n <!-- 可拖拽文件列表 -->\n <SortableFileList\n v-if=\"fileListRef.length > 0\"\n :file-list=\"fileListRef\"\n :card-size=\"getProps.cardSize || 80\"\n :disabled=\"getProps.readonly || getProps.disabled\"\n @update:file-list=\"handleFileListUpdate\"\n @sort-change=\"handleSortChange\"\n @preview=\"handlePreview\"\n @remove=\"handleRemoveFile\"\n />\n \n <!-- 上传按钮区域 -->\n <a-upload\n ref=\"uploadRef\"\n v-bind=\"getBindValue\"\n :file-list=\"fileListRef\"\n :show-file-list=\"false\"\n :custom-request=\"handleCustomRequest\"\n @change=\"handleChange\"\n @before-upload=\"handleBeforeUpload\"\n @progress=\"handleProgress\"\n >\n <template v-if=\"!hideUploadButton\" #upload-button>\n <slot name=\"upload-button\">\n <div\n class=\"upload-card-button\"\n :style=\"{\n width: cardSizeValue,\n height: cardSizeValue,\n }\"\n >\n <icon-plus :size=\"16\" />\n <div v-if=\"getProps.uploadButtonText\" class=\"upload-text\">\n {{ getProps.uploadButtonText }}\n </div>\n </div>\n </slot>\n </template>\n </a-upload>\n\n <!-- 提示信息 -->\n <div v-if=\"getProps.tip\" class=\"upload-tip sortable-tip\">{{ getProps.tip }}</div>\n </div>\n\n <!-- 图片预览 -->\n <a-image\n v-if=\"previewImageUrl\"\n :src=\"previewImageUrl\"\n :preview-visible=\"previewVisible\"\n :preview-props=\"{ closable: true }\"\n style=\"display: none\"\n @preview-visible-change=\"(visible: boolean) => (previewVisible = visible)\"\n />\n\n <!-- 视频预览 - 模态框模式 -->\n <VideoPreviewModal\n v-if=\"getProps.videoPreviewMode === 'modal' || !getProps.videoPreviewMode\"\n v-model:visible=\"previewVideoVisible\"\n :video-url=\"previewVideoUrl\"\n :file-name=\"previewFileName\"\n :player-options=\"getProps.videoPlayerOptions\"\n />\n\n <!-- 视频预览 - 行内模式 -->\n <div v-if=\"getProps.videoPreviewMode === 'inline' && previewVideoVisible\" class=\"inline-video-preview\">\n <VideoPreview\n :video-url=\"previewVideoUrl\"\n :player-options=\"getProps.videoPlayerOptions\"\n />\n <a-button class=\"close-inline-preview\" @click=\"previewVideoVisible = false\">\n 关闭预览\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, unref, onMounted, nextTick } from 'vue';\n import { Message } from '@arco-design/web-vue';\n import { IconPlus, IconUpload } from '@arco-design/web-vue/es/icon';\n import SortableFileList from './components/SortableFileList.vue';\n import VideoPreview from './components/VideoPreview.vue';\n import VideoPreviewModal from './components/VideoPreviewModal.vue';\n import type {\n BasicUploadProps,\n BasicUploadEmits,\n UploadFileItem,\n CustomRequestOptions,\n } from './types';\n\n defineOptions({\n name: 'BasicUpload',\n inheritAttrs: false,\n });\n\n const props = withDefaults(defineProps<BasicUploadProps>(), {\n accept: 'image/*',\n maxSize: 30,\n maxCount: 1,\n multiple: false,\n disabled: false,\n readonly: false,\n listType: 'picture-card',\n name: 'file',\n withCredentials: false,\n showFileList: true,\n showRemoveButton: true,\n showDownloadButton: false,\n showPreviewButton: true,\n showUploadButton: true,\n imagePreview: true,\n imageCrop: false,\n imageCompress: false,\n draggable: false,\n directory: false,\n autoUpload: true,\n resultType: 'fileList',\n uploadButtonType: 'primary',\n responseUrlKey: undefined,\n sortable: false,\n videoPreview: true,\n videoPreviewMode: 'modal',\n videoPlayerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<BasicUploadEmits>();\n\n // 内部状态\n const uploadRef = ref();\n const fileListRef = ref<UploadFileItem[]>([]);\n const propsRef = ref<Partial<BasicUploadProps>>({});\n const hasShownActionError = ref(false);\n // 追踪已处理的文件状态,防止重复触发事件\n const processedFiles = ref(new Map<string, string>());\n // 图片预览状态\n const previewVisible = ref(false);\n const previewImageUrl = ref('');\n // 视频预览状态\n const previewVideoUrl = ref('');\n const previewVideoVisible = ref(false);\n const previewFileName = ref('');\n\n // 合并 props\n const getProps = computed((): BasicUploadProps => {\n return { ...props, ...unref(propsRef) } as BasicUploadProps;\n });\n\n // 是否应该使用可拖拽列表\n const shouldUseSortable = computed(() => {\n return getProps.value.sortable && getProps.value.listType === 'picture-card';\n });\n\n // 是否隐藏上传按钮\n const hideUploadButton = computed(() => {\n const propsData = unref(getProps);\n if (!propsData.showUploadButton) return true;\n if (propsData.readonly) return true;\n if (propsData.maxCount && fileListRef.value.length >= propsData.maxCount) {\n return true;\n }\n return false;\n });\n\n // 卡片尺寸(用于样式绑定)\n const cardSizeValue = computed(() => {\n return `${getProps.value.cardSize || 80}px`;\n });\n\n // 获取绑定到 a-upload 的属性\n const getBindValue = computed(() => {\n const propsData = unref(getProps);\n\n return {\n ...propsData,\n disabled: propsData.disabled || propsData.readonly,\n showRemoveButton: propsData.showRemoveButton && !propsData.readonly,\n showUploadButton: !hideUploadButton.value,\n // 只有在没有自定义预览时才启用 imagePreview\n // imagePreview: propsData.imagePreview && !propsData.onPreview,\n // 只有在没有自定义预览且未启用视频预览时才启用原生 imagePreview\n imagePreview: propsData.imagePreview && !propsData.onPreview && !propsData.videoPreview,\n onRemove: async (fileItem: UploadFileItem) => {\n // 如果有自定义的 onRemove 回调\n if (propsData.onRemove) {\n const canRemove = await propsData.onRemove(fileItem);\n if (!canRemove) return false;\n }\n\n // 触发 remove 事件\n emit('remove', fileItem);\n return true;\n },\n };\n });\n\n /**\n * 判断文件是否为视频\n */\n const isVideoFile = (fileItem: UploadFileItem): boolean => {\n if (!fileItem.url && !fileItem.originFileObj) return false;\n \n // 通过文件名判断\n const fileName = fileItem.name || fileItem.originFileObj?.name || '';\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v'];\n const hasVideoExtension = videoExtensions.some(ext => \n fileName.toLowerCase().endsWith(ext)\n );\n \n // 通过 MIME 类型判断\n const mimeType = fileItem.originFileObj?.type || '';\n const isVideoMimeType = mimeType.startsWith('video/');\n \n return hasVideoExtension || isVideoMimeType;\n };\n\n /**\n * 文件大小验证\n */\n const validateFileSize = (file: File): boolean => {\n const propsData = unref(getProps);\n if (!propsData.maxSize) return true;\n\n const maxSizeInBytes = propsData.maxSize * 1024 * 1024;\n\n if (file.size > maxSizeInBytes) {\n Message.error(`文件大小不能超过 ${propsData.maxSize}MB`);\n return false;\n }\n return true;\n };\n\n /**\n * 文件类型验证\n */\n const validateFileType = (file: File): boolean => {\n const propsData = unref(getProps);\n if (!propsData.accept) return true;\n\n const acceptTypes = propsData.accept.split(',').map((type: any) => type.trim());\n const fileExtension = `.${file.name.split('.').pop()?.toLowerCase()}`;\n const fileMimeType = file.type;\n\n const isValid = acceptTypes.some((type: any) => {\n if (type.startsWith('.')) {\n return fileExtension === type.toLowerCase();\n }\n if (type.includes('*')) {\n const [mainType] = type.split('/');\n return fileMimeType.startsWith(mainType);\n }\n return fileMimeType === type;\n });\n\n if (!isValid) {\n Message.error(`不支持的文件类型: ${file.name}`);\n return false;\n }\n return true;\n };\n\n /**\n * 上传前的钩子\n */\n const handleBeforeUpload = async (file: File): Promise<boolean> => {\n const propsData = unref(getProps);\n\n // 文件大小验证\n if (!validateFileSize(file)) {\n return false;\n }\n\n // 文件类型验证\n if (!validateFileType(file)) {\n return false;\n }\n\n // 数量限制验证\n if (propsData.maxCount && fileListRef.value.length >= propsData.maxCount) {\n Message.error(`最多只能上传 ${propsData.maxCount} 个文件`);\n emit('exceed', [file], fileListRef.value);\n return false;\n }\n\n // 自定义验证\n if (propsData.beforeUpload) {\n try {\n const result = await propsData.beforeUpload(file);\n return result;\n } catch (error) {\n console.error('beforeUpload error:', error);\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * 自定义上传请求\n */\n const handleCustomRequest = (options: any) => {\n const propsData = unref(getProps);\n\n if (propsData.customRequest) {\n const customOptions: CustomRequestOptions = {\n file: options.fileItem.file!,\n fileItem: options.fileItem,\n onProgress: (percent: number, event?: ProgressEvent) => {\n options.onProgress(percent, event);\n },\n onSuccess: (response: any) => {\n options.onSuccess(response);\n },\n onError: (error: Error) => {\n options.onError(error);\n },\n headers: propsData.headers,\n data: propsData.data,\n name: propsData.name,\n action: propsData.action,\n withCredentials: propsData.withCredentials,\n };\n\n return propsData.customRequest(customOptions);\n }\n // 使用默认上传逻辑\n return defaultUpload(options);\n };\n\n /**\n * 从响应中提取 URL\n */\n const extractUrlFromResponse = (response: any): string | null => {\n // 定义优先级顺序\n const urlPaths = ['url', 'data.pathUrl', 'data.url', 'data.path', 'pathUrl', 'path'];\n\n for (const path of urlPaths) {\n const value = path.split('.').reduce((obj, key) => obj?.[key], response);\n if (value && typeof value === 'string') {\n return value;\n }\n }\n\n // 特殊情况:data 字段本身是字符串\n if (response.data && typeof response.data === 'string') {\n return response.data;\n }\n\n return null;\n };\n\n /**\n * 开发环境日志工具\n */\n const isDev = import.meta.env.DEV;\n const logger = {\n debug: (...args: any[]) => isDev && console.log('[BasicUpload]', ...args),\n warn: (...args: any[]) => console.warn('[BasicUpload]', ...args),\n error: (...args: any[]) => console.error('[BasicUpload]', ...args),\n };\n\n /**\n * 默认上传逻辑\n */\n const defaultUpload = (options: any) => {\n const propsData = unref(getProps);\n const { fileItem, onProgress, onSuccess, onError } = options;\n\n // 检查是否配置了上传地址\n if (!propsData.action) {\n // 只在第一次错误时显示提示,避免多次弹窗\n if (!hasShownActionError.value) {\n Message.error('请配置上传地址 action');\n hasShownActionError.value = true;\n // 3秒后重置标志,允许再次显示错误\n setTimeout(() => {\n hasShownActionError.value = false;\n }, 3000);\n }\n onError(new Error('上传地址未配置'));\n return {\n abort() {\n xhr.abort();\n },\n };\n }\n\n const formData = new FormData();\n formData.append(propsData.name || 'file', fileItem.file!);\n\n // 添加额外参数\n if (propsData.data) {\n Object.keys(propsData.data).forEach((key) => {\n formData.append(key, propsData.data![key]);\n });\n }\n\n const xhr = new XMLHttpRequest();\n\n // 上传进度\n xhr.upload.addEventListener('progress', (e: ProgressEvent) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n onProgress(percent, e);\n }\n });\n\n // 上传成功\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n\n const { code, message, data } = response;\n\n if (code !== 200) {\n const errorMsg = message ? `上传失败: ${message}` : '上传失败';\n onError(new Error(errorMsg));\n Message.error(errorMsg);\n return;\n }\n\n // 从响应中提取 URL\n const extractedUrl = extractUrlFromResponse(response);\n\n const normalizedResponse = extractedUrl\n ? { url: extractedUrl, name: fileItem.name, ...data }\n : response;\n\n if (!extractedUrl) {\n logger.warn('响应中未找到 URL 字段,可能导致上传状态异常');\n }\n\n Message.success(`${fileItem.name} 上传成功`);\n\n onSuccess(normalizedResponse);\n } catch (error) {\n // 如果响应不是 JSON,尝试作为文本处理\n onSuccess({ data: xhr.responseText });\n }\n } else {\n const errorMsg = `上传失败: HTTP ${xhr.status}`;\n Message.error(errorMsg);\n onError(new Error(errorMsg));\n }\n });\n\n // 上传失败\n xhr.addEventListener('error', () => {\n logger.error('上传网络错误');\n onError(new Error('网络错误'));\n });\n\n // 上传中止\n xhr.addEventListener('abort', () => {\n logger.debug('上传已取消');\n onError(new Error('上传已取消'));\n });\n\n xhr.open('POST', propsData.action);\n\n // 设置请求头\n if (propsData.headers) {\n Object.keys(propsData.headers).forEach((key) => {\n xhr.setRequestHeader(key, propsData.headers![key]);\n });\n }\n\n // 是否携带凭证\n if (propsData.withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n\n // 返回包含 abort 方法的对象,以支持取消上传\n return {\n abort() {\n xhr.abort();\n },\n };\n };\n\n /**\n * 为视频文件添加特殊样式类(兼容性处理)\n */\n const addVideoFileClass = () => {\n nextTick(() => {\n const uploadItems = document.querySelectorAll('.arco-upload-list-picture');\n uploadItems.forEach((item) => {\n const img = item.querySelector('img');\n if (img && img.src) {\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.webm', '.mkv', '.m4v'];\n const isVideo = videoExtensions.some(ext => img.src.toLowerCase().includes(ext));\n if (isVideo) {\n item.classList.add('is-video-file');\n } else {\n item.classList.remove('is-video-file');\n }\n }\n });\n });\n };\n\n /**\n * 文件状态改变\n */\n const handleChange = (fileList: UploadFileItem[], currentFile: UploadFileItem) => {\n // 如果是内部更新触发的 change,直接返回,避免循环\n // if (isInternalUpdate.value) return;\n const oldLength = fileListRef.value.length;\n const newLength = fileList.length;\n\n fileListRef.value = fileList;\n \n // 为视频文件添加特殊样式\n addVideoFileClass();\n\n // 触发 change 事件\n emit('change', fileList);\n\n // 判断是否为删除操作(文件数量减少)\n const isRemove = newLength < oldLength;\n\n // 获取当前文件的唯一标识和上次处理的状态\n const fileKey = currentFile.uid || `file-${Date.now()}-${Math.random()}`;\n const lastStatus = processedFiles.value.get(fileKey);\n\n // 根据文件状态触发相应事件\n // 只有在非删除操作且状态首次变为 done 时才触发 success\n if (currentFile.status === 'done' && lastStatus !== 'done' && !isRemove) {\n processedFiles.value.set(fileKey, 'done');\n emit('handleSuccess', currentFile.response, currentFile);\n } else if (currentFile.status === 'error' && lastStatus !== 'error') {\n processedFiles.value.set(fileKey, 'error');\n const error = new Error('上传失败');\n emit('handlError', error, currentFile);\n }\n\n // 清理已删除文件的处理记录\n if (isRemove) {\n const fileUids = new Set(fileList.map((f) => f.uid));\n processedFiles.value.forEach((_value: string, uid: string) => {\n if (!fileUids.has(uid)) {\n processedFiles.value.delete(uid);\n }\n });\n }\n\n // 更新 v-model\n updateModelValue(fileList);\n };\n\n /**\n * 上传进度\n */\n const handleProgress = (currentFile: UploadFileItem) => {\n const percent = currentFile.percent || 0;\n\n emit('progress', percent, currentFile);\n };\n\n /**\n * 预览文件\n */\n const handlePreview = (fileItem: UploadFileItem) => {\n const propsData = unref(getProps);\n\n // 自定义预览(优先级最高)\n if (propsData.onPreview) {\n propsData.onPreview(fileItem);\n return;\n }\n\n // 视频预览\n if (propsData.videoPreview && isVideoFile(fileItem) && fileItem.url) {\n // 先关闭图片预览\n previewImageUrl.value = '';\n previewVisible.value = false;\n\n previewVideoUrl.value = fileItem.url;\n previewFileName.value = fileItem.name || '';\n previewVideoVisible.value = true;\n return;\n }\n\n // 图片预览\n if (propsData.imagePreview && fileItem.url) {\n previewVideoUrl.value = '';\n previewVideoVisible.value = false;\n\n previewImageUrl.value = fileItem.url;\n previewVisible.value = true;\n }\n };\n\n /**\n * 更新 v-model 值\n */\n const updateModelValue = (fileList: UploadFileItem[]) => {\n const propsData = unref(getProps);\n\n switch (propsData.resultType) {\n case 'fileList':\n emit('update:modelValue', fileList);\n break;\n case 'url':\n if (propsData.multiple) {\n const urls = fileList\n .filter((file) => file.status === 'done' && file.url)\n .map((file) => file.url!);\n emit('update:modelValue', urls);\n } else {\n const url = fileList.find((file) => file.status === 'done')?.url || '';\n emit('update:modelValue', url);\n }\n break;\n case 'string':\n const urls = fileList\n .filter((file) => file.status === 'done' && file.url)\n .map((file) => file.url!);\n emit('update:modelValue', urls.join(','));\n break;\n default:\n emit('update:modelValue', fileList);\n }\n };\n\n /**\n * 解析 modelValue 为 fileList\n */\n const parseModelValue = (value: any): UploadFileItem[] => {\n if (!value) return [];\n\n // 已经是 fileList 格式\n if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {\n return value as UploadFileItem[];\n }\n\n // URL 数组\n if (Array.isArray(value)) {\n return value.map((url, index) => ({\n uid: `${Date.now()}-${index}`,\n name: url.split('/').pop() || `file-${index}`,\n url,\n status: 'done' as const,\n }));\n }\n\n // 字符串(单个URL或逗号分隔的URL)\n if (typeof value === 'string') {\n const urls = value.split(',').filter(Boolean);\n return urls.map((url, index) => ({\n uid: `${Date.now()}-${index}`,\n name: url.split('/').pop() || `file-${index}`,\n url: url.trim(),\n status: 'done' as const,\n }));\n }\n\n return [];\n };\n\n /**\n * 手动触发上传\n */\n const submit = () => {\n uploadRef.value?.submit?.();\n };\n\n /**\n * 中止上传\n */\n const abort = (fileItem?: UploadFileItem) => {\n uploadRef.value?.abort?.(fileItem);\n };\n\n /**\n * 清空文件列表\n */\n const clearFiles = () => {\n fileListRef.value = [];\n processedFiles.value.clear(); // 清理状态追踪\n emit('update:modelValue', []);\n emit('change', []);\n };\n\n /**\n * 获取文件列表\n */\n const getFileList = (): UploadFileItem[] => {\n return fileListRef.value;\n };\n\n /**\n * 上传文件\n */\n const upload = (fileItem: UploadFileItem) => {\n uploadRef.value?.upload?.(fileItem);\n };\n\n /**\n * 设置 Props\n */\n const setProps = (uploadProps: Partial<BasicUploadProps>) => {\n propsRef.value = { ...unref(propsRef), ...uploadProps };\n };\n\n /**\n * 设置文件列表\n */\n const setFileList = (files: UploadFileItem[]) => {\n fileListRef.value = files;\n updateModelValue(files);\n };\n\n /**\n * 添加文件\n */\n const addFile = (file: UploadFileItem) => {\n fileListRef.value.push(file);\n updateModelValue(fileListRef.value);\n };\n\n /**\n * 删除文件\n */\n const removeFile = (fileItem: UploadFileItem) => {\n const index = fileListRef.value.findIndex((item: UploadFileItem) => item.uid === fileItem.uid);\n if (index !== -1) {\n fileListRef.value.splice(index, 1);\n updateModelValue(fileListRef.value);\n }\n };\n\n /**\n * 更新文件\n */\n const updateFile = (fileItem: UploadFileItem) => {\n const index = fileListRef.value.findIndex((item: UploadFileItem) => item.uid === fileItem.uid);\n if (index !== -1) {\n fileListRef.value[index] = { ...fileListRef.value[index], ...fileItem };\n updateModelValue(fileListRef.value);\n }\n };\n\n /**\n * 处理文件列表更新(从可拖拽列表触发)\n */\n const handleFileListUpdate = (newFileList: UploadFileItem[]) => {\n fileListRef.value = newFileList;\n emit('change', newFileList);\n updateModelValue(newFileList);\n };\n\n /**\n * 处理排序改变\n */\n const handleSortChange = (newFileList: UploadFileItem[]) => {\n emit('sortChange', newFileList);\n };\n\n /**\n * 处理删除文件(从可拖拽列表触发)\n */\n const handleRemoveFile = async (file: UploadFileItem) => {\n const propsData = unref(getProps);\n\n // 如果有自定义的 onRemove 回调\n if (propsData.onRemove) {\n const canRemove = await propsData.onRemove(file);\n if (!canRemove) return;\n }\n\n removeFile(file);\n };\n\n // 暴露方法\n defineExpose({\n submit,\n abort,\n clearFiles,\n getFileList,\n upload,\n setProps,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n });\n\n // 监听 modelValue 变化\n watch(\n () => getProps.value.modelValue,\n (val: any) => {\n // 只有在外部真正改变 modelValue 时才更新(如父组件传入初始值或编辑时回填)\n fileListRef.value = parseModelValue(val);\n // 为视频文件添加特殊样式\n addVideoFileClass();\n },\n { immediate: true },\n );\n\n onMounted(() => {\n nextTick(() => {\n emit('register', {\n submit,\n abort,\n clearFiles,\n getFileList,\n upload,\n setProps,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n });\n });\n });\n</script>\n\n<style scoped>\n .basic-upload {\n width: 100%;\n }\n\n .sortable-upload-container {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: flex-start;\n }\n\n .upload-card-button {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 80px;\n color: var(--color-text-3);\n font-size: 14px;\n background-color: #fafafa;\n border-width: 1px;\n border-style: dashed;\n border-color: #e5e7eb;\n border-radius: 6px;\n }\n\n .upload-card-button .arco-icon {\n font-size: 24px;\n margin-bottom: 8px;\n }\n\n .upload-text {\n margin-top: 8px;\n font-size: 12px;\n }\n\n .upload-tip {\n color: var(--color-text-3);\n font-size: 12px;\n line-height: 1.5;\n margin-top: 8px;\n }\n\n .sortable-tip {\n width: 100%;\n margin-top: 0;\n }\n\n :deep(.arco-upload-list-picture) {\n width: v-bind(cardSizeValue) !important;\n height: v-bind(cardSizeValue) !important;\n line-height: v-bind(cardSizeValue) !important;\n }\n\n :deep(.arco-upload-list-picture img) {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n /* 视频文件占位处理 - 隐藏破损的图片 */\n :deep(.arco-upload-list-picture img[src*=\".mp4\"]),\n :deep(.arco-upload-list-picture img[src*=\".avi\"]),\n :deep(.arco-upload-list-picture img[src*=\".mov\"]),\n :deep(.arco-upload-list-picture img[src*=\".wmv\"]),\n :deep(.arco-upload-list-picture img[src*=\".flv\"]),\n :deep(.arco-upload-list-picture img[src*=\".webm\"]),\n :deep(.arco-upload-list-picture img[src*=\".mkv\"]),\n :deep(.arco-upload-list-picture img[src*=\".m4v\"]) {\n opacity: 0;\n }\n\n /* 视频文件容器添加背景和图标 - 使用 :has() 选择器(现代浏览器) */\n :deep(.arco-upload-list-picture:has(img[src*=\".mp4\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".avi\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".mov\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".wmv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".flv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".webm\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".mkv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".m4v\"]) .arco-upload-list-picture-img),\n /* 兼容性降级方案 - 使用 JavaScript 添加的类名 */\n :deep(.arco-upload-list-picture.is-video-file .arco-upload-list-picture-img) {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n /* 视频图标 */\n :deep(.arco-upload-list-picture:has(img[src*=\".mp4\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".avi\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".mov\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".wmv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".flv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".webm\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".mkv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".m4v\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture.is-video-file .arco-upload-list-picture-img)::before {\n content: '▶';\n position: absolute;\n font-size: 32px;\n color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n pointer-events: none;\n }\n\n /* 遮罩层 - 修复操作图标位置 */\n :deep(.arco-upload-list-picture-mask) {\n line-height: v-bind(cardSizeValue) !important;\n }\n\n /* 操作按钮容器 - 根据尺寸调整图标大小 */\n :deep(.arco-upload-list-picture-operation) {\n font-size: calc(v-bind(cardSizeValue) / 80 * 14px) !important;\n }\n\n /* 错误提示图标 - 根据尺寸调整图标大小 */\n :deep(.arco-upload-list-picture-error-tip .arco-upload-icon-error) {\n font-size: calc(v-bind(cardSizeValue) / 80 * 26px) !important;\n }\n\n /* 行内视频预览 */\n .inline-video-preview {\n margin-top: 16px;\n border: 1px solid var(--color-border-2);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .close-inline-preview {\n width: 100%;\n border-radius: 0;\n }\n</style>\n","import { ref, unref } from 'vue';\nimport type {\n UseUploadOptions,\n UseUploadReturn,\n UploadFileItem,\n} from './types';\n\n/**\n * useUpload Hook\n * 用于在外部管理 Upload 组件的状态和方法\n * \n * @example\n * ```ts\n * // 图片上传示例\n * const [register, uploadMethods] = useUpload({\n * maxCount: 5,\n * accept: 'image/*',\n * action: '/api/upload'\n * });\n * \n * // 视频上传示例\n * const [registerVideo, videoMethods] = useUpload({\n * accept: 'video/*',\n * maxSize: 200,\n * videoPreview: true,\n * videoPreviewMode: 'modal',\n * videoPlayerOptions: {\n * autoplay: false,\n * loop: false,\n * controls: true\n * }\n * });\n * \n * // 在模板中使用\n * <BasicUpload @register=\"register\" />\n * <BasicUpload @register=\"registerVideo\" />\n * \n * // 调用方法\n * uploadMethods.submit();\n * uploadMethods.clearFiles();\n * videoMethods.getFileList();\n * ```\n */\nexport function useUpload(props?: UseUploadOptions): [\n (instance: any) => void,\n Omit<UseUploadReturn, 'register'>\n] {\n const uploadRef = ref<any>(null);\n const fileListRef = ref<UploadFileItem[]>(props?.defaultFileList || []);\n\n /**\n * 注册 Upload 实例\n */\n const register = (uploadInstance: any) => {\n uploadRef.value = uploadInstance;\n\n // 如果有 defaultFileList,同步到组件\n if (props?.defaultFileList && props.defaultFileList.length > 0) {\n uploadInstance.setFileList(props.defaultFileList);\n }\n\n // 如果有其他配置项,应用到实例\n if (props && Object.keys(props).length > 0) {\n const {defaultFileList, ...restProps} = props;\n if (Object.keys(restProps).length > 0) {\n setProps(restProps);\n }\n }\n };\n\n /**\n * 获取 Upload 实例\n */\n const getUpload = () => {\n const upload = unref(uploadRef);\n if (!upload) {\n throw new Error('Upload 实例未注册,请确保在组件上使用 @register=\"register\"');\n }\n return upload;\n };\n\n /**\n * 手动触发上传\n */\n const submit = () => {\n getUpload().submit();\n };\n\n /**\n * 中止上传\n */\n const abort = (fileItem?: UploadFileItem) => {\n getUpload().abort(fileItem);\n };\n\n /**\n * 清空文件列表\n */\n const clearFiles = () => {\n getUpload().clearFiles();\n fileListRef.value = [];\n };\n\n /**\n * 获取文件列表\n */\n const getFileList = (): UploadFileItem[] => {\n return getUpload().getFileList();\n };\n\n /**\n * 上传文件\n */\n const upload = (fileItem: UploadFileItem) => {\n getUpload().upload(fileItem);\n };\n\n /**\n * 设置文件列表\n */\n const setFileList = (files: UploadFileItem[]) => {\n // 同步到内部 ref\n fileListRef.value = files;\n // 同步到组件实例\n const upload = getUpload();\n if (upload.setFileList) {\n upload.setFileList(files);\n }\n };\n\n /**\n * 添加文件\n */\n const addFile = (file: UploadFileItem) => {\n // 同步到内部 ref\n fileListRef.value.push(file);\n // 同步到组件实例\n const upload = getUpload();\n if (upload.addFile) {\n upload.addFile(file);\n }\n };\n\n /**\n * 删除文件\n */\n const removeFile = (fileItem: UploadFileItem) => {\n // 同步到内部 ref\n const index = fileListRef.value.findIndex(\n (item: any) => item.uid === fileItem.uid\n );\n if (index !== -1) {\n fileListRef.value.splice(index, 1);\n }\n // 同步到组件实例\n const upload = getUpload();\n if (upload.removeFile) {\n upload.removeFile(fileItem);\n }\n };\n\n /**\n * 更新文件\n */\n const updateFile = (fileItem: UploadFileItem) => {\n // 同步到内部 ref\n const index = fileListRef.value.findIndex(\n (item: any) => item.uid === fileItem.uid\n );\n if (index !== -1) {\n fileListRef.value[index] = { ...fileListRef.value[index], ...fileItem };\n }\n // 同步到组件实例\n const upload = getUpload();\n if (upload.updateFile) {\n upload.updateFile(fileItem);\n }\n };\n\n /**\n * 设置 Upload 属性\n */\n const setProps = (uploadProps: Omit<UseUploadOptions, 'register'>) => {\n getUpload().setProps(uploadProps);\n };\n\n // 使用 getter 确保返回的是最新的响应式值\n const methods = {\n get fileList() {\n return fileListRef.value;\n },\n submit,\n abort,\n upload,\n clearFiles,\n getFileList,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n setProps,\n };\n\n return [register, methods];\n}\n\n","import {\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';\nimport { BasicUpload } from '../Upload';\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 BasicUpload,\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, ComponentType>();\n\n/**\n * 注册自定义组件\n * @param name 组件名称\n * @param component 组件实例\n */\nexport function registerComponent(name: string, component: ComponentType) {\n customComponentMap.set(name, component);\n}\n\n/**\n * 获取组件\n * @param name 组件名称或组件实例\n * @returns 组件实例\n */\nexport function getComponent(name: string | ComponentType): ComponentType | 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 */\nexport const componentsNeedUploadPlaceholder = new Set([\n 'Upload',\n 'BasicUpload',\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\n/**\n * 根据组件类型生成默认规则\n * @param component 组件类型\n * @param label 标签文本\n * @returns 规则\n */\nexport function getRules(component: string, label: string): any[] {\n if (componentsNeedPlaceholder.has(component)) {\n return [{ required: true, message: `请输入${label}` }];\n }\n if (componentsNeedUploadPlaceholder.has(component)) {\n return [{ required: true, message: `请上传${label}` }];\n }\n return [{ required: true, message: `请选择${label}` }];\n}\n","import type { GetLabelConfig } from './types';\n\n/**\n * 从 options 数组中获取 label\n * @param value - 值\n * @param options - 选项数组\n * @param config - 配置\n * @returns label 字符串\n */\nexport function getLabelFromOptions(\n value: any,\n options: any[],\n config?: GetLabelConfig\n): string {\n if (!options || !Array.isArray(options)) {\n return String(value || '-');\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n\n const option = options.find((opt) => opt[valueKey] === value);\n return option?.[labelKey] || String(value || '-');\n}\n\n/**\n * 从 options 数组中获取多个 label(用于多选)\n * @param values - 值数组\n * @param options - 选项数组\n * @param config - 配置\n * @returns label 字符串数组\n */\nexport function getLabelsFromOptions(\n values: any[],\n options: any[],\n config?: GetLabelConfig\n): string[] {\n if (!values || !Array.isArray(values)) {\n return [];\n }\n\n return values.map((value) => getLabelFromOptions(value, options, config));\n}\n\n/**\n * 从 Tree 数据中递归获取 label\n * @param value - 值\n * @param treeData - 树形数据\n * @param config - 配置\n * @returns label 字符串\n */\nexport function getLabelFromTreeData(\n value: any,\n treeData: any[],\n config?: GetLabelConfig\n): string {\n if (!treeData || !Array.isArray(treeData)) {\n return String(value || '-');\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n const childrenKey = config?.childrenKey || 'children';\n\n // 递归查找函数\n function findLabel(nodes: any[], targetValue: any): string | null {\n for (const node of nodes) {\n if (node[valueKey] === targetValue) {\n return node[labelKey];\n }\n if (node[childrenKey] && Array.isArray(node[childrenKey])) {\n const result = findLabel(node[childrenKey], targetValue);\n if (result) return result;\n }\n }\n return null;\n }\n\n const label = findLabel(treeData, value);\n return label || String(value || '-');\n}\n\n/**\n * 格式化 Cascader 路径\n * @param value - 值数组\n * @param separator - 分隔符\n * @returns 格式化后的路径字符串\n */\nexport function formatCascaderPath(\n value: any[],\n separator: string = ' / '\n): string {\n if (!Array.isArray(value)) {\n return String(value || '-');\n }\n\n if (value.length === 0) {\n return '-';\n }\n\n return value.join(separator);\n}\n\n/**\n * 从 Cascader options 中获取路径 labels\n * @param values - 值数组(例如 [1, 2, 3])\n * @param options - Cascader 选项数组\n * @param config - 配置\n * @returns label 数组\n */\nexport function getCascaderLabels(\n values: any[],\n options: any[],\n config?: GetLabelConfig\n): string[] {\n if (!values || !Array.isArray(values) || values.length === 0) {\n return [];\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n const childrenKey = config?.childrenKey || 'children';\n\n const labels: string[] = [];\n let currentOptions = options;\n\n for (const value of values) {\n const option = currentOptions.find((opt) => opt[valueKey] === value);\n if (option) {\n labels.push(option[labelKey]);\n currentOptions = option[childrenKey] || [];\n } else {\n // 如果找不到,直接使用值\n labels.push(String(value));\n break;\n }\n }\n\n return labels;\n}\n\n/**\n * 判断是否为图片文件\n * @param file - 文件对象或 URL 字符串\n * @returns 是否为图片\n */\nexport function isImageFile(file: any): boolean {\n // 支持的图片扩展名\n const imageExtensions = [\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n ];\n\n // 支持的图片 MIME 类型\n const imageMimeTypes = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/bmp',\n ];\n\n // 字符串格式:直接判断 URL\n if (typeof file === 'string') {\n const lowerUrl = file.toLowerCase();\n return imageExtensions.some((ext) => lowerUrl.endsWith(ext));\n }\n\n // 对象格式:判断 url、name 或 type\n if (typeof file === 'object' && file !== null) {\n // 优先检查 type 字段\n if (file.type && imageMimeTypes.includes(file.type)) {\n return true;\n }\n\n // 检查 url\n if (file.url) {\n const lowerUrl = file.url.toLowerCase();\n if (imageExtensions.some((ext) => lowerUrl.endsWith(ext))) {\n return true;\n }\n }\n\n // 检查 name\n if (file.name) {\n const lowerName = file.name.toLowerCase();\n if (imageExtensions.some((ext) => lowerName.endsWith(ext))) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * 获取文件 URL\n * @param file - 文件对象或 URL 字符串\n * @returns URL 字符串\n */\nexport function getFileUrl(file: any): string {\n if (typeof file === 'string') {\n return file;\n }\n if (typeof file === 'object' && file !== null) {\n return file.url || '';\n }\n return '';\n}\n\n/**\n * 获取文件名称\n * @param file - 文件对象或 URL 字符串\n * @returns 文件名称\n */\nexport function getFileName(file: any): string {\n if (typeof file === 'string') {\n // 从 URL 中提取文件名\n const parts = file.split('/');\n return parts[parts.length - 1] || file;\n }\n\n if (typeof file === 'object' && file !== null) {\n // 优先使用 name 字段\n if (file.name) {\n return file.name;\n }\n // 其次从 url 中提取\n if (file.url) {\n const parts = file.url.split('/');\n return parts[parts.length - 1] || file.url;\n }\n }\n\n return '';\n}\n\n/**\n * 将文件数组分类为图片和非图片\n * @param files - 文件数组\n * @returns 分类结果\n */\nexport function classifyFiles(files: any[]): {\n imageFiles: any[];\n otherFiles: any[];\n} {\n if (!files || !Array.isArray(files)) {\n return { imageFiles: [], otherFiles: [] };\n }\n\n const imageFiles: any[] = [];\n const otherFiles: any[] = [];\n\n files.forEach((file) => {\n if (isImageFile(file)) {\n imageFiles.push(file);\n } else {\n otherFiles.push(file);\n }\n });\n\n return { imageFiles, otherFiles };\n}\n\n/**\n * 格式化日期\n * @param value - 日期值\n * @param format - 格式(目前简单实现)\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(value: any, format?: string): string {\n if (!value) return '-';\n\n try {\n // 如果已经是字符串,直接返回\n if (typeof value === 'string') {\n return value;\n }\n\n // 如果是 Date 对象或时间戳\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n return String(value);\n }\n\n // 简单的日期格式化(可以后续扩展)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n if (format === 'datetime') {\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n return `${year}-${month}-${day}`;\n } catch (error) {\n console.error('[ReadonlyField] 日期格式化错误:', error);\n return String(value);\n }\n}\n\n/**\n * 格式化布尔值\n * @param value - 布尔值\n * @param trueText - true 的文本,默认 '是'\n * @param falseText - false 的文本,默认 '否'\n * @returns 格式化后的文本\n */\nexport function formatBoolean(\n value: any,\n trueText: string = '是',\n falseText: string = '否'\n): string {\n if (value === true || value === 'true' || value === 1 || value === '1') {\n return trueText;\n }\n if (value === false || value === 'false' || value === 0 || value === '0') {\n return falseText;\n }\n return '-';\n}\n\n/**\n * 安全地转换为字符串\n * @param value - 任意值\n * @param emptyText - 空值占位符\n * @returns 字符串\n */\nexport function safeToString(value: any, emptyText: string = '-'): string {\n if (value === null || value === undefined || value === '') {\n return emptyText;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n","import { h } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport { Image, ImagePreviewGroup } from '@arco-design/web-vue';\nimport type { Renderer, RenderConfig } from './types';\nimport {\n getLabelFromOptions,\n getLabelsFromOptions,\n getLabelFromTreeData,\n formatCascaderPath,\n getCascaderLabels,\n classifyFiles,\n getFileUrl,\n getFileName,\n formatDate,\n formatBoolean,\n safeToString,\n} from './utils';\n\n/**\n * 渲染纯文本(默认渲染器)\n */\nexport function renderText(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n const text = safeToString(value, emptyText);\n\n return h(\n 'div',\n {\n class: ['readonly-field-text', { 'readonly-field-empty': !value }],\n },\n text\n );\n}\n\n/**\n * 渲染 InputNumber\n */\nexport function renderInputNumber(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-number' }, String(value));\n}\n\n/**\n * 渲染 Select\n */\nexport function renderSelect(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 优先使用 labelMap\n if (config.labelMap && value in config.labelMap) {\n return h('div', { class: 'readonly-field-select' }, config.labelMap[value]);\n }\n\n // 从 options 中查找\n const options = config.componentProps?.options || [];\n const label = getLabelFromOptions(value, options);\n\n return h('div', { class: 'readonly-field-select' }, label);\n}\n\n/**\n * 渲染 Select(多选)\n */\nexport function renderSelectMultiple(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || !Array.isArray(value) || value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const options = config.componentProps?.options || [];\n const labels = getLabelsFromOptions(value, options);\n\n return h(\n 'div',\n { class: 'readonly-field-select-multiple' },\n labels.join(', ')\n );\n}\n\n/**\n * 渲染 TreeSelect\n */\nexport function renderTreeSelect(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 优先使用 labelMap\n if (config.labelMap && value in config.labelMap) {\n return h(\n 'div',\n { class: 'readonly-field-tree-select' },\n config.labelMap[value]\n );\n }\n\n // 从 treeData 中查找\n const treeData = config.componentProps?.data || [];\n const label = getLabelFromTreeData(value, treeData);\n\n return h('div', { class: 'readonly-field-tree-select' }, label);\n}\n\n/**\n * 渲染 Cascader\n */\nexport function renderCascader(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 如果不是数组,直接显示\n if (!Array.isArray(value)) {\n return h('div', { class: 'readonly-field-cascader' }, String(value));\n }\n\n if (value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const options = config.componentProps?.options || [];\n\n // 尝试从 options 中获取 labels\n if (options.length > 0) {\n const labels = getCascaderLabels(value, options);\n if (labels.length > 0) {\n return h(\n 'div',\n { class: 'readonly-field-cascader' },\n formatCascaderPath(labels)\n );\n }\n }\n\n // 否则直接格式化值数组\n return h(\n 'div',\n { class: 'readonly-field-cascader' },\n formatCascaderPath(value)\n );\n}\n\n/**\n * 渲染 DatePicker\n */\nexport function renderDatePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const formatted = formatDate(value);\n return h('div', { class: 'readonly-field-date' }, formatted);\n}\n\n/**\n * 渲染 RangePicker\n */\nexport function renderRangePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || !Array.isArray(value) || value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const startDate = formatDate(value[0]);\n const endDate = formatDate(value[1]);\n\n return h(\n 'div',\n { class: 'readonly-field-range' },\n `${startDate} ~ ${endDate}`\n );\n}\n\n/**\n * 渲染 TimePicker\n */\nexport function renderTimePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-time' }, String(value));\n}\n\n/**\n * 渲染 Switch\n */\nexport function renderSwitch(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const trueText =\n config.componentProps?.checkedText ||\n config.componentProps?.trueText ||\n '是';\n const falseText =\n config.componentProps?.uncheckedText ||\n config.componentProps?.falseText ||\n '否';\n\n const text = formatBoolean(value, trueText, falseText);\n\n return h('div', { class: 'readonly-field-switch' }, text);\n}\n\n/**\n * 渲染 Checkbox\n */\nexport function renderCheckbox(value: any, config: RenderConfig): VNodeChild {\n return renderSwitch(value, config);\n}\n\n/**\n * 渲染 CheckboxGroup\n */\nexport function renderCheckboxGroup(\n value: any,\n config: RenderConfig\n): VNodeChild {\n return renderSelectMultiple(value, config);\n}\n\n/**\n * 渲染 Radio/RadioGroup\n */\nexport function renderRadio(value: any, config: RenderConfig): VNodeChild {\n return renderSelect(value, config);\n}\n\n/**\n * 渲染 Rate\n */\nexport function renderRate(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-rate' }, `${value} 分`);\n}\n\n/**\n * 渲染 Slider\n */\nexport function renderSlider(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 如果是范围滑块(数组)\n if (Array.isArray(value)) {\n return h(\n 'div',\n { class: 'readonly-field-slider' },\n `${value[0]} ~ ${value[1]}`\n );\n }\n\n return h('div', { class: 'readonly-field-slider' }, String(value));\n}\n\n/**\n * 渲染 Upload/BasicUpload\n * 图片使用 Arco Design Image 组件展示,支持预览\n * 其他文件显示为链接\n */\nexport function renderUpload(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 确保是数组\n const files = Array.isArray(value) ? value : [value];\n\n // 分类文件\n const { imageFiles, otherFiles } = classifyFiles(files);\n\n const children: VNodeChild[] = [];\n\n // 渲染图片(使用 Arco Design Image + ImagePreviewGroup)\n if (imageFiles.length > 0) {\n children.push(\n h(\n ImagePreviewGroup,\n { infinite: true },\n {\n default: () =>\n h(\n 'div',\n { class: 'readonly-image-list' },\n imageFiles.map((file) =>\n h(Image, {\n src: getFileUrl(file),\n width: 100,\n height: 100,\n fit: 'cover',\n class: 'readonly-image-item',\n alt: getFileName(file),\n })\n )\n ),\n }\n )\n );\n }\n\n // 渲染其他文件(链接)\n if (otherFiles.length > 0) {\n children.push(\n h(\n 'div',\n { class: 'readonly-file-list' },\n otherFiles.map((file) =>\n h(\n 'a',\n {\n href: getFileUrl(file),\n target: '_blank',\n class: 'readonly-file-link',\n rel: 'noopener noreferrer',\n },\n getFileName(file)\n )\n )\n )\n );\n }\n\n return h('div', { class: 'readonly-upload-container' }, children);\n}\n\n/**\n * 渲染 Textarea\n */\nexport function renderTextarea(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 保留换行\n return h(\n 'div',\n {\n class: 'readonly-field-textarea',\n style: { whiteSpace: 'pre-wrap' },\n },\n String(value)\n );\n}\n\n/**\n * 渲染器映射表\n */\nexport const rendererMap: Record<string, Renderer> = {\n // 输入组件\n Input: renderText,\n InputPassword: renderText,\n InputNumber: renderInputNumber,\n Textarea: renderTextarea,\n AutoComplete: renderText,\n\n // 选择组件\n Select: renderSelect,\n TreeSelect: renderTreeSelect,\n Cascader: renderCascader,\n\n // 单选/多选\n Radio: renderRadio,\n RadioGroup: renderRadio,\n Checkbox: renderCheckbox,\n CheckboxGroup: renderCheckboxGroup,\n\n // 日期时间\n DatePicker: renderDatePicker,\n RangePicker: renderRangePicker,\n TimePicker: renderTimePicker,\n\n // 其他\n Switch: renderSwitch,\n Rate: renderRate,\n Slider: renderSlider,\n Upload: renderUpload,\n BasicUpload: renderUpload,\n\n // 默认\n default: renderText,\n};\n\n/**\n * 获取渲染器\n * @param component - 组件类型\n * @returns 渲染器函数\n */\nexport function getRenderer(component: string = 'Input'): Renderer {\n return rendererMap[component] || rendererMap.default;\n}\n","<template>\n <div :class=\"wrapperClass\" :style=\"customStyle\">\n <component :is=\"renderedContent\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, onMounted } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport type { ReadonlyFieldProps, RenderConfig } from './types';\nimport { getRenderer } from './renderers';\n\ndefineOptions({\n name: 'BasicReadonlyField',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ReadonlyFieldProps>(), {\n component: 'Input',\n emptyText: '-',\n});\n\n// 加载状态(用于异步获取 options)\nconst loading = ref(false);\n// 缓存的 options(异步获取后存储)\nconst cachedOptions = ref<any[]>([]);\n\n/**\n * 包装器类名\n */\nconst wrapperClass = computed(() => {\n return [\n 'readonly-field',\n props.class,\n {\n 'readonly-field-loading': loading.value,\n },\n ];\n});\n\n/**\n * 自定义样式\n */\nconst customStyle = computed(() => {\n return props.style || {};\n});\n\n/**\n * 渲染配置\n */\nconst renderConfig = computed<RenderConfig>(() => {\n return {\n component: props.component,\n componentProps: props.componentProps,\n labelMap: props.labelMap,\n fetchOptions: props.fetchOptions,\n emptyText: props.emptyText,\n customRender: props.customRender,\n value: props.value,\n };\n});\n\n/**\n * 增强的渲染配置(包含缓存的 options)\n */\nconst enhancedRenderConfig = computed<RenderConfig>(() => {\n const config = { ...renderConfig.value };\n\n // 如果有缓存的 options,合并到 componentProps 中\n if (cachedOptions.value.length > 0) {\n config.componentProps = {\n ...config.componentProps,\n options: cachedOptions.value,\n };\n }\n\n return config;\n});\n\n/**\n * 渲染内容\n */\nconst renderedContent = computed<VNodeChild>(() => {\n try {\n // 如果有自定义渲染函数,优先使用\n if (props.customRender) {\n return props.customRender(props.value, enhancedRenderConfig.value);\n }\n\n // 获取对应的渲染器\n const renderer = getRenderer(props.component || 'Input');\n\n // 执行渲染\n return renderer(props.value, enhancedRenderConfig.value);\n } catch (error) {\n console.error('[BasicReadonlyField] 渲染错误:', error);\n return props.emptyText || '-';\n }\n});\n\n/**\n * 异步获取 options\n */\nconst fetchOptionsAsync = async () => {\n if (!props.fetchOptions) return;\n\n try {\n loading.value = true;\n const options = await props.fetchOptions();\n cachedOptions.value = options || [];\n } catch (error) {\n console.error('[BasicReadonlyField] 获取 options 失败:', error);\n cachedOptions.value = [];\n } finally {\n loading.value = false;\n }\n};\n\n/**\n * 监听 fetchOptions 变化\n */\nwatch(\n () => props.fetchOptions,\n () => {\n if (props.fetchOptions) {\n fetchOptionsAsync();\n }\n },\n { immediate: true }\n);\n\n/**\n * 监听 value 变化(如果需要重新获取 options)\n */\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n // 如果值发生变化且有 fetchOptions,可能需要重新获取\n // 这里暂时不实现,根据实际需求可以扩展\n }\n);\n\n// 组件挂载时的初始化\nonMounted(() => {\n // 如果有 fetchOptions 但还没有缓存,立即获取\n if (props.fetchOptions && cachedOptions.value.length === 0) {\n fetchOptionsAsync();\n }\n});\n</script>\n\n<style scoped>\n.readonly-field {\n color: var(--color-text-1);\n line-height: 1.5;\n min-height: 32px;\n display: flex;\n align-items: center;\n}\n\n.readonly-field-loading {\n opacity: 0.6;\n}\n\n/* 空值样式 */\n.readonly-field-empty {\n color: var(--color-text-4);\n}\n\n/* 文本样式 */\n.readonly-field-text {\n word-break: break-word;\n}\n\n/* 数字样式 */\n.readonly-field-number {\n font-variant-numeric: tabular-nums;\n}\n\n/* Textarea 样式 */\n.readonly-field-textarea {\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* Upload 容器 */\n.readonly-upload-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* 图片列表(网格布局) */\n.readonly-image-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n gap: 8px;\n max-width: 100%;\n}\n\n.readonly-image-item {\n border-radius: var(--border-radius-small);\n cursor: pointer;\n transition: transform 0.2s ease;\n border: 1px solid var(--color-border-2);\n}\n\n.readonly-image-item:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n/* 文件列表 */\n.readonly-file-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.readonly-file-link {\n color: rgb(var(--primary-6));\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.readonly-file-link:hover {\n text-decoration: underline;\n color: rgb(var(--primary-5));\n}\n\n.readonly-file-link::before {\n content: '📎';\n font-size: 14px;\n}\n\n/* Select 多选 */\n.readonly-field-select-multiple {\n word-break: break-word;\n}\n\n/* Cascader 路径 */\n.readonly-field-cascader {\n word-break: break-word;\n}\n\n/* Rate */\n.readonly-field-rate {\n color: var(--color-text-1);\n}\n\n/* Slider */\n.readonly-field-slider {\n color: var(--color-text-1);\n}\n\n/* Switch */\n.readonly-field-switch {\n color: var(--color-text-1);\n}\n\n/* Date */\n.readonly-field-date {\n color: var(--color-text-1);\n}\n\n/* Range */\n.readonly-field-range {\n color: var(--color-text-1);\n}\n\n/* Time */\n.readonly-field-time {\n color: var(--color-text-1);\n}\n</style>\n","import { ref } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport type {\n UseReadonlyFieldOptions,\n UseReadonlyFieldReturn,\n RenderConfig,\n} from './types';\nimport { getRenderer } from './renderers';\nimport {\n getLabelFromOptions,\n getLabelsFromOptions,\n getLabelFromTreeData,\n} from './utils';\n\n/**\n * useReadonlyField Hook\n * 提供函数式的只读字段渲染能力\n * \n * @param options - Hook 配置选项\n * @returns Hook 返回值\n * \n * @example\n * ```ts\n * const { render, getLabel } = useReadonlyField();\n * \n * // 渲染字段\n * const content = render(value, {\n * component: 'Select',\n * componentProps: { options: [...] }\n * });\n * \n * // 获取 label\n * const label = await getLabel(value, {\n * component: 'Select',\n * componentProps: { options: [...] }\n * });\n * ```\n */\nexport function useReadonlyField(\n options?: UseReadonlyFieldOptions\n): UseReadonlyFieldReturn {\n // 默认配置\n const defaultEmptyText = options?.defaultEmptyText || '-';\n const globalLabelMap = options?.globalLabelMap || {};\n\n // 缓存的 options(用于异步获取)\n const optionsCache = ref<Map<string, any[]>>(new Map());\n\n /**\n * 渲染函数\n * @param value - 值\n * @param config - 渲染配置\n * @returns 渲染的 VNode\n */\n const render = (value: any, config: RenderConfig): VNodeChild => {\n try {\n // 合并配置\n const mergedConfig: RenderConfig = {\n emptyText: defaultEmptyText,\n ...config,\n labelMap: {\n ...globalLabelMap,\n ...(config.labelMap || {}),\n },\n };\n\n // 自定义渲染优先\n if (mergedConfig.customRender) {\n return mergedConfig.customRender(value, mergedConfig);\n }\n\n // 获取对应的渲染器\n const renderer = getRenderer(mergedConfig.component || 'Input');\n\n // 执行渲染\n return renderer(value, mergedConfig);\n } catch (error) {\n console.error('[useReadonlyField] 渲染错误:', error);\n return defaultEmptyText;\n }\n };\n\n /**\n * 获取 label(用于 Select、TreeSelect 等)\n * @param value - 值\n * @param config - 渲染配置\n * @returns label 字符串\n */\n const getLabel = async (\n value: any,\n config: RenderConfig\n ): Promise<string> => {\n if (value === null || value === undefined || value === '') {\n return config.emptyText || defaultEmptyText;\n }\n\n // 优先使用 labelMap\n const labelMap = {\n ...globalLabelMap,\n ...(config.labelMap || {}),\n };\n\n if (value in labelMap) {\n return labelMap[value];\n }\n\n // 处理异步 fetchOptions\n if (config.fetchOptions) {\n try {\n // 尝试从缓存获取\n const cacheKey = config.fetchOptions.toString();\n let options = optionsCache.value.get(cacheKey);\n\n if (!options) {\n // 缓存中没有,执行获取\n options = await config.fetchOptions();\n optionsCache.value.set(cacheKey, options || []);\n }\n\n return getLabelFromOptions(value, options || []);\n } catch (error) {\n console.error('[useReadonlyField] 获取 options 失败:', error);\n return String(value);\n }\n }\n\n // 从 componentProps.options 中获取\n const options = config.componentProps?.options || [];\n if (options.length > 0) {\n return getLabelFromOptions(value, options);\n }\n\n // 从 componentProps.data(TreeSelect)中获取\n const treeData = config.componentProps?.data || [];\n if (treeData.length > 0) {\n return getLabelFromTreeData(value, treeData);\n }\n\n // 都没有,直接返回值\n return String(value);\n };\n\n /**\n * 获取多个 label(用于多选)\n * @param values - 值数组\n * @param config - 渲染配置\n * @returns label 字符串数组\n */\n const getLabels = async (\n values: any[],\n config: RenderConfig\n ): Promise<string[]> => {\n if (!values || !Array.isArray(values) || values.length === 0) {\n return [];\n }\n\n // 处理异步 fetchOptions\n if (config.fetchOptions) {\n try {\n // 尝试从缓存获取\n const cacheKey = config.fetchOptions.toString();\n let options = optionsCache.value.get(cacheKey);\n\n if (!options) {\n // 缓存中没有,执行获取\n options = await config.fetchOptions();\n optionsCache.value.set(cacheKey, options || []);\n }\n\n return getLabelsFromOptions(values, options || []);\n } catch (error) {\n console.error('[useReadonlyField] 获取 options 失败:', error);\n return values.map(String);\n }\n }\n\n // 从 componentProps.options 中获取\n const options = config.componentProps?.options || [];\n if (options.length > 0) {\n return getLabelsFromOptions(values, options);\n }\n\n // 都没有,直接返回值\n return values.map(String);\n };\n\n /**\n * 清除 options 缓存\n */\n const clearCache = () => {\n optionsCache.value.clear();\n };\n\n return {\n render,\n getLabel,\n getLabels,\n clearCache,\n };\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 <!-- 自定义 label(支持省略和 tooltip) -->\n <template v-if=\"shouldRenderCustomLabel(schema)\" #label>\n <a-tooltip\n v-if=\"schema.labelTooltip\"\n :content=\"getLabelTooltipContent(schema)\"\n >\n <span :style=\"getLabelStyle(schema)\">\n {{ schema.label }}\n </span>\n </a-tooltip>\n <span v-else :style=\"getLabelStyle(schema)\">\n {{ schema.label }}\n </span>\n </template>\n <!-- 使用插槽自定义内容 -->\n <template v-if=\"schema.slotName\">\n <slot\n :name=\"schema.slotName\"\n :field=\"schema.field\"\n :schema=\"schema\"\n :formModel=\"formModel\"\n />\n </template>\n <!-- 自定义组件内容渲染 -->\n <template v-else-if=\"schema.renderComponentContent\">\n <component\n :is=\"schema.renderComponentContent(schema, formModel)\"\n />\n </template>\n <!-- 只读字段渲染 -->\n <template v-else-if=\"isFieldReadonly(schema)\">\n <BasicReadonlyField\n :value=\"formModel[schema.field]\"\n :component=\"getComponentString(schema.component)\"\n :componentProps=\"schema.componentProps\"\n :labelMap=\"schema.readonlyConfig?.labelMap\"\n :fetchOptions=\"schema.readonlyConfig?.fetchOptions\"\n :emptyText=\"schema.readonlyConfig?.emptyText\"\n :customRender=\"schema.readonlyConfig?.customRender ? (value: any) => schema.readonlyConfig!.customRender!(value, schema) : undefined\"\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 <template #icon>\n <icon-search />\n </template>\n {{ getActionProps.submitButtonText }}\n </a-button>\n <a-button\n v-if=\"getActionProps.showResetButton\"\n @click=\"handleReset\"\n >\n <template #icon>\n <icon-refresh />\n </template>\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, getRules} from './componentMap';\nimport type {FormSchema, BasicFormProps, BasicFormEmits} from './types';\nimport {BasicReadonlyField} from '../ReadonlyField';\n\ndefineOptions({\n name: 'BasicForm',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicFormProps>(), {\n schemas: () => [],\n layout: 'horizontal',\n labelAlign: 'right',\n gutter: 24,\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 labelColProps: propsData.labelColProps,\n wrapperColProps: propsData.wrapperColProps,\n };\n});\n\n// 获取 Row 配置\nconst getRow = computed(() => {\n const propsData = unref(getProps);\n return {\n gutter: propsData.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 =\n 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: FormSchema) => 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: FormSchema) => {\n if (!(schema.field in formModel)) {\n formModel[schema.field] =\n schema.defaultValue !== undefined ? schema.defaultValue : 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: FormSchema) => {\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 // 自动生成必填验证规则\n let rules = schema.rules;\n if (schema.required && (!rules || rules.length === 0)) {\n const componentType =\n typeof schema.component === 'string' ? schema.component : '';\n rules = getRules(componentType, schema.label);\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,\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// 判断是否需要渲染自定义 label\nconst shouldRenderCustomLabel = (schema: FormSchema): boolean => {\n return !!(schema.labelEllipsis || schema.labelTooltip);\n};\n\n// 获取 label 样式\nconst getLabelStyle = (schema: FormSchema): Record<string, any> => {\n if (!schema.labelEllipsis) {\n return {};\n }\n\n const maxWidth = schema.labelMaxWidth || '150px';\n\n return {\n display: 'inline-block',\n maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n };\n};\n\n// 获取 label tooltip 内容\nconst getLabelTooltipContent = (schema: FormSchema): string => {\n if (typeof schema.labelTooltip === 'string') {\n return schema.labelTooltip;\n }\n return schema.label;\n};\n\n// 判断字段是否为只读模式\nconst isFieldReadonly = (schema: FormSchema): boolean => {\n const propsData = unref(getProps);\n \n // 全局只读模式\n if (propsData.readonly) {\n return true;\n }\n \n // 字段级只读配置\n if (schema.readonly !== undefined) {\n if (typeof schema.readonly === 'boolean') {\n return schema.readonly;\n }\n if (typeof schema.readonly === 'function') {\n return schema.readonly(formModel);\n }\n }\n \n return false;\n};\n\n// 获取组件字符串类型(用于 ReadonlyField)\nconst getComponentString = (component: string | any): string => {\n if (typeof component === 'string') {\n return component;\n }\n // 如果是组件实例,尝试获取组件名\n return component?.name || 'Input';\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 // 如果是直接调用(没有传入 data 参数),需要先验证\n if (!data) {\n try {\n await validate();\n const values = getFieldsValue();\n emit('submit', values);\n return values;\n } catch (error) {\n console.warn('表单验证失败:', error);\n throw error;\n }\n }\n\n // 如果是表单 @submit 事件触发(有 data 参数)\n // 如果有验证错误,不触发 submit\n if (data.errors) {\n console.warn('表单验证失败:', data.errors);\n return;\n }\n\n // 验证通过,触发 submit 事件\n emit('submit', data.values);\n return 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 =\n internalSchemas.value.length > 0\n ? internalSchemas.value\n : props.schemas || [];\n const hasField = schemas.some((s: FormSchema) => 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: FormSchema) => 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 (\n item.defaultValue !== undefined &&\n formModel[item.field!] === oldSchema.defaultValue\n ) {\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(\n (s: FormSchema) => s.field === f,\n );\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: FormSchema) => 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 () => getProps.value.schemas,\n (newSchemas: any) => {\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, watch } 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(\n options: UseFormOptions = {},\n): [(formInstance: any) => void, Omit<UseFormReturn, 'register'>] {\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 const pendingValues = ref<Record<string, any> | null>(null);\n let unwatchFormRef: (() => void) | null = null;\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\n // 清理旧的监听器\n if (unwatchFormRef) {\n unwatchFormRef();\n unwatchFormRef = null;\n }\n\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 if (formInstance.formRef) {\n unwatchFormRef = watch(\n () => formInstance.formRef.value,\n (val: any) => {\n if (val === null) {\n formRef.value = null;\n loadedRef.value = false;\n if (unwatchFormRef) {\n unwatchFormRef();\n unwatchFormRef = null;\n }\n }\n },\n { flush: 'sync' }, // 同步执行,确保及时清理\n );\n }\n\n // 关键:注册完成后应用待处理的值\n if (pendingValues.value) {\n await setFieldsValue(pendingValues.value);\n pendingValues.value = null;\n }\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 const form = unref(formRef);\n if (!form) return null;\n\n // 双重保险:检查实例是否真正可用\n if (form.formRef?.value === null) {\n formRef.value = null;\n loadedRef.value = false;\n return null;\n }\n\n return form;\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\n // 如果表单未注册,保存到待处理队列\n if (!form) {\n pendingValues.value = { ...pendingValues.value, ...values };\n return;\n }\n\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","/**\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","<template>\n <div class=\"basic-text-ellipsis\">\n <a-tooltip\n v-if=\"showTooltip\"\n :content=\"text\"\n :trigger=\"tooltipTrigger\"\n v-bind=\"tooltipProps\"\n >\n <div\n ref=\"textRef\"\n class=\"text-ellipsis-content\"\n :style=\"ellipsisStyle\"\n >\n {{ text }}\n </div>\n </a-tooltip>\n <div\n v-else\n ref=\"textRef\"\n class=\"text-ellipsis-content\"\n :style=\"ellipsisStyle\"\n >\n {{ text }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, watch, nextTick } from 'vue';\nimport type { TextEllipsisProps } from './types';\nimport { debounce } from '../../utils/debounce';\n\n// Props 定义\nconst props = withDefaults(defineProps<TextEllipsisProps>(), {\n text: '',\n lines: 1,\n tooltip: true,\n tooltipTrigger: 'hover',\n alwaysShowTooltip: false,\n tooltipProps: () => ({}),\n});\n\n// 响应式状态\nconst textRef = ref<HTMLDivElement>();\nconst isTruncated = ref(false);\nlet resizeObserver: ResizeObserver | null = null;\n\n// 计算样式\nconst ellipsisStyle = computed<Record<string, any>>(() => {\n if (props.lines === 1) {\n return {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n }\n\n return {\n display: '-webkit-box',\n '-webkit-box-orient': 'vertical',\n '-webkit-line-clamp': props.lines,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n wordBreak: 'break-word',\n };\n});\n\n// 是否显示 tooltip\nconst showTooltip = computed(() => {\n if (!props.tooltip) {\n return false;\n }\n \n if (props.alwaysShowTooltip) {\n return true;\n }\n\n return isTruncated.value;\n});\n\n// 检测文本是否被截断\nconst checkTruncation = () => {\n if (!textRef.value) {\n return;\n }\n\n const element = textRef.value;\n \n // 对于单行省略,检查 scrollWidth 和 clientWidth\n if (props.lines === 1) {\n isTruncated.value = element.scrollWidth > element.clientWidth;\n } else {\n // 对于多行省略,检查 scrollHeight 和 clientHeight\n isTruncated.value = element.scrollHeight > element.clientHeight;\n }\n};\n\n// 防抖的检测函数\nconst debouncedCheck = debounce(checkTruncation, 100);\n\n// 初始化 ResizeObserver\nconst initResizeObserver = () => {\n if (!textRef.value) {\n return;\n }\n\n resizeObserver = new ResizeObserver(() => {\n debouncedCheck();\n });\n\n resizeObserver.observe(textRef.value);\n};\n\n// 清理 ResizeObserver\nconst cleanupResizeObserver = () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n debouncedCheck.cancel();\n};\n\n// 生命周期钩子\nonMounted(() => {\n nextTick(() => {\n checkTruncation();\n initResizeObserver();\n });\n});\n\nonBeforeUnmount(() => {\n cleanupResizeObserver();\n});\n\n// 监听文本和行数变化\nwatch(\n () => [props.text, props.lines],\n () => {\n nextTick(() => {\n checkTruncation();\n });\n }\n);\n</script>\n\n<style scoped>\n.basic-text-ellipsis {\n width: 100%;\n}\n\n.text-ellipsis-content {\n width: 100%;\n word-wrap: break-word;\n}\n</style>\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 { componentMap as formComponentMap } from '../../Form/componentMap';\n\n/**\n * 编辑组件映射表\n * 复用 Form 组件的 componentMap,支持所有 Arco Design 数据输入组件\n */\nexport const editComponentMap = {\n ...formComponentMap,\n // 可以添加 Table 专用的编辑组件\n};\n\n/**\n * 获取编辑组件\n * @param name 组件名称(字符串)或组件实例\n * @returns 组件实例\n */\nexport function getEditComponent(name: string | any): any {\n if (typeof name === 'string') {\n return editComponentMap[name as keyof typeof editComponentMap];\n }\n return name;\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { BasicColumn, TrimConfig, EventListeners } from '../../types';\n\n/**\n * useTrim Hook 选项\n */\nexport interface UseTrimOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 全局编辑配置 */\n editConfig?: { autoTrim?: boolean };\n}\n\n/**\n * useTrim Hook 返回值\n */\nexport interface UseTrimReturn {\n /** Trim 配置(computed,自动缓存) */\n trimConfig: ComputedRef<TrimConfig>;\n /** 应用 trim 处理 */\n applyTrim: (value: any) => any;\n /** 包装事件监听器以支持 trim */\n wrapTrimListeners: (listeners: EventListeners, currentValue: () => any, onChange: (value: any) => void) => EventListeners;\n}\n\n/**\n * Trim Hook\n * 封装所有 trim 相关逻辑\n * \n * @param options - 配置选项\n * @returns Trim 相关方法和配置\n * \n * @example\n * ```typescript\n * const { trimConfig, applyTrim, wrapTrimListeners } = useTrim({\n * column: props.column,\n * editConfig: props.editConfig\n * });\n * ```\n */\nexport function useTrim(options: UseTrimOptions): UseTrimReturn {\n const { column, editConfig } = options;\n\n /**\n * 获取 Trim 配置(使用 computed 缓存)\n */\n const trimConfig = computed<TrimConfig>(() => {\n const columnConfig = column.autoTrim;\n const globalConfig = editConfig?.autoTrim;\n\n // 默认配置\n const defaultConfig: TrimConfig = {\n enabled: true,\n overall: true,\n eachLine: false,\n trigger: 'blur',\n };\n\n // 列级配置优先,然后是全局配置\n if (typeof columnConfig === 'object' && columnConfig !== null) {\n return {\n enabled: true,\n overall: columnConfig.overall ?? defaultConfig.overall,\n eachLine: columnConfig.eachLine ?? defaultConfig.eachLine,\n trigger: columnConfig.trigger ?? defaultConfig.trigger,\n };\n }\n\n if (typeof columnConfig === 'boolean') {\n return { ...defaultConfig, enabled: columnConfig };\n }\n\n if (typeof globalConfig === 'boolean') {\n return { ...defaultConfig, enabled: globalConfig };\n }\n\n return defaultConfig;\n });\n\n /**\n * 应用 trim 处理\n * @param value - 要处理的值\n * @returns 处理后的值\n */\n const applyTrim = (value: any): any => {\n const config = trimConfig.value;\n \n // 只对字符串进行 trim\n if (typeof value !== 'string') {\n return value;\n }\n\n let result = value;\n\n // trim 每行(用于 Textarea)\n if (config.eachLine) {\n result = result\n .split('\\n')\n .map(line => line.trim())\n .join('\\n');\n }\n\n // trim 整体\n if (config.overall) {\n result = result.trim();\n }\n\n return result;\n };\n\n /**\n * 包装事件监听器以支持 trim\n * @param listeners - 用户的事件监听器\n * @param currentValue - 获取当前值的函数\n * @param onChange - 值变化回调\n * @returns 包装后的事件监听器\n */\n const wrapTrimListeners = (\n listeners: EventListeners,\n currentValue: () => any,\n onChange: (value: any) => void\n ): EventListeners => {\n const config = trimConfig.value;\n\n if (!config.enabled) {\n return {};\n }\n\n const wrappedListeners: EventListeners = {};\n\n // 根据触发时机处理\n if (config.trigger === 'blur') {\n // 失焦时 trim\n const originalOnBlur = listeners.onBlur;\n wrappedListeners.onBlur = (...args: any[]) => {\n // 先执行用户的 onBlur\n originalOnBlur?.(...args);\n\n // 然后执行 trim\n const value = currentValue();\n const trimmedValue = applyTrim(value);\n\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n }\n };\n }\n\n return wrappedListeners;\n };\n\n return {\n trimConfig,\n applyTrim,\n wrapTrimListeners,\n };\n}\n","/**\n * 需要使用 \"请输入\" placeholder 的组件类型\n */\nexport const componentsNeedInputPlaceholder = new Set([\n 'Input',\n 'InputPassword',\n 'Textarea',\n 'AutoComplete',\n 'InputNumber',\n]);\n\n/**\n * 需要使用 \"请选择\" placeholder 的组件类型\n */\nexport const componentsNeedSelectPlaceholder = new Set([\n 'Select',\n 'DatePicker',\n 'TimePicker',\n 'RangePicker',\n 'Cascader',\n 'TreeSelect',\n 'Radio',\n 'RadioGroup',\n 'Checkbox',\n 'CheckboxGroup',\n]);\n\n/**\n * 需要使用 \"请上传\" placeholder 的组件类型\n */\nexport const componentsNeedUploadPlaceholder = new Set([\n 'Upload',\n 'BasicUpload',\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 (!label) {\n return '';\n }\n \n if (componentsNeedInputPlaceholder.has(component)) {\n return `请输入${label}`;\n }\n \n if (componentsNeedSelectPlaceholder.has(component)) {\n return `请选择${label}`;\n }\n \n if (componentsNeedUploadPlaceholder.has(component)) {\n return `请上传${label}`;\n }\n \n return '';\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn, EventListeners } from '../../types';\nimport { getPlaceholder } from '../utils';\n\n/**\n * useComponentProps Hook 选项\n */\nexport interface UseComponentPropsOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 当前行数据 */\n record: TableData;\n /** 组件大小 */\n size?: 'mini' | 'small' | 'medium' | 'large';\n /** 验证错误信息 */\n error?: string;\n /** 额外的事件监听器(用于包装 trim 等) */\n extraListeners?: EventListeners;\n}\n\n/**\n * useComponentProps Hook 返回值\n */\nexport interface UseComponentPropsReturn {\n /** 组件类型名称 */\n componentType: ComputedRef<string>;\n /** 用户配置的属性 */\n attrs: ComputedRef<Record<string, any>>;\n /** 用户配置的事件监听器 */\n listeners: ComputedRef<EventListeners>;\n /** 合并后的所有属性 */\n mergedProps: ComputedRef<Record<string, any>>;\n}\n\n/**\n * 组件属性处理 Hook\n * 处理属性和事件的分离、合并等逻辑\n * \n * @param options - 配置选项\n * @returns 组件属性相关的计算属性\n * \n * @example\n * ```typescript\n * const { componentType, attrs, listeners, mergedProps } = useComponentProps({\n * column: props.column,\n * record: props.record,\n * size: props.size,\n * error: props.error,\n * });\n * ```\n */\nexport function useComponentProps(options: UseComponentPropsOptions): UseComponentPropsReturn {\n const { column, record, size = 'small', error, extraListeners = {} } = options;\n\n /**\n * 获取组件类型名称(用于智能 placeholder)\n */\n const componentType = computed(() => {\n if (typeof column.editComponent === 'string') {\n return column.editComponent;\n }\n return 'Input';\n });\n\n /**\n * 获取用户配置的属性和事件\n */\n const userComponentProps = computed(() => {\n if (!column.editComponentProps) {\n return {};\n }\n\n if (typeof column.editComponentProps === 'function') {\n return column.editComponentProps(record);\n }\n\n return column.editComponentProps;\n });\n\n /**\n * 分离 props 和事件监听器\n * Vue 3 中,onXxx 格式的 prop 会被自动识别为事件监听器\n */\n const separatedProps = computed(() => {\n const userProps = userComponentProps.value;\n const attrs: Record<string, any> = {};\n const listeners: EventListeners = {};\n\n // 使用 for...in 遍历,性能优于 Object.keys().forEach\n for (const key in userProps) {\n if (Object.prototype.hasOwnProperty.call(userProps, key)) {\n // 判断是否是事件(以 on 开头且第三个字符是大写)\n // 使用 charCodeAt 替代正则表达式,性能更好\n if (key.startsWith('on') && key.length > 2 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90) {\n listeners[key] = userProps[key];\n } else {\n attrs[key] = userProps[key];\n }\n }\n }\n\n return { attrs, listeners };\n });\n\n /**\n * 属性部分\n */\n const attrs = computed(() => separatedProps.value.attrs);\n\n /**\n * 事件监听器部分\n */\n const listeners = computed(() => separatedProps.value.listeners);\n\n /**\n * 合并所有组件属性(包括基础属性、用户属性、事件监听器)\n */\n const mergedProps = computed(() => {\n const { attrs: userAttrs, listeners: userListeners } = separatedProps.value;\n\n // 基础属性\n const baseProps: Record<string, any> = {\n size,\n status: error ? 'error' : undefined,\n };\n\n // 智能 placeholder(仅在用户未配置时生效)\n if (!userAttrs.placeholder) {\n baseProps.placeholder = getPlaceholder(componentType.value, column.title as string || '');\n }\n\n // 合并:基础属性 < 用户属性 < 用户事件监听器 < 额外的事件监听器\n // extraListeners(如 trim 包装)会在内部调用用户的原始监听器\n return {\n ...baseProps,\n ...userAttrs,\n ...userListeners,\n ...extraListeners,\n };\n });\n\n return {\n componentType,\n attrs,\n listeners,\n mergedProps,\n };\n}\n","import { ref, watch, onBeforeUnmount, type Ref } from 'vue';\n\n/**\n * useEditCellValue Hook 选项\n */\nexport interface UseEditCellValueOptions {\n /** 外部传入的值 */\n value: any;\n /** 值变化回调 */\n onChange: (value: any) => void;\n /** 防抖延迟(毫秒),0 表示不防抖 */\n debounce?: number;\n /** 节流延迟(毫秒),0 表示不节流 */\n throttle?: number;\n /** 是否深度监听(仅对对象/数组有效) */\n deep?: boolean;\n}\n\n/**\n * useEditCellValue Hook 返回值\n */\nexport interface UseEditCellValueReturn {\n /** 当前值 */\n currentValue: Ref<any>;\n /** 处理值变化 */\n handleChange: (value: any) => void;\n /** 直接设置值(不触发 onChange) */\n setValue: (value: any) => void;\n}\n\n/**\n * 编辑单元格值管理 Hook\n * 管理编辑值的状态、同步、防抖/节流等\n * \n * @param options - 配置选项\n * @returns 值管理相关的方法和状态\n * \n * @example\n * ```typescript\n * const { currentValue, handleChange, setValue } = useEditCellValue({\n * value: props.value,\n * onChange: (val) => emit('change', val),\n * debounce: 300,\n * });\n * ```\n */\nexport function useEditCellValue(options: UseEditCellValueOptions): UseEditCellValueReturn {\n const { value, onChange, debounce = 0, throttle = 0, deep = false } = options;\n\n // 内部值\n const currentValue = ref(value);\n \n // 防抖计时器\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n \n // 节流相关\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n let lastThrottleTime = 0;\n\n /**\n * 监听外部值变化\n * 智能判断是否需要深度监听\n */\n watch(\n () => value,\n (newVal) => {\n currentValue.value = newVal;\n },\n { \n // 只对对象/数组使用深度监听\n deep: deep || (typeof value === 'object' && value !== null)\n }\n );\n\n /**\n * 清理计时器\n */\n const clearTimers = () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n };\n\n /**\n * 执行防抖\n */\n const executeDebounce = (callback: () => void) => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n callback();\n debounceTimer = null;\n }, debounce);\n };\n\n /**\n * 执行节流\n */\n const executeThrottle = (callback: () => void) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastThrottleTime;\n\n if (timeSinceLastCall >= throttle) {\n // 可以立即执行\n callback();\n lastThrottleTime = now;\n } else {\n // 需要等待\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n }\n const remainingTime = throttle - timeSinceLastCall;\n throttleTimer = setTimeout(() => {\n callback();\n lastThrottleTime = Date.now();\n throttleTimer = null;\n }, remainingTime);\n }\n };\n\n /**\n * 处理值变化\n */\n const handleChange = (newValue: any) => {\n // 更新内部值\n currentValue.value = newValue;\n\n // 执行回调\n const executeCallback = () => {\n onChange(newValue);\n };\n\n // 根据配置决定执行方式\n if (debounce > 0 && throttle > 0) {\n // 同时配置了防抖和节流,优先使用防抖\n console.warn('[useEditCellValue] 同时配置了防抖和节流,将使用防抖');\n executeDebounce(executeCallback);\n } else if (debounce > 0) {\n // 防抖\n executeDebounce(executeCallback);\n } else if (throttle > 0) {\n // 节流\n executeThrottle(executeCallback);\n } else {\n // 立即执行\n executeCallback();\n }\n };\n\n /**\n * 直接设置值(不触发 onChange)\n * 用于外部同步值的场景\n */\n const setValue = (newValue: any) => {\n currentValue.value = newValue;\n };\n\n /**\n * 组件卸载时清理计时器\n */\n onBeforeUnmount(() => {\n clearTimers();\n });\n\n return {\n currentValue,\n handleChange,\n setValue,\n };\n}\n","/**\n * 预设格式化器\n * 提供常用的值格式化函数\n */\n\n/**\n * Trim 格式化器\n * 去除字符串首尾空格\n */\nexport function trimFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.trim();\n}\n\n/**\n * 大写格式化器\n * 将字符串转为大写\n */\nexport function uppercaseFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.toUpperCase();\n}\n\n/**\n * 小写格式化器\n * 将字符串转为小写\n */\nexport function lowercaseFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.toLowerCase();\n}\n\n/**\n * 数字格式化器\n * 将值转换为数字\n */\nexport function numberFormatter(value: any): any {\n const num = Number(value);\n return isNaN(num) ? value : num;\n}\n\n/**\n * 首字母大写格式化器\n * 将字符串首字母转为大写\n */\nexport function capitalizeFormatter(value: any): any {\n if (typeof value !== 'string' || value.length === 0) {\n return value;\n }\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\n/**\n * 移除多余空格格式化器\n * 将多个连续空格替换为单个空格\n */\nexport function removeExtraSpacesFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.replace(/\\s+/g, ' ');\n}\n\n/**\n * 移除所有空格格式化器\n * 移除字符串中的所有空格\n */\nexport function removeAllSpacesFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.replace(/\\s/g, '');\n}\n\n/**\n * 格式化器映射表\n */\nexport const formatters = {\n trim: trimFormatter,\n uppercase: uppercaseFormatter,\n lowercase: lowercaseFormatter,\n number: numberFormatter,\n capitalize: capitalizeFormatter,\n removeExtraSpaces: removeExtraSpacesFormatter,\n removeAllSpaces: removeAllSpacesFormatter,\n} as const;\n\n/**\n * 格式化器类型\n */\nexport type FormatterType = keyof typeof formatters;\n\n/**\n * 获取格式化器\n * @param type - 格式化器类型\n * @returns 格式化函数\n */\nexport function getFormatter(type: string): ((value: any) => any) | undefined {\n return formatters[type as FormatterType];\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { BasicColumn, FormatConfig, EventListeners } from '../../types';\nimport { getFormatter } from './formatters';\nimport { useTrim } from './useTrim';\n\n/**\n * useEditFormat Hook 选项\n */\nexport interface UseEditFormatOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 全局编辑配置 */\n editConfig?: { autoTrim?: boolean };\n}\n\n/**\n * useEditFormat Hook 返回值\n */\nexport interface UseEditFormatReturn {\n /** 格式化配置 */\n formatConfigs: ComputedRef<FormatConfig[]>;\n /** 应用所有格式化 */\n applyFormat: (value: any, trigger?: 'change' | 'blur') => any;\n /** 包装事件监听器以支持格式化 */\n wrapFormatListeners: (listeners: EventListeners, currentValue: () => any, onChange: (value: any) => void) => EventListeners;\n}\n\n/**\n * 统一格式化系统 Hook\n * 支持多种格式化类型,替代单一的 autoTrim\n * \n * @param options - 配置选项\n * @returns 格式化相关的方法和配置\n * \n * @example\n * ```typescript\n * const { formatConfigs, applyFormat, wrapFormatListeners } = useEditFormat({\n * column: props.column,\n * editConfig: props.editConfig,\n * });\n * ```\n */\nexport function useEditFormat(options: UseEditFormatOptions): UseEditFormatReturn {\n const { column, editConfig } = options;\n\n // 使用 trim hook 处理向后兼容\n const { trimConfig, applyTrim } = useTrim({ column, editConfig });\n\n /**\n * 获取格式化配置(使用 computed 缓存)\n */\n const formatConfigs = computed<FormatConfig[]>(() => {\n const configs: FormatConfig[] = [];\n\n // 优先使用新的 editFormat 配置\n if (column.editFormat) {\n if (Array.isArray(column.editFormat)) {\n configs.push(...column.editFormat);\n } else {\n configs.push(column.editFormat);\n }\n }\n // 向后兼容:如果没有 editFormat,但有 autoTrim 配置\n else if (column.autoTrim !== undefined || editConfig?.autoTrim !== undefined) {\n // 将 autoTrim 转换为 format 配置\n if (trimConfig.value.enabled) {\n configs.push({\n type: 'trim',\n trigger: trimConfig.value.trigger,\n });\n }\n }\n\n return configs;\n });\n\n /**\n * 应用单个格式化\n * @param value - 要格式化的值\n * @param formatConfig - 格式化配置\n * @returns 格式化后的值\n */\n const applySingleFormat = (value: any, formatConfig: FormatConfig): any => {\n const { type } = formatConfig;\n\n // 如果 type 是函数,直接调用\n if (typeof type === 'function') {\n return type(value);\n }\n\n // 特殊处理 trim(使用 useTrim 的逻辑以支持 eachLine 等高级配置)\n if (type === 'trim') {\n return applyTrim(value);\n }\n\n // 使用预设格式化器\n const formatter = getFormatter(type as string);\n if (formatter) {\n return formatter(value);\n }\n\n // 如果没有找到格式化器,返回原值并警告\n console.warn(`[useEditFormat] 未找到格式化器: ${type}`);\n return value;\n };\n\n /**\n * 应用所有格式化\n * @param value - 要格式化的值\n * @param trigger - 触发时机(可选)\n * @returns 格式化后的值\n */\n const applyFormat = (value: any, trigger?: 'change' | 'blur'): any => {\n let result = value;\n\n const configs = formatConfigs.value;\n\n for (const config of configs) {\n // 如果指定了触发时机,只应用匹配的格式化\n if (trigger && config.trigger && config.trigger !== trigger) {\n continue;\n }\n\n result = applySingleFormat(result, config);\n }\n\n return result;\n };\n\n /**\n * 包装事件监听器以支持格式化\n * @param listeners - 用户的事件监听器\n * @param currentValue - 获取当前值的函数\n * @param onChange - 值变化回调\n * @returns 包装后的事件监听器\n */\n const wrapFormatListeners = (\n listeners: EventListeners,\n currentValue: () => any,\n onChange: (value: any) => void\n ): EventListeners => {\n const configs = formatConfigs.value;\n\n if (configs.length === 0) {\n return {};\n }\n\n const wrappedListeners: EventListeners = {};\n\n // 检查是否有 blur 触发的格式化\n const hasBlurFormat = configs.some(config => !config.trigger || config.trigger === 'blur');\n\n if (hasBlurFormat) {\n const originalOnBlur = listeners.onBlur;\n wrappedListeners.onBlur = (...args: any[]) => {\n // 先执行用户的 onBlur\n originalOnBlur?.(...args);\n\n // 然后执行 blur 触发的格式化\n const value = currentValue();\n const formattedValue = applyFormat(value, 'blur');\n\n if (formattedValue !== value) {\n onChange(formattedValue);\n }\n };\n }\n\n return wrappedListeners;\n };\n\n return {\n formatConfigs,\n applyFormat,\n wrapFormatListeners,\n };\n}\n","<template>\n <div class=\"edit-cell\">\n <!-- 自定义渲染 -->\n <template v-if=\"props.column.editRender\">\n <component\n :is=\"customRenderContent\"\n />\n </template>\n <!-- 默认组件渲染 -->\n <template v-else>\n <component\n :is=\"editComponent\"\n v-bind=\"mergedProps\"\n :model-value=\"currentValue\"\n @update:model-value=\"handleChange\"\n class=\"edit-cell-input\"\n />\n </template>\n <div v-if=\"error\" class=\"edit-cell-error\">\n {{ error }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn } from '../types';\nimport { getEditComponent } from './componentMap';\nimport { useEditFormat, useComponentProps, useEditCellValue } from './hooks';\n\ndefineOptions({\n name: 'EditCell',\n});\n\ninterface EditCellProps {\n /** 列配置 */\n column: BasicColumn;\n /** 当前行数据 */\n record: TableData;\n /** 当前值 */\n value: any;\n /** 组件大小 */\n size?: 'mini' | 'small' | 'medium' | 'large';\n /** 验证错误信息 */\n error?: string;\n /** 行索引(用于自定义渲染) */\n rowIndex?: number;\n /** 全局编辑配置(用于获取全局 autoTrim) */\n editConfig?: { autoTrim?: boolean };\n}\n\ninterface EditCellEmits {\n (e: 'change', value: any): void;\n}\n\nconst props = withDefaults(defineProps<EditCellProps>(), {\n size: 'small',\n rowIndex: 0,\n});\n\nconst emit = defineEmits<EditCellEmits>();\n\n// 使用统一格式化系统 Hook(替代 useTrim,支持更多格式化类型)\nconst { applyFormat, wrapFormatListeners } = useEditFormat({\n column: props.column,\n editConfig: props.editConfig,\n});\n\n// 使用值管理 Hook(支持防抖/节流)\nconst { currentValue, handleChange: handleValueChange } = useEditCellValue({\n value: props.value,\n onChange: (value: any) => {\n // 应用 change 触发的格式化\n const formattedValue = applyFormat(value, 'change');\n emit('change', formattedValue);\n },\n debounce: props.column.editDebounce || 0, // 从 column 配置中获取防抖延迟\n throttle: props.column.editThrottle || 0, // 从 column 配置中获取节流延迟\n deep: false, // 智能深度监听由 hook 内部处理\n});\n\n/**\n * 获取编辑组件\n */\nconst editComponent = computed(() => {\n if (!props.column.editComponent) {\n return getEditComponent('Input');\n }\n \n const component = getEditComponent(props.column.editComponent);\n \n // 验证组件是否存在\n if (!component) {\n console.warn(`[EditCell] 未找到编辑组件: ${props.column.editComponent},将使用默认 Input 组件`);\n return getEditComponent('Input');\n }\n \n return component;\n});\n\n// 使用组件属性 Hook(不包含格式化监听器)\nconst { listeners, mergedProps: baseProps } = useComponentProps({\n column: props.column,\n record: props.record,\n size: props.size,\n error: props.error,\n});\n\n/**\n * 合并后的属性(包含格式化监听器)\n */\nconst mergedProps = computed(() => {\n const formatListeners = wrapFormatListeners(\n listeners.value,\n () => currentValue.value,\n (value) => {\n currentValue.value = value;\n emit('change', value);\n }\n );\n \n return {\n ...baseProps.value,\n ...formatListeners,\n };\n});\n\n/**\n * 处理值变化\n */\nconst handleChange = (value: any) => {\n handleValueChange(value);\n};\n\n/**\n * 自定义渲染内容\n */\nconst customRenderContent = computed(() => {\n if (!props.column.editRender) {\n return null;\n }\n \n try {\n return props.column.editRender({\n record: props.record,\n column: props.column,\n rowIndex: props.rowIndex,\n value: currentValue.value,\n onChange: handleChange,\n });\n } catch (error) {\n console.error('[EditCell] 自定义渲染函数执行出错:', error);\n return h('div', { style: { color: 'var(--color-danger)' } }, '渲染出错');\n }\n});\n</script>\n\n<style scoped>\n.edit-cell {\n width: 100%;\n}\n\n.edit-cell-input {\n width: 100%;\n}\n\n.edit-cell-error {\n color: rgb(var(--danger-6));\n font-size: 12px;\n line-height: 1.5;\n margin-top: 4px;\n}\n</style>\n","import type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn, EditRule } from '../types';\n\n/**\n * 编辑验证 Hook\n * 提供编辑值的验证功能\n */\nexport function useEditValidation() {\n /**\n * 验证单个字段\n */\n const validateField = async (\n value: any,\n column: BasicColumn,\n record: TableData\n ): Promise<{ valid: boolean; message?: string }> => {\n // 如果没有配置验证规则,直接通过\n if (!column.editRule) {\n return { valid: true };\n }\n \n // 统一处理为数组\n const rules = Array.isArray(column.editRule) ? column.editRule : [column.editRule];\n \n // 逐个验证规则\n for (const rule of rules) {\n const result = await validateSingleRule(value, rule, column, record);\n if (!result.valid) {\n return result;\n }\n }\n \n return { valid: true };\n };\n \n /**\n * 验证单个规则\n */\n const validateSingleRule = async (\n value: any,\n rule: EditRule,\n column: BasicColumn,\n record: TableData\n ): Promise<{ valid: boolean; message?: string }> => {\n const label = column.title || column.dataIndex || '字段';\n \n // 必填验证\n if (rule.required) {\n if (value === null || value === undefined || value === '') {\n return {\n valid: false,\n message: rule.message || `请输入${label}`,\n };\n }\n }\n \n // 如果值为空且不是必填,后续验证跳过\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n \n // 正则验证\n if (rule.pattern) {\n if (!rule.pattern.test(String(value))) {\n return {\n valid: false,\n message: rule.message || `${label}格式不正确`,\n };\n }\n }\n \n // 数字类型验证\n if (typeof value === 'number') {\n // 最小值验证\n if (rule.min !== undefined && value < rule.min) {\n return {\n valid: false,\n message: rule.message || `${label}不能小于${rule.min}`,\n };\n }\n \n // 最大值验证\n if (rule.max !== undefined && value > rule.max) {\n return {\n valid: false,\n message: rule.message || `${label}不能大于${rule.max}`,\n };\n }\n }\n \n // 字符串类型验证\n if (typeof value === 'string') {\n // 最小长度验证\n if (rule.minLength !== undefined && value.length < rule.minLength) {\n return {\n valid: false,\n message: rule.message || `${label}长度不能小于${rule.minLength}个字符`,\n };\n }\n \n // 最大长度验证\n if (rule.maxLength !== undefined && value.length > rule.maxLength) {\n return {\n valid: false,\n message: rule.message || `${label}长度不能大于${rule.maxLength}个字符`,\n };\n }\n }\n \n // 自定义验证函数(同步或异步)\n if (rule.validator) {\n try {\n const result = await rule.validator(value, record);\n \n if (result === false) {\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n \n if (typeof result === 'string') {\n return {\n valid: false,\n message: result,\n };\n }\n \n return { valid: true };\n } catch (error) {\n console.error('[useEditValidation] validator error:', error);\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n }\n \n // 异步验证函数(专门用于需要请求后端的场景)\n if (rule.asyncValidator) {\n try {\n const result = await rule.asyncValidator(value, record);\n \n if (result === false) {\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n \n if (typeof result === 'string') {\n return {\n valid: false,\n message: result,\n };\n }\n \n return { valid: true };\n } catch (error) {\n console.error('[useEditValidation] asyncValidator error:', error);\n return {\n valid: false,\n message: rule.message || `${label}异步验证失败`,\n };\n }\n }\n \n return { valid: true };\n };\n \n /**\n * 验证整行数据\n */\n const validateRow = async (\n editValues: Record<string, any>,\n columns: BasicColumn[],\n record: TableData\n ): Promise<{ valid: boolean; errors: Record<string, string> }> => {\n const errors: Record<string, string> = {};\n \n // 验证所有需要编辑的列\n for (const column of columns) {\n if (!column.dataIndex || !column.editRule) {\n continue;\n }\n \n const value = editValues[column.dataIndex];\n const result = await validateField(value, column, record);\n \n if (!result.valid && result.message) {\n errors[column.dataIndex] = result.message;\n }\n }\n \n return {\n valid: Object.keys(errors).length === 0,\n errors,\n };\n };\n \n return {\n validateField,\n validateRow,\n };\n}\n","import { reactive, computed } from 'vue';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport { Message } from '@arco-design/web-vue';\nimport type { BasicColumn, BasicTableProps, TableEditConfig } from '../types';\nimport { useEditValidation } from './useEditValidation';\n\n/**\n * 表格编辑 Hook\n * 管理编辑状态、编辑值、编辑操作\n */\nexport function useTableEdit(\n props: ComputedRef<BasicTableProps>,\n dataSource: Ref<TableData[]>,\n getRowKey: (record: TableData) => string | number\n) {\n // 编辑状态 Map: { recordKey: { columnKey: true } }\n const editingStateMap = reactive<Record<string, Record<string, boolean>>>({});\n\n // 编辑值 Map: { recordKey: { columnKey: value } }\n const editValueMap = reactive<Record<string, Record<string, any>>>({});\n\n // 原始数据缓存(用于取消编辑)\n const originalDataMap = reactive<Record<string, TableData>>({});\n\n // 验证错误 Map: { recordKey: { columnKey: errorMessage } }\n const validationErrorMap = reactive<Record<string, Record<string, string>>>({});\n\n // 编辑验证 Hook\n const { validateRow } = useEditValidation();\n\n /**\n * 获取编辑配置\n */\n const editConfig = computed<TableEditConfig>(() => {\n return {\n mode: 'row',\n enabled: true,\n allowAdd: true,\n allowDelete: true,\n ...props.value.editConfig,\n };\n });\n\n /**\n * 获取可编辑的列\n */\n const getEditableColumns = (columns: BasicColumn[]): BasicColumn[] => {\n return columns.filter(col => col.edit || col.editable);\n };\n\n /**\n * 检查是否正在编辑\n */\n const isEditing = (record: TableData, column?: BasicColumn): boolean => {\n const recordKey = String(getRowKey(record));\n\n if (!editingStateMap[recordKey]) {\n return false;\n }\n\n // 如果指定了列,检查该列是否在编辑\n if (column && column.dataIndex) {\n return !!editingStateMap[recordKey][column.dataIndex];\n }\n\n // 否则检查是否有任何列在编辑\n return Object.values(editingStateMap[recordKey]).some(Boolean);\n };\n\n /**\n * 获取编辑值\n */\n const getEditValue = (record: TableData, column: BasicColumn): any => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n // 如果有编辑值,返回编辑值\n if (editValueMap[recordKey] && columnKey in editValueMap[recordKey]) {\n return editValueMap[recordKey][columnKey];\n }\n\n // 如果有默认值,返回默认值\n if (column.editDefaultValue) {\n return column.editDefaultValue;\n }\n\n // 如果配置了 editValueGetter,使用它来获取值\n if (column.editValueGetter) {\n return column.editValueGetter(record);\n }\n\n // 否则返回原始值\n return record[columnKey];\n };\n\n /**\n * 设置编辑值\n */\n const setEditValue = (record: TableData, column: BasicColumn, value: any): void => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n if (!editValueMap[recordKey]) {\n editValueMap[recordKey] = {};\n }\n\n editValueMap[recordKey][columnKey] = value;\n\n // 清除该字段的验证错误\n if (validationErrorMap[recordKey] && validationErrorMap[recordKey][columnKey]) {\n delete validationErrorMap[recordKey][columnKey];\n }\n };\n\n /**\n * 获取验证错误\n */\n const getValidationError = (record: TableData, column: BasicColumn): string | undefined => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n if (validationErrorMap[recordKey]) {\n return validationErrorMap[recordKey][columnKey];\n }\n\n return undefined;\n };\n\n /**\n * 开始编辑\n */\n const startEdit = (record: TableData, column?: BasicColumn): void => {\n const recordKey = String(getRowKey(record));\n const mode = editConfig.value.mode || 'row';\n\n // 保存原始数据(如果还没保存过)\n if (!originalDataMap[recordKey]) {\n originalDataMap[recordKey] = { ...record };\n }\n\n // 初始化编辑状态\n if (!editingStateMap[recordKey]) {\n editingStateMap[recordKey] = {};\n }\n\n // 初始化编辑值\n if (!editValueMap[recordKey]) {\n editValueMap[recordKey] = {};\n }\n\n if (mode === 'row') {\n // 行编辑模式:编辑所有可编辑列\n const editableColumns = getEditableColumns(props.value.columns || []);\n editableColumns.forEach(col => {\n if (col.dataIndex) {\n editingStateMap[recordKey][col.dataIndex] = true;\n // 初始化编辑值\n if (!(col.dataIndex in editValueMap[recordKey])) {\n editValueMap[recordKey][col.dataIndex] = getEditValue(record, col);\n }\n }\n });\n } else if (mode === 'cell' && column && column.dataIndex) {\n // 单元格编辑模式:只编辑指定列\n editingStateMap[recordKey][column.dataIndex] = true;\n // 初始化编辑值\n if (!(column.dataIndex in editValueMap[recordKey])) {\n editValueMap[recordKey][column.dataIndex] = getEditValue(record, column);\n }\n }\n };\n\n /**\n * 获取变更的值\n */\n const getChangedValues = (record: TableData): Record<string, any> => {\n const recordKey = String(getRowKey(record));\n const changedValues: Record<string, any> = {};\n\n if (!editValueMap[recordKey]) {\n return changedValues;\n }\n\n // 比较编辑值和原始值\n Object.keys(editValueMap[recordKey]).forEach(columnKey => {\n const editValue = editValueMap[recordKey][columnKey];\n const originalValue = originalDataMap[recordKey]?.[columnKey];\n\n // 如果值发生变化,记录下来\n if (editValue !== originalValue) {\n changedValues[columnKey] = editValue;\n }\n });\n\n return changedValues;\n };\n\n /**\n * 保存编辑\n */\n const saveEdit = async (record: TableData): Promise<boolean> => {\n const recordKey = String(getRowKey(record));\n\n if (!isEditing(record)) {\n return true;\n }\n\n // 获取可编辑的列\n const editableColumns = getEditableColumns(props.value.columns || []);\n\n // 根据编辑模式确定需要验证的列\n let columnsToValidate: BasicColumn[];\n if (editConfig.value.mode === 'cell') {\n // 单元格编辑模式:只验证当前正在编辑的列\n const editingColumns = editingStateMap[recordKey] || {};\n columnsToValidate = editableColumns.filter(col =>\n col.dataIndex && editingColumns[col.dataIndex]\n );\n } else {\n // 行编辑模式:验证所有可编辑的列\n columnsToValidate = editableColumns;\n }\n\n // 验证所有编辑中的字段\n const validationResult = await validateRow(\n editValueMap[recordKey] || {},\n columnsToValidate,\n record\n );\n\n if (!validationResult.valid) {\n // 保存验证错误\n validationErrorMap[recordKey] = validationResult.errors;\n\n // 显示第一个错误\n const firstError = Object.values(validationResult.errors)[0];\n if (firstError) {\n Message.error(firstError);\n }\n\n return false;\n }\n\n // 获取变更的值\n const changedValues = getChangedValues(record);\n\n // 执行 beforeSave 回调\n if (editConfig.value.beforeSave) {\n try {\n const result = await editConfig.value.beforeSave(record, changedValues);\n if (result === false) {\n return false;\n }\n } catch (error) {\n console.error('[useTableEdit] beforeSave error:', error);\n Message.error('保存前验证失败');\n return false;\n }\n }\n\n // 应用编辑值到数据源\n if (editValueMap[recordKey]) {\n Object.keys(editValueMap[recordKey]).forEach(columnKey => {\n const column = editableColumns.find(col => col.dataIndex === columnKey);\n let value = editValueMap[recordKey][columnKey];\n\n // 如果配置了 editValueSetter,使用它来转换值\n if (column?.editValueSetter) {\n value = column.editValueSetter(value, record);\n }\n\n record[columnKey] = value;\n });\n }\n\n // 执行 onSave 回调\n if (editConfig.value.onSave) {\n try {\n await editConfig.value.onSave(record, changedValues);\n } catch (error) {\n console.error('[useTableEdit] onSave error:', error);\n }\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n\n Message.success('保存成功');\n return true;\n };\n\n /**\n * 取消编辑\n */\n const cancelEdit = (record: TableData): void => {\n const recordKey = String(getRowKey(record));\n\n if (!isEditing(record)) {\n return;\n }\n\n // 恢复原始数据\n if (originalDataMap[recordKey]) {\n Object.keys(originalDataMap[recordKey]).forEach(key => {\n record[key] = originalDataMap[recordKey][key];\n });\n }\n\n // 执行 onCancel 回调\n if (editConfig.value.onCancel) {\n editConfig.value.onCancel(record);\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n };\n\n /**\n * 删除行\n */\n const deleteRow = async (record: TableData): Promise<void> => {\n const recordKey = String(getRowKey(record));\n\n // 执行 onDelete 回调\n if (editConfig.value.onDelete) {\n try {\n await editConfig.value.onDelete(record);\n } catch (error) {\n console.error('[useTableEdit] onDelete error:', error);\n Message.error('删除失败');\n return;\n }\n }\n\n // 从数据源中删除\n const index = dataSource.value.findIndex(item => getRowKey(item) === recordKey);\n if (index > -1) {\n dataSource.value.splice(index, 1);\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n\n Message.success('删除成功');\n };\n\n /**\n * 添加新行\n */\n const addRow = async (position: 'top' | 'bottom' = 'bottom'): Promise<void> => {\n let newRecord: Partial<TableData> = {};\n\n // 执行 onAdd 回调获取新行数据\n if (editConfig.value.onAdd) {\n try {\n newRecord = await editConfig.value.onAdd();\n } catch (error) {\n console.error('[useTableEdit] onAdd error:', error);\n Message.error('添加失败');\n return;\n }\n }\n\n // 生成临时 ID(如果没有提供)\n const rowKey = props.value.rowKey || 'id';\n if (typeof rowKey === 'string' && !newRecord[rowKey]) {\n newRecord[rowKey] = `temp_${Date.now()}_${Math.random()}`;\n }\n\n if (position === 'top') {\n // 添加到数据源开头\n dataSource.value.unshift(newRecord as TableData);\n } else {\n // 添加到数据源末尾\n dataSource.value.push(newRecord as TableData);\n }\n\n // 自动进入编辑模式\n startEdit(newRecord as TableData);\n };\n\n /**\n * 获取所有编辑中的行\n */\n const getEditingRows = (): TableData[] => {\n const editingKeys = Object.keys(editingStateMap);\n return dataSource.value.filter(record => {\n const recordKey = String(getRowKey(record));\n return editingKeys.includes(recordKey);\n });\n };\n\n /**\n * 批量保存编辑\n */\n const saveAllEdits = async (): Promise<boolean> => {\n const editingRows = getEditingRows();\n\n if (editingRows.length === 0) {\n return true;\n }\n\n // 逐个保存\n for (const record of editingRows) {\n const success = await saveEdit(record);\n if (!success) {\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * 批量取消编辑\n */\n const cancelAllEdits = (): void => {\n const editingRows = getEditingRows();\n\n editingRows.forEach(record => {\n cancelEdit(record);\n });\n };\n\n return {\n editingStateMap,\n editValueMap,\n validationErrorMap,\n isEditing,\n getEditValue,\n setEditValue,\n getValidationError,\n startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n getChangedValues,\n };\n}\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 <!-- 透传 form- 前缀的插槽给 BasicForm -->\n <template\n v-for=\"(_, name) in formSlots\"\n :key=\"name\"\n #[getFormSlotName(name)]=\"slotProps\"\n >\n <slot :name=\"name\" v-bind=\"slotProps || {}\" />\n </template>\n </BasicForm>\n <a-divider class=\"!mt-0\" />\n </div>\n\n <!-- 工具栏 -->\n <div\n v-if=\"\n getToolbarConfig.show || getToolbarConfig.title || $slots.tableTitle\n \"\n class=\"basic-table-toolbar\"\n >\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 v-if=\"getToolbarConfig.show\" class=\"toolbar-right\">\n <a-space>\n <!-- 自定义操作按钮 -->\n <template\n v-if=\"\n getToolbarConfig.actions && getToolbarConfig.actions.length > 0\n \"\n >\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\n v-if=\"getToolbarConfig.showFullscreen\"\n :content=\"isFullscreen ? '退出全屏' : '全屏'\"\n >\n <a-button\n @click=\"handleFullscreen\"\n :aria-label=\"isFullscreen ? '退出全屏' : '全屏显示'\"\n >\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\n v-if=\"getToolbarConfig.showDensity\"\n @select=\"handleDensityChange\"\n >\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\n v-if=\"getToolbarConfig.showColumnSetting\"\n trigger=\"click\"\n position=\"br\"\n >\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\n v-model=\"checkedColumns\"\n @change=\"handleColumnChange\"\n >\n <div\n v-for=\"col in settingColumns\"\n :key=\"col.dataIndex\"\n class=\"column-setting-item\"\n >\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\n v-for=\"col in getViewColumns.filter((c: any) => c.slotName)\"\n :key=\"col.dataIndex\"\n #[col.slotName!]=\"slotProps\"\n >\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\n v-for=\"action in getActionButtons(slotProps.record)\"\n :key=\"action.label\"\n >\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 <template v-else-if=\"(col.edit || col.editable) && isEditing(slotProps.record, col)\">\n <EditCell\n :column=\"col\"\n :record=\"slotProps.record\"\n :row-index=\"slotProps.rowIndex\"\n :value=\"getEditValue(slotProps.record, col)\"\n :error=\"getValidationError(slotProps.record, col)\"\n @change=\"(val: any) => setEditValue(slotProps.record, col, val)\"\n />\n </template>\n <!-- 用户自定义插槽 -->\n <slot\n v-else-if=\"$slots[col.dataIndex as string]\"\n :name=\"col.dataIndex\"\n v-bind=\"slotProps\"\n />\n <!-- customRender 渲染 -->\n <component\n v-else-if=\"col.customRender\"\n :is=\"renderCustomCell(col, slotProps)\"\n />\n <!-- format 格式化 -->\n <template v-else-if=\"col.format\">\n {{\n col.format(\n slotProps.record[col.dataIndex!],\n slotProps.record,\n slotProps.rowIndex\n )\n }}\n </template>\n <!-- ellipsis 省略渲染 -->\n <template v-else-if=\"col.dataIndex && originalColumnsMap.get(col.dataIndex as string)?.ellipsis && typeof originalColumnsMap.get(col.dataIndex as string)?.ellipsis === 'object'\">\n <BasicTextEllipsis\n :text=\"String(slotProps.record[col.dataIndex!] ?? '')\"\n :lines=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).lines ?? 1\"\n :tooltip=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltip ?? true\"\n :tooltipTrigger=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltipTrigger ?? 'hover'\"\n :tooltipProps=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltipProps\"\n />\n </template>\n <!-- 默认渲染:显示原始值 -->\n <template v-else>\n {{ slotProps.record[col.dataIndex!] }}\n </template>\n </template>\n </a-table>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n watch,\n onMounted,\n onBeforeUnmount,\n nextTick,\n h,\n useSlots,\n} from 'vue';\nimport type {VNodeChild} 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 {BasicTextEllipsis} from '../TextEllipsis';\nimport {debounce} from '../../utils/debounce';\nimport useLocalStorage from '../../hooks/useLocalStorage';\nimport EditCell from './components/EditCell.vue';\nimport { useTableEdit } from './hooks/useTableEdit';\nimport type {\n BasicColumn,\n BasicTableProps,\n BasicTableEmits,\n ActionItem,\n TablePaginationConfig,\n TableSearchConfig,\n TableToolbarConfig,\n} 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 =\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'INVALID_RESPONSE'\n | '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 pagination: () => ({\n current: 1,\n pageSize: 20,\n showTotal: true,\n showJumper: true,\n showPageSize: true,\n pageSizeOptions: [5, 10, 20, 50, 100],\n }),\n search: () => ({ show: false }),\n toolbar: () => ({ show: false }),\n});\n\nconst emit = defineEmits<BasicTableEmits>();\n\n// 获取插槽\nconst slots = useSlots();\n\n/**\n * 获取所有需要透传给 Form 的插槽\n * 使用 form- 前缀标识需要透传的插槽\n */\nconst formSlots = computed(() => {\n const result: Record<string, any> = {};\n Object.keys(slots).forEach((name) => {\n if (name.startsWith('form-')) {\n result[name] = slots[name];\n }\n });\n return result;\n});\n\n/**\n * 获取 Form 插槽名称(去除 form- 前缀)\n * @param slotName - 原始插槽名称\n * @returns 去除前缀后的插槽名称\n */\nconst getFormSlotName = (slotName: string | symbol): string => {\n const name = slotName.toString();\n return name.startsWith('form-') ? name.slice(5) : name;\n};\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: 20,\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// AbortController 用于取消请求\nlet currentAbortController: AbortController | null = null;\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 () => [getMergedProps.value.data, getMergedProps.value.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: false,\n showRefresh: false,\n showColumnSetting: false,\n showFullscreen: false,\n showDensity: false,\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: 'horizontal',\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((): false | TablePaginationConfig => {\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// 编辑功能 Hook\nconst {\n isEditing,\n getEditValue,\n setEditValue,\n getValidationError,\n startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n getChangedValues,\n} = useTableEdit(getMergedProps, dataSource, getRowKey);\n\n// 原始列配置映射(用于在 slot 中访问完整的列配置)\nconst originalColumnsMap = computed(() => {\n const mergedProps = getMergedProps.value;\n const map = new Map<string, BasicColumn>();\n mergedProps.columns.forEach((col) => {\n if (col.dataIndex) {\n map.set(col.dataIndex as string, col);\n }\n });\n return map;\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: 60,\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 (\n getToolbarConfig.value.showColumnSetting &&\n checkedColumns.value.length > 0\n ) {\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 // 如果列是可编辑的,自动添加 slotName\n if ((col.edit || col.editable) && !col.slotName) {\n return {...col, slotName: col.dataIndex as string};\n }\n // 如果配置了 ellipsis 对象形式,自动添加 slotName 并移除 ellipsis(避免传递给 Arco Table)\n if (!col.slotName && col.ellipsis && typeof col.ellipsis === 'object') {\n const { ellipsis, ...restCol } = col;\n return {...restCol, slotName: col.dataIndex as string};\n }\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 {\n columns,\n data,\n loading,\n pagination,\n search,\n toolbar,\n api,\n fetchSetting,\n beforeFetch,\n afterFetch,\n onFetchError,\n immediate,\n showIndexColumn,\n indexColumnProps,\n showActionColumn,\n actionColumn,\n rowKey,\n expandable,\n scroll,\n draggable,\n bordered,\n stripe,\n showHeader,\n size,\n rowSelection,\n ...rest\n } = 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 VNodeChild 或 null\n */\nconst renderCustomCell = (\n col: BasicColumn,\n slotProps: SlotProps\n): VNodeChild | 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 的 VNodeChild 有 type 属性)\n if (typeof result === 'object' && result !== null && 'type' in result) {\n return result as VNodeChild;\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 = (\n obj: Record<string, any>,\n prefix = ''\n): 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 (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n ) {\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 // AbortController 会自动取消之前的请求\n if (getMergedProps.value.api) {\n await fetchData();\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 = (\n value: string | number | Record<string, any> | undefined\n) => {\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 = (\n rowKeys: (string | number)[],\n rowKey: string | number,\n record: TableData\n) => {\n selectedRowKeys.value = rowKeys;\n selectedRows.value = dataSource.value.filter((item: TableData) =>\n rowKeys.includes(getRowKey(item))\n );\n emit('select', rowKeys, rowKey, record);\n};\n\n// 处理全选\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n selectedRowKeys.value = dataSource.value.map((item: TableData) =>\n getRowKey(item)\n );\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 = (\n record: TableData,\n column: BasicColumn,\n event: Event\n) => {\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 // 取消之前的请求\n if (currentAbortController) {\n currentAbortController.abort();\n }\n\n // 创建新的 AbortController\n currentAbortController = new AbortController();\n const signal = currentAbortController.signal;\n\n try {\n loadingRef.value = true;\n\n // 获取 fetchSetting 配置(支持自定义字段名)\n const fetchSetting = {\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'records',\n totalField: 'total',\n ...mergedProps.fetchSetting,\n };\n\n let params: any = {\n ...searchParams.value,\n };\n\n // 添加分页参数(使用 fetchSetting 配置的字段名)\n if (paginationRef.value) {\n params[fetchSetting.pageField] = paginationRef.value.current;\n params[fetchSetting.sizeField] = paginationRef.value.pageSize;\n }\n\n // 请求前处理(支持异步)\n if (mergedProps.beforeFetch) {\n params = await Promise.resolve(mergedProps.beforeFetch(params));\n }\n\n // 将 signal 传递给 API(需要 API 支持 AbortSignal)\n const result = await mergedProps.api(params, signal);\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 // 使用 fetchSetting 配置的字段名验证响应数据\n const listField = fetchSetting.listField;\n const totalField = fetchSetting.totalField;\n\n if (!(listField in result)) {\n throw {\n code: ERROR_CODES.INVALID_RESPONSE,\n message: `API 响应格式无效:缺少 ${listField} 字段`,\n data: result,\n } as FetchError;\n }\n\n if (!Array.isArray(result[listField])) {\n console.warn(`API 响应格式警告:${listField} 字段不是数组,已转换为空数组`);\n }\n\n let data = Array.isArray(result[listField]) ? result[listField] : [];\n let total = typeof result[totalField] === 'number' ? result[totalField] : data.length;\n\n // 数据一致性检查\n if (total < data.length) {\n console.warn(\n `数据一致性警告:total(${total}) 小于 data.length(${data.length})`\n );\n }\n\n // 请求后处理(支持异步)\n if (mergedProps.afterFetch) {\n const processed = await Promise.resolve(mergedProps.afterFetch(result));\n data = Array.isArray(processed[listField]) ? processed[listField] : data;\n total = typeof processed[totalField] === 'number' ? processed[totalField] : 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 // 如果是请求被取消,不显示错误\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('请求已被取消');\n return;\n }\n\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 (\n error.message.includes('network') ||\n error.message.includes('fetch')\n ) {\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 // 只有当前 signal 没有被取消时才关闭 loading\n if (!signal.aborted) {\n loadingRef.value = false;\n }\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) =>\n keys.includes(getRowKey(item))\n );\n};\nconst deleteSelectRowByKey = (key: string | number) => {\n dataSource.value = dataSource.value.filter(\n (item: TableData) => getRowKey(item) !== key\n );\n selectedRowKeys.value = selectedRowKeys.value.filter((k) => k !== key);\n selectedRows.value = selectedRows.value.filter(\n (item: TableData) => getRowKey(item) !== key\n );\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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 // 注册表格实例\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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>) =>\n 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[]) =>\n searchFormRef.value?.clearValidate?.(field),\n submit: () => searchFormRef.value?.handleSubmit?.(),\n updateSchema: (schema: any) => searchFormRef.value?.updateSchema?.(schema),\n resetSchema: (schemas: any[]) =>\n searchFormRef.value?.resetSchema?.(schemas),\n removeSchemaByField: (field: string | string[]) =>\n searchFormRef.value?.removeSchema?.(field), // 实际方法名是 removeSchema\n appendSchemaByField: () => {\n // BasicForm 没有 appendSchemaByField,可以通过 updateSchema 或 setProps 实现\n console.warn(\n 'appendSchemaByField 方法暂不支持,请使用 updateSchema 或 setProps'\n );\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, #fff);\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, #1d2129);\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, #fff);\n border-radius: 4px;\n padding: 10px 0;\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","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 /**\n * 开始编辑\n */\n const startEdit = (record: TableData, column?: BasicColumn): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.startEdit) {\n table.startEdit(record, column);\n }\n };\n\n /**\n * 保存编辑\n */\n const saveEdit = async (record: TableData): Promise<boolean> => {\n const table = getTable();\n if (!table) return false;\n \n if (table.saveEdit) {\n return await table.saveEdit(record);\n }\n return false;\n };\n\n /**\n * 取消编辑\n */\n const cancelEdit = (record: TableData): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.cancelEdit) {\n table.cancelEdit(record);\n }\n };\n\n /**\n * 删除行\n */\n const deleteRow = async (record: TableData): Promise<void> => {\n const table = getTable();\n if (!table) return;\n \n if (table.deleteRow) {\n await table.deleteRow(record);\n }\n };\n\n /**\n * 添加新行\n */\n const addRow = async (): Promise<void> => {\n const table = getTable();\n if (!table) return;\n \n if (table.addRow) {\n await table.addRow();\n }\n };\n\n /**\n * 获取所有编辑中的数据\n */\n const getEditingRows = (): TableData[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getEditingRows) {\n return table.getEditingRows();\n }\n return [];\n };\n\n /**\n * 批量保存编辑\n */\n const saveAllEdits = async (): Promise<boolean> => {\n const table = getTable();\n if (!table) return false;\n \n if (table.saveAllEdits) {\n return await table.saveAllEdits();\n }\n return false;\n };\n\n /**\n * 批量取消编辑\n */\n const cancelAllEdits = (): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.cancelAllEdits) {\n table.cancelAllEdits();\n }\n };\n\n /**\n * 判断是否正在编辑\n */\n const isEditing = (record: TableData, column?: BasicColumn): boolean => {\n const table = getTable();\n if (!table) return false;\n \n if (table.isEditing) {\n return table.isEditing(record, column);\n }\n return false;\n };\n\n /**\n * 获取编辑值\n */\n const getEditValue = (record: TableData, column: BasicColumn): any => {\n const table = getTable();\n if (!table) return undefined;\n \n if (table.getEditValue) {\n return table.getEditValue(record, column);\n }\n return undefined;\n };\n\n /**\n * 设置编辑值\n */\n const setEditValue = (record: TableData, column: BasicColumn, value: any): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.setEditValue) {\n table.setEditValue(record, column, value);\n }\n };\n\n /**\n * 获取变更的值\n */\n const getChangedValues = (record: TableData): Record<string, any> => {\n const table = getTable();\n if (!table) return {};\n \n if (table.getChangedValues) {\n return table.getChangedValues(record);\n }\n return {};\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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 :style=\"{ display: 'block', textAlign: getProps.titleAlign }\" :class=\"['block']\">\n {{ getProps.title }}\n </span>\n <div :class=\"['modal-title-actions', getProps.closable ? 'has-close' : '']\">\n <template v-if=\"getProps.helpMessage\">\n <a-tooltip v-if=\"Array.isArray(getProps.helpMessage)\" position=\"top\">\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 v-else class=\"cursor-pointer\" @click=\"handleFullscreen\" />\n </div>\n </div>\n </div>\n </template>\n\n <!-- Loading 状态 -->\n <a-spin\n :loading=\"getProps.loading\"\n :tip=\"getProps.loadingTip\"\n :style=\"spinStyle\"\n class=\"w-full\"\n >\n <div v-if=\"getProps.useWrapper\" :style=\"wrapperStyle\" class=\"modal-wrapper\">\n <slot />\n </div>\n <slot v-else />\n </a-spin>\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\">\n import { ref, computed, watch, unref, nextTick, onMounted, CSSProperties } from 'vue';\n import {\n IconQuestionCircle,\n IconFullscreen,\n IconFullscreenExit,\n } from '@arco-design/web-vue/es/icon';\n import type { BasicModalProps, ModalEmits, ModalMethods } from './types';\n\n defineOptions({\n name: 'BasicModal',\n inheritAttrs: false,\n });\n\n const props = withDefaults(defineProps<BasicModalProps>(), {\n visible: false,\n defaultVisible: false,\n width: 520,\n minHeight: 46,\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\n const emit = defineEmits<ModalEmits>();\n\n const visibleRef = ref(false);\n const fullscreenRef = ref(false);\n const confirmLoading = ref(false);\n const modalLoading = ref(false);\n const propsRef = ref<Partial<BasicModalProps>>({});\n\n // 获取合并后的属性\n const getProps = computed((): BasicModalProps => {\n return { ...props, ...unref(propsRef) } as BasicModalProps;\n });\n\n // 获取绑定到 a-modal 的属性\n const 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 // 获取弹窗样式\n const 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' ? `${propsData.height}px` : propsData.height;\n }\n\n if (propsData.minHeight) {\n style.minHeight =\n typeof propsData.minHeight === 'number' ? `${propsData.minHeight}px` : 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 样式\n const 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' ? propsData.height : parseInt(propsData.height);\n style.maxHeight = `${height - propsData.wrapperFooterOffset!}px`;\n style.overflowY = 'auto';\n }\n\n return style;\n });\n\n // Spin 样式\n const 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 : '46px',\n };\n\n // 只在 loading 时禁用交互\n if (propsData.loading) {\n style.pointerEvents = 'none';\n }\n\n return style;\n });\n\n // 获取取消按钮属性\n const getCancelButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.cancelButtonProps,\n };\n });\n\n // 获取确认按钮属性\n const getOkButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.okButtonProps,\n loading: confirmLoading.value || propsData.okLoading,\n };\n });\n\n // 处理可见性变化\n const handleVisibleChange = (visible: boolean) => {\n visibleRef.value = visible;\n emit('update:visible', visible);\n emit('visible-change', visible);\n };\n\n // 处理确认(内部实现)\n const 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 // 处理确认(移除防抖,直接使用)\n const handleOk = handleOkInternal;\n\n // 处理取消\n const 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 // 处理全屏\n const handleFullscreen = () => {\n fullscreenRef.value = !fullscreenRef.value;\n };\n\n // 设置 Modal Props\n const setModalProps = (modalProps: Partial<BasicModalProps>) => {\n propsRef.value = { ...unref(propsRef), ...modalProps };\n };\n\n // 打开弹窗\n const openModal = () => {\n handleVisibleChange(true);\n };\n\n // 关闭弹窗\n const closeModal = () => {\n handleVisibleChange(false);\n };\n\n // 修改确认按钮的 loading 状态\n const changeOkLoading = (loading: boolean) => {\n confirmLoading.value = loading;\n };\n\n // 修改 modal 的 loading 状态\n const changeLoading = (loading: boolean) => {\n modalLoading.value = loading;\n setModalProps({ loading });\n };\n\n // 获取 Modal Props\n const getModalProps = (): BasicModalProps => {\n // 确保返回当前实际的 visible 状态\n return { ...unref(getProps), visible: visibleRef.value };\n };\n\n // 暴露方法给外部\n const modalMethods: ModalMethods = {\n setModalProps,\n openModal,\n closeModal,\n changeOkLoading,\n changeLoading,\n getModalProps,\n };\n\n defineExpose(modalMethods);\n\n // 监听 visible 变化\n watch(\n () => getProps.value.visible,\n (val) => {\n visibleRef.value = val ?? false;\n },\n { immediate: true },\n );\n\n // 监听 defaultFullscreen\n watch(\n () => getProps.value.defaultFullscreen,\n (val) => {\n fullscreenRef.value = val || false;\n },\n { immediate: true },\n );\n\n // 组件挂载后触发注册事件\n onMounted(() => {\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 modal.setModalProps({ _data: data } as any);\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 setTimeout(() => {\n modal.setModalProps({ _data: undefined } as any);\n });\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","/**\n * 数组对比选项\n */\nexport interface DiffOptions<T = any> {\n /**\n * 唯一标识字段名\n * @default 'id'\n */\n uniqueKey?: string;\n \n /**\n * 对比深度\n * - shallow: 浅层对比,只对比第一层字段\n * - deep: 深度对比,递归对比所有层级\n * @default 'shallow'\n */\n compareDepth?: 'shallow' | 'deep';\n \n /**\n * 指定需要对比的字段(只对比这些字段)\n * 如果不指定,则对比所有字段(excludeKeys 除外)\n */\n compareFields?: (keyof T)[];\n \n /**\n * 排除不需要对比的字段\n */\n excludeKeys?: (keyof T)[];\n \n /**\n * 删除标记字段名\n * @default 'delFlag'\n */\n deletedFlag?: string;\n \n /**\n * 删除标记值\n * @default 1\n */\n deletedFlagValue?: any;\n}\n\n/**\n * 数组对比结果\n */\nexport interface DiffResult<T = any> {\n /**\n * 被删除的数据(已添加删除标记)\n */\n deleted: T[];\n \n /**\n * 被修改的数据(包含修改后的值)\n */\n modified: T[];\n \n /**\n * 新增的数据\n */\n added: T[];\n}\n\n/**\n * 对象对比选项\n */\nexport interface CompareOptions<T = any> {\n /**\n * 对比深度\n * - shallow: 浅层对比,只对比第一层字段\n * - deep: 深度对比,递归对比所有层级\n * @default 'shallow'\n */\n depth?: 'shallow' | 'deep';\n \n /**\n * 指定需要对比的字段(只对比这些字段)\n */\n compareFields?: (keyof T)[];\n \n /**\n * 排除不需要对比的字段\n */\n excludeKeys?: (keyof T)[];\n}\n\n/**\n * 克隆对象并添加标记\n * @param obj 原始对象\n * @param flagKey 标记字段名\n * @param flagValue 标记值\n * @returns 克隆并添加标记后的对象\n */\nfunction cloneWithFlag<T extends Record<string, any>>(\n obj: T,\n flagKey: string,\n flagValue: any\n): T {\n return {\n ...obj,\n [flagKey]: flagValue\n };\n}\n\n/**\n * 构建数据映射表(内部辅助函数)\n * @param data 数据数组\n * @param uniqueKey 唯一标识字段\n * @param warnPrefix 警告前缀(用于区分调用来源)\n * @returns Map 对象\n */\nfunction buildDataMap<T extends Record<string, any>>(\n data: T[],\n uniqueKey: string,\n warnPrefix?: string\n): Map<any, T> {\n const map = new Map<any, T>();\n \n for (const item of data) {\n const key = item[uniqueKey];\n \n if (key === undefined || key === null) {\n if (process.env.NODE_ENV !== 'production' && warnPrefix) {\n console.warn(`[${warnPrefix}] 数据项缺少唯一标识字段 \"${uniqueKey}\":`, item);\n }\n continue;\n }\n \n if (map.has(key)) {\n if (process.env.NODE_ENV !== 'production' && warnPrefix) {\n console.warn(`[${warnPrefix}] 检测到重复的 ${uniqueKey}: \"${key}\",后者将覆盖前者`);\n }\n }\n \n map.set(key, item);\n }\n \n return map;\n}\n\n/**\n * 深度对比两个值是否相等(用于替代 JSON.stringify)\n * @param val1 值1\n * @param val2 值2\n * @returns 是否相等\n */\nfunction deepEqual(val1: any, val2: any): boolean {\n // 严格相等(包括 NaN !== NaN)\n if (val1 === val2) {\n return true;\n }\n \n // 处理 NaN\n if (typeof val1 === 'number' && typeof val2 === 'number' && \n isNaN(val1) && isNaN(val2)) {\n return true;\n }\n \n // null 检查\n if (val1 === null || val2 === null) {\n return false;\n }\n \n // undefined 检查\n if (val1 === undefined || val2 === undefined) {\n return false;\n }\n \n // 类型不同\n if (typeof val1 !== typeof val2) {\n return false;\n }\n \n // Date 对象\n if (val1 instanceof Date && val2 instanceof Date) {\n return val1.getTime() === val2.getTime();\n }\n \n // RegExp 对象\n if (val1 instanceof RegExp && val2 instanceof RegExp) {\n return val1.toString() === val2.toString();\n }\n \n // 数组\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (val1.length !== val2.length) {\n return false;\n }\n for (let i = 0; i < val1.length; i++) {\n if (!deepEqual(val1[i], val2[i])) {\n return false;\n }\n }\n return true;\n }\n \n // 对象\n if (typeof val1 === 'object' && typeof val2 === 'object') {\n const keys1 = Object.keys(val1);\n const keys2 = Object.keys(val2);\n \n if (keys1.length !== keys2.length) {\n return false;\n }\n \n // 检查所有键是否存在且值相等\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n if (!deepEqual(val1[key], val2[key])) {\n return false;\n }\n }\n return true;\n }\n \n // 其他情况(基本类型)\n return val1 === val2;\n}\n\n/**\n * 判断两个对象是否相等\n * @param obj1 对象1\n * @param obj2 对象2\n * @param options 对比选项\n * @returns 是否相等\n */\nfunction isObjectEqual<T extends Record<string, any>>(\n obj1: T,\n obj2: T,\n options: {\n depth: 'shallow' | 'deep';\n fields?: (keyof T)[];\n excludeKeys?: (keyof T)[];\n }\n): boolean {\n const { depth, fields, excludeKeys = [] } = options;\n \n // 确定需要对比的键\n let keysToCompare: (keyof T)[];\n \n if (fields && fields.length > 0) {\n // 如果指定了 compareFields,只对比这些字段\n keysToCompare = fields;\n } else {\n // 否则对比所有字段(excludeKeys 除外)\n const allKeys = new Set([\n ...Object.keys(obj1),\n ...Object.keys(obj2)\n ]);\n \n keysToCompare = Array.from(allKeys).filter(\n key => !excludeKeys.includes(key as keyof T)\n ) as (keyof T)[];\n }\n \n // 对比每个字段\n for (const key of keysToCompare) {\n const val1 = obj1[key];\n const val2 = obj2[key];\n \n // 严格相等(包括 undefined)\n if (val1 === val2) {\n continue;\n }\n \n // 处理 null 和 undefined\n if (val1 === null || val1 === undefined || val2 === null || val2 === undefined) {\n return false;\n }\n \n // 获取值的类型\n const type1 = typeof val1;\n const type2 = typeof val2;\n \n // 类型不同\n if (type1 !== type2) {\n return false;\n }\n \n // 如果是对象或数组,根据 depth 决定如何对比\n if (type1 === 'object') {\n if (depth === 'shallow') {\n // 浅层对比:特殊类型需要深度比较值,普通对象只比较引用\n if ((val1 as any) instanceof Date && (val2 as any) instanceof Date) {\n // Date: 比较时间戳\n if ((val1 as Date).getTime() !== (val2 as Date).getTime()) {\n return false;\n }\n } else if ((val1 as any) instanceof RegExp && (val2 as any) instanceof RegExp) {\n // RegExp: 比较字符串表示\n if ((val1 as RegExp).toString() !== (val2 as RegExp).toString()) {\n return false;\n }\n } else if (Array.isArray(val1) && Array.isArray(val2)) {\n // 数组浅层对比:比较长度和每个元素的引用\n if (val1.length !== val2.length) {\n return false;\n }\n for (let i = 0; i < val1.length; i++) {\n if (val1[i] !== val2[i]) {\n return false;\n }\n }\n } else if (val1 !== val2) {\n // 其他对象:引用不同则不相等(浅层对比)\n return false;\n }\n } else {\n // 深度对比:使用 deepEqual 递归比较\n if (!deepEqual(val1, val2)) {\n return false;\n }\n }\n } else {\n // 基本类型直接比较\n if (val1 !== val2) {\n return false;\n }\n }\n }\n \n return true;\n}\n\n/**\n * 对比两个对象是否相等\n * \n * @param obj1 对象1\n * @param obj2 对象2\n * @param options 对比选项\n * @returns 是否相等\n * \n * @example\n * ```ts\n * const obj1 = { id: 1, name: '张三', age: 25 };\n * const obj2 = { id: 1, name: '张三', age: 26 };\n * \n * // 浅层对比所有字段\n * compareObjects(obj1, obj2); // false\n * \n * // 只对比 name 字段\n * compareObjects(obj1, obj2, { compareFields: ['name'] }); // true\n * \n * // 排除 age 字段\n * compareObjects(obj1, obj2, { excludeKeys: ['age'] }); // true\n * \n * // 深度对比\n * const obj3 = { id: 1, user: { name: '张三', age: 25 } };\n * const obj4 = { id: 1, user: { name: '张三', age: 25 } };\n * compareObjects(obj3, obj4, { depth: 'deep' }); // true\n * ```\n */\nexport function compareObjects<T extends Record<string, any>>(\n obj1: T,\n obj2: T,\n options?: CompareOptions<T>\n): boolean {\n const { depth = 'shallow', compareFields, excludeKeys = [] } = options || {};\n \n return isObjectEqual(obj1, obj2, {\n depth,\n fields: compareFields,\n excludeKeys\n });\n}\n\n/**\n * 对比两个数组,识别删除、修改和新增的数据\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 对比结果,包含删除、修改和新增的数据\n * \n * @example\n * ```ts\n * // 基础使用\n * const originalData = [\n * { id: 1, name: '张三', age: 25 },\n * { id: 2, name: '李四', age: 30 },\n * { id: 3, name: '王五', age: 28 }\n * ];\n * \n * const currentData = [\n * { id: 1, name: '张三', age: 26 }, // 修改了 age\n * { id: 2, name: '李四', age: 30 }, // 未修改\n * { id: 4, name: '赵六', age: 32 } // 新增\n * ];\n * \n * const result = diffArrays(originalData, currentData);\n * // 结果:\n * // {\n * // deleted: [{ id: 3, name: '王五', age: 28, delFlag: 1 }],\n * // modified: [{ id: 1, name: '张三', age: 26 }],\n * // added: [{ id: 4, name: '赵六', age: 32 }]\n * // }\n * ```\n * \n * @example\n * ```ts\n * // 使用自定义选项\n * const result = diffArrays(originalData, currentData, {\n * uniqueKey: 'userId', // 使用 userId 作为唯一标识\n * compareDepth: 'deep', // 深度对比\n * compareFields: ['name', 'age'], // 只对比 name 和 age 字段\n * deletedFlag: 'isDeleted', // 使用 isDeleted 作为删除标记\n * deletedFlagValue: true // 删除标记值为 true\n * });\n * ```\n * \n * @example\n * ```ts\n * // 排除某些字段的对比\n * const result = diffArrays(originalData, currentData, {\n * excludeKeys: ['updateTime', 'version'] // 不对比这些字段\n * });\n * ```\n */\nexport function diffArrays<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): DiffResult<T> {\n return {\n deleted: findDeleted(original, current, options),\n modified: findModified(original, current, options),\n added: findAdded(original, current, options)\n };\n}\n\n/**\n * 查找被删除的数据(在原始数据中存在,但在当前数据中不存在)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 被删除的数据(已添加删除标记)\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' },\n * { id: 3, name: '王五' }\n * ];\n * const current = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' }\n * ];\n * \n * const deleted = findDeleted(original, current);\n * // [{ id: 3, name: '王五', delFlag: 1 }]\n * ```\n * \n * @example\n * ```ts\n * // 自定义删除标记\n * const deleted = findDeleted(original, current, {\n * deletedFlag: 'isDeleted',\n * deletedFlagValue: true\n * });\n * // [{ id: 3, name: '王五', isDeleted: true }]\n * ```\n */\nexport function findDeleted<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const {\n uniqueKey = 'id',\n deletedFlag = 'delFlag',\n deletedFlagValue = 1\n } = options || {};\n \n // 边界处理\n if (!original || !Array.isArray(original)) {\n return [];\n }\n \n if (!current || !Array.isArray(current)) {\n // 如果 current 为空,original 中的所有数据都是删除\n return original.map(item => cloneWithFlag(item, deletedFlag, deletedFlagValue));\n }\n \n // 构建当前数据映射表\n const currentMap = buildDataMap(current, uniqueKey);\n \n // 查找删除的数据\n const deleted: T[] = [];\n const originalMap = buildDataMap(original, uniqueKey, 'findDeleted');\n \n for (const [key, item] of originalMap) {\n if (!currentMap.has(key)) {\n // 在当前数据中不存在,标记为删除\n deleted.push(cloneWithFlag(item, deletedFlag, deletedFlagValue));\n }\n }\n \n return deleted;\n}\n\n/**\n * 查找被修改的数据(在两个数组中都存在,但内容不同)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 被修改的数据(包含修改后的值)\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三', age: 25 },\n * { id: 2, name: '李四', age: 30 }\n * ];\n * const current = [\n * { id: 1, name: '张三', age: 26 }, // age 被修改\n * { id: 2, name: '李四', age: 30 } // 未修改\n * ];\n * \n * const modified = findModified(original, current);\n * // [{ id: 1, name: '张三', age: 26 }]\n * ```\n * \n * @example\n * ```ts\n * // 只对比特定字段\n * const modified = findModified(original, current, {\n * compareFields: ['name'] // 只对比 name 字段\n * });\n * \n * // 排除某些字段\n * const modified = findModified(original, current, {\n * excludeKeys: ['updateTime'] // 不对比 updateTime 字段\n * });\n * ```\n */\nexport function findModified<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const {\n uniqueKey = 'id',\n compareDepth = 'shallow',\n compareFields,\n excludeKeys = []\n } = options || {};\n \n // 边界处理\n if (!original || !Array.isArray(original) || !current || !Array.isArray(current)) {\n return [];\n }\n \n // 性能优化:提前创建 excludeKeys 数组\n const excludeKeysWithUnique = [...excludeKeys, uniqueKey as keyof T];\n \n // 构建数据映射表\n const originalMap = buildDataMap(original, uniqueKey);\n const currentMap = buildDataMap(current, uniqueKey);\n \n // 查找修改的数据\n const modified: T[] = [];\n for (const [key, originalItem] of originalMap) {\n const currentItem = currentMap.get(key);\n \n if (currentItem) {\n // 存在,检查是否修改\n const isEqual = isObjectEqual(originalItem, currentItem, {\n depth: compareDepth,\n fields: compareFields,\n excludeKeys: excludeKeysWithUnique\n });\n \n if (!isEqual) {\n // 内容不同,标记为修改(使用当前数据)\n modified.push(currentItem);\n }\n }\n }\n \n return modified;\n}\n\n/**\n * 查找新增的数据(在当前数据中存在,但在原始数据中不存在)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 新增的数据\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' }\n * ];\n * const current = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' },\n * { id: 3, name: '王五' } // 新增\n * ];\n * \n * const added = findAdded(original, current);\n * // [{ id: 3, name: '王五' }]\n * ```\n * \n * @example\n * ```ts\n * // 批量导入场景\n * function handleImport(existingData: any[], importData: any[]) {\n * const added = findAdded(existingData, importData);\n * console.log(`导入 ${importData.length} 条,新增 ${added.length} 条`);\n * await api.batchInsert(added);\n * }\n * ```\n */\nexport function findAdded<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const { uniqueKey = 'id' } = options || {};\n \n // 边界处理\n if (!current || !Array.isArray(current)) {\n return [];\n }\n \n if (!original || !Array.isArray(original)) {\n // 如果 original 为空,current 中的所有数据都是新增\n return [...current];\n }\n \n // 构建数据映射表\n const originalMap = buildDataMap(original, uniqueKey);\n const currentMap = buildDataMap(current, uniqueKey, 'findAdded');\n \n // 查找新增的数据\n const added: T[] = [];\n for (const [key, item] of currentMap) {\n if (!originalMap.has(key)) {\n // 在原始数据中不存在,标记为新增\n added.push(item);\n }\n }\n \n return added;\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":["getCurrentInstance","inject","_export_sfc","_sfc_main","defineComponent","computed","_hoisted_1","_sfc_render","openBlock","createElementBlock","normalizeClass","normalizeStyle","createElementVNode","_createElementBlock","_normalizeStyle","_openBlock","_hoisted_3","_createVNode","_hoisted_4","_createElementVNode","_hoisted_5","_unref","_createBlock","_hoisted_6","reactive","_Fragment","_renderList","_withModifiers","ref","_a","watch","onMounted","onUnmounted","_normalizeClass","_hoisted_2","_hoisted_7","_withDirectives","_toDisplayString","_createTextVNode","unref","Message","nextTick","urls","_mergeProps","_renderSlot","$slots","_withCtx","upload","Input","InputNumber","InputPassword","Textarea","AutoComplete","Select","Radio","RadioGroup","Checkbox","CheckboxGroup","Cascader","TreeSelect","DatePicker","TimePicker","RangePicker","Switch","Slider","Rate","Upload","Mention","Transfer","componentsNeedSelectPlaceholder","componentsNeedUploadPlaceholder","getPlaceholder","opt","formatDate","h","ImagePreviewGroup","Image","_resolveDynamicComponent","options","onBeforeUnmount","_createSlots","_normalizeProps","_guardReactiveProps","formComponentMap","attrs","listeners","debounce","throttle","useSlots","_vShow","_b","props"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../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-exclamation-circle/icon-exclamation-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-exclamation-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-plus/icon-plus.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-plus/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-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-eye/icon-eye.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-eye/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-upload/icon-upload.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-upload/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-delete/icon-delete.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-delete/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","../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-mute/icon-mute.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-mute/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-pause/icon-pause.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-pause/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-play-arrow/icon-play-arrow.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-play-arrow/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-sound/icon-sound.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-sound/index.js","../src/components/Upload/components/SortableFileItem.vue","../src/components/Upload/components/SortableFileList.vue","../src/components/Upload/components/VideoPreview.vue","../src/components/Upload/components/VideoPreviewModal.vue","../src/components/Upload/BasicUpload.vue","../src/components/Upload/useUpload.ts","../src/components/Form/componentMap.ts","../src/components/ReadonlyField/utils.ts","../src/components/ReadonlyField/renderers.ts","../src/components/ReadonlyField/BasicReadonlyField.vue","../src/components/ReadonlyField/useReadonlyField.ts","../src/components/Form/BasicForm.vue","../src/components/Form/useForm.ts","../src/utils/debounce.ts","../src/components/TextEllipsis/BasicTextEllipsis.vue","../src/hooks/useLocalStorage.ts","../src/components/Table/components/componentMap.ts","../src/components/Table/components/hooks/useTrim.ts","../src/components/Table/components/utils.ts","../src/components/Table/components/hooks/useComponentProps.ts","../src/components/Table/components/hooks/useEditCellValue.ts","../src/components/Table/components/hooks/formatters.ts","../src/components/Table/components/hooks/useEditFormat.ts","../src/components/Table/components/EditCell.vue","../src/components/Table/hooks/useEditValidation.ts","../src/components/Table/hooks/useTableEdit.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/utils/diff.ts","../src/hooks/useDebounce.ts","../src/hooks/useToggle.ts"],"sourcesContent":["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: \"IconExclamationCircle\",\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}-exclamation-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: \"M24 28V14m0 16v4M6 24c0-9.941 8.059-18 18-18s18 8.059 18 18-8.059 18-18 18S6 33.941 6 24Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconExclamationCircle = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconExclamationCircle as default };\n","import _IconExclamationCircle from \"./icon-exclamation-circle.js\";\nconst IconExclamationCircle = Object.assign(_IconExclamationCircle, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconExclamationCircle.name, _IconExclamationCircle);\n }\n});\nexport { IconExclamationCircle 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: \"IconPlus\",\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}-plus`, { [`${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: \"M5 24h38M24 5v38\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPlus = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPlus as default };\n","import _IconPlus from \"./icon-plus.js\";\nconst IconPlus = Object.assign(_IconPlus, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPlus.name, _IconPlus);\n }\n});\nexport { IconPlus 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: \"IconEye\",\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}-eye`, { [`${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\", {\n \"clip-rule\": \"evenodd\",\n d: \"M24 37c6.627 0 12.627-4.333 18-13-5.373-8.667-11.373-13-18-13-6.627 0-12.627 4.333-18 13 5.373 8.667 11.373 13 18 13Z\"\n }, null, -1),\n createElementVNode(\"path\", { d: \"M29 24a5 5 0 1 1-10 0 5 5 0 0 1 10 0Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconEye = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconEye as default };\n","import _IconEye from \"./icon-eye.js\";\nconst IconEye = Object.assign(_IconEye, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconEye.name, _IconEye);\n }\n});\nexport { IconEye 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: \"IconUpload\",\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}-upload`, { [`${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: \"M14.93 17.071 24.001 8l9.071 9.071m-9.07 16.071v-25M40 35v6H8v-6\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconUpload = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconUpload as default };\n","import _IconUpload from \"./icon-upload.js\";\nconst IconUpload = Object.assign(_IconUpload, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconUpload.name, _IconUpload);\n }\n});\nexport { IconUpload 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: \"IconDelete\",\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}-delete`, { [`${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: \"M5 11h5.5m0 0v29a1 1 0 0 0 1 1h25a1 1 0 0 0 1-1V11m-27 0H16m21.5 0H43m-5.5 0H32m-16 0V7h16v4m-16 0h16M20 18v15m8-15v15\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconDelete = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconDelete as default };\n","import _IconDelete from \"./icon-delete.js\";\nconst IconDelete = Object.assign(_IconDelete, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconDelete.name, _IconDelete);\n }\n});\nexport { IconDelete 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","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: \"IconMute\",\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}-mute`, { [`${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: \"m19 11.5 4.833-4.35a.1.1 0 0 1 .167.075V17m-14-1H7.1a.1.1 0 0 0-.1.1v15.8a.1.1 0 0 0 .1.1H14l9.833 8.85a.1.1 0 0 0 .167-.075V31m6.071-14.071C32.535 19.393 34 23 32.799 26m2.929-14.728C41.508 17.052 42.5 25 39.123 32M6.5 6.5l35 35\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconMute = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconMute as default };\n","import _IconMute from \"./icon-mute.js\";\nconst IconMute = Object.assign(_IconMute, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconMute.name, _IconMute);\n }\n});\nexport { IconMute 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: \"IconPause\",\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}-pause`, { [`${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: \"M14 12h4v24h-4zM30 12h4v24h-4z\" }, null, -1),\n createElementVNode(\"path\", {\n fill: \"currentColor\",\n stroke: \"none\",\n d: \"M14 12h4v24h-4zM30 12h4v24h-4z\"\n }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPause = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPause as default };\n","import _IconPause from \"./icon-pause.js\";\nconst IconPause = Object.assign(_IconPause, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPause.name, _IconPause);\n }\n});\nexport { IconPause 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: \"IconPlayArrow\",\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}-play-arrow`, { [`${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: \"M12.533 7.965A1 1 0 0 0 11 8.81v30.377a1 1 0 0 0 1.533.846L36.656 24.84a1 1 0 0 0 0-1.692L12.533 7.965Z\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconPlayArrow = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconPlayArrow as default };\n","import _IconPlayArrow from \"./icon-play-arrow.js\";\nconst IconPlayArrow = Object.assign(_IconPlayArrow, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconPlayArrow.name, _IconPlayArrow);\n }\n});\nexport { IconPlayArrow 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: \"IconSound\",\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}-sound`, { [`${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: \"m14 16 10-9v34l-10-9H6V16h8Z\" }, null, -1),\n createElementVNode(\"path\", { d: \"M31.071 16.929c3.905 3.905 3.905 10.237 0 14.142M36.727 11.272c7.03 7.03 7.03 18.426 0 25.456\" }, null, -1)\n ]), 14, _hoisted_1);\n}\nvar _IconSound = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\nexport { _IconSound as default };\n","import _IconSound from \"./icon-sound.js\";\nconst IconSound = Object.assign(_IconSound, {\n install: (app, options) => {\n var _a;\n const iconPrefix = (_a = options == null ? void 0 : options.iconPrefix) != null ? _a : \"\";\n app.component(iconPrefix + _IconSound.name, _IconSound);\n }\n});\nexport { IconSound as default };\n","<template>\n <div\n class=\"sortable-file-item\"\n :class=\"{\n 'is-dragging': isDragging,\n 'is-over': isOver,\n 'is-uploading': file.status === 'uploading',\n 'is-error': file.status === 'error',\n 'is-disabled': disabled,\n 'is-video': isVideoFile(file),\n }\"\n :draggable=\"!disabled\"\n :style=\"{\n width: `${cardSize}px`,\n height: `${cardSize}px`,\n }\"\n @dragstart=\"handleDragStart\"\n @dragend=\"handleDragEnd\"\n >\n <!-- 图片预览 -->\n <img v-if=\"file.url\" :src=\"file.url\" :alt=\"file.name\" class=\"file-image\" />\n\n <!-- 上传进度 -->\n <div v-if=\"file.status === 'uploading'\" class=\"upload-progress\">\n <a-progress :percent=\"file.percent || 0\" size=\"mini\" />\n </div>\n\n <!-- 操作遮罩 -->\n <div v-if=\"file.status === 'done'\" class=\"file-mask\">\n <div class=\"file-actions\">\n <icon-eye class=\"action-icon\" @click=\"handlePreview\" />\n <icon-delete v-if=\"!disabled\" class=\"action-icon\" @click=\"handleRemove\" />\n </div>\n </div>\n\n <!-- 错误提示 -->\n <div v-if=\"file.status === 'error'\" class=\"error-tip\">\n <icon-exclamation-circle />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { IconEye, IconDelete, IconExclamationCircle } from '@arco-design/web-vue/es/icon';\n import type { UploadFileItem } from '../types';\n\n defineOptions({\n name: 'SortableFileItem',\n });\n\n interface SortableFileItemProps {\n /** 文件对象 */\n file: UploadFileItem;\n /** 是否正在拖拽 */\n isDragging: boolean;\n /** 是否为拖拽目标 */\n isOver: boolean;\n /** 卡片尺寸 */\n cardSize: number;\n /** 是否禁用(readonly 或 disabled 状态下为 true) */\n disabled: boolean;\n }\n\n interface SortableFileItemEmits {\n (e: 'dragstart', event: DragEvent): void;\n (e: 'dragend', event: DragEvent): void;\n (e: 'preview', file: UploadFileItem): void;\n (e: 'remove', file: UploadFileItem): void;\n }\n\n const props = withDefaults(defineProps<SortableFileItemProps>(), {\n isDragging: false,\n isOver: false,\n cardSize: 80,\n disabled: false,\n });\n\n const emit = defineEmits<SortableFileItemEmits>();\n\n /**\n * 判断文件是否为视频\n */\n const isVideoFile = (file: UploadFileItem): boolean => {\n if (!file.url && !file.name) return false;\n const fileName = file.name || '';\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v'];\n return videoExtensions.some(ext => fileName.toLowerCase().endsWith(ext));\n };\n\n /**\n * 拖拽开始\n */\n const handleDragStart = (event: DragEvent) => {\n if (props.disabled) {\n event.preventDefault();\n return;\n }\n emit('dragstart', event);\n };\n\n /**\n * 拖拽结束\n */\n const handleDragEnd = (event: DragEvent) => {\n emit('dragend', event);\n };\n\n /**\n * 预览文件\n */\n const handlePreview = () => {\n emit('preview', props.file);\n };\n\n /**\n * 删除文件\n */\n const handleRemove = () => {\n if (!props.disabled) {\n emit('remove', props.file);\n }\n };\n</script>\n\n<style scoped>\n .sortable-file-item {\n position: relative;\n overflow: hidden;\n border: 1px solid var(--color-border-2);\n border-radius: 4px;\n cursor: move;\n transition: all 0.3s;\n user-select: none;\n background-color: var(--color-fill-1);\n }\n\n /* 禁用状态 */\n .sortable-file-item.is-disabled {\n cursor: default;\n opacity: 0.6;\n }\n\n .file-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n /* 视频文件样式 */\n .sortable-file-item.is-video {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n .sortable-file-item.is-video .file-image {\n opacity: 0;\n }\n\n .sortable-file-item.is-video::before {\n content: '▶';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 32px;\n color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n pointer-events: none;\n }\n\n /* 拖拽中状态 */\n .sortable-file-item.is-dragging {\n opacity: 0.5;\n transform: scale(0.95);\n border-color: rgb(var(--primary-6));\n }\n\n /* 拖拽目标状态 */\n .sortable-file-item.is-over {\n border: 2px dashed rgb(var(--primary-6));\n background-color: var(--color-primary-light-1);\n }\n\n /* 操作遮罩 */\n .file-mask {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity 0.3s;\n }\n\n .sortable-file-item:hover .file-mask {\n opacity: 1;\n }\n\n .file-actions {\n display: flex;\n gap: 12px;\n }\n\n .action-icon {\n color: white;\n font-size: 18px;\n cursor: pointer;\n transition: transform 0.2s;\n }\n\n .action-icon:hover {\n transform: scale(1.2);\n }\n\n /* 上传进度 */\n .upload-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 8px;\n background-color: rgba(255, 255, 255, 0.95);\n }\n\n /* 上传中状态 */\n .sortable-file-item.is-uploading {\n cursor: default;\n }\n\n /* 错误状态 */\n .sortable-file-item.is-error {\n border-color: rgb(var(--danger-6));\n }\n\n .error-tip {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n color: rgb(var(--danger-6));\n font-size: 26px;\n }\n</style>\n","<template>\n <div class=\"sortable-file-list\">\n <SortableFileItem\n v-for=\"(file, index) in fileList\"\n :key=\"file.uid\"\n :file=\"file\"\n :card-size=\"cardSize\"\n :disabled=\"disabled\"\n :is-dragging=\"dragState.dragIndex === index\"\n :is-over=\"dragState.overIndex === index\"\n @dragstart=\"handleDragStart($event, index)\"\n @dragover.prevent=\"handleDragOver($event, index)\"\n @drop=\"handleDrop($event, index)\"\n @dragend=\"handleDragEnd\"\n @preview=\"handlePreview\"\n @remove=\"handleRemove\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { reactive } from 'vue';\n import SortableFileItem from './SortableFileItem.vue';\n import type { UploadFileItem, DragState } from '../types';\n\n defineOptions({\n name: 'SortableFileList',\n });\n\n interface SortableFileListProps {\n /** 文件列表 */\n fileList: UploadFileItem[];\n /** 卡片尺寸 */\n cardSize: number;\n /** 是否禁用(readonly 或 disabled 状态下为 true) */\n disabled: boolean;\n }\n\n interface SortableFileListEmits {\n (e: 'update:fileList', fileList: UploadFileItem[]): void;\n (e: 'sortChange', fileList: UploadFileItem[]): void;\n (e: 'preview', file: UploadFileItem): void;\n (e: 'remove', file: UploadFileItem): void;\n }\n\n const props = withDefaults(defineProps<SortableFileListProps>(), {\n fileList: () => [],\n cardSize: 80,\n disabled: false,\n });\n\n const emit = defineEmits<SortableFileListEmits>();\n\n // 拖拽状态管理\n const dragState = reactive<DragState>({\n dragIndex: null,\n overIndex: null,\n });\n\n /**\n * 拖拽开始\n */\n const handleDragStart = (event: DragEvent, index: number) => {\n if (props.disabled) {\n event.preventDefault();\n return;\n }\n\n dragState.dragIndex = index;\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('text/plain', String(index));\n };\n\n /**\n * 拖拽经过\n */\n const handleDragOver = (event: DragEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n event.preventDefault();\n dragState.overIndex = index;\n event.dataTransfer!.dropEffect = 'move';\n };\n\n /**\n * 放置处理\n */\n const handleDrop = (event: DragEvent, index: number) => {\n if (props.disabled) {\n return;\n }\n\n event.preventDefault();\n\n const fromIndex = dragState.dragIndex;\n const toIndex = index;\n\n if (fromIndex === null || fromIndex === toIndex) {\n return;\n }\n\n // 重新排列文件列表\n const newFileList = [...props.fileList];\n const [movedItem] = newFileList.splice(fromIndex, 1);\n newFileList.splice(toIndex, 0, movedItem);\n\n emit('update:fileList', newFileList);\n emit('sortChange', newFileList);\n\n // 清理状态\n dragState.dragIndex = null;\n dragState.overIndex = null;\n };\n\n /**\n * 拖拽结束\n */\n const handleDragEnd = () => {\n dragState.dragIndex = null;\n dragState.overIndex = null;\n };\n\n /**\n * 预览文件\n */\n const handlePreview = (file: UploadFileItem) => {\n emit('preview', file);\n };\n\n /**\n * 删除文件\n */\n const handleRemove = (file: UploadFileItem) => {\n emit('remove', file);\n };\n</script>\n\n<style scoped>\n .sortable-file-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n</style>\n","<template>\n <div class=\"video-preview\" :class=\"{ fullscreen: isFullscreen }\">\n <div class=\"video-container\" @click=\"togglePlay\">\n <video\n ref=\"videoRef\"\n :src=\"videoUrl\"\n :autoplay=\"playerOptions?.autoplay\"\n :loop=\"playerOptions?.loop\"\n :muted=\"isMuted\"\n :preload=\"playerOptions?.preload || 'metadata'\"\n @loadedmetadata=\"handleLoadedMetadata\"\n @timeupdate=\"handleTimeUpdate\"\n @play=\"isPlaying = true\"\n @pause=\"isPlaying = false\"\n @ended=\"handleEnded\"\n @volumechange=\"handleVolumeChange\"\n />\n \n <!-- 播放按钮覆盖层 -->\n <div v-if=\"!isPlaying && !isLoading\" class=\"play-overlay\">\n <div class=\"play-button\">\n <icon-play-arrow :size=\"48\" />\n </div>\n </div>\n\n <!-- 加载中 -->\n <div v-if=\"isLoading\" class=\"loading-overlay\">\n <a-spin :size=\"48\" />\n </div>\n </div>\n\n <!-- 自定义控制条 -->\n <div v-if=\"playerOptions?.controls !== false\" class=\"video-controls\" @click.stop>\n <div class=\"progress-bar-container\" @click=\"handleProgressClick\">\n <div class=\"progress-bar\">\n <div class=\"progress-bar-loaded\" :style=\"{ width: `${loadedPercent}%` }\" />\n <div class=\"progress-bar-played\" :style=\"{ width: `${playedPercent}%` }\" />\n <div\n class=\"progress-bar-handle\"\n :style=\"{ left: `${playedPercent}%` }\"\n @mousedown=\"handleProgressMouseDown\"\n />\n </div>\n </div>\n\n <div class=\"controls-bottom\">\n <div class=\"controls-left\">\n <!-- 播放/暂停 -->\n <button class=\"control-button\" @click=\"togglePlay\">\n <icon-pause v-if=\"isPlaying\" :size=\"20\" />\n <icon-play-arrow v-else :size=\"20\" />\n </button>\n\n <!-- 音量 -->\n <div class=\"volume-control\" @mouseenter=\"showVolumeSlider = true\" @mouseleave=\"showVolumeSlider = false\">\n <button class=\"control-button\" @click=\"toggleMute\">\n <icon-mute v-if=\"isMuted || volume === 0\" :size=\"20\" />\n <icon-sound v-else :size=\"20\" />\n </button>\n <div v-show=\"showVolumeSlider\" class=\"volume-slider-container\">\n <input\n v-model.number=\"volume\"\n type=\"range\"\n min=\"0\"\n max=\"100\"\n class=\"volume-slider\"\n @input=\"handleVolumeInput\"\n />\n </div>\n </div>\n\n <!-- 时间显示 -->\n <span class=\"time-display\">\n {{ formatTime(currentTime) }} / {{ formatTime(duration) }}\n </span>\n </div>\n\n <div class=\"controls-right\">\n <!-- 播放速度 -->\n <a-dropdown :popup-max-height=\"false\">\n <button class=\"control-button\">\n {{ playbackRate }}x\n </button>\n <template #content>\n <a-doption\n v-for=\"rate in playbackRates\"\n :key=\"rate\"\n :value=\"rate\"\n @click=\"setPlaybackRate(rate)\"\n >\n {{ rate }}x\n </a-doption>\n </template>\n </a-dropdown>\n\n <!-- 全屏 -->\n <button class=\"control-button\" @click=\"toggleFullscreen\">\n <icon-fullscreen-exit v-if=\"isFullscreen\" :size=\"20\" />\n <icon-fullscreen v-else :size=\"20\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted, onUnmounted } from 'vue';\n import {\n IconPlayArrow,\n IconPause,\n IconSound,\n IconMute,\n IconFullscreen,\n IconFullscreenExit,\n } from '@arco-design/web-vue/es/icon';\n\n interface VideoPlayerOptions {\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n }\n\n interface VideoPreviewProps {\n videoUrl: string;\n playerOptions?: VideoPlayerOptions;\n }\n\n defineOptions({\n name: 'VideoPreview',\n });\n\n const props = withDefaults(defineProps<VideoPreviewProps>(), {\n playerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<{\n play: [];\n pause: [];\n ended: [];\n timeupdate: [time: number];\n }>();\n\n // 视频元素引用\n const videoRef = ref<HTMLVideoElement>();\n\n // 播放状态\n const isPlaying = ref(false);\n const isLoading = ref(true);\n const currentTime = ref(0);\n const duration = ref(0);\n const loadedPercent = ref(0);\n\n // 音量控制\n const volume = ref(100);\n const isMuted = ref(props.playerOptions?.muted || false);\n const showVolumeSlider = ref(false);\n\n // 播放速度\n const playbackRate = ref(1);\n const playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2];\n\n // 全屏状态\n const isFullscreen = ref(false);\n\n // 进度条拖拽\n const isDraggingProgress = ref(false);\n\n // 计算播放进度百分比\n const playedPercent = computed(() => {\n if (duration.value === 0) return 0;\n return (currentTime.value / duration.value) * 100;\n });\n\n /**\n * 格式化时间显示\n */\n const formatTime = (seconds: number): string => {\n if (!isFinite(seconds)) return '00:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n };\n\n /**\n * 切换播放/暂停\n */\n const togglePlay = () => {\n if (!videoRef.value) return;\n\n if (isPlaying.value) {\n videoRef.value.pause();\n emit('pause');\n } else {\n videoRef.value.play();\n emit('play');\n }\n };\n\n /**\n * 切换静音\n */\n const toggleMute = () => {\n if (!videoRef.value) return;\n isMuted.value = !isMuted.value;\n videoRef.value.muted = isMuted.value;\n };\n\n /**\n * 音量调节\n */\n const handleVolumeInput = (event: Event) => {\n if (!videoRef.value) return;\n const target = event.target as HTMLInputElement;\n const newVolume = Number(target.value);\n volume.value = newVolume;\n videoRef.value.volume = newVolume / 100;\n if (newVolume > 0 && isMuted.value) {\n isMuted.value = false;\n }\n };\n\n /**\n * 设置播放速度\n */\n const setPlaybackRate = (rate: number) => {\n if (!videoRef.value) return;\n playbackRate.value = rate;\n videoRef.value.playbackRate = rate;\n };\n\n /**\n * 切换全屏\n */\n const toggleFullscreen = async () => {\n const container = videoRef.value?.parentElement?.parentElement;\n if (!container) return;\n\n try {\n if (!isFullscreen.value) {\n if (container.requestFullscreen) {\n await container.requestFullscreen();\n } else if ((container as any).webkitRequestFullscreen) {\n await (container as any).webkitRequestFullscreen();\n } else if ((container as any).mozRequestFullScreen) {\n await (container as any).mozRequestFullScreen();\n } else if ((container as any).msRequestFullscreen) {\n await (container as any).msRequestFullscreen();\n }\n } else {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n } else if ((document as any).webkitExitFullscreen) {\n await (document as any).webkitExitFullscreen();\n } else if ((document as any).mozCancelFullScreen) {\n await (document as any).mozCancelFullScreen();\n } else if ((document as any).msExitFullscreen) {\n await (document as any).msExitFullscreen();\n }\n }\n } catch (error) {\n console.error('全屏切换失败:', error);\n }\n };\n\n /**\n * 进度条点击\n */\n const handleProgressClick = (event: MouseEvent) => {\n if (!videoRef.value) return;\n const target = event.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n const percent = (event.clientX - rect.left) / rect.width;\n videoRef.value.currentTime = percent * duration.value;\n };\n\n /**\n * 进度条拖拽开始\n */\n const handleProgressMouseDown = (event: MouseEvent) => {\n event.preventDefault();\n isDraggingProgress.value = true;\n document.addEventListener('mousemove', handleProgressMouseMove);\n document.addEventListener('mouseup', handleProgressMouseUp);\n };\n\n /**\n * 进度条拖拽中\n */\n const handleProgressMouseMove = (event: MouseEvent) => {\n if (!isDraggingProgress.value || !videoRef.value) return;\n const container = videoRef.value.parentElement?.parentElement?.querySelector('.progress-bar-container') as HTMLElement;\n if (!container) return;\n \n const rect = container.getBoundingClientRect();\n let percent = (event.clientX - rect.left) / rect.width;\n percent = Math.max(0, Math.min(1, percent));\n videoRef.value.currentTime = percent * duration.value;\n };\n\n /**\n * 进度条拖拽结束\n */\n const handleProgressMouseUp = () => {\n isDraggingProgress.value = false;\n document.removeEventListener('mousemove', handleProgressMouseMove);\n document.removeEventListener('mouseup', handleProgressMouseUp);\n };\n\n /**\n * 视频元数据加载完成\n */\n const handleLoadedMetadata = () => {\n if (!videoRef.value) return;\n duration.value = videoRef.value.duration;\n isLoading.value = false;\n };\n\n /**\n * 时间更新\n */\n const handleTimeUpdate = () => {\n if (!videoRef.value || isDraggingProgress.value) return;\n currentTime.value = videoRef.value.currentTime;\n \n // 更新缓冲进度\n if (videoRef.value.buffered.length > 0) {\n const bufferedEnd = videoRef.value.buffered.end(videoRef.value.buffered.length - 1);\n loadedPercent.value = (bufferedEnd / duration.value) * 100;\n }\n \n emit('timeupdate', currentTime.value);\n };\n\n /**\n * 视频播放结束\n */\n const handleEnded = () => {\n isPlaying.value = false;\n emit('ended');\n };\n\n /**\n * 音量变化\n */\n const handleVolumeChange = () => {\n if (!videoRef.value) return;\n volume.value = videoRef.value.volume * 100;\n isMuted.value = videoRef.value.muted;\n };\n\n /**\n * 监听全屏变化\n */\n const handleFullscreenChange = () => {\n isFullscreen.value = !!(\n document.fullscreenElement ||\n (document as any).webkitFullscreenElement ||\n (document as any).mozFullScreenElement ||\n (document as any).msFullscreenElement\n );\n };\n\n // 监听 videoUrl 变化\n watch(\n () => props.videoUrl,\n () => {\n isLoading.value = true;\n currentTime.value = 0;\n duration.value = 0;\n isPlaying.value = false;\n }\n );\n\n onMounted(() => {\n // 监听全屏变化事件\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n document.addEventListener('webkitfullscreenchange', handleFullscreenChange);\n document.addEventListener('mozfullscreenchange', handleFullscreenChange);\n document.addEventListener('MSFullscreenChange', handleFullscreenChange);\n });\n\n onUnmounted(() => {\n // 清理事件监听\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n document.removeEventListener('webkitfullscreenchange', handleFullscreenChange);\n document.removeEventListener('mozfullscreenchange', handleFullscreenChange);\n document.removeEventListener('MSFullscreenChange', handleFullscreenChange);\n document.removeEventListener('mousemove', handleProgressMouseMove);\n document.removeEventListener('mouseup', handleProgressMouseUp);\n });\n\n // 暴露方法\n defineExpose({\n play: () => videoRef.value?.play(),\n pause: () => videoRef.value?.pause(),\n togglePlay,\n toggleMute,\n setPlaybackRate,\n toggleFullscreen,\n });\n</script>\n\n<style scoped>\n .video-preview {\n width: 100%;\n max-width: 100%;\n background: #000;\n border-radius: 4px;\n overflow: hidden;\n position: relative;\n }\n\n .video-preview.fullscreen {\n border-radius: 0;\n }\n\n .video-container {\n position: relative;\n width: 100%;\n background: #000;\n cursor: pointer;\n }\n\n video {\n width: 100%;\n height: auto;\n display: block;\n max-height: 70vh;\n }\n\n .fullscreen video {\n max-height: 100vh;\n }\n\n .play-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.3);\n transition: opacity 0.3s;\n }\n\n .play-button {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.9);\n display: flex;\n align-items: center;\n justify-content: center;\n color: #000;\n transition: transform 0.2s;\n }\n\n .play-button:hover {\n transform: scale(1.1);\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n }\n\n .video-controls {\n background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);\n padding: 12px;\n position: relative;\n }\n\n .progress-bar-container {\n padding: 8px 0;\n cursor: pointer;\n margin-bottom: 8px;\n }\n\n .progress-bar {\n height: 4px;\n background: rgba(255, 255, 255, 0.3);\n border-radius: 2px;\n position: relative;\n overflow: visible;\n }\n\n .progress-bar-loaded {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: rgba(255, 255, 255, 0.5);\n border-radius: 2px;\n transition: width 0.2s;\n }\n\n .progress-bar-played {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--color-primary-light-4, #165dff);\n border-radius: 2px;\n transition: width 0.1s;\n }\n\n .progress-bar-handle {\n position: absolute;\n top: 50%;\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .progress-bar-container:hover .progress-bar-handle {\n opacity: 1;\n }\n\n .controls-bottom {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .controls-left,\n .controls-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .control-button {\n background: transparent;\n border: none;\n color: #fff;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background 0.2s;\n font-size: 14px;\n min-width: 32px;\n height: 32px;\n }\n\n .control-button:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n\n .volume-control {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .volume-slider-container {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.9);\n padding: 12px 8px;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n\n .volume-slider {\n writing-mode: vertical-lr; \n direction: rtl;\n width: 4px;\n height: 80px;\n padding: 0;\n margin: 0;\n }\n\n .volume-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n cursor: pointer;\n }\n\n .volume-slider::-moz-range-thumb {\n width: 12px;\n height: 12px;\n background: #fff;\n border-radius: 50%;\n cursor: pointer;\n border: none;\n }\n\n .time-display {\n color: #fff;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n user-select: none;\n }\n\n /* 响应式 */\n @media (max-width: 768px) {\n .play-button {\n width: 60px;\n height: 60px;\n }\n\n .control-button {\n min-width: 28px;\n height: 28px;\n }\n\n .time-display {\n font-size: 12px;\n }\n }\n</style>\n","<template>\n <a-modal\n :visible=\"visible\"\n :footer=\"false\"\n :simple=\"true\"\n :mask-closable=\"true\"\n :esc-to-close=\"true\"\n width=\"auto\"\n :modal-class=\"'video-preview-modal'\"\n @cancel=\"handleClose\"\n >\n <template #title>\n <div class=\"video-modal-title\">\n <span class=\"file-name\">{{ fileName || '视频预览' }}</span>\n </div>\n </template>\n \n <div class=\"video-modal-content\">\n <VideoPreview\n v-if=\"videoUrl\"\n :video-url=\"videoUrl\"\n :player-options=\"playerOptions\"\n @play=\"handlePlay\"\n @pause=\"handlePause\"\n @ended=\"handleEnded\"\n />\n </div>\n </a-modal>\n</template>\n\n<script setup lang=\"ts\">\n import { watch } from 'vue';\n import VideoPreview from './VideoPreview.vue';\n\n interface VideoPlayerOptions {\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n }\n\n interface VideoPreviewModalProps {\n visible: boolean;\n videoUrl: string;\n fileName?: string;\n playerOptions?: VideoPlayerOptions;\n }\n\n interface VideoPreviewModalEmits {\n (e: 'update:visible', value: boolean): void;\n (e: 'play'): void;\n (e: 'pause'): void;\n (e: 'ended'): void;\n }\n\n defineOptions({\n name: 'VideoPreviewModal',\n });\n\n const props = withDefaults(defineProps<VideoPreviewModalProps>(), {\n visible: false,\n videoUrl: '',\n fileName: '',\n playerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<VideoPreviewModalEmits>();\n\n /**\n * 关闭模态框\n */\n const handleClose = () => {\n emit('update:visible', false);\n };\n\n /**\n * 播放事件\n */\n const handlePlay = () => {\n emit('play');\n };\n\n /**\n * 暂停事件\n */\n const handlePause = () => {\n emit('pause');\n };\n\n /**\n * 播放结束事件\n */\n const handleEnded = () => {\n emit('ended');\n };\n\n // 监听 visible 变化,当关闭时停止播放\n watch(\n () => props.visible,\n (newVisible) => {\n if (!newVisible) {\n // 模态框关闭时可以进行清理操作\n }\n }\n );\n</script>\n\n<style>\n .video-preview-modal .arco-modal {\n max-width: 90vw;\n max-height: 90vh;\n }\n\n .video-preview-modal .arco-modal-header {\n border-bottom: 1px solid var(--color-border-2);\n padding: 16px 20px;\n }\n\n .video-preview-modal .arco-modal-body {\n padding: 0;\n max-height: calc(90vh - 60px);\n overflow: hidden;\n }\n</style>\n\n<style scoped>\n .video-modal-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n }\n\n .file-name {\n font-size: 16px;\n font-weight: 500;\n color: var(--color-text-1);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 600px;\n }\n\n .video-modal-content {\n width: 100%;\n min-width: 400px;\n max-width: 90vw;\n background: #000;\n }\n\n @media (max-width: 768px) {\n .video-modal-content {\n min-width: auto;\n }\n\n .file-name {\n font-size: 14px;\n max-width: 250px;\n }\n }\n</style>\n","<template>\n <div class=\"basic-upload\">\n <!-- 当不启用拖拽排序或非 picture-card 模式时,使用原生 Arco Upload -->\n <a-upload\n v-if=\"!shouldUseSortable\"\n ref=\"uploadRef\"\n v-bind=\"getBindValue\"\n :file-list=\"fileListRef\"\n :custom-request=\"handleCustomRequest\"\n @change=\"handleChange\"\n @before-upload=\"handleBeforeUpload\"\n @progress=\"handleProgress\"\n @preview=\"handlePreview\"\n >\n <template v-if=\"!hideUploadButton\" #upload-button>\n <slot name=\"upload-button\">\n <template v-if=\"getProps.listType === 'picture-card'\">\n <div\n class=\"upload-card-button\"\n :style=\"{\n width: cardSizeValue,\n height: cardSizeValue,\n }\"\n >\n <icon-plus :size=\"16\" />\n <div v-if=\"getProps.uploadButtonText\" class=\"upload-text\">\n {{ getProps.uploadButtonText }}\n </div>\n </div>\n </template>\n <template v-else>\n <a-button :type=\"getProps.uploadButtonType || 'primary'\">\n <template #icon>\n <icon-upload />\n </template>\n {{ getProps.uploadButtonText || '上传文件' }}\n </a-button>\n </template>\n </slot>\n </template>\n\n <!-- 自定义上传区域内容 -->\n <template v-if=\"$slots.default\" #default>\n <slot />\n </template>\n\n <!-- 提示信息 -->\n <template v-if=\"getProps.tip || $slots.tip\" #tip>\n <slot name=\"tip\">\n <div class=\"upload-tip\">{{ getProps.tip }}</div>\n </slot>\n </template>\n\n <!-- 自定义文件列表项 -->\n <template v-if=\"$slots.file\" #file=\"{ file }\">\n <slot name=\"file\" :file=\"file\" />\n </template>\n </a-upload>\n\n <!-- 当启用拖拽排序且为 picture-card 模式时,使用自定义可拖拽列表 -->\n <div v-else class=\"sortable-upload-container\">\n <!-- 可拖拽文件列表 -->\n <SortableFileList\n v-if=\"fileListRef.length > 0\"\n :file-list=\"fileListRef\"\n :card-size=\"getProps.cardSize || 80\"\n :disabled=\"getProps.readonly || getProps.disabled\"\n @update:file-list=\"handleFileListUpdate\"\n @sort-change=\"handleSortChange\"\n @preview=\"handlePreview\"\n @remove=\"handleRemoveFile\"\n />\n \n <!-- 上传按钮区域 -->\n <a-upload\n ref=\"uploadRef\"\n v-bind=\"getBindValue\"\n :file-list=\"fileListRef\"\n :show-file-list=\"false\"\n :custom-request=\"handleCustomRequest\"\n @change=\"handleChange\"\n @before-upload=\"handleBeforeUpload\"\n @progress=\"handleProgress\"\n >\n <template v-if=\"!hideUploadButton\" #upload-button>\n <slot name=\"upload-button\">\n <div\n class=\"upload-card-button\"\n :style=\"{\n width: cardSizeValue,\n height: cardSizeValue,\n }\"\n >\n <icon-plus :size=\"16\" />\n <div v-if=\"getProps.uploadButtonText\" class=\"upload-text\">\n {{ getProps.uploadButtonText }}\n </div>\n </div>\n </slot>\n </template>\n </a-upload>\n\n <!-- 提示信息 -->\n <div v-if=\"getProps.tip\" class=\"upload-tip sortable-tip\">{{ getProps.tip }}</div>\n </div>\n\n <!-- 图片预览 -->\n <a-image\n v-if=\"previewImageUrl\"\n :src=\"previewImageUrl\"\n :preview-visible=\"previewVisible\"\n :preview-props=\"{ closable: true }\"\n style=\"display: none\"\n @preview-visible-change=\"(visible: boolean) => (previewVisible = visible)\"\n />\n\n <!-- 视频预览 - 模态框模式 -->\n <VideoPreviewModal\n v-if=\"getProps.videoPreviewMode === 'modal' || !getProps.videoPreviewMode\"\n v-model:visible=\"previewVideoVisible\"\n :video-url=\"previewVideoUrl\"\n :file-name=\"previewFileName\"\n :player-options=\"getProps.videoPlayerOptions\"\n />\n\n <!-- 视频预览 - 行内模式 -->\n <div v-if=\"getProps.videoPreviewMode === 'inline' && previewVideoVisible\" class=\"inline-video-preview\">\n <VideoPreview\n :video-url=\"previewVideoUrl\"\n :player-options=\"getProps.videoPlayerOptions\"\n />\n <a-button class=\"close-inline-preview\" @click=\"previewVideoVisible = false\">\n 关闭预览\n </a-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, unref, onMounted, nextTick } from 'vue';\n import { Message } from '@arco-design/web-vue';\n import { IconPlus, IconUpload } from '@arco-design/web-vue/es/icon';\n import SortableFileList from './components/SortableFileList.vue';\n import VideoPreview from './components/VideoPreview.vue';\n import VideoPreviewModal from './components/VideoPreviewModal.vue';\n import type {\n BasicUploadProps,\n BasicUploadEmits,\n UploadFileItem,\n CustomRequestOptions,\n } from './types';\n\n defineOptions({\n name: 'BasicUpload',\n inheritAttrs: false,\n });\n\n const props = withDefaults(defineProps<BasicUploadProps>(), {\n accept: 'image/*',\n maxSize: 30,\n maxCount: 1,\n multiple: false,\n disabled: false,\n readonly: false,\n listType: 'picture-card',\n name: 'file',\n withCredentials: false,\n showFileList: true,\n showRemoveButton: true,\n showDownloadButton: false,\n showPreviewButton: true,\n showUploadButton: true,\n imagePreview: true,\n imageCrop: false,\n imageCompress: false,\n draggable: false,\n directory: false,\n autoUpload: true,\n resultType: 'fileList',\n uploadButtonType: 'primary',\n responseUrlKey: undefined,\n sortable: false,\n videoPreview: true,\n videoPreviewMode: 'modal',\n videoPlayerOptions: () => ({\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n }),\n });\n\n const emit = defineEmits<BasicUploadEmits>();\n\n // 内部状态\n const uploadRef = ref();\n const fileListRef = ref<UploadFileItem[]>([]);\n const propsRef = ref<Partial<BasicUploadProps>>({});\n const hasShownActionError = ref(false);\n // 追踪已处理的文件状态,防止重复触发事件\n const processedFiles = ref(new Map<string, string>());\n // 图片预览状态\n const previewVisible = ref(false);\n const previewImageUrl = ref('');\n // 视频预览状态\n const previewVideoUrl = ref('');\n const previewVideoVisible = ref(false);\n const previewFileName = ref('');\n\n // 合并 props\n const getProps = computed((): BasicUploadProps => {\n return { ...props, ...unref(propsRef) } as BasicUploadProps;\n });\n\n // 是否应该使用可拖拽列表\n const shouldUseSortable = computed(() => {\n return getProps.value.sortable && getProps.value.listType === 'picture-card';\n });\n\n // 是否隐藏上传按钮\n const hideUploadButton = computed(() => {\n const propsData = unref(getProps);\n if (!propsData.showUploadButton) return true;\n if (propsData.readonly) return true;\n if (propsData.maxCount && fileListRef.value.length >= propsData.maxCount) {\n return true;\n }\n return false;\n });\n\n // 卡片尺寸(用于样式绑定)\n const cardSizeValue = computed(() => {\n return `${getProps.value.cardSize || 80}px`;\n });\n\n // 获取绑定到 a-upload 的属性\n const getBindValue = computed(() => {\n const propsData = unref(getProps);\n\n return {\n ...propsData,\n disabled: propsData.disabled || propsData.readonly,\n showRemoveButton: propsData.showRemoveButton && !propsData.readonly,\n showUploadButton: !hideUploadButton.value,\n // 只有在没有自定义预览时才启用 imagePreview\n // imagePreview: propsData.imagePreview && !propsData.onPreview,\n // 只有在没有自定义预览且未启用视频预览时才启用原生 imagePreview\n imagePreview: propsData.imagePreview && !propsData.onPreview && !propsData.videoPreview,\n onRemove: async (fileItem: UploadFileItem) => {\n // 如果有自定义的 onRemove 回调\n if (propsData.onRemove) {\n const canRemove = await propsData.onRemove(fileItem);\n if (!canRemove) return false;\n }\n\n // 触发 remove 事件\n emit('remove', fileItem);\n return true;\n },\n };\n });\n\n /**\n * 判断文件是否为视频\n */\n const isVideoFile = (fileItem: UploadFileItem): boolean => {\n if (!fileItem.url && !fileItem.originFileObj) return false;\n \n // 通过文件名判断\n const fileName = fileItem.name || fileItem.originFileObj?.name || '';\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v'];\n const hasVideoExtension = videoExtensions.some(ext => \n fileName.toLowerCase().endsWith(ext)\n );\n \n // 通过 MIME 类型判断\n const mimeType = fileItem.originFileObj?.type || '';\n const isVideoMimeType = mimeType.startsWith('video/');\n \n return hasVideoExtension || isVideoMimeType;\n };\n\n /**\n * 文件大小验证\n */\n const validateFileSize = (file: File): boolean => {\n const propsData = unref(getProps);\n if (!propsData.maxSize) return true;\n\n const maxSizeInBytes = propsData.maxSize * 1024 * 1024;\n\n if (file.size > maxSizeInBytes) {\n Message.error(`文件大小不能超过 ${propsData.maxSize}MB`);\n return false;\n }\n return true;\n };\n\n /**\n * 文件类型验证\n */\n const validateFileType = (file: File): boolean => {\n const propsData = unref(getProps);\n if (!propsData.accept) return true;\n\n const acceptTypes = propsData.accept.split(',').map((type: any) => type.trim());\n const fileExtension = `.${file.name.split('.').pop()?.toLowerCase()}`;\n const fileMimeType = file.type;\n\n const isValid = acceptTypes.some((type: any) => {\n if (type.startsWith('.')) {\n return fileExtension === type.toLowerCase();\n }\n if (type.includes('*')) {\n const [mainType] = type.split('/');\n return fileMimeType.startsWith(mainType);\n }\n return fileMimeType === type;\n });\n\n if (!isValid) {\n Message.error(`不支持的文件类型: ${file.name}`);\n return false;\n }\n return true;\n };\n\n /**\n * 上传前的钩子\n */\n const handleBeforeUpload = async (file: File): Promise<boolean> => {\n const propsData = unref(getProps);\n\n // 文件大小验证\n if (!validateFileSize(file)) {\n return false;\n }\n\n // 文件类型验证\n if (!validateFileType(file)) {\n return false;\n }\n\n // 数量限制验证\n if (propsData.maxCount && fileListRef.value.length >= propsData.maxCount) {\n Message.error(`最多只能上传 ${propsData.maxCount} 个文件`);\n emit('exceed', [file], fileListRef.value);\n return false;\n }\n\n // 自定义验证\n if (propsData.beforeUpload) {\n try {\n const result = await propsData.beforeUpload(file);\n return result;\n } catch (error) {\n console.error('beforeUpload error:', error);\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * 自定义上传请求\n */\n const handleCustomRequest = (options: any) => {\n const propsData = unref(getProps);\n\n if (propsData.customRequest) {\n const customOptions: CustomRequestOptions = {\n file: options.fileItem.file!,\n fileItem: options.fileItem,\n onProgress: (percent: number, event?: ProgressEvent) => {\n options.onProgress(percent, event);\n },\n onSuccess: (response: any) => {\n options.onSuccess(response);\n },\n onError: (error: Error) => {\n options.onError(error);\n },\n headers: propsData.headers,\n data: propsData.data,\n name: propsData.name,\n action: propsData.action,\n withCredentials: propsData.withCredentials,\n };\n\n return propsData.customRequest(customOptions);\n }\n // 使用默认上传逻辑\n return defaultUpload(options);\n };\n\n /**\n * 从响应中提取 URL\n */\n const extractUrlFromResponse = (response: any): string | null => {\n // 定义优先级顺序\n const urlPaths = ['url', 'data.pathUrl', 'data.url', 'data.path', 'pathUrl', 'path'];\n\n for (const path of urlPaths) {\n const value = path.split('.').reduce((obj, key) => obj?.[key], response);\n if (value && typeof value === 'string') {\n return value;\n }\n }\n\n // 特殊情况:data 字段本身是字符串\n if (response.data && typeof response.data === 'string') {\n return response.data;\n }\n\n return null;\n };\n\n /**\n * 开发环境日志工具\n */\n const isDev = import.meta.env.DEV;\n const logger = {\n debug: (...args: any[]) => isDev && console.log('[BasicUpload]', ...args),\n warn: (...args: any[]) => console.warn('[BasicUpload]', ...args),\n error: (...args: any[]) => console.error('[BasicUpload]', ...args),\n };\n\n /**\n * 默认上传逻辑\n */\n const defaultUpload = (options: any) => {\n const propsData = unref(getProps);\n const { fileItem, onProgress, onSuccess, onError } = options;\n\n // 检查是否配置了上传地址\n if (!propsData.action) {\n // 只在第一次错误时显示提示,避免多次弹窗\n if (!hasShownActionError.value) {\n Message.error('请配置上传地址 action');\n hasShownActionError.value = true;\n // 3秒后重置标志,允许再次显示错误\n setTimeout(() => {\n hasShownActionError.value = false;\n }, 3000);\n }\n onError(new Error('上传地址未配置'));\n return {\n abort() {\n xhr.abort();\n },\n };\n }\n\n const formData = new FormData();\n formData.append(propsData.name || 'file', fileItem.file!);\n\n // 添加额外参数\n if (propsData.data) {\n Object.keys(propsData.data).forEach((key) => {\n formData.append(key, propsData.data![key]);\n });\n }\n\n const xhr = new XMLHttpRequest();\n\n // 上传进度\n xhr.upload.addEventListener('progress', (e: ProgressEvent) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n onProgress(percent, e);\n }\n });\n\n // 上传成功\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n\n const { code, message, data } = response;\n\n if (code !== 200) {\n const errorMsg = message ? `上传失败: ${message}` : '上传失败';\n onError(new Error(errorMsg));\n Message.error(errorMsg);\n return;\n }\n\n // 从响应中提取 URL\n const extractedUrl = extractUrlFromResponse(response);\n\n const normalizedResponse = extractedUrl\n ? { url: extractedUrl, name: fileItem.name, ...data }\n : response;\n\n if (!extractedUrl) {\n logger.warn('响应中未找到 URL 字段,可能导致上传状态异常');\n }\n\n Message.success(`${fileItem.name} 上传成功`);\n\n onSuccess(normalizedResponse);\n } catch (error) {\n // 如果响应不是 JSON,尝试作为文本处理\n onSuccess({ data: xhr.responseText });\n }\n } else {\n const errorMsg = `上传失败: HTTP ${xhr.status}`;\n Message.error(errorMsg);\n onError(new Error(errorMsg));\n }\n });\n\n // 上传失败\n xhr.addEventListener('error', () => {\n logger.error('上传网络错误');\n onError(new Error('网络错误'));\n });\n\n // 上传中止\n xhr.addEventListener('abort', () => {\n logger.debug('上传已取消');\n onError(new Error('上传已取消'));\n });\n\n xhr.open('POST', propsData.action);\n\n // 设置请求头\n if (propsData.headers) {\n Object.keys(propsData.headers).forEach((key) => {\n xhr.setRequestHeader(key, propsData.headers![key]);\n });\n }\n\n // 是否携带凭证\n if (propsData.withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n\n // 返回包含 abort 方法的对象,以支持取消上传\n return {\n abort() {\n xhr.abort();\n },\n };\n };\n\n /**\n * 为视频文件添加特殊样式类(兼容性处理)\n */\n const addVideoFileClass = () => {\n nextTick(() => {\n const uploadItems = document.querySelectorAll('.arco-upload-list-picture');\n uploadItems.forEach((item) => {\n const img = item.querySelector('img');\n if (img && img.src) {\n const videoExtensions = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.webm', '.mkv', '.m4v'];\n const isVideo = videoExtensions.some(ext => img.src.toLowerCase().includes(ext));\n if (isVideo) {\n item.classList.add('is-video-file');\n } else {\n item.classList.remove('is-video-file');\n }\n }\n });\n });\n };\n\n /**\n * 文件状态改变\n */\n const handleChange = (fileList: UploadFileItem[], currentFile: UploadFileItem) => {\n // 如果是内部更新触发的 change,直接返回,避免循环\n // if (isInternalUpdate.value) return;\n const oldLength = fileListRef.value.length;\n const newLength = fileList.length;\n\n fileListRef.value = fileList;\n \n // 为视频文件添加特殊样式\n addVideoFileClass();\n\n // 触发 change 事件\n emit('change', fileList);\n\n // 判断是否为删除操作(文件数量减少)\n const isRemove = newLength < oldLength;\n\n // 获取当前文件的唯一标识和上次处理的状态\n const fileKey = currentFile.uid || `file-${Date.now()}-${Math.random()}`;\n const lastStatus = processedFiles.value.get(fileKey);\n\n // 根据文件状态触发相应事件\n // 只有在非删除操作且状态首次变为 done 时才触发 success\n if (currentFile.status === 'done' && lastStatus !== 'done' && !isRemove) {\n processedFiles.value.set(fileKey, 'done');\n emit('handleSuccess', currentFile.response, currentFile);\n } else if (currentFile.status === 'error' && lastStatus !== 'error') {\n processedFiles.value.set(fileKey, 'error');\n const error = new Error('上传失败');\n emit('handlError', error, currentFile);\n }\n\n // 清理已删除文件的处理记录\n if (isRemove) {\n const fileUids = new Set(fileList.map((f) => f.uid));\n processedFiles.value.forEach((_value: string, uid: string) => {\n if (!fileUids.has(uid)) {\n processedFiles.value.delete(uid);\n }\n });\n }\n\n // 更新 v-model\n updateModelValue(fileList);\n };\n\n /**\n * 上传进度\n */\n const handleProgress = (currentFile: UploadFileItem) => {\n const percent = currentFile.percent || 0;\n\n emit('progress', percent, currentFile);\n };\n\n /**\n * 预览文件\n */\n const handlePreview = (fileItem: UploadFileItem) => {\n const propsData = unref(getProps);\n\n // 自定义预览(优先级最高)\n if (propsData.onPreview) {\n propsData.onPreview(fileItem);\n return;\n }\n\n // 视频预览\n if (propsData.videoPreview && isVideoFile(fileItem) && fileItem.url) {\n // 先关闭图片预览\n previewImageUrl.value = '';\n previewVisible.value = false;\n\n previewVideoUrl.value = fileItem.url;\n previewFileName.value = fileItem.name || '';\n previewVideoVisible.value = true;\n return;\n }\n\n // 图片预览\n if (propsData.imagePreview && fileItem.url) {\n previewVideoUrl.value = '';\n previewVideoVisible.value = false;\n\n previewImageUrl.value = fileItem.url;\n previewVisible.value = true;\n }\n };\n\n /**\n * 更新 v-model 值\n */\n const updateModelValue = (fileList: UploadFileItem[]) => {\n const propsData = unref(getProps);\n\n switch (propsData.resultType) {\n case 'fileList':\n emit('update:modelValue', fileList);\n break;\n case 'url':\n if (propsData.multiple) {\n const urls = fileList\n .filter((file) => file.status === 'done' && file.url)\n .map((file) => file.url!);\n emit('update:modelValue', urls);\n } else {\n const url = fileList.find((file) => file.status === 'done')?.url || '';\n emit('update:modelValue', url);\n }\n break;\n case 'string':\n const urls = fileList\n .filter((file) => file.status === 'done' && file.url)\n .map((file) => file.url!);\n emit('update:modelValue', urls.join(','));\n break;\n default:\n emit('update:modelValue', fileList);\n }\n };\n\n /**\n * 解析 modelValue 为 fileList\n */\n const parseModelValue = (value: any): UploadFileItem[] => {\n if (!value) return [];\n\n // 已经是 fileList 格式\n if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {\n return value as UploadFileItem[];\n }\n\n // URL 数组\n if (Array.isArray(value)) {\n return value.map((url, index) => ({\n uid: `${Date.now()}-${index}`,\n name: url.split('/').pop() || `file-${index}`,\n url,\n status: 'done' as const,\n }));\n }\n\n // 字符串(单个URL或逗号分隔的URL)\n if (typeof value === 'string') {\n const urls = value.split(',').filter(Boolean);\n return urls.map((url, index) => ({\n uid: `${Date.now()}-${index}`,\n name: url.split('/').pop() || `file-${index}`,\n url: url.trim(),\n status: 'done' as const,\n }));\n }\n\n return [];\n };\n\n /**\n * 手动触发上传\n */\n const submit = () => {\n uploadRef.value?.submit?.();\n };\n\n /**\n * 中止上传\n */\n const abort = (fileItem?: UploadFileItem) => {\n uploadRef.value?.abort?.(fileItem);\n };\n\n /**\n * 清空文件列表\n */\n const clearFiles = () => {\n fileListRef.value = [];\n processedFiles.value.clear(); // 清理状态追踪\n emit('update:modelValue', []);\n emit('change', []);\n };\n\n /**\n * 获取文件列表\n */\n const getFileList = (): UploadFileItem[] => {\n return fileListRef.value;\n };\n\n /**\n * 上传文件\n */\n const upload = (fileItem: UploadFileItem) => {\n uploadRef.value?.upload?.(fileItem);\n };\n\n /**\n * 设置 Props\n */\n const setProps = (uploadProps: Partial<BasicUploadProps>) => {\n propsRef.value = { ...unref(propsRef), ...uploadProps };\n };\n\n /**\n * 设置文件列表\n */\n const setFileList = (files: UploadFileItem[]) => {\n fileListRef.value = files;\n updateModelValue(files);\n };\n\n /**\n * 添加文件\n */\n const addFile = (file: UploadFileItem) => {\n fileListRef.value.push(file);\n updateModelValue(fileListRef.value);\n };\n\n /**\n * 删除文件\n */\n const removeFile = (fileItem: UploadFileItem) => {\n const index = fileListRef.value.findIndex((item: UploadFileItem) => item.uid === fileItem.uid);\n if (index !== -1) {\n fileListRef.value.splice(index, 1);\n updateModelValue(fileListRef.value);\n }\n };\n\n /**\n * 更新文件\n */\n const updateFile = (fileItem: UploadFileItem) => {\n const index = fileListRef.value.findIndex((item: UploadFileItem) => item.uid === fileItem.uid);\n if (index !== -1) {\n fileListRef.value[index] = { ...fileListRef.value[index], ...fileItem };\n updateModelValue(fileListRef.value);\n }\n };\n\n /**\n * 处理文件列表更新(从可拖拽列表触发)\n */\n const handleFileListUpdate = (newFileList: UploadFileItem[]) => {\n fileListRef.value = newFileList;\n emit('change', newFileList);\n updateModelValue(newFileList);\n };\n\n /**\n * 处理排序改变\n */\n const handleSortChange = (newFileList: UploadFileItem[]) => {\n emit('sortChange', newFileList);\n };\n\n /**\n * 处理删除文件(从可拖拽列表触发)\n */\n const handleRemoveFile = async (file: UploadFileItem) => {\n const propsData = unref(getProps);\n\n // 如果有自定义的 onRemove 回调\n if (propsData.onRemove) {\n const canRemove = await propsData.onRemove(file);\n if (!canRemove) return;\n }\n\n removeFile(file);\n };\n\n // 暴露方法\n defineExpose({\n submit,\n abort,\n clearFiles,\n getFileList,\n upload,\n setProps,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n });\n\n // 监听 modelValue 变化\n watch(\n () => getProps.value.modelValue,\n (val: any) => {\n // 只有在外部真正改变 modelValue 时才更新(如父组件传入初始值或编辑时回填)\n fileListRef.value = parseModelValue(val);\n // 为视频文件添加特殊样式\n addVideoFileClass();\n },\n { immediate: true },\n );\n\n onMounted(() => {\n nextTick(() => {\n emit('register', {\n submit,\n abort,\n clearFiles,\n getFileList,\n upload,\n setProps,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n });\n });\n });\n</script>\n\n<style scoped>\n .basic-upload {\n width: 100%;\n }\n\n .sortable-upload-container {\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: flex-start;\n }\n\n .upload-card-button {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 80px;\n color: var(--color-text-3);\n font-size: 14px;\n background-color: #fafafa;\n border-width: 1px;\n border-style: dashed;\n border-color: #e5e7eb;\n border-radius: 6px;\n }\n\n .upload-card-button .arco-icon {\n font-size: 24px;\n margin-bottom: 8px;\n }\n\n .upload-text {\n margin-top: 8px;\n font-size: 12px;\n }\n\n .upload-tip {\n color: var(--color-text-3);\n font-size: 12px;\n line-height: 1.5;\n margin-top: 8px;\n }\n\n .sortable-tip {\n width: 100%;\n margin-top: 0;\n }\n\n :deep(.arco-upload-list-picture) {\n width: v-bind(cardSizeValue) !important;\n height: v-bind(cardSizeValue) !important;\n line-height: v-bind(cardSizeValue) !important;\n }\n\n :deep(.arco-upload-list-picture img) {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n /* 视频文件占位处理 - 隐藏破损的图片 */\n :deep(.arco-upload-list-picture img[src*=\".mp4\"]),\n :deep(.arco-upload-list-picture img[src*=\".avi\"]),\n :deep(.arco-upload-list-picture img[src*=\".mov\"]),\n :deep(.arco-upload-list-picture img[src*=\".wmv\"]),\n :deep(.arco-upload-list-picture img[src*=\".flv\"]),\n :deep(.arco-upload-list-picture img[src*=\".webm\"]),\n :deep(.arco-upload-list-picture img[src*=\".mkv\"]),\n :deep(.arco-upload-list-picture img[src*=\".m4v\"]) {\n opacity: 0;\n }\n\n /* 视频文件容器添加背景和图标 - 使用 :has() 选择器(现代浏览器) */\n :deep(.arco-upload-list-picture:has(img[src*=\".mp4\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".avi\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".mov\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".wmv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".flv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".webm\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".mkv\"]) .arco-upload-list-picture-img),\n :deep(.arco-upload-list-picture:has(img[src*=\".m4v\"]) .arco-upload-list-picture-img),\n /* 兼容性降级方案 - 使用 JavaScript 添加的类名 */\n :deep(.arco-upload-list-picture.is-video-file .arco-upload-list-picture-img) {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n\n /* 视频图标 */\n :deep(.arco-upload-list-picture:has(img[src*=\".mp4\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".avi\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".mov\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".wmv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".flv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".webm\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".mkv\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture:has(img[src*=\".m4v\"]) .arco-upload-list-picture-img)::before,\n :deep(.arco-upload-list-picture.is-video-file .arco-upload-list-picture-img)::before {\n content: '▶';\n position: absolute;\n font-size: 32px;\n color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n pointer-events: none;\n }\n\n /* 遮罩层 - 修复操作图标位置 */\n :deep(.arco-upload-list-picture-mask) {\n line-height: v-bind(cardSizeValue) !important;\n }\n\n /* 操作按钮容器 - 根据尺寸调整图标大小 */\n :deep(.arco-upload-list-picture-operation) {\n font-size: calc(v-bind(cardSizeValue) / 80 * 14px) !important;\n }\n\n /* 错误提示图标 - 根据尺寸调整图标大小 */\n :deep(.arco-upload-list-picture-error-tip .arco-upload-icon-error) {\n font-size: calc(v-bind(cardSizeValue) / 80 * 26px) !important;\n }\n\n /* 行内视频预览 */\n .inline-video-preview {\n margin-top: 16px;\n border: 1px solid var(--color-border-2);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .close-inline-preview {\n width: 100%;\n border-radius: 0;\n }\n</style>\n","import { ref, unref } from 'vue';\nimport type {\n UseUploadOptions,\n UseUploadReturn,\n UploadFileItem,\n} from './types';\n\n/**\n * useUpload Hook\n * 用于在外部管理 Upload 组件的状态和方法\n * \n * @example\n * ```ts\n * // 图片上传示例\n * const [register, uploadMethods] = useUpload({\n * maxCount: 5,\n * accept: 'image/*',\n * action: '/api/upload'\n * });\n * \n * // 视频上传示例\n * const [registerVideo, videoMethods] = useUpload({\n * accept: 'video/*',\n * maxSize: 200,\n * videoPreview: true,\n * videoPreviewMode: 'modal',\n * videoPlayerOptions: {\n * autoplay: false,\n * loop: false,\n * controls: true\n * }\n * });\n * \n * // 在模板中使用\n * <BasicUpload @register=\"register\" />\n * <BasicUpload @register=\"registerVideo\" />\n * \n * // 调用方法\n * uploadMethods.submit();\n * uploadMethods.clearFiles();\n * videoMethods.getFileList();\n * ```\n */\nexport function useUpload(props?: UseUploadOptions): [\n (instance: any) => void,\n Omit<UseUploadReturn, 'register'>\n] {\n const uploadRef = ref<any>(null);\n const fileListRef = ref<UploadFileItem[]>(props?.defaultFileList || []);\n\n /**\n * 注册 Upload 实例\n */\n const register = (uploadInstance: any) => {\n uploadRef.value = uploadInstance;\n\n // 如果有 defaultFileList,同步到组件\n if (props?.defaultFileList && props.defaultFileList.length > 0) {\n uploadInstance.setFileList(props.defaultFileList);\n }\n\n // 如果有其他配置项,应用到实例\n if (props && Object.keys(props).length > 0) {\n const {defaultFileList, ...restProps} = props;\n if (Object.keys(restProps).length > 0) {\n setProps(restProps);\n }\n }\n };\n\n /**\n * 获取 Upload 实例\n */\n const getUpload = () => {\n const upload = unref(uploadRef);\n if (!upload) {\n throw new Error('Upload 实例未注册,请确保在组件上使用 @register=\"register\"');\n }\n return upload;\n };\n\n /**\n * 手动触发上传\n */\n const submit = () => {\n getUpload().submit();\n };\n\n /**\n * 中止上传\n */\n const abort = (fileItem?: UploadFileItem) => {\n getUpload().abort(fileItem);\n };\n\n /**\n * 清空文件列表\n */\n const clearFiles = () => {\n getUpload().clearFiles();\n fileListRef.value = [];\n };\n\n /**\n * 获取文件列表\n */\n const getFileList = (): UploadFileItem[] => {\n return getUpload().getFileList();\n };\n\n /**\n * 上传文件\n */\n const upload = (fileItem: UploadFileItem) => {\n getUpload().upload(fileItem);\n };\n\n /**\n * 设置文件列表\n */\n const setFileList = (files: UploadFileItem[]) => {\n // 同步到内部 ref\n fileListRef.value = files;\n // 同步到组件实例\n const upload = getUpload();\n if (upload.setFileList) {\n upload.setFileList(files);\n }\n };\n\n /**\n * 添加文件\n */\n const addFile = (file: UploadFileItem) => {\n // 同步到内部 ref\n fileListRef.value.push(file);\n // 同步到组件实例\n const upload = getUpload();\n if (upload.addFile) {\n upload.addFile(file);\n }\n };\n\n /**\n * 删除文件\n */\n const removeFile = (fileItem: UploadFileItem) => {\n // 同步到内部 ref\n const index = fileListRef.value.findIndex(\n (item: any) => item.uid === fileItem.uid\n );\n if (index !== -1) {\n fileListRef.value.splice(index, 1);\n }\n // 同步到组件实例\n const upload = getUpload();\n if (upload.removeFile) {\n upload.removeFile(fileItem);\n }\n };\n\n /**\n * 更新文件\n */\n const updateFile = (fileItem: UploadFileItem) => {\n // 同步到内部 ref\n const index = fileListRef.value.findIndex(\n (item: any) => item.uid === fileItem.uid\n );\n if (index !== -1) {\n fileListRef.value[index] = { ...fileListRef.value[index], ...fileItem };\n }\n // 同步到组件实例\n const upload = getUpload();\n if (upload.updateFile) {\n upload.updateFile(fileItem);\n }\n };\n\n /**\n * 设置 Upload 属性\n */\n const setProps = (uploadProps: Omit<UseUploadOptions, 'register'>) => {\n getUpload().setProps(uploadProps);\n };\n\n // 使用 getter 确保返回的是最新的响应式值\n const methods = {\n get fileList() {\n return fileListRef.value;\n },\n submit,\n abort,\n upload,\n clearFiles,\n getFileList,\n setFileList,\n addFile,\n removeFile,\n updateFile,\n setProps,\n };\n\n return [register, methods];\n}\n\n","import {\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';\nimport { BasicUpload } from '../Upload';\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 BasicUpload,\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, ComponentType>();\n\n/**\n * 注册自定义组件\n * @param name 组件名称\n * @param component 组件实例\n */\nexport function registerComponent(name: string, component: ComponentType) {\n customComponentMap.set(name, component);\n}\n\n/**\n * 获取组件\n * @param name 组件名称或组件实例\n * @returns 组件实例\n */\nexport function getComponent(name: string | ComponentType): ComponentType | 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 */\nexport const componentsNeedUploadPlaceholder = new Set([\n 'Upload',\n 'BasicUpload',\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\n/**\n * 根据组件类型生成默认规则\n * @param component 组件类型\n * @param label 标签文本\n * @returns 规则\n */\nexport function getRules(component: string, label: string): any[] {\n if (componentsNeedPlaceholder.has(component)) {\n return [{ required: true, message: `请输入${label}` }];\n }\n if (componentsNeedUploadPlaceholder.has(component)) {\n return [{ required: true, message: `请上传${label}` }];\n }\n return [{ required: true, message: `请选择${label}` }];\n}\n","import type { GetLabelConfig } from './types';\n\n/**\n * 从 options 数组中获取 label\n * @param value - 值\n * @param options - 选项数组\n * @param config - 配置\n * @returns label 字符串\n */\nexport function getLabelFromOptions(\n value: any,\n options: any[],\n config?: GetLabelConfig\n): string {\n if (!options || !Array.isArray(options)) {\n return String(value || '-');\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n\n const option = options.find((opt) => opt[valueKey] === value);\n return option?.[labelKey] || String(value || '-');\n}\n\n/**\n * 从 options 数组中获取多个 label(用于多选)\n * @param values - 值数组\n * @param options - 选项数组\n * @param config - 配置\n * @returns label 字符串数组\n */\nexport function getLabelsFromOptions(\n values: any[],\n options: any[],\n config?: GetLabelConfig\n): string[] {\n if (!values || !Array.isArray(values)) {\n return [];\n }\n\n return values.map((value) => getLabelFromOptions(value, options, config));\n}\n\n/**\n * 从 Tree 数据中递归获取 label\n * @param value - 值\n * @param treeData - 树形数据\n * @param config - 配置\n * @returns label 字符串\n */\nexport function getLabelFromTreeData(\n value: any,\n treeData: any[],\n config?: GetLabelConfig\n): string {\n if (!treeData || !Array.isArray(treeData)) {\n return String(value || '-');\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n const childrenKey = config?.childrenKey || 'children';\n\n // 递归查找函数\n function findLabel(nodes: any[], targetValue: any): string | null {\n for (const node of nodes) {\n if (node[valueKey] === targetValue) {\n return node[labelKey];\n }\n if (node[childrenKey] && Array.isArray(node[childrenKey])) {\n const result = findLabel(node[childrenKey], targetValue);\n if (result) return result;\n }\n }\n return null;\n }\n\n const label = findLabel(treeData, value);\n return label || String(value || '-');\n}\n\n/**\n * 格式化 Cascader 路径\n * @param value - 值数组\n * @param separator - 分隔符\n * @returns 格式化后的路径字符串\n */\nexport function formatCascaderPath(\n value: any[],\n separator: string = ' / '\n): string {\n if (!Array.isArray(value)) {\n return String(value || '-');\n }\n\n if (value.length === 0) {\n return '-';\n }\n\n return value.join(separator);\n}\n\n/**\n * 从 Cascader options 中获取路径 labels\n * @param values - 值数组(例如 [1, 2, 3])\n * @param options - Cascader 选项数组\n * @param config - 配置\n * @returns label 数组\n */\nexport function getCascaderLabels(\n values: any[],\n options: any[],\n config?: GetLabelConfig\n): string[] {\n if (!values || !Array.isArray(values) || values.length === 0) {\n return [];\n }\n\n const labelKey = config?.labelKey || 'label';\n const valueKey = config?.valueKey || 'value';\n const childrenKey = config?.childrenKey || 'children';\n\n const labels: string[] = [];\n let currentOptions = options;\n\n for (const value of values) {\n const option = currentOptions.find((opt) => opt[valueKey] === value);\n if (option) {\n labels.push(option[labelKey]);\n currentOptions = option[childrenKey] || [];\n } else {\n // 如果找不到,直接使用值\n labels.push(String(value));\n break;\n }\n }\n\n return labels;\n}\n\n/**\n * 判断是否为图片文件\n * @param file - 文件对象或 URL 字符串\n * @returns 是否为图片\n */\nexport function isImageFile(file: any): boolean {\n // 支持的图片扩展名\n const imageExtensions = [\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.webp',\n '.svg',\n '.bmp',\n '.ico',\n ];\n\n // 支持的图片 MIME 类型\n const imageMimeTypes = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/bmp',\n ];\n\n // 字符串格式:直接判断 URL\n if (typeof file === 'string') {\n const lowerUrl = file.toLowerCase();\n return imageExtensions.some((ext) => lowerUrl.endsWith(ext));\n }\n\n // 对象格式:判断 url、name 或 type\n if (typeof file === 'object' && file !== null) {\n // 优先检查 type 字段\n if (file.type && imageMimeTypes.includes(file.type)) {\n return true;\n }\n\n // 检查 url\n if (file.url) {\n const lowerUrl = file.url.toLowerCase();\n if (imageExtensions.some((ext) => lowerUrl.endsWith(ext))) {\n return true;\n }\n }\n\n // 检查 name\n if (file.name) {\n const lowerName = file.name.toLowerCase();\n if (imageExtensions.some((ext) => lowerName.endsWith(ext))) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * 获取文件 URL\n * @param file - 文件对象或 URL 字符串\n * @returns URL 字符串\n */\nexport function getFileUrl(file: any): string {\n if (typeof file === 'string') {\n return file;\n }\n if (typeof file === 'object' && file !== null) {\n return file.url || '';\n }\n return '';\n}\n\n/**\n * 获取文件名称\n * @param file - 文件对象或 URL 字符串\n * @returns 文件名称\n */\nexport function getFileName(file: any): string {\n if (typeof file === 'string') {\n // 从 URL 中提取文件名\n const parts = file.split('/');\n return parts[parts.length - 1] || file;\n }\n\n if (typeof file === 'object' && file !== null) {\n // 优先使用 name 字段\n if (file.name) {\n return file.name;\n }\n // 其次从 url 中提取\n if (file.url) {\n const parts = file.url.split('/');\n return parts[parts.length - 1] || file.url;\n }\n }\n\n return '';\n}\n\n/**\n * 将文件数组分类为图片和非图片\n * @param files - 文件数组\n * @returns 分类结果\n */\nexport function classifyFiles(files: any[]): {\n imageFiles: any[];\n otherFiles: any[];\n} {\n if (!files || !Array.isArray(files)) {\n return { imageFiles: [], otherFiles: [] };\n }\n\n const imageFiles: any[] = [];\n const otherFiles: any[] = [];\n\n files.forEach((file) => {\n if (isImageFile(file)) {\n imageFiles.push(file);\n } else {\n otherFiles.push(file);\n }\n });\n\n return { imageFiles, otherFiles };\n}\n\n/**\n * 格式化日期\n * @param value - 日期值\n * @param format - 格式(目前简单实现)\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(value: any, format?: string): string {\n if (!value) return '-';\n\n try {\n // 如果已经是字符串,直接返回\n if (typeof value === 'string') {\n return value;\n }\n\n // 如果是 Date 对象或时间戳\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n return String(value);\n }\n\n // 简单的日期格式化(可以后续扩展)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n if (format === 'datetime') {\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n\n return `${year}-${month}-${day}`;\n } catch (error) {\n console.error('[ReadonlyField] 日期格式化错误:', error);\n return String(value);\n }\n}\n\n/**\n * 格式化布尔值\n * @param value - 布尔值\n * @param trueText - true 的文本,默认 '是'\n * @param falseText - false 的文本,默认 '否'\n * @returns 格式化后的文本\n */\nexport function formatBoolean(\n value: any,\n trueText: string = '是',\n falseText: string = '否'\n): string {\n if (value === true || value === 'true' || value === 1 || value === '1') {\n return trueText;\n }\n if (value === false || value === 'false' || value === 0 || value === '0') {\n return falseText;\n }\n return '-';\n}\n\n/**\n * 安全地转换为字符串\n * @param value - 任意值\n * @param emptyText - 空值占位符\n * @returns 字符串\n */\nexport function safeToString(value: any, emptyText: string = '-'): string {\n if (value === null || value === undefined || value === '') {\n return emptyText;\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n","import { h } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport { Image, ImagePreviewGroup } from '@arco-design/web-vue';\nimport type { Renderer, RenderConfig } from './types';\nimport {\n getLabelFromOptions,\n getLabelsFromOptions,\n getLabelFromTreeData,\n formatCascaderPath,\n getCascaderLabels,\n classifyFiles,\n getFileUrl,\n getFileName,\n formatDate,\n formatBoolean,\n safeToString,\n} from './utils';\n\n/**\n * 渲染纯文本(默认渲染器)\n */\nexport function renderText(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n const text = safeToString(value, emptyText);\n\n return h(\n 'div',\n {\n class: ['readonly-field-text', { 'readonly-field-empty': !value }],\n },\n text\n );\n}\n\n/**\n * 渲染 InputNumber\n */\nexport function renderInputNumber(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-number' }, String(value));\n}\n\n/**\n * 渲染 Select\n */\nexport function renderSelect(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 优先使用 labelMap\n if (config.labelMap && value in config.labelMap) {\n return h('div', { class: 'readonly-field-select' }, config.labelMap[value]);\n }\n\n // 从 options 中查找\n const options = config.componentProps?.options || [];\n const label = getLabelFromOptions(value, options);\n\n return h('div', { class: 'readonly-field-select' }, label);\n}\n\n/**\n * 渲染 Select(多选)\n */\nexport function renderSelectMultiple(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || !Array.isArray(value) || value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const options = config.componentProps?.options || [];\n const labels = getLabelsFromOptions(value, options);\n\n return h(\n 'div',\n { class: 'readonly-field-select-multiple' },\n labels.join(', ')\n );\n}\n\n/**\n * 渲染 TreeSelect\n */\nexport function renderTreeSelect(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined || value === '') {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 优先使用 labelMap\n if (config.labelMap && value in config.labelMap) {\n return h(\n 'div',\n { class: 'readonly-field-tree-select' },\n config.labelMap[value]\n );\n }\n\n // 从 treeData 中查找\n const treeData = config.componentProps?.data || [];\n const label = getLabelFromTreeData(value, treeData);\n\n return h('div', { class: 'readonly-field-tree-select' }, label);\n}\n\n/**\n * 渲染 Cascader\n */\nexport function renderCascader(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 如果不是数组,直接显示\n if (!Array.isArray(value)) {\n return h('div', { class: 'readonly-field-cascader' }, String(value));\n }\n\n if (value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const options = config.componentProps?.options || [];\n\n // 尝试从 options 中获取 labels\n if (options.length > 0) {\n const labels = getCascaderLabels(value, options);\n if (labels.length > 0) {\n return h(\n 'div',\n { class: 'readonly-field-cascader' },\n formatCascaderPath(labels)\n );\n }\n }\n\n // 否则直接格式化值数组\n return h(\n 'div',\n { class: 'readonly-field-cascader' },\n formatCascaderPath(value)\n );\n}\n\n/**\n * 渲染 DatePicker\n */\nexport function renderDatePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const formatted = formatDate(value);\n return h('div', { class: 'readonly-field-date' }, formatted);\n}\n\n/**\n * 渲染 RangePicker\n */\nexport function renderRangePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || !Array.isArray(value) || value.length === 0) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const startDate = formatDate(value[0]);\n const endDate = formatDate(value[1]);\n\n return h(\n 'div',\n { class: 'readonly-field-range' },\n `${startDate} ~ ${endDate}`\n );\n}\n\n/**\n * 渲染 TimePicker\n */\nexport function renderTimePicker(\n value: any,\n config: RenderConfig\n): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-time' }, String(value));\n}\n\n/**\n * 渲染 Switch\n */\nexport function renderSwitch(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n const trueText =\n config.componentProps?.checkedText ||\n config.componentProps?.trueText ||\n '是';\n const falseText =\n config.componentProps?.uncheckedText ||\n config.componentProps?.falseText ||\n '否';\n\n const text = formatBoolean(value, trueText, falseText);\n\n return h('div', { class: 'readonly-field-switch' }, text);\n}\n\n/**\n * 渲染 Checkbox\n */\nexport function renderCheckbox(value: any, config: RenderConfig): VNodeChild {\n return renderSwitch(value, config);\n}\n\n/**\n * 渲染 CheckboxGroup\n */\nexport function renderCheckboxGroup(\n value: any,\n config: RenderConfig\n): VNodeChild {\n return renderSelectMultiple(value, config);\n}\n\n/**\n * 渲染 Radio/RadioGroup\n */\nexport function renderRadio(value: any, config: RenderConfig): VNodeChild {\n return renderSelect(value, config);\n}\n\n/**\n * 渲染 Rate\n */\nexport function renderRate(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n return h('div', { class: 'readonly-field-rate' }, `${value} 分`);\n}\n\n/**\n * 渲染 Slider\n */\nexport function renderSlider(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (value === null || value === undefined) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 如果是范围滑块(数组)\n if (Array.isArray(value)) {\n return h(\n 'div',\n { class: 'readonly-field-slider' },\n `${value[0]} ~ ${value[1]}`\n );\n }\n\n return h('div', { class: 'readonly-field-slider' }, String(value));\n}\n\n/**\n * 渲染 Upload/BasicUpload\n * 图片使用 Arco Design Image 组件展示,支持预览\n * 其他文件显示为链接\n */\nexport function renderUpload(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 确保是数组\n const files = Array.isArray(value) ? value : [value];\n\n // 分类文件\n const { imageFiles, otherFiles } = classifyFiles(files);\n\n const children: VNodeChild[] = [];\n\n // 渲染图片(使用 Arco Design Image + ImagePreviewGroup)\n if (imageFiles.length > 0) {\n children.push(\n h(\n ImagePreviewGroup,\n { infinite: true },\n {\n default: () =>\n h(\n 'div',\n { class: 'readonly-image-list' },\n imageFiles.map((file) =>\n h(Image, {\n src: getFileUrl(file),\n width: 100,\n height: 100,\n fit: 'cover',\n class: 'readonly-image-item',\n alt: getFileName(file),\n })\n )\n ),\n }\n )\n );\n }\n\n // 渲染其他文件(链接)\n if (otherFiles.length > 0) {\n children.push(\n h(\n 'div',\n { class: 'readonly-file-list' },\n otherFiles.map((file) =>\n h(\n 'a',\n {\n href: getFileUrl(file),\n target: '_blank',\n class: 'readonly-file-link',\n rel: 'noopener noreferrer',\n },\n getFileName(file)\n )\n )\n )\n );\n }\n\n return h('div', { class: 'readonly-upload-container' }, children);\n}\n\n/**\n * 渲染 Textarea\n */\nexport function renderTextarea(value: any, config: RenderConfig): VNodeChild {\n const emptyText = config.emptyText || '-';\n\n if (!value) {\n return h('div', { class: 'readonly-field-empty' }, emptyText);\n }\n\n // 保留换行\n return h(\n 'div',\n {\n class: 'readonly-field-textarea',\n style: { whiteSpace: 'pre-wrap' },\n },\n String(value)\n );\n}\n\n/**\n * 渲染器映射表\n */\nexport const rendererMap: Record<string, Renderer> = {\n // 输入组件\n Input: renderText,\n InputPassword: renderText,\n InputNumber: renderInputNumber,\n Textarea: renderTextarea,\n AutoComplete: renderText,\n\n // 选择组件\n Select: renderSelect,\n TreeSelect: renderTreeSelect,\n Cascader: renderCascader,\n\n // 单选/多选\n Radio: renderRadio,\n RadioGroup: renderRadio,\n Checkbox: renderCheckbox,\n CheckboxGroup: renderCheckboxGroup,\n\n // 日期时间\n DatePicker: renderDatePicker,\n RangePicker: renderRangePicker,\n TimePicker: renderTimePicker,\n\n // 其他\n Switch: renderSwitch,\n Rate: renderRate,\n Slider: renderSlider,\n Upload: renderUpload,\n BasicUpload: renderUpload,\n\n // 默认\n default: renderText,\n};\n\n/**\n * 获取渲染器\n * @param component - 组件类型\n * @returns 渲染器函数\n */\nexport function getRenderer(component: string = 'Input'): Renderer {\n return rendererMap[component] || rendererMap.default;\n}\n","<template>\n <div :class=\"wrapperClass\" :style=\"customStyle\">\n <component :is=\"renderedContent\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch, onMounted } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport type { ReadonlyFieldProps, RenderConfig } from './types';\nimport { getRenderer } from './renderers';\n\ndefineOptions({\n name: 'BasicReadonlyField',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ReadonlyFieldProps>(), {\n component: 'Input',\n emptyText: '-',\n});\n\n// 加载状态(用于异步获取 options)\nconst loading = ref(false);\n// 缓存的 options(异步获取后存储)\nconst cachedOptions = ref<any[]>([]);\n\n/**\n * 包装器类名\n */\nconst wrapperClass = computed(() => {\n return [\n 'readonly-field',\n props.class,\n {\n 'readonly-field-loading': loading.value,\n },\n ];\n});\n\n/**\n * 自定义样式\n */\nconst customStyle = computed(() => {\n return props.style || {};\n});\n\n/**\n * 渲染配置\n */\nconst renderConfig = computed<RenderConfig>(() => {\n return {\n component: props.component,\n componentProps: props.componentProps,\n labelMap: props.labelMap,\n fetchOptions: props.fetchOptions,\n emptyText: props.emptyText,\n customRender: props.customRender,\n value: props.value,\n };\n});\n\n/**\n * 增强的渲染配置(包含缓存的 options)\n */\nconst enhancedRenderConfig = computed<RenderConfig>(() => {\n const config = { ...renderConfig.value };\n\n // 如果有缓存的 options,合并到 componentProps 中\n if (cachedOptions.value.length > 0) {\n config.componentProps = {\n ...config.componentProps,\n options: cachedOptions.value,\n };\n }\n\n return config;\n});\n\n/**\n * 渲染内容\n */\nconst renderedContent = computed<VNodeChild>(() => {\n try {\n // 如果有自定义渲染函数,优先使用\n if (props.customRender) {\n return props.customRender(props.value, enhancedRenderConfig.value);\n }\n\n // 获取对应的渲染器\n const renderer = getRenderer(props.component || 'Input');\n\n // 执行渲染\n return renderer(props.value, enhancedRenderConfig.value);\n } catch (error) {\n console.error('[BasicReadonlyField] 渲染错误:', error);\n return props.emptyText || '-';\n }\n});\n\n/**\n * 异步获取 options\n */\nconst fetchOptionsAsync = async () => {\n if (!props.fetchOptions) return;\n\n try {\n loading.value = true;\n const options = await props.fetchOptions();\n cachedOptions.value = options || [];\n } catch (error) {\n console.error('[BasicReadonlyField] 获取 options 失败:', error);\n cachedOptions.value = [];\n } finally {\n loading.value = false;\n }\n};\n\n/**\n * 监听 fetchOptions 变化\n */\nwatch(\n () => props.fetchOptions,\n () => {\n if (props.fetchOptions) {\n fetchOptionsAsync();\n }\n },\n { immediate: true }\n);\n\n/**\n * 监听 value 变化(如果需要重新获取 options)\n */\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n // 如果值发生变化且有 fetchOptions,可能需要重新获取\n // 这里暂时不实现,根据实际需求可以扩展\n }\n);\n\n// 组件挂载时的初始化\nonMounted(() => {\n // 如果有 fetchOptions 但还没有缓存,立即获取\n if (props.fetchOptions && cachedOptions.value.length === 0) {\n fetchOptionsAsync();\n }\n});\n</script>\n\n<style scoped>\n.readonly-field {\n color: var(--color-text-1);\n line-height: 1.5;\n min-height: 32px;\n display: flex;\n align-items: center;\n}\n\n.readonly-field-loading {\n opacity: 0.6;\n}\n\n/* 空值样式 */\n.readonly-field-empty {\n color: var(--color-text-4);\n}\n\n/* 文本样式 */\n.readonly-field-text {\n word-break: break-word;\n}\n\n/* 数字样式 */\n.readonly-field-number {\n font-variant-numeric: tabular-nums;\n}\n\n/* Textarea 样式 */\n.readonly-field-textarea {\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* Upload 容器 */\n.readonly-upload-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* 图片列表(网格布局) */\n.readonly-image-list {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n gap: 8px;\n max-width: 100%;\n}\n\n.readonly-image-item {\n border-radius: var(--border-radius-small);\n cursor: pointer;\n transition: transform 0.2s ease;\n border: 1px solid var(--color-border-2);\n}\n\n.readonly-image-item:hover {\n transform: scale(1.05);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n/* 文件列表 */\n.readonly-file-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.readonly-file-link {\n color: rgb(var(--primary-6));\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.readonly-file-link:hover {\n text-decoration: underline;\n color: rgb(var(--primary-5));\n}\n\n.readonly-file-link::before {\n content: '📎';\n font-size: 14px;\n}\n\n/* Select 多选 */\n.readonly-field-select-multiple {\n word-break: break-word;\n}\n\n/* Cascader 路径 */\n.readonly-field-cascader {\n word-break: break-word;\n}\n\n/* Rate */\n.readonly-field-rate {\n color: var(--color-text-1);\n}\n\n/* Slider */\n.readonly-field-slider {\n color: var(--color-text-1);\n}\n\n/* Switch */\n.readonly-field-switch {\n color: var(--color-text-1);\n}\n\n/* Date */\n.readonly-field-date {\n color: var(--color-text-1);\n}\n\n/* Range */\n.readonly-field-range {\n color: var(--color-text-1);\n}\n\n/* Time */\n.readonly-field-time {\n color: var(--color-text-1);\n}\n</style>\n","import { ref } from 'vue';\nimport type { VNodeChild } from 'vue';\nimport type {\n UseReadonlyFieldOptions,\n UseReadonlyFieldReturn,\n RenderConfig,\n} from './types';\nimport { getRenderer } from './renderers';\nimport {\n getLabelFromOptions,\n getLabelsFromOptions,\n getLabelFromTreeData,\n} from './utils';\n\n/**\n * useReadonlyField Hook\n * 提供函数式的只读字段渲染能力\n * \n * @param options - Hook 配置选项\n * @returns Hook 返回值\n * \n * @example\n * ```ts\n * const { render, getLabel } = useReadonlyField();\n * \n * // 渲染字段\n * const content = render(value, {\n * component: 'Select',\n * componentProps: { options: [...] }\n * });\n * \n * // 获取 label\n * const label = await getLabel(value, {\n * component: 'Select',\n * componentProps: { options: [...] }\n * });\n * ```\n */\nexport function useReadonlyField(\n options?: UseReadonlyFieldOptions\n): UseReadonlyFieldReturn {\n // 默认配置\n const defaultEmptyText = options?.defaultEmptyText || '-';\n const globalLabelMap = options?.globalLabelMap || {};\n\n // 缓存的 options(用于异步获取)\n const optionsCache = ref<Map<string, any[]>>(new Map());\n\n /**\n * 渲染函数\n * @param value - 值\n * @param config - 渲染配置\n * @returns 渲染的 VNode\n */\n const render = (value: any, config: RenderConfig): VNodeChild => {\n try {\n // 合并配置\n const mergedConfig: RenderConfig = {\n emptyText: defaultEmptyText,\n ...config,\n labelMap: {\n ...globalLabelMap,\n ...(config.labelMap || {}),\n },\n };\n\n // 自定义渲染优先\n if (mergedConfig.customRender) {\n return mergedConfig.customRender(value, mergedConfig);\n }\n\n // 获取对应的渲染器\n const renderer = getRenderer(mergedConfig.component || 'Input');\n\n // 执行渲染\n return renderer(value, mergedConfig);\n } catch (error) {\n console.error('[useReadonlyField] 渲染错误:', error);\n return defaultEmptyText;\n }\n };\n\n /**\n * 获取 label(用于 Select、TreeSelect 等)\n * @param value - 值\n * @param config - 渲染配置\n * @returns label 字符串\n */\n const getLabel = async (\n value: any,\n config: RenderConfig\n ): Promise<string> => {\n if (value === null || value === undefined || value === '') {\n return config.emptyText || defaultEmptyText;\n }\n\n // 优先使用 labelMap\n const labelMap = {\n ...globalLabelMap,\n ...(config.labelMap || {}),\n };\n\n if (value in labelMap) {\n return labelMap[value];\n }\n\n // 处理异步 fetchOptions\n if (config.fetchOptions) {\n try {\n // 尝试从缓存获取\n const cacheKey = config.fetchOptions.toString();\n let options = optionsCache.value.get(cacheKey);\n\n if (!options) {\n // 缓存中没有,执行获取\n options = await config.fetchOptions();\n optionsCache.value.set(cacheKey, options || []);\n }\n\n return getLabelFromOptions(value, options || []);\n } catch (error) {\n console.error('[useReadonlyField] 获取 options 失败:', error);\n return String(value);\n }\n }\n\n // 从 componentProps.options 中获取\n const options = config.componentProps?.options || [];\n if (options.length > 0) {\n return getLabelFromOptions(value, options);\n }\n\n // 从 componentProps.data(TreeSelect)中获取\n const treeData = config.componentProps?.data || [];\n if (treeData.length > 0) {\n return getLabelFromTreeData(value, treeData);\n }\n\n // 都没有,直接返回值\n return String(value);\n };\n\n /**\n * 获取多个 label(用于多选)\n * @param values - 值数组\n * @param config - 渲染配置\n * @returns label 字符串数组\n */\n const getLabels = async (\n values: any[],\n config: RenderConfig\n ): Promise<string[]> => {\n if (!values || !Array.isArray(values) || values.length === 0) {\n return [];\n }\n\n // 处理异步 fetchOptions\n if (config.fetchOptions) {\n try {\n // 尝试从缓存获取\n const cacheKey = config.fetchOptions.toString();\n let options = optionsCache.value.get(cacheKey);\n\n if (!options) {\n // 缓存中没有,执行获取\n options = await config.fetchOptions();\n optionsCache.value.set(cacheKey, options || []);\n }\n\n return getLabelsFromOptions(values, options || []);\n } catch (error) {\n console.error('[useReadonlyField] 获取 options 失败:', error);\n return values.map(String);\n }\n }\n\n // 从 componentProps.options 中获取\n const options = config.componentProps?.options || [];\n if (options.length > 0) {\n return getLabelsFromOptions(values, options);\n }\n\n // 都没有,直接返回值\n return values.map(String);\n };\n\n /**\n * 清除 options 缓存\n */\n const clearCache = () => {\n optionsCache.value.clear();\n };\n\n return {\n render,\n getLabel,\n getLabels,\n clearCache,\n };\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 <!-- 自定义 label(支持省略和 tooltip) -->\n <template v-if=\"shouldRenderCustomLabel(schema)\" #label>\n <a-tooltip\n v-if=\"schema.labelTooltip\"\n :content=\"getLabelTooltipContent(schema)\"\n >\n <span :style=\"getLabelStyle(schema)\">\n {{ schema.label }}\n </span>\n </a-tooltip>\n <span v-else :style=\"getLabelStyle(schema)\">\n {{ schema.label }}\n </span>\n </template>\n <!-- 使用插槽自定义内容 -->\n <template v-if=\"schema.slotName\">\n <slot\n :name=\"schema.slotName\"\n :field=\"schema.field\"\n :schema=\"schema\"\n :formModel=\"formModel\"\n />\n </template>\n <!-- 自定义组件内容渲染 -->\n <template v-else-if=\"schema.renderComponentContent\">\n <component\n :is=\"schema.renderComponentContent(schema, formModel)\"\n />\n </template>\n <!-- 只读字段渲染 -->\n <template v-else-if=\"isFieldReadonly(schema)\">\n <BasicReadonlyField\n :value=\"formModel[schema.field]\"\n :component=\"getComponentString(schema.component)\"\n :componentProps=\"schema.componentProps\"\n :labelMap=\"schema.readonlyConfig?.labelMap\"\n :fetchOptions=\"schema.readonlyConfig?.fetchOptions\"\n :emptyText=\"schema.readonlyConfig?.emptyText\"\n :customRender=\"schema.readonlyConfig?.customRender ? (value: any) => schema.readonlyConfig!.customRender!(value, schema) : undefined\"\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 <template #icon>\n <icon-search />\n </template>\n {{ getActionProps.submitButtonText }}\n </a-button>\n <a-button\n v-if=\"getActionProps.showResetButton\"\n @click=\"handleReset\"\n >\n <template #icon>\n <icon-refresh />\n </template>\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, getRules} from './componentMap';\nimport type {FormSchema, BasicFormProps, BasicFormEmits} from './types';\nimport {BasicReadonlyField} from '../ReadonlyField';\n\ndefineOptions({\n name: 'BasicForm',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BasicFormProps>(), {\n schemas: () => [],\n layout: 'horizontal',\n labelAlign: 'right',\n gutter: 24,\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 labelColProps: propsData.labelColProps,\n wrapperColProps: propsData.wrapperColProps,\n };\n});\n\n// 获取 Row 配置\nconst getRow = computed(() => {\n const propsData = unref(getProps);\n return {\n gutter: propsData.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 =\n 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: FormSchema) => 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: FormSchema) => {\n if (!(schema.field in formModel)) {\n formModel[schema.field] =\n schema.defaultValue !== undefined ? schema.defaultValue : 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: FormSchema) => {\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 // 自动生成必填验证规则\n let rules = schema.rules;\n if (schema.required && (!rules || rules.length === 0)) {\n const componentType =\n typeof schema.component === 'string' ? schema.component : '';\n rules = getRules(componentType, schema.label);\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,\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// 判断是否需要渲染自定义 label\nconst shouldRenderCustomLabel = (schema: FormSchema): boolean => {\n return !!(schema.labelEllipsis || schema.labelTooltip);\n};\n\n// 获取 label 样式\nconst getLabelStyle = (schema: FormSchema): Record<string, any> => {\n if (!schema.labelEllipsis) {\n return {};\n }\n\n const maxWidth = schema.labelMaxWidth || '150px';\n\n return {\n display: 'inline-block',\n maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n };\n};\n\n// 获取 label tooltip 内容\nconst getLabelTooltipContent = (schema: FormSchema): string => {\n if (typeof schema.labelTooltip === 'string') {\n return schema.labelTooltip;\n }\n return schema.label;\n};\n\n// 判断字段是否为只读模式\nconst isFieldReadonly = (schema: FormSchema): boolean => {\n const propsData = unref(getProps);\n \n // 全局只读模式\n if (propsData.readonly) {\n return true;\n }\n \n // 字段级只读配置\n if (schema.readonly !== undefined) {\n if (typeof schema.readonly === 'boolean') {\n return schema.readonly;\n }\n if (typeof schema.readonly === 'function') {\n return schema.readonly(formModel);\n }\n }\n \n return false;\n};\n\n// 获取组件字符串类型(用于 ReadonlyField)\nconst getComponentString = (component: string | any): string => {\n if (typeof component === 'string') {\n return component;\n }\n // 如果是组件实例,尝试获取组件名\n return component?.name || 'Input';\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 // 如果是直接调用(没有传入 data 参数),需要先验证\n if (!data) {\n try {\n await validate();\n const values = getFieldsValue();\n emit('submit', values);\n return values;\n } catch (error) {\n console.warn('表单验证失败:', error);\n throw error;\n }\n }\n\n // 如果是表单 @submit 事件触发(有 data 参数)\n // 如果有验证错误,不触发 submit\n if (data.errors) {\n console.warn('表单验证失败:', data.errors);\n return;\n }\n\n // 验证通过,触发 submit 事件\n emit('submit', data.values);\n return 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 =\n internalSchemas.value.length > 0\n ? internalSchemas.value\n : props.schemas || [];\n const hasField = schemas.some((s: FormSchema) => 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: FormSchema) => 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 (\n item.defaultValue !== undefined &&\n formModel[item.field!] === oldSchema.defaultValue\n ) {\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(\n (s: FormSchema) => s.field === f,\n );\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: FormSchema) => 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 () => getProps.value.schemas,\n (newSchemas: any) => {\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, watch } 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(\n options: UseFormOptions = {},\n): [(formInstance: any) => void, Omit<UseFormReturn, 'register'>] {\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 const pendingValues = ref<Record<string, any> | null>(null);\n let unwatchFormRef: (() => void) | null = null;\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\n // 清理旧的监听器\n if (unwatchFormRef) {\n unwatchFormRef();\n unwatchFormRef = null;\n }\n\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 if (formInstance.formRef) {\n unwatchFormRef = watch(\n () => formInstance.formRef.value,\n (val: any) => {\n if (val === null) {\n formRef.value = null;\n loadedRef.value = false;\n if (unwatchFormRef) {\n unwatchFormRef();\n unwatchFormRef = null;\n }\n }\n },\n { flush: 'sync' }, // 同步执行,确保及时清理\n );\n }\n\n // 关键:注册完成后应用待处理的值\n if (pendingValues.value) {\n await setFieldsValue(pendingValues.value);\n pendingValues.value = null;\n }\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 const form = unref(formRef);\n if (!form) return null;\n\n // 双重保险:检查实例是否真正可用\n if (form.formRef?.value === null) {\n formRef.value = null;\n loadedRef.value = false;\n return null;\n }\n\n return form;\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\n // 如果表单未注册,保存到待处理队列\n if (!form) {\n pendingValues.value = { ...pendingValues.value, ...values };\n return;\n }\n\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","/**\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","<template>\n <div class=\"basic-text-ellipsis\">\n <a-tooltip\n v-if=\"showTooltip\"\n :content=\"text\"\n :trigger=\"tooltipTrigger\"\n v-bind=\"tooltipProps\"\n >\n <div\n ref=\"textRef\"\n class=\"text-ellipsis-content\"\n :style=\"ellipsisStyle\"\n >\n {{ text }}\n </div>\n </a-tooltip>\n <div\n v-else\n ref=\"textRef\"\n class=\"text-ellipsis-content\"\n :style=\"ellipsisStyle\"\n >\n {{ text }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, watch, nextTick } from 'vue';\nimport type { TextEllipsisProps } from './types';\nimport { debounce } from '../../utils/debounce';\n\n// Props 定义\nconst props = withDefaults(defineProps<TextEllipsisProps>(), {\n text: '',\n lines: 1,\n tooltip: true,\n tooltipTrigger: 'hover',\n alwaysShowTooltip: false,\n tooltipProps: () => ({}),\n});\n\n// 响应式状态\nconst textRef = ref<HTMLDivElement>();\nconst isTruncated = ref(false);\nlet resizeObserver: ResizeObserver | null = null;\n\n// 计算样式\nconst ellipsisStyle = computed<Record<string, any>>(() => {\n if (props.lines === 1) {\n return {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n }\n\n return {\n display: '-webkit-box',\n '-webkit-box-orient': 'vertical',\n '-webkit-line-clamp': props.lines,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n wordBreak: 'break-word',\n };\n});\n\n// 是否显示 tooltip\nconst showTooltip = computed(() => {\n if (!props.tooltip) {\n return false;\n }\n \n if (props.alwaysShowTooltip) {\n return true;\n }\n\n return isTruncated.value;\n});\n\n// 检测文本是否被截断\nconst checkTruncation = () => {\n if (!textRef.value) {\n return;\n }\n\n const element = textRef.value;\n \n // 对于单行省略,检查 scrollWidth 和 clientWidth\n if (props.lines === 1) {\n isTruncated.value = element.scrollWidth > element.clientWidth;\n } else {\n // 对于多行省略,检查 scrollHeight 和 clientHeight\n isTruncated.value = element.scrollHeight > element.clientHeight;\n }\n};\n\n// 防抖的检测函数\nconst debouncedCheck = debounce(checkTruncation, 100);\n\n// 初始化 ResizeObserver\nconst initResizeObserver = () => {\n if (!textRef.value) {\n return;\n }\n\n resizeObserver = new ResizeObserver(() => {\n debouncedCheck();\n });\n\n resizeObserver.observe(textRef.value);\n};\n\n// 清理 ResizeObserver\nconst cleanupResizeObserver = () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n resizeObserver = null;\n }\n debouncedCheck.cancel();\n};\n\n// 生命周期钩子\nonMounted(() => {\n nextTick(() => {\n checkTruncation();\n initResizeObserver();\n });\n});\n\nonBeforeUnmount(() => {\n cleanupResizeObserver();\n});\n\n// 监听文本和行数变化\nwatch(\n () => [props.text, props.lines],\n () => {\n nextTick(() => {\n checkTruncation();\n });\n }\n);\n</script>\n\n<style scoped>\n.basic-text-ellipsis {\n width: 100%;\n}\n\n.text-ellipsis-content {\n width: 100%;\n word-wrap: break-word;\n}\n</style>\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 { componentMap as formComponentMap } from '../../Form/componentMap';\n\n/**\n * 编辑组件映射表\n * 复用 Form 组件的 componentMap,支持所有 Arco Design 数据输入组件\n */\nexport const editComponentMap = {\n ...formComponentMap,\n // 可以添加 Table 专用的编辑组件\n};\n\n/**\n * 获取编辑组件\n * @param name 组件名称(字符串)或组件实例\n * @returns 组件实例\n */\nexport function getEditComponent(name: string | any): any {\n if (typeof name === 'string') {\n return editComponentMap[name as keyof typeof editComponentMap];\n }\n return name;\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { BasicColumn, TrimConfig, EventListeners } from '../../types';\n\n/**\n * useTrim Hook 选项\n */\nexport interface UseTrimOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 全局编辑配置 */\n editConfig?: { autoTrim?: boolean };\n}\n\n/**\n * useTrim Hook 返回值\n */\nexport interface UseTrimReturn {\n /** Trim 配置(computed,自动缓存) */\n trimConfig: ComputedRef<TrimConfig>;\n /** 应用 trim 处理 */\n applyTrim: (value: any) => any;\n /** 包装事件监听器以支持 trim */\n wrapTrimListeners: (listeners: EventListeners, currentValue: () => any, onChange: (value: any) => void) => EventListeners;\n}\n\n/**\n * Trim Hook\n * 封装所有 trim 相关逻辑\n * \n * @param options - 配置选项\n * @returns Trim 相关方法和配置\n * \n * @example\n * ```typescript\n * const { trimConfig, applyTrim, wrapTrimListeners } = useTrim({\n * column: props.column,\n * editConfig: props.editConfig\n * });\n * ```\n */\nexport function useTrim(options: UseTrimOptions): UseTrimReturn {\n const { column, editConfig } = options;\n\n /**\n * 获取 Trim 配置(使用 computed 缓存)\n */\n const trimConfig = computed<TrimConfig>(() => {\n const columnConfig = column.autoTrim;\n const globalConfig = editConfig?.autoTrim;\n\n // 默认配置\n const defaultConfig: TrimConfig = {\n enabled: true,\n overall: true,\n eachLine: false,\n trigger: 'blur',\n };\n\n // 列级配置优先,然后是全局配置\n if (typeof columnConfig === 'object' && columnConfig !== null) {\n return {\n enabled: true,\n overall: columnConfig.overall ?? defaultConfig.overall,\n eachLine: columnConfig.eachLine ?? defaultConfig.eachLine,\n trigger: columnConfig.trigger ?? defaultConfig.trigger,\n };\n }\n\n if (typeof columnConfig === 'boolean') {\n return { ...defaultConfig, enabled: columnConfig };\n }\n\n if (typeof globalConfig === 'boolean') {\n return { ...defaultConfig, enabled: globalConfig };\n }\n\n return defaultConfig;\n });\n\n /**\n * 应用 trim 处理\n * @param value - 要处理的值\n * @returns 处理后的值\n */\n const applyTrim = (value: any): any => {\n const config = trimConfig.value;\n \n // 只对字符串进行 trim\n if (typeof value !== 'string') {\n return value;\n }\n\n let result = value;\n\n // trim 每行(用于 Textarea)\n if (config.eachLine) {\n result = result\n .split('\\n')\n .map(line => line.trim())\n .join('\\n');\n }\n\n // trim 整体\n if (config.overall) {\n result = result.trim();\n }\n\n return result;\n };\n\n /**\n * 包装事件监听器以支持 trim\n * @param listeners - 用户的事件监听器\n * @param currentValue - 获取当前值的函数\n * @param onChange - 值变化回调\n * @returns 包装后的事件监听器\n */\n const wrapTrimListeners = (\n listeners: EventListeners,\n currentValue: () => any,\n onChange: (value: any) => void\n ): EventListeners => {\n const config = trimConfig.value;\n\n if (!config.enabled) {\n return {};\n }\n\n const wrappedListeners: EventListeners = {};\n\n // 根据触发时机处理\n if (config.trigger === 'blur') {\n // 失焦时 trim\n const originalOnBlur = listeners.onBlur;\n wrappedListeners.onBlur = (...args: any[]) => {\n // 先执行用户的 onBlur\n originalOnBlur?.(...args);\n\n // 然后执行 trim\n const value = currentValue();\n const trimmedValue = applyTrim(value);\n\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n }\n };\n }\n\n return wrappedListeners;\n };\n\n return {\n trimConfig,\n applyTrim,\n wrapTrimListeners,\n };\n}\n","/**\n * 需要使用 \"请输入\" placeholder 的组件类型\n */\nexport const componentsNeedInputPlaceholder = new Set([\n 'Input',\n 'InputPassword',\n 'Textarea',\n 'AutoComplete',\n 'InputNumber',\n]);\n\n/**\n * 需要使用 \"请选择\" placeholder 的组件类型\n */\nexport const componentsNeedSelectPlaceholder = new Set([\n 'Select',\n 'DatePicker',\n 'TimePicker',\n 'RangePicker',\n 'Cascader',\n 'TreeSelect',\n 'Radio',\n 'RadioGroup',\n 'Checkbox',\n 'CheckboxGroup',\n]);\n\n/**\n * 需要使用 \"请上传\" placeholder 的组件类型\n */\nexport const componentsNeedUploadPlaceholder = new Set([\n 'Upload',\n 'BasicUpload',\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 (!label) {\n return '';\n }\n \n if (componentsNeedInputPlaceholder.has(component)) {\n return `请输入${label}`;\n }\n \n if (componentsNeedSelectPlaceholder.has(component)) {\n return `请选择${label}`;\n }\n \n if (componentsNeedUploadPlaceholder.has(component)) {\n return `请上传${label}`;\n }\n \n return '';\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn, EventListeners } from '../../types';\nimport { getPlaceholder } from '../utils';\n\n/**\n * useComponentProps Hook 选项\n */\nexport interface UseComponentPropsOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 当前行数据 */\n record: TableData;\n /** 组件大小 */\n size?: 'mini' | 'small' | 'medium' | 'large';\n /** 验证错误信息 */\n error?: string;\n /** 额外的事件监听器(用于包装 trim 等) */\n extraListeners?: EventListeners;\n}\n\n/**\n * useComponentProps Hook 返回值\n */\nexport interface UseComponentPropsReturn {\n /** 组件类型名称 */\n componentType: ComputedRef<string>;\n /** 用户配置的属性 */\n attrs: ComputedRef<Record<string, any>>;\n /** 用户配置的事件监听器 */\n listeners: ComputedRef<EventListeners>;\n /** 合并后的所有属性 */\n mergedProps: ComputedRef<Record<string, any>>;\n}\n\n/**\n * 组件属性处理 Hook\n * 处理属性和事件的分离、合并等逻辑\n * \n * @param options - 配置选项\n * @returns 组件属性相关的计算属性\n * \n * @example\n * ```typescript\n * const { componentType, attrs, listeners, mergedProps } = useComponentProps({\n * column: props.column,\n * record: props.record,\n * size: props.size,\n * error: props.error,\n * });\n * ```\n */\nexport function useComponentProps(options: UseComponentPropsOptions): UseComponentPropsReturn {\n const { column, record, size = 'small', error, extraListeners = {} } = options;\n\n /**\n * 获取组件类型名称(用于智能 placeholder)\n */\n const componentType = computed(() => {\n if (typeof column.editComponent === 'string') {\n return column.editComponent;\n }\n return 'Input';\n });\n\n /**\n * 获取用户配置的属性和事件\n */\n const userComponentProps = computed(() => {\n if (!column.editComponentProps) {\n return {};\n }\n\n if (typeof column.editComponentProps === 'function') {\n return column.editComponentProps(record);\n }\n\n return column.editComponentProps;\n });\n\n /**\n * 分离 props 和事件监听器\n * Vue 3 中,onXxx 格式的 prop 会被自动识别为事件监听器\n */\n const separatedProps = computed(() => {\n const userProps = userComponentProps.value;\n const attrs: Record<string, any> = {};\n const listeners: EventListeners = {};\n\n // 使用 for...in 遍历,性能优于 Object.keys().forEach\n for (const key in userProps) {\n if (Object.prototype.hasOwnProperty.call(userProps, key)) {\n // 判断是否是事件(以 on 开头且第三个字符是大写)\n // 使用 charCodeAt 替代正则表达式,性能更好\n if (key.startsWith('on') && key.length > 2 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90) {\n listeners[key] = userProps[key];\n } else {\n attrs[key] = userProps[key];\n }\n }\n }\n\n return { attrs, listeners };\n });\n\n /**\n * 属性部分\n */\n const attrs = computed(() => separatedProps.value.attrs);\n\n /**\n * 事件监听器部分\n */\n const listeners = computed(() => separatedProps.value.listeners);\n\n /**\n * 合并所有组件属性(包括基础属性、用户属性、事件监听器)\n */\n const mergedProps = computed(() => {\n const { attrs: userAttrs, listeners: userListeners } = separatedProps.value;\n\n // 基础属性\n const baseProps: Record<string, any> = {\n size,\n status: error ? 'error' : undefined,\n };\n\n // 智能 placeholder(仅在用户未配置时生效)\n if (!userAttrs.placeholder) {\n baseProps.placeholder = getPlaceholder(componentType.value, column.title as string || '');\n }\n\n // 合并:基础属性 < 用户属性 < 用户事件监听器 < 额外的事件监听器\n // extraListeners(如 trim 包装)会在内部调用用户的原始监听器\n return {\n ...baseProps,\n ...userAttrs,\n ...userListeners,\n ...extraListeners,\n };\n });\n\n return {\n componentType,\n attrs,\n listeners,\n mergedProps,\n };\n}\n","import { ref, watch, onBeforeUnmount, type Ref } from 'vue';\n\n/**\n * useEditCellValue Hook 选项\n */\nexport interface UseEditCellValueOptions {\n /** 外部传入的值 */\n value: any;\n /** 值变化回调 */\n onChange: (value: any) => void;\n /** 防抖延迟(毫秒),0 表示不防抖 */\n debounce?: number;\n /** 节流延迟(毫秒),0 表示不节流 */\n throttle?: number;\n /** 是否深度监听(仅对对象/数组有效) */\n deep?: boolean;\n}\n\n/**\n * useEditCellValue Hook 返回值\n */\nexport interface UseEditCellValueReturn {\n /** 当前值 */\n currentValue: Ref<any>;\n /** 处理值变化 */\n handleChange: (value: any) => void;\n /** 直接设置值(不触发 onChange) */\n setValue: (value: any) => void;\n}\n\n/**\n * 编辑单元格值管理 Hook\n * 管理编辑值的状态、同步、防抖/节流等\n * \n * @param options - 配置选项\n * @returns 值管理相关的方法和状态\n * \n * @example\n * ```typescript\n * const { currentValue, handleChange, setValue } = useEditCellValue({\n * value: props.value,\n * onChange: (val) => emit('change', val),\n * debounce: 300,\n * });\n * ```\n */\nexport function useEditCellValue(options: UseEditCellValueOptions): UseEditCellValueReturn {\n const { value, onChange, debounce = 0, throttle = 0, deep = false } = options;\n\n // 内部值\n const currentValue = ref(value);\n \n // 防抖计时器\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n \n // 节流相关\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n let lastThrottleTime = 0;\n\n /**\n * 监听外部值变化\n * 智能判断是否需要深度监听\n */\n watch(\n () => value,\n (newVal) => {\n currentValue.value = newVal;\n },\n { \n // 只对对象/数组使用深度监听\n deep: deep || (typeof value === 'object' && value !== null)\n }\n );\n\n /**\n * 清理计时器\n */\n const clearTimers = () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n };\n\n /**\n * 执行防抖\n */\n const executeDebounce = (callback: () => void) => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n callback();\n debounceTimer = null;\n }, debounce);\n };\n\n /**\n * 执行节流\n */\n const executeThrottle = (callback: () => void) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastThrottleTime;\n\n if (timeSinceLastCall >= throttle) {\n // 可以立即执行\n callback();\n lastThrottleTime = now;\n } else {\n // 需要等待\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n }\n const remainingTime = throttle - timeSinceLastCall;\n throttleTimer = setTimeout(() => {\n callback();\n lastThrottleTime = Date.now();\n throttleTimer = null;\n }, remainingTime);\n }\n };\n\n /**\n * 处理值变化\n */\n const handleChange = (newValue: any) => {\n // 更新内部值\n currentValue.value = newValue;\n\n // 执行回调\n const executeCallback = () => {\n onChange(newValue);\n };\n\n // 根据配置决定执行方式\n if (debounce > 0 && throttle > 0) {\n // 同时配置了防抖和节流,优先使用防抖\n console.warn('[useEditCellValue] 同时配置了防抖和节流,将使用防抖');\n executeDebounce(executeCallback);\n } else if (debounce > 0) {\n // 防抖\n executeDebounce(executeCallback);\n } else if (throttle > 0) {\n // 节流\n executeThrottle(executeCallback);\n } else {\n // 立即执行\n executeCallback();\n }\n };\n\n /**\n * 直接设置值(不触发 onChange)\n * 用于外部同步值的场景\n */\n const setValue = (newValue: any) => {\n currentValue.value = newValue;\n };\n\n /**\n * 组件卸载时清理计时器\n */\n onBeforeUnmount(() => {\n clearTimers();\n });\n\n return {\n currentValue,\n handleChange,\n setValue,\n };\n}\n","/**\n * 预设格式化器\n * 提供常用的值格式化函数\n */\n\n/**\n * Trim 格式化器\n * 去除字符串首尾空格\n */\nexport function trimFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.trim();\n}\n\n/**\n * 大写格式化器\n * 将字符串转为大写\n */\nexport function uppercaseFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.toUpperCase();\n}\n\n/**\n * 小写格式化器\n * 将字符串转为小写\n */\nexport function lowercaseFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.toLowerCase();\n}\n\n/**\n * 数字格式化器\n * 将值转换为数字\n */\nexport function numberFormatter(value: any): any {\n const num = Number(value);\n return isNaN(num) ? value : num;\n}\n\n/**\n * 首字母大写格式化器\n * 将字符串首字母转为大写\n */\nexport function capitalizeFormatter(value: any): any {\n if (typeof value !== 'string' || value.length === 0) {\n return value;\n }\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\n/**\n * 移除多余空格格式化器\n * 将多个连续空格替换为单个空格\n */\nexport function removeExtraSpacesFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.replace(/\\s+/g, ' ');\n}\n\n/**\n * 移除所有空格格式化器\n * 移除字符串中的所有空格\n */\nexport function removeAllSpacesFormatter(value: any): any {\n if (typeof value !== 'string') {\n return value;\n }\n return value.replace(/\\s/g, '');\n}\n\n/**\n * 格式化器映射表\n */\nexport const formatters = {\n trim: trimFormatter,\n uppercase: uppercaseFormatter,\n lowercase: lowercaseFormatter,\n number: numberFormatter,\n capitalize: capitalizeFormatter,\n removeExtraSpaces: removeExtraSpacesFormatter,\n removeAllSpaces: removeAllSpacesFormatter,\n} as const;\n\n/**\n * 格式化器类型\n */\nexport type FormatterType = keyof typeof formatters;\n\n/**\n * 获取格式化器\n * @param type - 格式化器类型\n * @returns 格式化函数\n */\nexport function getFormatter(type: string): ((value: any) => any) | undefined {\n return formatters[type as FormatterType];\n}\n","import { computed, type ComputedRef } from 'vue';\nimport type { BasicColumn, FormatConfig, EventListeners } from '../../types';\nimport { getFormatter } from './formatters';\nimport { useTrim } from './useTrim';\n\n/**\n * useEditFormat Hook 选项\n */\nexport interface UseEditFormatOptions {\n /** 列配置 */\n column: BasicColumn;\n /** 全局编辑配置 */\n editConfig?: { autoTrim?: boolean };\n}\n\n/**\n * useEditFormat Hook 返回值\n */\nexport interface UseEditFormatReturn {\n /** 格式化配置 */\n formatConfigs: ComputedRef<FormatConfig[]>;\n /** 应用所有格式化 */\n applyFormat: (value: any, trigger?: 'change' | 'blur') => any;\n /** 包装事件监听器以支持格式化 */\n wrapFormatListeners: (listeners: EventListeners, currentValue: () => any, onChange: (value: any) => void) => EventListeners;\n}\n\n/**\n * 统一格式化系统 Hook\n * 支持多种格式化类型,替代单一的 autoTrim\n * \n * @param options - 配置选项\n * @returns 格式化相关的方法和配置\n * \n * @example\n * ```typescript\n * const { formatConfigs, applyFormat, wrapFormatListeners } = useEditFormat({\n * column: props.column,\n * editConfig: props.editConfig,\n * });\n * ```\n */\nexport function useEditFormat(options: UseEditFormatOptions): UseEditFormatReturn {\n const { column, editConfig } = options;\n\n // 使用 trim hook 处理向后兼容\n const { trimConfig, applyTrim } = useTrim({ column, editConfig });\n\n /**\n * 获取格式化配置(使用 computed 缓存)\n */\n const formatConfigs = computed<FormatConfig[]>(() => {\n const configs: FormatConfig[] = [];\n\n // 优先使用新的 editFormat 配置\n if (column.editFormat) {\n if (Array.isArray(column.editFormat)) {\n configs.push(...column.editFormat);\n } else {\n configs.push(column.editFormat);\n }\n }\n // 向后兼容:如果没有 editFormat,但有 autoTrim 配置\n else if (column.autoTrim !== undefined || editConfig?.autoTrim !== undefined) {\n // 将 autoTrim 转换为 format 配置\n if (trimConfig.value.enabled) {\n configs.push({\n type: 'trim',\n trigger: trimConfig.value.trigger,\n });\n }\n }\n\n return configs;\n });\n\n /**\n * 应用单个格式化\n * @param value - 要格式化的值\n * @param formatConfig - 格式化配置\n * @returns 格式化后的值\n */\n const applySingleFormat = (value: any, formatConfig: FormatConfig): any => {\n const { type } = formatConfig;\n\n // 如果 type 是函数,直接调用\n if (typeof type === 'function') {\n return type(value);\n }\n\n // 特殊处理 trim(使用 useTrim 的逻辑以支持 eachLine 等高级配置)\n if (type === 'trim') {\n return applyTrim(value);\n }\n\n // 使用预设格式化器\n const formatter = getFormatter(type as string);\n if (formatter) {\n return formatter(value);\n }\n\n // 如果没有找到格式化器,返回原值并警告\n console.warn(`[useEditFormat] 未找到格式化器: ${type}`);\n return value;\n };\n\n /**\n * 应用所有格式化\n * @param value - 要格式化的值\n * @param trigger - 触发时机(可选)\n * @returns 格式化后的值\n */\n const applyFormat = (value: any, trigger?: 'change' | 'blur'): any => {\n let result = value;\n\n const configs = formatConfigs.value;\n\n for (const config of configs) {\n // 如果指定了触发时机,只应用匹配的格式化\n if (trigger && config.trigger && config.trigger !== trigger) {\n continue;\n }\n\n result = applySingleFormat(result, config);\n }\n\n return result;\n };\n\n /**\n * 包装事件监听器以支持格式化\n * @param listeners - 用户的事件监听器\n * @param currentValue - 获取当前值的函数\n * @param onChange - 值变化回调\n * @returns 包装后的事件监听器\n */\n const wrapFormatListeners = (\n listeners: EventListeners,\n currentValue: () => any,\n onChange: (value: any) => void\n ): EventListeners => {\n const configs = formatConfigs.value;\n\n if (configs.length === 0) {\n return {};\n }\n\n const wrappedListeners: EventListeners = {};\n\n // 检查是否有 blur 触发的格式化\n const hasBlurFormat = configs.some(config => !config.trigger || config.trigger === 'blur');\n\n if (hasBlurFormat) {\n const originalOnBlur = listeners.onBlur;\n wrappedListeners.onBlur = (...args: any[]) => {\n // 先执行用户的 onBlur\n originalOnBlur?.(...args);\n\n // 然后执行 blur 触发的格式化\n const value = currentValue();\n const formattedValue = applyFormat(value, 'blur');\n\n if (formattedValue !== value) {\n onChange(formattedValue);\n }\n };\n }\n\n return wrappedListeners;\n };\n\n return {\n formatConfigs,\n applyFormat,\n wrapFormatListeners,\n };\n}\n","<template>\n <div class=\"edit-cell\">\n <!-- 自定义渲染 -->\n <template v-if=\"props.column.editRender\">\n <component\n :is=\"customRenderContent\"\n />\n </template>\n <!-- 默认组件渲染 -->\n <template v-else>\n <component\n :is=\"editComponent\"\n v-bind=\"mergedProps\"\n :model-value=\"currentValue\"\n @update:model-value=\"handleChange\"\n class=\"edit-cell-input\"\n />\n </template>\n <div v-if=\"error\" class=\"edit-cell-error\">\n {{ error }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn } from '../types';\nimport { getEditComponent } from './componentMap';\nimport { useEditFormat, useComponentProps, useEditCellValue } from './hooks';\n\ndefineOptions({\n name: 'EditCell',\n});\n\ninterface EditCellProps {\n /** 列配置 */\n column: BasicColumn;\n /** 当前行数据 */\n record: TableData;\n /** 当前值 */\n value: any;\n /** 组件大小 */\n size?: 'mini' | 'small' | 'medium' | 'large';\n /** 验证错误信息 */\n error?: string;\n /** 行索引(用于自定义渲染) */\n rowIndex?: number;\n /** 全局编辑配置(用于获取全局 autoTrim) */\n editConfig?: { autoTrim?: boolean };\n}\n\ninterface EditCellEmits {\n (e: 'change', value: any): void;\n}\n\nconst props = withDefaults(defineProps<EditCellProps>(), {\n size: 'small',\n rowIndex: 0,\n});\n\nconst emit = defineEmits<EditCellEmits>();\n\n// 使用统一格式化系统 Hook(替代 useTrim,支持更多格式化类型)\nconst { applyFormat, wrapFormatListeners } = useEditFormat({\n column: props.column,\n editConfig: props.editConfig,\n});\n\n// 使用值管理 Hook(支持防抖/节流)\nconst { currentValue, handleChange: handleValueChange } = useEditCellValue({\n value: props.value,\n onChange: (value: any) => {\n // 应用 change 触发的格式化\n const formattedValue = applyFormat(value, 'change');\n emit('change', formattedValue);\n },\n debounce: props.column.editDebounce || 0, // 从 column 配置中获取防抖延迟\n throttle: props.column.editThrottle || 0, // 从 column 配置中获取节流延迟\n deep: false, // 智能深度监听由 hook 内部处理\n});\n\n/**\n * 获取编辑组件\n */\nconst editComponent = computed(() => {\n if (!props.column.editComponent) {\n return getEditComponent('Input');\n }\n \n const component = getEditComponent(props.column.editComponent);\n \n // 验证组件是否存在\n if (!component) {\n console.warn(`[EditCell] 未找到编辑组件: ${props.column.editComponent},将使用默认 Input 组件`);\n return getEditComponent('Input');\n }\n \n return component;\n});\n\n// 使用组件属性 Hook(不包含格式化监听器)\nconst { listeners, mergedProps: baseProps } = useComponentProps({\n column: props.column,\n record: props.record,\n size: props.size,\n error: props.error,\n});\n\n/**\n * 合并后的属性(包含格式化监听器)\n */\nconst mergedProps = computed(() => {\n const formatListeners = wrapFormatListeners(\n listeners.value,\n () => currentValue.value,\n (value) => {\n currentValue.value = value;\n emit('change', value);\n }\n );\n \n return {\n ...baseProps.value,\n ...formatListeners,\n };\n});\n\n/**\n * 处理值变化\n */\nconst handleChange = (value: any) => {\n handleValueChange(value);\n};\n\n/**\n * 自定义渲染内容\n */\nconst customRenderContent = computed(() => {\n if (!props.column.editRender) {\n return null;\n }\n \n try {\n return props.column.editRender({\n record: props.record,\n column: props.column,\n rowIndex: props.rowIndex,\n value: currentValue.value,\n onChange: handleChange,\n });\n } catch (error) {\n console.error('[EditCell] 自定义渲染函数执行出错:', error);\n return h('div', { style: { color: 'var(--color-danger)' } }, '渲染出错');\n }\n});\n</script>\n\n<style scoped>\n.edit-cell {\n width: 100%;\n}\n\n.edit-cell-input {\n width: 100%;\n}\n\n.edit-cell-error {\n color: rgb(var(--danger-6));\n font-size: 12px;\n line-height: 1.5;\n margin-top: 4px;\n}\n</style>\n","import type { TableData } from '@arco-design/web-vue';\nimport type { BasicColumn, EditRule } from '../types';\n\n/**\n * 编辑验证 Hook\n * 提供编辑值的验证功能\n */\nexport function useEditValidation() {\n /**\n * 验证单个字段\n */\n const validateField = async (\n value: any,\n column: BasicColumn,\n record: TableData\n ): Promise<{ valid: boolean; message?: string }> => {\n // 如果没有配置验证规则,直接通过\n if (!column.editRule) {\n return { valid: true };\n }\n \n // 统一处理为数组\n const rules = Array.isArray(column.editRule) ? column.editRule : [column.editRule];\n \n // 逐个验证规则\n for (const rule of rules) {\n const result = await validateSingleRule(value, rule, column, record);\n if (!result.valid) {\n return result;\n }\n }\n \n return { valid: true };\n };\n \n /**\n * 验证单个规则\n */\n const validateSingleRule = async (\n value: any,\n rule: EditRule,\n column: BasicColumn,\n record: TableData\n ): Promise<{ valid: boolean; message?: string }> => {\n const label = column.title || column.dataIndex || '字段';\n \n // 必填验证\n if (rule.required) {\n if (value === null || value === undefined || value === '') {\n return {\n valid: false,\n message: rule.message || `请输入${label}`,\n };\n }\n }\n \n // 如果值为空且不是必填,后续验证跳过\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n \n // 正则验证\n if (rule.pattern) {\n if (!rule.pattern.test(String(value))) {\n return {\n valid: false,\n message: rule.message || `${label}格式不正确`,\n };\n }\n }\n \n // 数字类型验证\n if (typeof value === 'number') {\n // 最小值验证\n if (rule.min !== undefined && value < rule.min) {\n return {\n valid: false,\n message: rule.message || `${label}不能小于${rule.min}`,\n };\n }\n \n // 最大值验证\n if (rule.max !== undefined && value > rule.max) {\n return {\n valid: false,\n message: rule.message || `${label}不能大于${rule.max}`,\n };\n }\n }\n \n // 字符串类型验证\n if (typeof value === 'string') {\n // 最小长度验证\n if (rule.minLength !== undefined && value.length < rule.minLength) {\n return {\n valid: false,\n message: rule.message || `${label}长度不能小于${rule.minLength}个字符`,\n };\n }\n \n // 最大长度验证\n if (rule.maxLength !== undefined && value.length > rule.maxLength) {\n return {\n valid: false,\n message: rule.message || `${label}长度不能大于${rule.maxLength}个字符`,\n };\n }\n }\n \n // 自定义验证函数(同步或异步)\n if (rule.validator) {\n try {\n const result = await rule.validator(value, record);\n \n if (result === false) {\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n \n if (typeof result === 'string') {\n return {\n valid: false,\n message: result,\n };\n }\n \n return { valid: true };\n } catch (error) {\n console.error('[useEditValidation] validator error:', error);\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n }\n \n // 异步验证函数(专门用于需要请求后端的场景)\n if (rule.asyncValidator) {\n try {\n const result = await rule.asyncValidator(value, record);\n \n if (result === false) {\n return {\n valid: false,\n message: rule.message || `${label}验证失败`,\n };\n }\n \n if (typeof result === 'string') {\n return {\n valid: false,\n message: result,\n };\n }\n \n return { valid: true };\n } catch (error) {\n console.error('[useEditValidation] asyncValidator error:', error);\n return {\n valid: false,\n message: rule.message || `${label}异步验证失败`,\n };\n }\n }\n \n return { valid: true };\n };\n \n /**\n * 验证整行数据\n */\n const validateRow = async (\n editValues: Record<string, any>,\n columns: BasicColumn[],\n record: TableData\n ): Promise<{ valid: boolean; errors: Record<string, string> }> => {\n const errors: Record<string, string> = {};\n \n // 验证所有需要编辑的列\n for (const column of columns) {\n if (!column.dataIndex || !column.editRule) {\n continue;\n }\n \n const value = editValues[column.dataIndex];\n const result = await validateField(value, column, record);\n \n if (!result.valid && result.message) {\n errors[column.dataIndex] = result.message;\n }\n }\n \n return {\n valid: Object.keys(errors).length === 0,\n errors,\n };\n };\n \n return {\n validateField,\n validateRow,\n };\n}\n","import { reactive, computed } from 'vue';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { TableData } from '@arco-design/web-vue';\nimport { Message } from '@arco-design/web-vue';\nimport type { BasicColumn, BasicTableProps, TableEditConfig } from '../types';\nimport { useEditValidation } from './useEditValidation';\n\n/**\n * 表格编辑 Hook\n * 管理编辑状态、编辑值、编辑操作\n */\nexport function useTableEdit(\n props: ComputedRef<BasicTableProps>,\n dataSource: Ref<TableData[]>,\n getRowKey: (record: TableData) => string | number\n) {\n // 编辑状态 Map: { recordKey: { columnKey: true } }\n const editingStateMap = reactive<Record<string, Record<string, boolean>>>({});\n\n // 编辑值 Map: { recordKey: { columnKey: value } }\n const editValueMap = reactive<Record<string, Record<string, any>>>({});\n\n // 原始数据缓存(用于取消编辑)\n const originalDataMap = reactive<Record<string, TableData>>({});\n\n // 验证错误 Map: { recordKey: { columnKey: errorMessage } }\n const validationErrorMap = reactive<Record<string, Record<string, string>>>({});\n\n // 编辑验证 Hook\n const { validateRow } = useEditValidation();\n\n /**\n * 获取编辑配置\n */\n const editConfig = computed<TableEditConfig>(() => {\n return {\n mode: 'row',\n enabled: true,\n allowAdd: true,\n allowDelete: true,\n ...props.value.editConfig,\n };\n });\n\n /**\n * 获取可编辑的列\n */\n const getEditableColumns = (columns: BasicColumn[]): BasicColumn[] => {\n return columns.filter(col => col.edit || col.editable);\n };\n\n /**\n * 检查是否正在编辑\n */\n const isEditing = (record: TableData, column?: BasicColumn): boolean => {\n const recordKey = String(getRowKey(record));\n\n if (!editingStateMap[recordKey]) {\n return false;\n }\n\n // 如果指定了列,检查该列是否在编辑\n if (column && column.dataIndex) {\n return !!editingStateMap[recordKey][column.dataIndex];\n }\n\n // 否则检查是否有任何列在编辑\n return Object.values(editingStateMap[recordKey]).some(Boolean);\n };\n\n /**\n * 获取编辑值\n */\n const getEditValue = (record: TableData, column: BasicColumn): any => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n // 如果有编辑值,返回编辑值\n if (editValueMap[recordKey] && columnKey in editValueMap[recordKey]) {\n return editValueMap[recordKey][columnKey];\n }\n\n // 如果有默认值,返回默认值\n if (column.editDefaultValue) {\n return column.editDefaultValue;\n }\n\n // 如果配置了 editValueGetter,使用它来获取值\n if (column.editValueGetter) {\n return column.editValueGetter(record);\n }\n\n // 否则返回原始值\n return record[columnKey];\n };\n\n /**\n * 设置编辑值\n */\n const setEditValue = (record: TableData, column: BasicColumn, value: any): void => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n if (!editValueMap[recordKey]) {\n editValueMap[recordKey] = {};\n }\n\n editValueMap[recordKey][columnKey] = value;\n\n // 清除该字段的验证错误\n if (validationErrorMap[recordKey] && validationErrorMap[recordKey][columnKey]) {\n delete validationErrorMap[recordKey][columnKey];\n }\n };\n\n /**\n * 获取验证错误\n */\n const getValidationError = (record: TableData, column: BasicColumn): string | undefined => {\n const recordKey = String(getRowKey(record));\n const columnKey = column.dataIndex as string;\n\n if (validationErrorMap[recordKey]) {\n return validationErrorMap[recordKey][columnKey];\n }\n\n return undefined;\n };\n\n /**\n * 开始编辑\n */\n const startEdit = (record: TableData, column?: BasicColumn): void => {\n const recordKey = String(getRowKey(record));\n const mode = editConfig.value.mode || 'row';\n\n // 保存原始数据(如果还没保存过)\n if (!originalDataMap[recordKey]) {\n originalDataMap[recordKey] = { ...record };\n }\n\n // 初始化编辑状态\n if (!editingStateMap[recordKey]) {\n editingStateMap[recordKey] = {};\n }\n\n // 初始化编辑值\n if (!editValueMap[recordKey]) {\n editValueMap[recordKey] = {};\n }\n\n if (mode === 'row') {\n // 行编辑模式:编辑所有可编辑列\n const editableColumns = getEditableColumns(props.value.columns || []);\n editableColumns.forEach(col => {\n if (col.dataIndex) {\n editingStateMap[recordKey][col.dataIndex] = true;\n // 初始化编辑值\n if (!(col.dataIndex in editValueMap[recordKey])) {\n editValueMap[recordKey][col.dataIndex] = getEditValue(record, col);\n }\n }\n });\n } else if (mode === 'cell' && column && column.dataIndex) {\n // 单元格编辑模式:只编辑指定列\n editingStateMap[recordKey][column.dataIndex] = true;\n // 初始化编辑值\n if (!(column.dataIndex in editValueMap[recordKey])) {\n editValueMap[recordKey][column.dataIndex] = getEditValue(record, column);\n }\n }\n };\n\n /**\n * 获取变更的值\n */\n const getChangedValues = (record: TableData): Record<string, any> => {\n const recordKey = String(getRowKey(record));\n const changedValues: Record<string, any> = {};\n\n if (!editValueMap[recordKey]) {\n return changedValues;\n }\n\n // 比较编辑值和原始值\n Object.keys(editValueMap[recordKey]).forEach(columnKey => {\n const editValue = editValueMap[recordKey][columnKey];\n const originalValue = originalDataMap[recordKey]?.[columnKey];\n\n // 如果值发生变化,记录下来\n if (editValue !== originalValue) {\n changedValues[columnKey] = editValue;\n }\n });\n\n return changedValues;\n };\n\n /**\n * 保存编辑\n */\n const saveEdit = async (record: TableData): Promise<boolean> => {\n const recordKey = String(getRowKey(record));\n\n if (!isEditing(record)) {\n return true;\n }\n\n // 获取可编辑的列\n const editableColumns = getEditableColumns(props.value.columns || []);\n\n // 根据编辑模式确定需要验证的列\n let columnsToValidate: BasicColumn[];\n if (editConfig.value.mode === 'cell') {\n // 单元格编辑模式:只验证当前正在编辑的列\n const editingColumns = editingStateMap[recordKey] || {};\n columnsToValidate = editableColumns.filter(col =>\n col.dataIndex && editingColumns[col.dataIndex]\n );\n } else {\n // 行编辑模式:验证所有可编辑的列\n columnsToValidate = editableColumns;\n }\n\n // 验证所有编辑中的字段\n const validationResult = await validateRow(\n editValueMap[recordKey] || {},\n columnsToValidate,\n record\n );\n\n if (!validationResult.valid) {\n // 保存验证错误\n validationErrorMap[recordKey] = validationResult.errors;\n\n // 显示第一个错误\n const firstError = Object.values(validationResult.errors)[0];\n if (firstError) {\n Message.error(firstError);\n }\n\n return false;\n }\n\n // 获取变更的值\n const changedValues = getChangedValues(record);\n\n // 执行 beforeSave 回调\n if (editConfig.value.beforeSave) {\n try {\n const result = await editConfig.value.beforeSave(record, changedValues);\n if (result === false) {\n return false;\n }\n } catch (error) {\n console.error('[useTableEdit] beforeSave error:', error);\n Message.error('保存前验证失败');\n return false;\n }\n }\n\n // 应用编辑值到数据源\n if (editValueMap[recordKey]) {\n Object.keys(editValueMap[recordKey]).forEach(columnKey => {\n const column = editableColumns.find(col => col.dataIndex === columnKey);\n let value = editValueMap[recordKey][columnKey];\n\n // 如果配置了 editValueSetter,使用它来转换值\n if (column?.editValueSetter) {\n value = column.editValueSetter(value, record);\n }\n\n record[columnKey] = value;\n });\n }\n\n // 执行 onSave 回调\n if (editConfig.value.onSave) {\n try {\n await editConfig.value.onSave(record, changedValues);\n } catch (error) {\n console.error('[useTableEdit] onSave error:', error);\n }\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n\n Message.success('保存成功');\n return true;\n };\n\n /**\n * 取消编辑\n */\n const cancelEdit = (record: TableData): void => {\n const recordKey = String(getRowKey(record));\n\n if (!isEditing(record)) {\n return;\n }\n\n // 恢复原始数据\n if (originalDataMap[recordKey]) {\n Object.keys(originalDataMap[recordKey]).forEach(key => {\n record[key] = originalDataMap[recordKey][key];\n });\n }\n\n // 执行 onCancel 回调\n if (editConfig.value.onCancel) {\n editConfig.value.onCancel(record);\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n };\n\n /**\n * 删除行\n */\n const deleteRow = async (record: TableData): Promise<void> => {\n const recordKey = String(getRowKey(record));\n\n // 执行 onDelete 回调\n if (editConfig.value.onDelete) {\n try {\n await editConfig.value.onDelete(record);\n } catch (error) {\n console.error('[useTableEdit] onDelete error:', error);\n Message.error('删除失败');\n return;\n }\n }\n\n // 从数据源中删除\n const index = dataSource.value.findIndex(item => getRowKey(item) === recordKey);\n if (index > -1) {\n dataSource.value.splice(index, 1);\n }\n\n // 清理编辑状态\n delete editingStateMap[recordKey];\n delete editValueMap[recordKey];\n delete originalDataMap[recordKey];\n delete validationErrorMap[recordKey];\n\n Message.success('删除成功');\n };\n\n /**\n * 添加新行\n */\n const addRow = async (position: 'top' | 'bottom' = 'bottom'): Promise<void> => {\n let newRecord: Partial<TableData> = {};\n\n // 执行 onAdd 回调获取新行数据\n if (editConfig.value.onAdd) {\n try {\n newRecord = await editConfig.value.onAdd();\n } catch (error) {\n console.error('[useTableEdit] onAdd error:', error);\n Message.error('添加失败');\n return;\n }\n }\n\n // 生成临时 ID(如果没有提供)\n const rowKey = props.value.rowKey || 'id';\n if (typeof rowKey === 'string' && !newRecord[rowKey]) {\n newRecord[rowKey] = `temp_${Date.now()}_${Math.random()}`;\n }\n\n if (position === 'top') {\n // 添加到数据源开头\n dataSource.value.unshift(newRecord as TableData);\n } else {\n // 添加到数据源末尾\n dataSource.value.push(newRecord as TableData);\n }\n\n // 自动进入编辑模式\n startEdit(newRecord as TableData);\n };\n\n /**\n * 获取所有编辑中的行\n */\n const getEditingRows = (): TableData[] => {\n const editingKeys = Object.keys(editingStateMap);\n return dataSource.value.filter(record => {\n const recordKey = String(getRowKey(record));\n return editingKeys.includes(recordKey);\n });\n };\n\n /**\n * 批量保存编辑\n */\n const saveAllEdits = async (): Promise<boolean> => {\n const editingRows = getEditingRows();\n\n if (editingRows.length === 0) {\n return true;\n }\n\n // 逐个保存\n for (const record of editingRows) {\n const success = await saveEdit(record);\n if (!success) {\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * 批量取消编辑\n */\n const cancelAllEdits = (): void => {\n const editingRows = getEditingRows();\n\n editingRows.forEach(record => {\n cancelEdit(record);\n });\n };\n\n return {\n editingStateMap,\n editValueMap,\n validationErrorMap,\n isEditing,\n getEditValue,\n setEditValue,\n getValidationError,\n startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n getChangedValues,\n };\n}\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 <!-- 透传 form- 前缀的插槽给 BasicForm -->\n <template\n v-for=\"(_, name) in formSlots\"\n :key=\"name\"\n #[getFormSlotName(name)]=\"slotProps\"\n >\n <slot :name=\"name\" v-bind=\"slotProps || {}\" />\n </template>\n </BasicForm>\n <a-divider class=\"!mt-0\" />\n </div>\n\n <!-- 工具栏 -->\n <div\n v-if=\"\n getToolbarConfig.show || getToolbarConfig.title || $slots.tableTitle\n \"\n class=\"basic-table-toolbar\"\n >\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 v-if=\"getToolbarConfig.show\" class=\"toolbar-right\">\n <a-space>\n <!-- 自定义操作按钮 -->\n <template\n v-if=\"\n getToolbarConfig.actions && getToolbarConfig.actions.length > 0\n \"\n >\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\n v-if=\"getToolbarConfig.showFullscreen\"\n :content=\"isFullscreen ? '退出全屏' : '全屏'\"\n >\n <a-button\n @click=\"handleFullscreen\"\n :aria-label=\"isFullscreen ? '退出全屏' : '全屏显示'\"\n >\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\n v-if=\"getToolbarConfig.showDensity\"\n @select=\"handleDensityChange\"\n >\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\n v-if=\"getToolbarConfig.showColumnSetting\"\n trigger=\"click\"\n position=\"br\"\n >\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\n v-model=\"checkedColumns\"\n @change=\"handleColumnChange\"\n >\n <div\n v-for=\"col in settingColumns\"\n :key=\"col.dataIndex\"\n class=\"column-setting-item\"\n >\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\n v-for=\"col in getViewColumns.filter((c: any) => c.slotName)\"\n :key=\"col.dataIndex\"\n #[col.slotName!]=\"slotProps\"\n >\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\n v-for=\"action in getActionButtons(slotProps.record)\"\n :key=\"action.label\"\n >\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 <template v-else-if=\"(col.edit || col.editable) && isEditing(slotProps.record, col)\">\n <EditCell\n :column=\"col\"\n :record=\"slotProps.record\"\n :row-index=\"slotProps.rowIndex\"\n :value=\"getEditValue(slotProps.record, col)\"\n :error=\"getValidationError(slotProps.record, col)\"\n :edit-config=\"props.editConfig\"\n @change=\"(val: any) => setEditValue(slotProps.record, col, val)\"\n />\n </template>\n <!-- 用户自定义插槽 -->\n <slot\n v-else-if=\"$slots[col.dataIndex as string]\"\n :name=\"col.dataIndex\"\n v-bind=\"slotProps\"\n />\n <!-- customRender 渲染 -->\n <component\n v-else-if=\"col.customRender\"\n :is=\"renderCustomCell(col, slotProps)\"\n />\n <!-- format 格式化 -->\n <template v-else-if=\"col.format\">\n {{\n col.format(\n slotProps.record[col.dataIndex!],\n slotProps.record,\n slotProps.rowIndex\n )\n }}\n </template>\n <!-- ellipsis 省略渲染 -->\n <template v-else-if=\"col.dataIndex && originalColumnsMap.get(col.dataIndex as string)?.ellipsis && typeof originalColumnsMap.get(col.dataIndex as string)?.ellipsis === 'object'\">\n <BasicTextEllipsis\n :text=\"String(slotProps.record[col.dataIndex!] ?? '')\"\n :lines=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).lines ?? 1\"\n :tooltip=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltip ?? true\"\n :tooltipTrigger=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltipTrigger ?? 'hover'\"\n :tooltipProps=\"(originalColumnsMap.get(col.dataIndex as string)!.ellipsis as any).tooltipProps\"\n />\n </template>\n <!-- 默认渲染:显示原始值 -->\n <template v-else>\n {{ slotProps.record[col.dataIndex!] }}\n </template>\n </template>\n </a-table>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n watch,\n onMounted,\n onBeforeUnmount,\n nextTick,\n h,\n useSlots,\n} from 'vue';\nimport type {VNodeChild} 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 {BasicTextEllipsis} from '../TextEllipsis';\nimport {debounce} from '../../utils/debounce';\nimport useLocalStorage from '../../hooks/useLocalStorage';\nimport EditCell from './components/EditCell.vue';\nimport { useTableEdit } from './hooks/useTableEdit';\nimport type {\n BasicColumn,\n BasicTableProps,\n BasicTableEmits,\n ActionItem,\n TablePaginationConfig,\n TableSearchConfig,\n TableToolbarConfig,\n} 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 =\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'INVALID_RESPONSE'\n | '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 pagination: () => ({\n current: 1,\n pageSize: 20,\n showTotal: true,\n showJumper: true,\n showPageSize: true,\n pageSizeOptions: [5, 10, 20, 50, 100],\n }),\n search: () => ({ show: false }),\n toolbar: () => ({ show: false }),\n});\n\nconst emit = defineEmits<BasicTableEmits>();\n\n// 获取插槽\nconst slots = useSlots();\n\n/**\n * 获取所有需要透传给 Form 的插槽\n * 使用 form- 前缀标识需要透传的插槽\n */\nconst formSlots = computed(() => {\n const result: Record<string, any> = {};\n Object.keys(slots).forEach((name) => {\n if (name.startsWith('form-')) {\n result[name] = slots[name];\n }\n });\n return result;\n});\n\n/**\n * 获取 Form 插槽名称(去除 form- 前缀)\n * @param slotName - 原始插槽名称\n * @returns 去除前缀后的插槽名称\n */\nconst getFormSlotName = (slotName: string | symbol): string => {\n const name = slotName.toString();\n return name.startsWith('form-') ? name.slice(5) : name;\n};\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: 20,\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// AbortController 用于取消请求\nlet currentAbortController: AbortController | null = null;\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 () => [getMergedProps.value.data, getMergedProps.value.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: false,\n showRefresh: false,\n showColumnSetting: false,\n showFullscreen: false,\n showDensity: false,\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: 'horizontal',\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((): false | TablePaginationConfig => {\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// 编辑功能 Hook\nconst {\n isEditing,\n getEditValue,\n setEditValue,\n getValidationError,\n startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n getChangedValues,\n} = useTableEdit(getMergedProps, dataSource, getRowKey);\n\n// 原始列配置映射(用于在 slot 中访问完整的列配置)\nconst originalColumnsMap = computed(() => {\n const mergedProps = getMergedProps.value;\n const map = new Map<string, BasicColumn>();\n mergedProps.columns.forEach((col) => {\n if (col.dataIndex) {\n map.set(col.dataIndex as string, col);\n }\n });\n return map;\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: 60,\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 (\n getToolbarConfig.value.showColumnSetting &&\n checkedColumns.value.length > 0\n ) {\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 // 如果列是可编辑的,自动添加 slotName\n if ((col.edit || col.editable) && !col.slotName) {\n return {...col, slotName: col.dataIndex as string};\n }\n // 如果配置了 ellipsis 对象形式,自动添加 slotName 并移除 ellipsis(避免传递给 Arco Table)\n if (!col.slotName && col.ellipsis && typeof col.ellipsis === 'object') {\n const { ellipsis, ...restCol } = col;\n return {...restCol, slotName: col.dataIndex as string};\n }\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 {\n columns,\n data,\n loading,\n pagination,\n search,\n toolbar,\n api,\n fetchSetting,\n beforeFetch,\n afterFetch,\n onFetchError,\n immediate,\n showIndexColumn,\n indexColumnProps,\n showActionColumn,\n actionColumn,\n rowKey,\n expandable,\n scroll,\n draggable,\n bordered,\n stripe,\n showHeader,\n size,\n rowSelection,\n ...rest\n } = 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 VNodeChild 或 null\n */\nconst renderCustomCell = (\n col: BasicColumn,\n slotProps: SlotProps\n): VNodeChild | 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 的 VNodeChild 有 type 属性)\n if (typeof result === 'object' && result !== null && 'type' in result) {\n return result as VNodeChild;\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 = (\n obj: Record<string, any>,\n prefix = ''\n): 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 (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n ) {\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 // AbortController 会自动取消之前的请求\n if (getMergedProps.value.api) {\n await fetchData();\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 = (\n value: string | number | Record<string, any> | undefined\n) => {\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 = (\n rowKeys: (string | number)[],\n rowKey: string | number,\n record: TableData\n) => {\n selectedRowKeys.value = rowKeys;\n selectedRows.value = dataSource.value.filter((item: TableData) =>\n rowKeys.includes(getRowKey(item))\n );\n emit('select', rowKeys, rowKey, record);\n};\n\n// 处理全选\nconst handleSelectAll = (checked: boolean) => {\n if (checked) {\n selectedRowKeys.value = dataSource.value.map((item: TableData) =>\n getRowKey(item)\n );\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 = (\n record: TableData,\n column: BasicColumn,\n event: Event\n) => {\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 // 取消之前的请求\n if (currentAbortController) {\n currentAbortController.abort();\n }\n\n // 创建新的 AbortController\n currentAbortController = new AbortController();\n const signal = currentAbortController.signal;\n\n try {\n loadingRef.value = true;\n\n // 获取 fetchSetting 配置(支持自定义字段名)\n const fetchSetting = {\n pageField: 'page',\n sizeField: 'pageSize',\n listField: 'records',\n totalField: 'total',\n ...mergedProps.fetchSetting,\n };\n\n let params: any = {\n ...searchParams.value,\n };\n\n // 添加分页参数(使用 fetchSetting 配置的字段名)\n if (paginationRef.value) {\n params[fetchSetting.pageField] = paginationRef.value.current;\n params[fetchSetting.sizeField] = paginationRef.value.pageSize;\n }\n\n // 请求前处理(支持异步)\n if (mergedProps.beforeFetch) {\n params = await Promise.resolve(mergedProps.beforeFetch(params));\n }\n\n // 将 signal 传递给 API(需要 API 支持 AbortSignal)\n const result = await mergedProps.api(params, signal);\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 // 使用 fetchSetting 配置的字段名验证响应数据\n const listField = fetchSetting.listField;\n const totalField = fetchSetting.totalField;\n\n if (!(listField in result)) {\n throw {\n code: ERROR_CODES.INVALID_RESPONSE,\n message: `API 响应格式无效:缺少 ${listField} 字段`,\n data: result,\n } as FetchError;\n }\n\n if (!Array.isArray(result[listField])) {\n console.warn(`API 响应格式警告:${listField} 字段不是数组,已转换为空数组`);\n }\n\n let data = Array.isArray(result[listField]) ? result[listField] : [];\n let total = typeof result[totalField] === 'number' ? result[totalField] : data.length;\n\n // 数据一致性检查\n if (total < data.length) {\n console.warn(\n `数据一致性警告:total(${total}) 小于 data.length(${data.length})`\n );\n }\n\n // 请求后处理(支持异步)\n if (mergedProps.afterFetch) {\n const processed = await Promise.resolve(mergedProps.afterFetch(result));\n data = Array.isArray(processed[listField]) ? processed[listField] : data;\n total = typeof processed[totalField] === 'number' ? processed[totalField] : 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 // 如果是请求被取消,不显示错误\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('请求已被取消');\n return;\n }\n\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 (\n error.message.includes('network') ||\n error.message.includes('fetch')\n ) {\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 // 只有当前 signal 没有被取消时才关闭 loading\n if (!signal.aborted) {\n loadingRef.value = false;\n }\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) =>\n keys.includes(getRowKey(item))\n );\n};\nconst deleteSelectRowByKey = (key: string | number) => {\n dataSource.value = dataSource.value.filter(\n (item: TableData) => getRowKey(item) !== key\n );\n selectedRowKeys.value = selectedRowKeys.value.filter((k) => k !== key);\n selectedRows.value = selectedRows.value.filter(\n (item: TableData) => getRowKey(item) !== key\n );\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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 // 注册表格实例\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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>) =>\n 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[]) =>\n searchFormRef.value?.clearValidate?.(field),\n submit: () => searchFormRef.value?.handleSubmit?.(),\n updateSchema: (schema: any) => searchFormRef.value?.updateSchema?.(schema),\n resetSchema: (schemas: any[]) =>\n searchFormRef.value?.resetSchema?.(schemas),\n removeSchemaByField: (field: string | string[]) =>\n searchFormRef.value?.removeSchema?.(field), // 实际方法名是 removeSchema\n appendSchemaByField: () => {\n // BasicForm 没有 appendSchemaByField,可以通过 updateSchema 或 setProps 实现\n console.warn(\n 'appendSchemaByField 方法暂不支持,请使用 updateSchema 或 setProps'\n );\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, #fff);\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, #1d2129);\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, #fff);\n border-radius: 4px;\n padding: 10px 0;\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","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 /**\n * 开始编辑\n */\n const startEdit = (record: TableData, column?: BasicColumn): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.startEdit) {\n table.startEdit(record, column);\n }\n };\n\n /**\n * 保存编辑\n */\n const saveEdit = async (record: TableData): Promise<boolean> => {\n const table = getTable();\n if (!table) return false;\n \n if (table.saveEdit) {\n return await table.saveEdit(record);\n }\n return false;\n };\n\n /**\n * 取消编辑\n */\n const cancelEdit = (record: TableData): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.cancelEdit) {\n table.cancelEdit(record);\n }\n };\n\n /**\n * 删除行\n */\n const deleteRow = async (record: TableData): Promise<void> => {\n const table = getTable();\n if (!table) return;\n \n if (table.deleteRow) {\n await table.deleteRow(record);\n }\n };\n\n /**\n * 添加新行\n * @param position - 添加位置,'top' 表示添加到顶部,'bottom' 表示添加到底部\n */\n const addRow = async (position: 'top' | 'bottom' = 'bottom'): Promise<void> => {\n const table = getTable();\n if (!table) return;\n \n if (table.addRow) {\n await table.addRow(position);\n }\n };\n\n /**\n * 获取所有编辑中的数据\n */\n const getEditingRows = (): TableData[] => {\n const table = getTable();\n if (!table) return [];\n \n if (table.getEditingRows) {\n return table.getEditingRows();\n }\n return [];\n };\n\n /**\n * 批量保存编辑\n */\n const saveAllEdits = async (): Promise<boolean> => {\n const table = getTable();\n if (!table) return false;\n \n if (table.saveAllEdits) {\n return await table.saveAllEdits();\n }\n return false;\n };\n\n /**\n * 批量取消编辑\n */\n const cancelAllEdits = (): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.cancelAllEdits) {\n table.cancelAllEdits();\n }\n };\n\n /**\n * 判断是否正在编辑\n */\n const isEditing = (record: TableData, column?: BasicColumn): boolean => {\n const table = getTable();\n if (!table) return false;\n \n if (table.isEditing) {\n return table.isEditing(record, column);\n }\n return false;\n };\n\n /**\n * 获取编辑值\n */\n const getEditValue = (record: TableData, column: BasicColumn): any => {\n const table = getTable();\n if (!table) return undefined;\n \n if (table.getEditValue) {\n return table.getEditValue(record, column);\n }\n return undefined;\n };\n\n /**\n * 设置编辑值\n */\n const setEditValue = (record: TableData, column: BasicColumn, value: any): void => {\n const table = getTable();\n if (!table) return;\n \n if (table.setEditValue) {\n table.setEditValue(record, column, value);\n }\n };\n\n /**\n * 获取变更的值\n */\n const getChangedValues = (record: TableData): Record<string, any> => {\n const table = getTable();\n if (!table) return {};\n \n if (table.getChangedValues) {\n return table.getChangedValues(record);\n }\n return {};\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 startEdit,\n saveEdit,\n cancelEdit,\n deleteRow,\n addRow,\n getEditingRows,\n saveAllEdits,\n cancelAllEdits,\n isEditing,\n getEditValue,\n setEditValue,\n getChangedValues,\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 @open=\"emit('open')\"\n @close=\"emit('close')\"\n @before-open=\"emit('before-open')\"\n @before-close=\"emit('before-close')\"\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 :style=\"{ display: 'block', textAlign: getProps.titleAlign }\" :class=\"['block']\">\n {{ getProps.title }}\n </span>\n <div :class=\"['modal-title-actions', getProps.closable ? 'has-close' : '']\">\n <template v-if=\"getProps.helpMessage\">\n <a-tooltip v-if=\"Array.isArray(getProps.helpMessage)\" position=\"top\">\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 v-else class=\"cursor-pointer\" @click=\"handleFullscreen\" />\n </div>\n </div>\n </div>\n </template>\n\n <!-- Loading 状态 -->\n <a-spin\n :loading=\"getProps.loading\"\n :tip=\"getProps.loadingTip\"\n :style=\"spinStyle\"\n class=\"w-full\"\n >\n <div v-if=\"getProps.useWrapper\" :style=\"wrapperStyle\" class=\"modal-wrapper\">\n <slot />\n </div>\n <slot v-else />\n </a-spin>\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\">\n import { ref, computed, watch, unref, nextTick, onMounted } from 'vue';\n import type { CSSProperties } from 'vue';\n import {\n IconQuestionCircle,\n IconFullscreen,\n IconFullscreenExit,\n } from '@arco-design/web-vue/es/icon';\n import type { BasicModalProps, ModalEmits, ModalMethods } from './types';\n\n defineOptions({\n name: 'BasicModal',\n inheritAttrs: false,\n });\n\n const props = withDefaults(defineProps<BasicModalProps>(), {\n // Arco 原生默认值\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 alignCenter: true,\n footer: true,\n draggable: false,\n escToClose: true,\n renderToBody: true,\n // 扩展属性默认值\n minHeight: 46,\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 });\n\n const emit = defineEmits<ModalEmits>();\n\n const visibleRef = ref(false);\n const fullscreenRef = ref(false);\n const confirmLoading = ref(false);\n const modalLoading = ref(false);\n const propsRef = ref<Record<string, any>>({});\n\n // 获取合并后的属性\n const getProps = computed(() => {\n return { ...props, ...unref(propsRef) };\n });\n\n // 获取绑定到 a-modal 的属性\n const getBindValue = computed(() => {\n const propsData = unref(getProps);\n return {\n // Arco 原生属性完全透传\n defaultVisible: propsData.defaultVisible,\n title: propsData.title,\n width: fullscreenRef.value ? '100%' : propsData.width,\n top: propsData.top,\n mask: propsData.mask,\n maskClosable: propsData.maskClosable,\n closable: propsData.closable,\n okText: propsData.okText,\n cancelText: propsData.cancelText,\n okLoading: propsData.okLoading,\n okButtonProps: propsData.okButtonProps,\n cancelButtonProps: propsData.cancelButtonProps,\n fullscreen: fullscreenRef.value || propsData.fullscreen,\n alignCenter: propsData.alignCenter || propsData.centered,\n unmountOnClose: propsData.unmountOnClose,\n hideCancel: propsData.hideCancel,\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 footer: propsData.footer === false ? false : undefined,\n titleAlign: propsData.titleAlign,\n // v2.24.0+ 新增属性\n maskAnimationName: propsData.maskAnimationName,\n modalAnimationName: propsData.modalAnimationName,\n // v2.31.0+ 新增属性\n bodyClass: propsData.bodyClass,\n bodyStyle: propsData.bodyStyle,\n };\n });\n\n // 获取弹窗样式\n const 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' ? `${propsData.height}px` : propsData.height;\n }\n\n if (propsData.minHeight) {\n style.minHeight =\n typeof propsData.minHeight === 'number' ? `${propsData.minHeight}px` : 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 样式\n const 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' ? propsData.height : parseInt(propsData.height);\n style.maxHeight = `${height - propsData.wrapperFooterOffset!}px`;\n style.overflowY = 'auto';\n }\n\n return style;\n });\n\n // Spin 样式\n const 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 : '46px',\n };\n\n // 只在 loading 时禁用交互\n if (propsData.loading) {\n style.pointerEvents = 'none';\n }\n\n return style;\n });\n\n // 获取取消按钮属性\n const getCancelButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.cancelButtonProps,\n };\n });\n\n // 获取确认按钮属性\n const getOkButtonProps = computed(() => {\n const propsData = unref(getProps);\n return {\n ...propsData.okButtonProps,\n loading: confirmLoading.value || propsData.okLoading,\n };\n });\n\n // 处理可见性变化\n const handleVisibleChange = (visible: boolean) => {\n visibleRef.value = visible;\n emit('update:visible', visible);\n emit('visible-change', visible);\n };\n\n // 处理确认(内部实现)\n const handleOkInternal = async (ev: MouseEvent) => {\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', ev);\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', ev);\n handleVisibleChange(false);\n }\n } finally {\n confirmLoading.value = false;\n }\n return;\n }\n\n emit('ok', ev);\n handleVisibleChange(false);\n };\n\n // 处理确认(移除防抖,直接使用)\n const handleOk = handleOkInternal;\n\n // 处理取消\n const handleCancel = async (ev: MouseEvent | KeyboardEvent) => {\n const propsData = unref(getProps);\n\n // 如果有 onBeforeCancel,先执行\n if (propsData.onBeforeCancel) {\n try {\n const result = propsData.onBeforeCancel();\n if (result === false) {\n // 返回 false 则不关闭\n return;\n }\n emit('cancel', ev);\n handleVisibleChange(false);\n } catch (e) {\n // 不关闭\n }\n return;\n }\n\n emit('cancel', ev);\n handleVisibleChange(false);\n };\n\n // 处理全屏\n const handleFullscreen = () => {\n fullscreenRef.value = !fullscreenRef.value;\n };\n\n // 设置 Modal Props\n const setModalProps = (modalProps: Partial<BasicModalProps>) => {\n propsRef.value = { ...unref(propsRef), ...modalProps };\n };\n\n // 打开弹窗\n const openModal = () => {\n handleVisibleChange(true);\n };\n\n // 关闭弹窗\n const closeModal = () => {\n handleVisibleChange(false);\n \n // 如果配置了关闭时自动清空数据,延迟清空(等动画结束)\n const propsData = unref(getProps);\n if (propsData.clearDataOnClose) {\n setTimeout(() => {\n clearData();\n }, 300); // 等待关闭动画结束\n }\n };\n\n // 修改确认按钮的 loading 状态\n const changeOkLoading = (loading: boolean) => {\n confirmLoading.value = loading;\n };\n\n // 修改 modal 的 loading 状态\n const changeLoading = (loading: boolean) => {\n modalLoading.value = loading;\n setModalProps({ loading });\n };\n\n // 获取 Modal Props\n const getModalProps = (): BasicModalProps => {\n // 确保返回当前实际的 visible 状态\n return { ...unref(getProps), visible: visibleRef.value };\n };\n\n // 清空弹窗数据\n const clearData = () => {\n // 清空动态设置的 props(保留初始 props)\n propsRef.value = {};\n // 重置 loading 状态\n confirmLoading.value = false;\n modalLoading.value = false;\n };\n\n // 暴露方法给外部\n const modalMethods: ModalMethods = {\n setModalProps,\n openModal,\n closeModal,\n changeOkLoading,\n changeLoading,\n getModalProps,\n clearData,\n };\n\n defineExpose(modalMethods);\n\n // 监听 visible 变化\n watch(\n () => getProps.value.visible,\n (val: boolean | undefined) => {\n visibleRef.value = val ?? false;\n },\n { immediate: true },\n );\n\n // 监听 defaultFullscreen\n watch(\n () => getProps.value.defaultFullscreen,\n (val: boolean | undefined) => {\n fullscreenRef.value = val || false;\n },\n { immediate: true },\n );\n\n // 组件挂载后触发注册事件\n onMounted(() => {\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 modal.setModalProps({ _data: data } as any);\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 setTimeout(() => {\n modal.setModalProps({ _data: undefined } as any);\n });\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 /**\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 getModalProps = (): BasicModalProps => {\n const modal = getModal();\n if (!modal) return {} as BasicModalProps;\n\n return modal.getModalProps();\n };\n\n /**\n * 清空弹窗数据\n */\n const clearData = () => {\n const modal = getModal();\n if (!modal) return;\n\n modal.clearData();\n };\n\n return [\n register,\n {\n openModal,\n closeModal,\n setModalProps,\n getVisible,\n changeOkLoading,\n changeLoading,\n getModalProps,\n clearData,\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 * 清空弹窗数据\n */\n const clearData = () => {\n const modal = getModal();\n if (!modal) return;\n\n modal.clearData();\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 clearData,\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","/**\n * 数组对比选项\n */\nexport interface DiffOptions<T = any> {\n /**\n * 唯一标识字段名\n * @default 'id'\n */\n uniqueKey?: string;\n \n /**\n * 对比深度\n * - shallow: 浅层对比,只对比第一层字段\n * - deep: 深度对比,递归对比所有层级\n * @default 'shallow'\n */\n compareDepth?: 'shallow' | 'deep';\n \n /**\n * 指定需要对比的字段(只对比这些字段)\n * 如果不指定,则对比所有字段(excludeKeys 除外)\n */\n compareFields?: (keyof T)[];\n \n /**\n * 排除不需要对比的字段\n */\n excludeKeys?: (keyof T)[];\n \n /**\n * 删除标记字段名\n * @default 'delFlag'\n */\n deletedFlag?: string;\n \n /**\n * 删除标记值\n * @default 1\n */\n deletedFlagValue?: any;\n}\n\n/**\n * 数组对比结果\n */\nexport interface DiffResult<T = any> {\n /**\n * 被删除的数据(已添加删除标记)\n */\n deleted: T[];\n \n /**\n * 被修改的数据(包含修改后的值)\n */\n modified: T[];\n \n /**\n * 新增的数据\n */\n added: T[];\n}\n\n/**\n * 对象对比选项\n */\nexport interface CompareOptions<T = any> {\n /**\n * 对比深度\n * - shallow: 浅层对比,只对比第一层字段\n * - deep: 深度对比,递归对比所有层级\n * @default 'shallow'\n */\n depth?: 'shallow' | 'deep';\n \n /**\n * 指定需要对比的字段(只对比这些字段)\n */\n compareFields?: (keyof T)[];\n \n /**\n * 排除不需要对比的字段\n */\n excludeKeys?: (keyof T)[];\n}\n\n/**\n * 克隆对象并添加标记\n * @param obj 原始对象\n * @param flagKey 标记字段名\n * @param flagValue 标记值\n * @returns 克隆并添加标记后的对象\n */\nfunction cloneWithFlag<T extends Record<string, any>>(\n obj: T,\n flagKey: string,\n flagValue: any\n): T {\n return {\n ...obj,\n [flagKey]: flagValue\n };\n}\n\n/**\n * 构建数据映射表(内部辅助函数)\n * @param data 数据数组\n * @param uniqueKey 唯一标识字段\n * @param warnPrefix 警告前缀(用于区分调用来源)\n * @returns Map 对象\n */\nfunction buildDataMap<T extends Record<string, any>>(\n data: T[],\n uniqueKey: string,\n warnPrefix?: string\n): Map<any, T> {\n const map = new Map<any, T>();\n \n for (const item of data) {\n const key = item[uniqueKey];\n \n if (key === undefined || key === null) {\n if (process.env.NODE_ENV !== 'production' && warnPrefix) {\n console.warn(`[${warnPrefix}] 数据项缺少唯一标识字段 \"${uniqueKey}\":`, item);\n }\n continue;\n }\n \n if (map.has(key)) {\n if (process.env.NODE_ENV !== 'production' && warnPrefix) {\n console.warn(`[${warnPrefix}] 检测到重复的 ${uniqueKey}: \"${key}\",后者将覆盖前者`);\n }\n }\n \n map.set(key, item);\n }\n \n return map;\n}\n\n/**\n * 深度对比两个值是否相等(用于替代 JSON.stringify)\n * @param val1 值1\n * @param val2 值2\n * @returns 是否相等\n */\nfunction deepEqual(val1: any, val2: any): boolean {\n // 严格相等(包括 NaN !== NaN)\n if (val1 === val2) {\n return true;\n }\n \n // 处理 NaN\n if (typeof val1 === 'number' && typeof val2 === 'number' && \n isNaN(val1) && isNaN(val2)) {\n return true;\n }\n \n // null 检查\n if (val1 === null || val2 === null) {\n return false;\n }\n \n // undefined 检查\n if (val1 === undefined || val2 === undefined) {\n return false;\n }\n \n // 类型不同\n if (typeof val1 !== typeof val2) {\n return false;\n }\n \n // Date 对象\n if (val1 instanceof Date && val2 instanceof Date) {\n return val1.getTime() === val2.getTime();\n }\n \n // RegExp 对象\n if (val1 instanceof RegExp && val2 instanceof RegExp) {\n return val1.toString() === val2.toString();\n }\n \n // 数组\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (val1.length !== val2.length) {\n return false;\n }\n for (let i = 0; i < val1.length; i++) {\n if (!deepEqual(val1[i], val2[i])) {\n return false;\n }\n }\n return true;\n }\n \n // 对象\n if (typeof val1 === 'object' && typeof val2 === 'object') {\n const keys1 = Object.keys(val1);\n const keys2 = Object.keys(val2);\n \n if (keys1.length !== keys2.length) {\n return false;\n }\n \n // 检查所有键是否存在且值相等\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false;\n }\n if (!deepEqual(val1[key], val2[key])) {\n return false;\n }\n }\n return true;\n }\n \n // 其他情况(基本类型)\n return val1 === val2;\n}\n\n/**\n * 判断两个对象是否相等\n * @param obj1 对象1\n * @param obj2 对象2\n * @param options 对比选项\n * @returns 是否相等\n */\nfunction isObjectEqual<T extends Record<string, any>>(\n obj1: T,\n obj2: T,\n options: {\n depth: 'shallow' | 'deep';\n fields?: (keyof T)[];\n excludeKeys?: (keyof T)[];\n }\n): boolean {\n const { depth, fields, excludeKeys = [] } = options;\n \n // 确定需要对比的键\n let keysToCompare: (keyof T)[];\n \n if (fields && fields.length > 0) {\n // 如果指定了 compareFields,只对比这些字段\n keysToCompare = fields;\n } else {\n // 否则对比所有字段(excludeKeys 除外)\n const allKeys = new Set([\n ...Object.keys(obj1),\n ...Object.keys(obj2)\n ]);\n \n keysToCompare = Array.from(allKeys).filter(\n key => !excludeKeys.includes(key as keyof T)\n ) as (keyof T)[];\n }\n \n // 对比每个字段\n for (const key of keysToCompare) {\n const val1 = obj1[key];\n const val2 = obj2[key];\n \n // 严格相等(包括 undefined)\n if (val1 === val2) {\n continue;\n }\n \n // 处理 null 和 undefined\n if (val1 === null || val1 === undefined || val2 === null || val2 === undefined) {\n return false;\n }\n \n // 获取值的类型\n const type1 = typeof val1;\n const type2 = typeof val2;\n \n // 类型不同\n if (type1 !== type2) {\n return false;\n }\n \n // 如果是对象或数组,根据 depth 决定如何对比\n if (type1 === 'object') {\n if (depth === 'shallow') {\n // 浅层对比:特殊类型需要深度比较值,普通对象只比较引用\n if ((val1 as any) instanceof Date && (val2 as any) instanceof Date) {\n // Date: 比较时间戳\n if ((val1 as Date).getTime() !== (val2 as Date).getTime()) {\n return false;\n }\n } else if ((val1 as any) instanceof RegExp && (val2 as any) instanceof RegExp) {\n // RegExp: 比较字符串表示\n if ((val1 as RegExp).toString() !== (val2 as RegExp).toString()) {\n return false;\n }\n } else if (Array.isArray(val1) && Array.isArray(val2)) {\n // 数组浅层对比:比较长度和每个元素的引用\n if (val1.length !== val2.length) {\n return false;\n }\n for (let i = 0; i < val1.length; i++) {\n if (val1[i] !== val2[i]) {\n return false;\n }\n }\n } else if (val1 !== val2) {\n // 其他对象:引用不同则不相等(浅层对比)\n return false;\n }\n } else {\n // 深度对比:使用 deepEqual 递归比较\n if (!deepEqual(val1, val2)) {\n return false;\n }\n }\n } else {\n // 基本类型直接比较\n if (val1 !== val2) {\n return false;\n }\n }\n }\n \n return true;\n}\n\n/**\n * 对比两个对象是否相等\n * \n * @param obj1 对象1\n * @param obj2 对象2\n * @param options 对比选项\n * @returns 是否相等\n * \n * @example\n * ```ts\n * const obj1 = { id: 1, name: '张三', age: 25 };\n * const obj2 = { id: 1, name: '张三', age: 26 };\n * \n * // 浅层对比所有字段\n * compareObjects(obj1, obj2); // false\n * \n * // 只对比 name 字段\n * compareObjects(obj1, obj2, { compareFields: ['name'] }); // true\n * \n * // 排除 age 字段\n * compareObjects(obj1, obj2, { excludeKeys: ['age'] }); // true\n * \n * // 深度对比\n * const obj3 = { id: 1, user: { name: '张三', age: 25 } };\n * const obj4 = { id: 1, user: { name: '张三', age: 25 } };\n * compareObjects(obj3, obj4, { depth: 'deep' }); // true\n * ```\n */\nexport function compareObjects<T extends Record<string, any>>(\n obj1: T,\n obj2: T,\n options?: CompareOptions<T>\n): boolean {\n const { depth = 'shallow', compareFields, excludeKeys = [] } = options || {};\n \n return isObjectEqual(obj1, obj2, {\n depth,\n fields: compareFields,\n excludeKeys\n });\n}\n\n/**\n * 对比两个数组,识别删除、修改和新增的数据\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 对比结果,包含删除、修改和新增的数据\n * \n * @example\n * ```ts\n * // 基础使用\n * const originalData = [\n * { id: 1, name: '张三', age: 25 },\n * { id: 2, name: '李四', age: 30 },\n * { id: 3, name: '王五', age: 28 }\n * ];\n * \n * const currentData = [\n * { id: 1, name: '张三', age: 26 }, // 修改了 age\n * { id: 2, name: '李四', age: 30 }, // 未修改\n * { id: 4, name: '赵六', age: 32 } // 新增\n * ];\n * \n * const result = diffArrays(originalData, currentData);\n * // 结果:\n * // {\n * // deleted: [{ id: 3, name: '王五', age: 28, delFlag: 1 }],\n * // modified: [{ id: 1, name: '张三', age: 26 }],\n * // added: [{ id: 4, name: '赵六', age: 32 }]\n * // }\n * ```\n * \n * @example\n * ```ts\n * // 使用自定义选项\n * const result = diffArrays(originalData, currentData, {\n * uniqueKey: 'userId', // 使用 userId 作为唯一标识\n * compareDepth: 'deep', // 深度对比\n * compareFields: ['name', 'age'], // 只对比 name 和 age 字段\n * deletedFlag: 'isDeleted', // 使用 isDeleted 作为删除标记\n * deletedFlagValue: true // 删除标记值为 true\n * });\n * ```\n * \n * @example\n * ```ts\n * // 排除某些字段的对比\n * const result = diffArrays(originalData, currentData, {\n * excludeKeys: ['updateTime', 'version'] // 不对比这些字段\n * });\n * ```\n */\nexport function diffArrays<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): DiffResult<T> {\n return {\n deleted: findDeleted(original, current, options),\n modified: findModified(original, current, options),\n added: findAdded(original, current, options)\n };\n}\n\n/**\n * 查找被删除的数据(在原始数据中存在,但在当前数据中不存在)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 被删除的数据(已添加删除标记)\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' },\n * { id: 3, name: '王五' }\n * ];\n * const current = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' }\n * ];\n * \n * const deleted = findDeleted(original, current);\n * // [{ id: 3, name: '王五', delFlag: 1 }]\n * ```\n * \n * @example\n * ```ts\n * // 自定义删除标记\n * const deleted = findDeleted(original, current, {\n * deletedFlag: 'isDeleted',\n * deletedFlagValue: true\n * });\n * // [{ id: 3, name: '王五', isDeleted: true }]\n * ```\n */\nexport function findDeleted<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const {\n uniqueKey = 'id',\n deletedFlag = 'delFlag',\n deletedFlagValue = 1\n } = options || {};\n \n // 边界处理\n if (!original || !Array.isArray(original)) {\n return [];\n }\n \n if (!current || !Array.isArray(current)) {\n // 如果 current 为空,original 中的所有数据都是删除\n return original.map(item => cloneWithFlag(item, deletedFlag, deletedFlagValue));\n }\n \n // 构建当前数据映射表\n const currentMap = buildDataMap(current, uniqueKey);\n \n // 查找删除的数据\n const deleted: T[] = [];\n const originalMap = buildDataMap(original, uniqueKey, 'findDeleted');\n \n for (const [key, item] of originalMap) {\n if (!currentMap.has(key)) {\n // 在当前数据中不存在,标记为删除\n deleted.push(cloneWithFlag(item, deletedFlag, deletedFlagValue));\n }\n }\n \n return deleted;\n}\n\n/**\n * 查找被修改的数据(在两个数组中都存在,但内容不同)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 被修改的数据(包含修改后的值)\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三', age: 25 },\n * { id: 2, name: '李四', age: 30 }\n * ];\n * const current = [\n * { id: 1, name: '张三', age: 26 }, // age 被修改\n * { id: 2, name: '李四', age: 30 } // 未修改\n * ];\n * \n * const modified = findModified(original, current);\n * // [{ id: 1, name: '张三', age: 26 }]\n * ```\n * \n * @example\n * ```ts\n * // 只对比特定字段\n * const modified = findModified(original, current, {\n * compareFields: ['name'] // 只对比 name 字段\n * });\n * \n * // 排除某些字段\n * const modified = findModified(original, current, {\n * excludeKeys: ['updateTime'] // 不对比 updateTime 字段\n * });\n * ```\n */\nexport function findModified<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const {\n uniqueKey = 'id',\n compareDepth = 'shallow',\n compareFields,\n excludeKeys = []\n } = options || {};\n \n // 边界处理\n if (!original || !Array.isArray(original) || !current || !Array.isArray(current)) {\n return [];\n }\n \n // 性能优化:提前创建 excludeKeys 数组\n const excludeKeysWithUnique = [...excludeKeys, uniqueKey as keyof T];\n \n // 构建数据映射表\n const originalMap = buildDataMap(original, uniqueKey);\n const currentMap = buildDataMap(current, uniqueKey);\n \n // 查找修改的数据\n const modified: T[] = [];\n for (const [key, originalItem] of originalMap) {\n const currentItem = currentMap.get(key);\n \n if (currentItem) {\n // 存在,检查是否修改\n const isEqual = isObjectEqual(originalItem, currentItem, {\n depth: compareDepth,\n fields: compareFields,\n excludeKeys: excludeKeysWithUnique\n });\n \n if (!isEqual) {\n // 内容不同,标记为修改(使用当前数据)\n modified.push(currentItem);\n }\n }\n }\n \n return modified;\n}\n\n/**\n * 查找新增的数据(在当前数据中存在,但在原始数据中不存在)\n * \n * @param original 原始数据(后台返回的数据)\n * @param current 当前数据(前端修改后的数据)\n * @param options 对比选项\n * @returns 新增的数据\n * \n * @example\n * ```ts\n * const original = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' }\n * ];\n * const current = [\n * { id: 1, name: '张三' },\n * { id: 2, name: '李四' },\n * { id: 3, name: '王五' } // 新增\n * ];\n * \n * const added = findAdded(original, current);\n * // [{ id: 3, name: '王五' }]\n * ```\n * \n * @example\n * ```ts\n * // 批量导入场景\n * function handleImport(existingData: any[], importData: any[]) {\n * const added = findAdded(existingData, importData);\n * console.log(`导入 ${importData.length} 条,新增 ${added.length} 条`);\n * await api.batchInsert(added);\n * }\n * ```\n */\nexport function findAdded<T extends Record<string, any>>(\n original: T[],\n current: T[],\n options?: DiffOptions<T>\n): T[] {\n const { uniqueKey = 'id' } = options || {};\n \n // 边界处理\n if (!current || !Array.isArray(current)) {\n return [];\n }\n \n if (!original || !Array.isArray(original)) {\n // 如果 original 为空,current 中的所有数据都是新增\n return [...current];\n }\n \n // 构建数据映射表\n const originalMap = buildDataMap(original, uniqueKey);\n const currentMap = buildDataMap(current, uniqueKey, 'findAdded');\n \n // 查找新增的数据\n const added: T[] = [];\n for (const [key, item] of currentMap) {\n if (!originalMap.has(key)) {\n // 在原始数据中不存在,标记为新增\n added.push(item);\n }\n }\n \n return added;\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":["getCurrentInstance","inject","_export_sfc","_sfc_main","defineComponent","computed","_hoisted_1","_sfc_render","openBlock","createElementBlock","normalizeClass","normalizeStyle","createElementVNode","_createElementBlock","_normalizeStyle","_openBlock","_hoisted_3","_createVNode","_hoisted_4","_createElementVNode","_hoisted_5","_unref","_createBlock","_hoisted_6","reactive","_Fragment","_renderList","_withModifiers","ref","_a","watch","onMounted","onUnmounted","_normalizeClass","_hoisted_2","_hoisted_7","_withDirectives","_toDisplayString","_createTextVNode","unref","Message","nextTick","urls","_mergeProps","_renderSlot","$slots","_withCtx","upload","Input","InputNumber","InputPassword","Textarea","AutoComplete","Select","Radio","RadioGroup","Checkbox","CheckboxGroup","Cascader","TreeSelect","DatePicker","TimePicker","RangePicker","Switch","Slider","Rate","Upload","Mention","Transfer","componentsNeedSelectPlaceholder","componentsNeedUploadPlaceholder","getPlaceholder","opt","formatDate","h","ImagePreviewGroup","Image","_resolveDynamicComponent","options","onBeforeUnmount","_createSlots","_normalizeProps","_guardReactiveProps","formComponentMap","attrs","listeners","debounce","throttle","useSlots","_vShow","_b","props"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]}
|