diff --git a/internal/vite-config/package.json b/internal/vite-config/package.json index b420f14fa..ca2049087 100644 --- a/internal/vite-config/package.json +++ b/internal/vite-config/package.json @@ -48,6 +48,7 @@ "@vitejs/plugin-vue-jsx": "catalog:", "dayjs": "catalog:", "dotenv": "catalog:", + "rolldown": "catalog:", "rollup-plugin-visualizer": "catalog:", "sass": "catalog:", "sass-embedded": "catalog:", diff --git a/internal/vite-config/src/plugins/license.ts b/internal/vite-config/src/plugins/license.ts index 81fc4ff07..f87a05b18 100644 --- a/internal/vite-config/src/plugins/license.ts +++ b/internal/vite-config/src/plugins/license.ts @@ -2,7 +2,7 @@ import type { NormalizedOutputOptions, OutputBundle, OutputChunk, -} from 'rollup'; +} from 'rolldown'; import type { PluginOption } from 'vite'; import { EOL } from 'node:os'; diff --git a/package.json b/package.json index 37923f436..bd100e00e 100644 --- a/package.json +++ b/package.json @@ -16,15 +16,16 @@ ], "homepage": "https://github.com/vbenjs/vue-vben-admin", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", + "repository": "vbenjs/vue-vben-admin.git", "license": "MIT", "author": { "name": "vben", "email": "ann.vben@gmail.com", "url": "https://github.com/anncwb" }, - "repository": "vbenjs/vue-vben-admin.git", "type": "module", "scripts": { + "bootstrap": "pnpm install", "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build", "build:analyze": "turbo build:analyze", "build:antd": "pnpm run build --filter=@vben/web-antd build:prod", @@ -44,6 +45,7 @@ "lint": "vsh lint", "postinstall": "pnpm -r run stub --if-present", "preinstall": "npx only-allow pnpm", + "prepare": "is-ci || pnpm exec lefthook install", "preview": "turbo-run preview", "publint": "vsh publint", "reinstall": "pnpm clean --del-lock && pnpm install", diff --git a/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue b/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue index 150331e55..3934377a8 100644 --- a/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue +++ b/packages/@core/ui-kit/form-ui/src/form-render/form-field.vue @@ -48,6 +48,7 @@ const { modelPropName, renderComponentContent, rules, + help, } = defineProps< Props & { commonComponentProps: MaybeComponentProps; @@ -166,6 +167,18 @@ const computedProps = computed(() => { }; }); +// 自定义帮助信息 +const computedHelp = computed(() => { + const helpContent = help; + if (!helpContent) { + return undefined; + } + return () => + isFunction(helpContent) + ? helpContent(values.value, getFormApi()) + : helpContent; +}); + watch( () => computedProps.value?.autofocus, (value) => { @@ -308,7 +321,7 @@ onUnmounted(() => { labelClass, ) " - :help="help" + :help="computedHelp" :colon="colon" :label="label" :required="shouldRequired && !hideRequiredMark" diff --git a/packages/@core/ui-kit/form-ui/src/types.ts b/packages/@core/ui-kit/form-ui/src/types.ts index b5c5a4fbc..2238abd1c 100644 --- a/packages/@core/ui-kit/form-ui/src/types.ts +++ b/packages/@core/ui-kit/form-ui/src/types.ts @@ -67,6 +67,14 @@ export type FormActions = FormContext; export type CustomRenderType = (() => Component | string) | string; +// 动态渲染参数 +export type CustomParamsRenderType = + | (( + value: Partial>, + actions: FormActions, + ) => Component | string) + | string; + export type FormSchemaRuleType = | 'required' | 'selectRequired' @@ -254,7 +262,7 @@ export interface FormSchema< /** 字段名 */ fieldName: string; /** 帮助信息 */ - help?: CustomRenderType; + help?: CustomParamsRenderType; /** 是否隐藏表单项 */ hide?: boolean; /** 表单项 */ diff --git a/packages/effects/common-ui/src/components/api-component/api-component.vue b/packages/effects/common-ui/src/components/api-component/api-component.vue index 19f51f526..682cd16b8 100644 --- a/packages/effects/common-ui/src/components/api-component/api-component.vue +++ b/packages/effects/common-ui/src/components/api-component/api-component.vue @@ -46,6 +46,8 @@ interface Props { alwaysLoad?: boolean; /** 在api请求之前的回调函数 */ beforeFetch?: AnyPromiseFunction; + /** 在api请求之前的判断是否允许请求的回调函数 */ + shouldFetch?: AnyPromiseFunction; /** 在api请求之后的回调函数 */ afterFetch?: AnyPromiseFunction; /** 直接传入选项数据,也作为api返回空数据时的后备数据 */ @@ -88,6 +90,7 @@ const props = withDefaults(defineProps(), { alwaysLoad: false, loadingSlot: '', beforeFetch: undefined, + shouldFetch: undefined, afterFetch: undefined, modelPropName: 'modelValue', api: undefined, @@ -159,7 +162,7 @@ const bindProps = computed(() => { }); async function fetchApi() { - const { api, beforeFetch, afterFetch, resultField } = props; + const { api, beforeFetch, shouldFetch, afterFetch, resultField } = props; if (!api || !isFunction(api)) { return; @@ -178,6 +181,14 @@ async function fetchApi() { if (beforeFetch && isFunction(beforeFetch)) { finalParams = (await beforeFetch(cloneDeep(finalParams))) || finalParams; } + // 判断是否需要控制执行中断 + if ( + shouldFetch && + isFunction(shouldFetch) && + !(await shouldFetch(finalParams)) + ) { + return; + } let res = await api(finalParams); if (afterFetch && isFunction(afterFetch)) { res = (await afterFetch(res)) || res; diff --git a/packages/effects/common-ui/src/components/json-viewer/index.vue b/packages/effects/common-ui/src/components/json-viewer/index.vue index 415e0c798..97a69ad89 100644 --- a/packages/effects/common-ui/src/components/json-viewer/index.vue +++ b/packages/effects/common-ui/src/components/json-viewer/index.vue @@ -12,7 +12,7 @@ import type { import { computed, useAttrs } from 'vue'; // @ts-expect-error - vue-json-viewer does not expose compatible typings for this import path -import VueJsonViewer from 'vue-json-viewer'; +import VueJsonViewerImport from 'vue-json-viewer'; import { $t } from '@vben/locales'; @@ -42,6 +42,11 @@ const emit = defineEmits<{ valueClick: [value: JsonViewerValue]; }>(); +/** CJS/UMD 在 Vite 下解析为 { default: Component },需解包否则会出现 missing template or render */ +const VueJsonViewer = + (VueJsonViewerImport as { default?: typeof VueJsonViewerImport }).default ?? + VueJsonViewerImport; + const attrs: SetupContext['attrs'] = useAttrs(); function handleClick(event: MouseEvent) { diff --git a/packages/effects/layouts/src/widgets/global-search/search-panel.vue b/packages/effects/layouts/src/widgets/global-search/search-panel.vue index 57d9c1482..fdd359230 100644 --- a/packages/effects/layouts/src/widgets/global-search/search-panel.vue +++ b/packages/effects/layouts/src/widgets/global-search/search-panel.vue @@ -196,7 +196,7 @@ watch( if (val) { handleSearch(val); } else { - searchResults.value = [...searchHistory.value]; + searchResults.value = searchHistory.value; } }, ); diff --git a/packages/effects/plugins/package.json b/packages/effects/plugins/package.json index 7f61579c9..853592251 100644 --- a/packages/effects/plugins/package.json +++ b/packages/effects/plugins/package.json @@ -14,6 +14,10 @@ "**/*.css" ], "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, "./echarts": { "types": "./src/echarts/index.ts", "default": "./src/echarts/index.ts" diff --git a/packages/effects/plugins/src/echarts/README.md b/packages/effects/plugins/src/echarts/README.md new file mode 100644 index 000000000..2549b68bf --- /dev/null +++ b/packages/effects/plugins/src/echarts/README.md @@ -0,0 +1,41 @@ +# ECharts Plugin + +ECharts 图表插件,预置常用组件和图表类型。 + +## 导出 + +| 导出 | 类型 | 说明 | +| ------------ | ---- | ------------ | +| `default` | 对象 | echarts 实例 | +| `EchartsUI` | 组件 | 图表容器组件 | +| `ECOption` | 类型 | 图表配置类型 | +| `useEcharts` | 函数 | 组合式函数 | + +## 使用 + +```ts +import { EchartsUI, useEcharts, ECOption } from '@vben/plugins/echarts'; +``` + +## 类型 + +```ts +import type { ECOption } from '@vben/plugins/echarts'; +``` + +## 预置组件 + +- TitleComponent +- TooltipComponent +- GridComponent +- LegendComponent +- ToolboxComponent +- DatasetComponent +- TransformComponent + +## 预置图表 + +- BarChart +- LineChart +- PieChart +- RadarChart diff --git a/packages/effects/plugins/src/echarts/echarts.ts b/packages/effects/plugins/src/echarts/echarts.ts index 3d73d3c7b..e5b879f72 100644 --- a/packages/effects/plugins/src/echarts/echarts.ts +++ b/packages/effects/plugins/src/echarts/echarts.ts @@ -1,17 +1,3 @@ -import type { - // 系列类型的定义后缀都为 SeriesOption - BarSeriesOption, - LineSeriesOption, -} from 'echarts/charts'; -import type { - DatasetComponentOption, - GridComponentOption, - // 组件类型的定义后缀都为 ComponentOption - TitleComponentOption, - TooltipComponentOption, -} from 'echarts/components'; -import type { ComposeOption } from 'echarts/core'; - import { BarChart, GaugeChart, @@ -21,14 +7,12 @@ import { RadarChart, } from 'echarts/charts'; import { - // 数据集组件 DatasetComponent, GridComponent, LegendComponent, TitleComponent, ToolboxComponent, TooltipComponent, - // 内置数据转换器组件 (filter, sort) TransformComponent, VisualMapComponent, } from 'echarts/components'; @@ -40,17 +24,6 @@ import { } from 'echarts/features'; import { CanvasRenderer } from 'echarts/renderers'; -// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型 -export type ECOption = ComposeOption< - | BarSeriesOption - | DatasetComponentOption - | GridComponentOption - | LineSeriesOption - | TitleComponentOption - | TooltipComponentOption ->; - -// 注册必须的组件 echarts.use([ TitleComponent, PieChart, @@ -71,5 +44,6 @@ echarts.use([ VisualMapComponent, MapChart, ]); +export type { ECOption } from './types'; export default echarts; diff --git a/packages/effects/plugins/src/echarts/index.ts b/packages/effects/plugins/src/echarts/index.ts index 80f36a13a..acb0f1e25 100644 --- a/packages/effects/plugins/src/echarts/index.ts +++ b/packages/effects/plugins/src/echarts/index.ts @@ -1,3 +1,4 @@ export * from './echarts'; export { default as EchartsUI } from './echarts-ui.vue'; +export * from './types'; export * from './use-echarts'; diff --git a/packages/effects/plugins/src/echarts/types.ts b/packages/effects/plugins/src/echarts/types.ts new file mode 100644 index 000000000..bebafb871 --- /dev/null +++ b/packages/effects/plugins/src/echarts/types.ts @@ -0,0 +1,28 @@ +import type { + BarSeriesOption, + LineSeriesOption, + PieSeriesOption, + RadarSeriesOption, +} from 'echarts/charts'; +import type { + DatasetComponentOption, + GridComponentOption, + LegendComponentOption, + TitleComponentOption, + ToolboxComponentOption, + TooltipComponentOption, +} from 'echarts/components'; +import type { ComposeOption } from 'echarts/core'; + +export type ECOption = ComposeOption< + | BarSeriesOption + | DatasetComponentOption + | GridComponentOption + | LegendComponentOption + | LineSeriesOption + | PieSeriesOption + | RadarSeriesOption + | TitleComponentOption + | ToolboxComponentOption + | TooltipComponentOption +>; diff --git a/packages/effects/plugins/src/index.ts b/packages/effects/plugins/src/index.ts new file mode 100644 index 000000000..744be92c8 --- /dev/null +++ b/packages/effects/plugins/src/index.ts @@ -0,0 +1,2 @@ +export * from './plugins-context'; +export * from './types'; diff --git a/packages/effects/plugins/src/motion/README.md b/packages/effects/plugins/src/motion/README.md new file mode 100644 index 000000000..03c2ca1e5 --- /dev/null +++ b/packages/effects/plugins/src/motion/README.md @@ -0,0 +1,26 @@ +# Motion Plugin + +基于 @vueuse/motion 的动画插件。 + +## 导出 + +| 导出 | 类型 | 说明 | +| ----------------- | ---- | ---------- | +| `Motion` | 组件 | 动画组件 | +| `MotionGroup` | 组件 | 动画组组件 | +| `MotionDirective` | 指令 | 动画指令 | +| `MotionPlugin` | 插件 | Vue 插件 | + +## 使用 + +```ts +import { MotionPlugin, Motion, MotionDirective } from '@vben/plugins/motion'; + +app.use(MotionPlugin); +``` + +## 类型 + +```ts +import type { MotionOptions, MotionVariants } from '@vben/plugins/motion'; +``` diff --git a/packages/effects/plugins/src/plugins-context.ts b/packages/effects/plugins/src/plugins-context.ts new file mode 100644 index 000000000..459c21343 --- /dev/null +++ b/packages/effects/plugins/src/plugins-context.ts @@ -0,0 +1,39 @@ +import type { VbenPluginsOptions } from './types'; + +let globalPluginsOptions: null | VbenPluginsOptions = null; + +export function providePluginsOptions(options: VbenPluginsOptions) { + if (!globalPluginsOptions) { + globalPluginsOptions = options; + return; + } + + globalPluginsOptions = { + ...globalPluginsOptions, + ...options, + form: + globalPluginsOptions.form && options.form + ? { ...globalPluginsOptions.form, ...options.form } + : globalPluginsOptions.form || options.form, + modal: + globalPluginsOptions.modal && options.modal + ? { ...globalPluginsOptions.modal, ...options.modal } + : globalPluginsOptions.modal || options.modal, + message: + globalPluginsOptions.message && options.message + ? { ...globalPluginsOptions.message, ...options.message } + : globalPluginsOptions.message || options.message, + components: { + ...globalPluginsOptions.components, + ...options.components, + }, + }; +} + +export function injectPluginsOptions() { + return globalPluginsOptions; +} + +export function resetPluginsOptions() { + globalPluginsOptions = null; +} diff --git a/packages/effects/plugins/src/types.ts b/packages/effects/plugins/src/types.ts new file mode 100644 index 000000000..9a989784f --- /dev/null +++ b/packages/effects/plugins/src/types.ts @@ -0,0 +1,24 @@ +import type { Component } from 'vue'; + +export interface VbenPluginsFormOptions { + useVbenForm: (...args: any[]) => any; +} + +export interface VbenPluginsModalOptions { + useVbenModal?: () => any; +} + +export interface VbenPluginsMessageOptions { + useMessage?: () => any; +} + +export interface VbenPluginsComponentsOptions { + [key: string]: Component; +} + +export interface VbenPluginsOptions { + form?: VbenPluginsFormOptions; + modal?: VbenPluginsModalOptions; + message?: VbenPluginsMessageOptions; + components?: VbenPluginsComponentsOptions; +} diff --git a/packages/effects/plugins/src/vxe-table/README.md b/packages/effects/plugins/src/vxe-table/README.md new file mode 100644 index 000000000..2dfd2b29a --- /dev/null +++ b/packages/effects/plugins/src/vxe-table/README.md @@ -0,0 +1,50 @@ +# VXE Table Plugin + +基于 vxe-table 和 vxe-pc-ui 的表格组件插件。 + +## 导出 + +| 导出 | 类型 | 说明 | +| --------------------- | ---- | -------------- | +| `setupVbenVxeTable` | 函数 | 初始化配置函数 | +| `useVbenVxeGrid` | 函数 | 表格组合式函数 | +| `VbenVxeGrid` | 组件 | 表格组件 | +| `VxeTableGridColumns` | 类型 | 表格列类型 | +| `VxeTableGridOptions` | 类型 | 表格配置类型 | +| `VxeGridProps` | 类型 | 表格 Props | +| `VxeGridListeners` | 类型 | 表格事件类型 | + +## 使用 + +```ts +import { + setupVbenVxeTable, + useVbenVxeGrid, + VbenVxeGrid, +} from '@vben/plugins/vxe-table'; +``` + +## 初始化 + +在应用入口处调用: + +```ts +import { setupVbenVxeTable } from '@vben/plugins/vxe-table'; +import { useVbenForm } from '@vben-core/form-ui'; + +setupVbenVxeTable({ + configVxeTable: (vxeUI) => { + // 配置 VXE Table + }, + useVbenForm, +}); +``` + +## 类型 + +```ts +import type { + VxeTableGridOptions, + VxeGridProps, +} from '@vben/plugins/vxe-table'; +``` diff --git a/packages/effects/plugins/src/vxe-table/index.ts b/packages/effects/plugins/src/vxe-table/index.ts index 6801b8b0e..36091179a 100644 --- a/packages/effects/plugins/src/vxe-table/index.ts +++ b/packages/effects/plugins/src/vxe-table/index.ts @@ -1,5 +1,5 @@ export { setupVbenVxeTable } from './init'; -export type { VxeTableGridOptions } from './types'; +export type { VxeTableGridColumns, VxeTableGridOptions } from './types'; export * from './use-vxe-grid'; export { default as VbenVxeGrid } from './use-vxe-grid.vue'; export type { VxeGridDefines } from 'vxe-table'; diff --git a/packages/effects/plugins/src/vxe-table/init.ts b/packages/effects/plugins/src/vxe-table/init.ts index fd95078bf..853ca0ef0 100644 --- a/packages/effects/plugins/src/vxe-table/init.ts +++ b/packages/effects/plugins/src/vxe-table/init.ts @@ -4,8 +4,6 @@ import { defineComponent, watch } from 'vue'; import { usePreferences } from '@vben/preferences'; -import { useVbenForm } from '@vben-core/form-ui'; - /** * 该插件提供了在表格中渲染第三方组件,用于兼容 antdv-next 组件库 * @@ -18,33 +16,19 @@ import VxeUIPluginRenderAntd from '@vxe-ui/plugin-render-antd'; import { VxeButton, VxeCheckbox, - - // VxeFormGather, - // VxeForm, - // VxeFormItem, VxeIcon, VxeInput, VxeLoading, VxeModal, VxeNumberInput, VxePager, - // VxeList, - // VxeModal, - // VxeOptgroup, - // VxeOption, - // VxePulldown, - // VxeRadio, - // VxeRadioButton, VxeRadioGroup, VxeSelect, VxeTooltip, VxeUI, VxeUpload, - // VxeSwitch, - // VxeTextarea, } from 'vxe-pc-ui'; -import enUS from 'vxe-pc-ui/lib/language/en-US'; -// 导入默认的语言 +import enUS from 'vxe-pc-ui/lib/language/en-US'; // 导入默认的语言 import zhCN from 'vxe-pc-ui/lib/language/zh-CN'; import { VxeColgroup, @@ -54,14 +38,15 @@ import { VxeToolbar, } from 'vxe-table'; -import { extendsDefaultFormatter } from './extends'; +import { injectPluginsOptions } from '../plugins-context'; +import { extendsDefaultFormatter } from './extends'; // 是否加载过 import '@vxe-ui/plugin-render-antd/dist/style.css'; // 是否加载过 let isInit = false; -let tableFormFactory: typeof useVbenForm | undefined; +let tableFormFactory: ((...args: any[]) => any) | undefined; function normalizeVxeLocale>(localeModule: T) { return ( @@ -73,13 +58,19 @@ function normalizeVxeLocale>(localeModule: T) { ) as T; } -export const useTableForm: typeof useVbenForm = ((...args) => { - if (!tableFormFactory) { - throw new Error('useTableForm is not initialized'); +export function useTableForm(...args: any[]) { + const pluginsOptions = injectPluginsOptions(); + const contextFormFactory = pluginsOptions?.form?.useVbenForm; + + const factory = tableFormFactory || contextFormFactory; + if (!factory) { + throw new Error( + 'useTableForm is not initialized. Please provide useVbenForm via setupVbenVxeTable() or providePluginsOptions()', + ); } - return tableFormFactory(...args); -}) as typeof useVbenForm; + return factory(...args); +} // 部分组件,如果没注册,vxe-table 会报错,这里实际没用组件,只是为了不报错,同时可以减少打包体积 const createVirtualComponent = (name = '') => { @@ -130,11 +121,14 @@ export function initVxeTable() { } export function setupVbenVxeTable(setupOptions: SetupVxeTable) { - const { configVxeTable, useVbenForm } = setupOptions; + const { configVxeTable, useVbenForm: useVbenFormFromParam } = setupOptions; initVxeTable(); - tableFormFactory = useVbenForm; + // 优先使用参数传入的 useVbenForm,否则清空让 context 注入生效 + if (useVbenFormFromParam) { + tableFormFactory = useVbenFormFromParam; + } const { isDark, locale } = usePreferences(); const localMap = { diff --git a/packages/effects/plugins/src/vxe-table/types.ts b/packages/effects/plugins/src/vxe-table/types.ts index fbb58de7d..7ed82932d 100644 --- a/packages/effects/plugins/src/vxe-table/types.ts +++ b/packages/effects/plugins/src/vxe-table/types.ts @@ -26,6 +26,8 @@ interface ToolbarConfigOptions extends VxeGridPropTypes.ToolbarConfig { search?: boolean; } +export type VxeTableGridColumns = VxeTableGridOptions['columns']; + export interface VxeTableGridOptions extends VxeTableGridProps { /** 工具栏配置 */ toolbarConfig?: ToolbarConfigOptions; @@ -40,6 +42,10 @@ export interface VxeGridProps< T extends Record = any, D extends BaseFormComponentType = BaseFormComponentType, > { + /** + * 数据 + */ + tableData?: any[]; /** * 标题 */ @@ -89,5 +95,5 @@ export type ExtendedVxeGridApi< export interface SetupVxeTable { configVxeTable: (ui: VxeUIExport) => void; - useVbenForm: typeof useVbenForm; + useVbenForm?: typeof useVbenForm; } diff --git a/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue b/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue index 6f1daf44f..66d2a0f7d 100644 --- a/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue +++ b/packages/effects/plugins/src/vxe-table/use-vxe-grid.vue @@ -72,6 +72,7 @@ const { gridEvents, formOptions, tableTitle, + tableData, tableTitleHelp, showSearchForm, separator, @@ -231,6 +232,9 @@ const options = computed(() => { } if (mergedOptions.formConfig) { mergedOptions.formConfig.enabled = false; + if (tableData.value && tableData.value.length > 0) { + mergedOptions.data = tableData.value; + } } return mergedOptions; }); @@ -332,7 +336,7 @@ async function init() { watch( formOptions, () => { - formApi.setState((prev) => { + formApi.setState((prev: Record) => { const finalFormOptions: VbenFormProps = mergeWithArrayOverride( {}, formOptions.value, diff --git a/packages/locales/src/langs/zh-CN/authentication.json b/packages/locales/src/langs/zh-CN/authentication.json index ade52ac22..27b4ce364 100644 --- a/packages/locales/src/langs/zh-CN/authentication.json +++ b/packages/locales/src/langs/zh-CN/authentication.json @@ -4,7 +4,7 @@ "pageDesc": "工程化、高性能、跨组件库的前端模版", "loginSuccess": "登录成功", "loginSuccessDesc": "欢迎回来", - "loginSubtitle": "请输入您的帐户信息以开始管理您的项目", + "loginSubtitle": "请输入您的账户信息以开始管理您的项目", "selectAccount": "快速选择账号", "username": "账号", "password": "密码", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dc77d87bd..c1b4ab2d4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -40,7 +40,7 @@ catalog: '@ctrl/tinycolor': ^4.2.0 '@eslint-community/eslint-plugin-eslint-comments': ^4.7.1 '@eslint/js': ^10.0.1 - '@iconify/json': ^2.2.451 + '@iconify/json': ^2.2.454 '@iconify/tailwind4': ^1.2.3 '@iconify/vue': ^5.0.0 '@intlify/core-base': ^11.3.0 @@ -76,7 +76,7 @@ catalog: '@vueuse/integrations': ^14.2.1 '@vueuse/motion': ^3.0.3 alova: ^3.4.1 - antdv-next: ^1.1.5 + antdv-next: ^1.1.7 archiver: ^7.0.1 axios: ^1.13.6 axios-mock-adapter: ^2.1.0 @@ -100,7 +100,7 @@ catalog: dotenv: ^17.3.1 echarts: ^6.0.0 es-toolkit: ^1.45.1 - eslint: ^10.0.3 + eslint: ^10.1.0 eslint-plugin-better-tailwindcss: ^4.3.2 eslint-plugin-command: ^3.5.2 eslint-plugin-jsonc: ^3.1.2 @@ -113,7 +113,7 @@ catalog: eslint-plugin-yml: ^3.3.1 execa: ^9.6.1 find-up: ^8.0.0 - get-port: ^7.1.0 + get-port: ^7.2.0 globals: ^17.4.0 happy-dom: ^20.8.4 html-minifier-terser: ^7.2.0 @@ -143,12 +143,13 @@ catalog: reka-ui: ^2.9.2 resolve.exports: ^2.0.3 rimraf: ^6.1.3 + rolldown: ^1.0.0-rc.10 rollup-plugin-visualizer: ^7.0.1 sass: ^1.98.0 sass-embedded: ^1.98.0 secure-ls: ^2.0.0 sortablejs: ^1.15.7 - stylelint: ^17.4.0 + stylelint: ^17.5.0 stylelint-config-recess-order: ^7.7.0 stylelint-config-recommended: ^18.0.0 stylelint-config-recommended-scss: ^17.0.0 @@ -184,15 +185,12 @@ catalog: vue-i18n: ^11.3.0 vue-json-pretty: ^2.4.0 vue-json-viewer: ^3.0.4 - vue-router: ^5.0.3 + vue-router: ^5.0.4 vue-tippy: ^6.7.1 vue-tsc: ^3.2.6 - vxe-pc-ui: ^4.13.10 - vxe-table: ^4.18.5 + vxe-pc-ui: ^4.13.13 + vxe-table: ^4.18.8 watermark-js-plus: ^1.6.3 yaml-eslint-parser: ^2.0.0 zod: ^3.25.76 zod-defaults: 0.1.3 -catalogs: - conflicts_echarts_h5_5_1: - echarts: ^5.5.1 diff --git a/scripts/deploy/Dockerfile b/scripts/deploy/Dockerfile index 9bc547cfa..308b6b372 100644 --- a/scripts/deploy/Dockerfile +++ b/scripts/deploy/Dockerfile @@ -8,6 +8,7 @@ ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" # 增加内存限制以防止构建大型项目时 OOM ENV NODE_OPTIONS=--max-old-space-size=8192 +ENV TZ=Asia/Shanghai # 启用 corepack 以使用 pnpm RUN npm i -g corepack