From b191d1aaedc6bef7ec1fe9035fc45e3d446f2e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=AD=90=E9=BB=98?= <925456043@qq.com> Date: Fri, 6 Mar 2026 19:58:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E5=BC=B9=E7=AA=97=E4=B8=8E=E5=86=85=E5=AE=B9=E5=8C=BA?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 收敛管理端公共 Modal 链路,新增表单弹窗与普通内容弹窗包装\n- 迁移 Bot、知识库、插件、工作流、资源、MCP、数据中枢与系统管理页面级弹窗\n- 统一内容区工具栏、列表容器、导航与顶部按钮的视觉密度和交互节奏 --- easyflow-ui-admin/app/src/bootstrap.ts | 15 +- .../components/headerSearch/HeaderSearch.vue | 217 ++++++---- .../app/src/components/page/ListPageShell.vue | 227 +++++++++++ .../app/src/components/page/PageData.vue | 49 ++- .../src/components/upload/UploadAvatar.vue | 68 +++- .../app/src/locales/langs/en-US/bot.json | 19 + .../app/src/locales/langs/zh-CN/bot.json | 19 + .../app/src/views/ai/bots/index.vue | 27 +- .../app/src/views/ai/bots/modal.vue | 384 ++++++++++++++---- .../pages/setting/PromptChoreChatModal.vue | 22 +- .../documentCollection/ChunkDocumentTable.vue | 31 +- .../documentCollection/DocumentCollection.vue | 53 ++- .../DocumentCollectionModal.vue | 51 +-- .../documentCollection/FaqCategoryDialog.vue | 37 +- .../ai/documentCollection/FaqEditDialog.vue | 30 +- .../ai/documentCollection/FaqImportDialog.vue | 47 ++- .../app/src/views/ai/mcp/Mcp.vue | 17 +- .../app/src/views/ai/mcp/McpModal.vue | 36 +- .../app/src/views/ai/model/AddModelModal.vue | 43 +- .../views/ai/model/AddModelProviderModal.vue | 40 +- .../src/views/ai/model/ManageModelModal.vue | 14 +- .../src/views/ai/model/ModelVerifyConfig.vue | 44 +- .../src/views/ai/plugin/AddPluginModal.vue | 33 +- .../src/views/ai/plugin/AiPluginToolModal.vue | 42 +- .../views/ai/plugin/CategoryPluginModal.vue | 40 +- .../app/src/views/ai/plugin/Plugin.vue | 28 +- .../views/ai/plugin/PluginRunTestModal.vue | 12 +- .../src/views/ai/resource/ChooseResource.vue | 13 +- .../src/views/ai/resource/PreviewModal.vue | 15 +- .../src/views/ai/resource/ResourceList.vue | 30 +- .../src/views/ai/resource/ResourceModal.vue | 39 +- .../src/views/ai/workflow/WorkflowList.vue | 28 +- .../src/views/ai/workflow/WorkflowModal.vue | 41 +- .../app/src/views/config/apikey/SysApiKey.vue | 14 +- .../src/views/config/apikey/SysApiKeyList.vue | 32 +- .../views/config/apikey/SysApiKeyModal.vue | 34 +- .../SysApiKeyResourcePermissionList.vue | 149 +++---- .../SysApiKeyResourcePermissionModal.vue | 40 +- ...SysApiKeyResourcePermissionSelectModal.vue | 57 +-- .../src/views/datacenter/BatchImportModal.vue | 20 +- .../views/datacenter/DatacenterTableList.vue | 18 +- .../views/datacenter/DatacenterTableModal.vue | 34 +- .../app/src/views/datacenter/RecordModal.vue | 33 +- .../system/sysAccount/SysAccountList.vue | 18 +- .../system/sysAccount/SysAccountModal.vue | 46 +-- .../src/views/system/sysDept/SysDeptModal.vue | 40 +- .../system/sysFeedback/sysFeedbackList.vue | 74 ++-- .../src/views/system/sysJob/SysJobList.vue | 18 +- .../src/views/system/sysJob/SysJobModal.vue | 41 +- .../src/views/system/sysLog/SysLogList.vue | 10 +- .../src/views/system/sysLog/SysLogModal.vue | 40 +- .../src/views/system/sysMenu/SysMenuModal.vue | 33 +- .../system/sysPosition/SysPositionList.vue | 18 +- .../system/sysPosition/SysPositionModal.vue | 33 +- .../src/views/system/sysRole/SysRoleList.vue | 18 +- .../src/views/system/sysRole/SysRoleModal.vue | 41 +- .../@core/base/design/src/css/global.css | 103 +++++ .../base/design/src/design-tokens/dark.css | 81 +++- .../base/design/src/design-tokens/default.css | 81 +++- .../packages/@core/preferences/src/config.ts | 8 +- .../src/components/layout-content.vue | 6 +- .../src/components/layout-header.vue | 23 +- .../src/components/layout-sidebar.vue | 105 +++-- .../src/components/layout-tabbar.vue | 16 +- .../widgets/sidebar-collapse-button.vue | 17 +- .../widgets/sidebar-fixed-button.vue | 17 +- .../ui-kit/layout-ui/src/easyflow-layout.vue | 29 +- .../menu-ui/src/components/menu-item.vue | 11 + .../ui-kit/menu-ui/src/components/menu.vue | 234 ++++++++--- .../menu-ui/src/components/sub-menu.vue | 11 + .../ui-kit/popup-ui/src/drawer/drawer.vue | 10 +- .../ui-kit/popup-ui/src/modal/modal-api.ts | 2 +- .../@core/ui-kit/popup-ui/src/modal/modal.ts | 2 +- .../@core/ui-kit/popup-ui/src/modal/modal.vue | 38 +- .../src/components/breadcrumb/breadcrumb.vue | 82 +++- .../ui/alert-dialog/AlertDialogContent.vue | 8 +- .../shadcn-ui/src/ui/dialog/DialogContent.vue | 24 +- .../shadcn-ui/src/ui/dialog/DialogOverlay.vue | 22 +- .../shadcn-ui/src/ui/sheet/SheetContent.vue | 1 + .../ui-kit/shadcn-ui/src/ui/sheet/sheet.ts | 10 +- .../src/components/tabs-chrome/tabs.vue | 46 +-- .../tabs-ui/src/components/tabs/tabs.vue | 18 +- .../src/components/widgets/tool-more.vue | 2 +- .../src/components/widgets/tool-screen.vue | 2 +- .../@core/ui-kit/tabs-ui/src/tabs-view.vue | 10 +- .../tabs-ui/src/use-tabs-view-scroll.ts | 5 +- .../form-modal/__tests__/form-modal.test.ts | 72 ++++ .../src/ui/form-modal/form-modal.vue | 177 ++++++++ .../common-ui/src/ui/form-modal/index.ts | 1 + .../effects/common-ui/src/ui/index.ts | 2 + .../panel-modal/__tests__/panel-modal.test.ts | 75 ++++ .../common-ui/src/ui/panel-modal/index.ts | 1 + .../src/ui/panel-modal/panel-modal.vue | 172 ++++++++ .../layouts/src/basic/header/header.vue | 64 ++- .../effects/layouts/src/basic/layout.vue | 2 +- .../layouts/src/basic/tabbar/tabbar.vue | 2 +- .../layouts/src/widgets/breadcrumb.vue | 4 +- .../widgets/global-search/global-search.vue | 268 ++++++++---- .../widgets/global-search/search-panel.vue | 235 +++++------ 99 files changed, 3148 insertions(+), 1623 deletions(-) create mode 100644 easyflow-ui-admin/app/src/components/page/ListPageShell.vue create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/form-modal/__tests__/form-modal.test.ts create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/form-modal/form-modal.vue create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/form-modal/index.ts create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/panel-modal/__tests__/panel-modal.test.ts create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/panel-modal/index.ts create mode 100644 easyflow-ui-admin/packages/effects/common-ui/src/ui/panel-modal/panel-modal.vue diff --git a/easyflow-ui-admin/app/src/bootstrap.ts b/easyflow-ui-admin/app/src/bootstrap.ts index 5381a14..f3cfe54 100644 --- a/easyflow-ui-admin/app/src/bootstrap.ts +++ b/easyflow-ui-admin/app/src/bootstrap.ts @@ -8,7 +8,10 @@ import { } from 'vue-element-plus-x'; import { registerAccessDirective } from '@easyflow/access'; -import { registerLoadingDirective } from '@easyflow/common-ui'; +import { + registerLoadingDirective, + setDefaultModalProps, +} from '@easyflow/common-ui'; import { preferences } from '@easyflow/preferences'; import { initStores } from '@easyflow/stores'; import '@easyflow/styles'; @@ -31,10 +34,12 @@ async function bootstrap(namespace: string) { // 初始化表单组件 await initSetupEasyFlowForm(); - // // 设置弹窗的默认配置 - // setDefaultModalProps({ - // fullscreenButton: false, - // }); + // 设置弹窗的默认配置 + setDefaultModalProps({ + bordered: true, + fullscreenButton: false, + overlayBlur: 0, + }); // // 设置抽屉的默认配置 // setDefaultDrawerProps({ // zIndex: 2000, diff --git a/easyflow-ui-admin/app/src/components/headerSearch/HeaderSearch.vue b/easyflow-ui-admin/app/src/components/headerSearch/HeaderSearch.vue index c4e5e56..33df232 100644 --- a/easyflow-ui-admin/app/src/components/headerSearch/HeaderSearch.vue +++ b/easyflow-ui-admin/app/src/components/headerSearch/HeaderSearch.vue @@ -1,7 +1,7 @@ + + + + diff --git a/easyflow-ui-admin/app/src/components/page/PageData.vue b/easyflow-ui-admin/app/src/components/page/PageData.vue index 1f07bcc..24562b3 100644 --- a/easyflow-ui-admin/app/src/components/page/PageData.vue +++ b/easyflow-ui-admin/app/src/components/page/PageData.vue @@ -23,7 +23,7 @@ const props = withDefaults(defineProps(), { // 响应式数据 const pageList = ref([]); const loading = ref(false); -const queryParams = ref({}); +const queryParams = ref>({}); const pageInfo = reactive({ pageNumber: 1, @@ -32,7 +32,7 @@ const pageInfo = reactive({ }); // 模拟 API 调用 - 这里需要根据你的实际 API 调用方式调整 -const doGet = async (params: any) => { +const doGet = async (params: Record) => { loading.value = true; try { // 这里替换为你的实际 API 调用 @@ -76,7 +76,7 @@ const handleCurrentChange = (newPage: number) => { }; // 暴露给父组件的方法 (替代 useImperativeHandle) -const setQuery = (newQueryParams: string) => { +const setQuery = (newQueryParams: Record) => { pageInfo.pageNumber = 1; pageInfo.pageSize = props.pageSize; queryParams.value = newQueryParams; @@ -85,6 +85,7 @@ const setQuery = (newQueryParams: string) => { // 暴露方法给父组件 defineExpose({ + reload: getPageList, setQuery, }); @@ -106,10 +107,13 @@ onMounted(() => { + + diff --git a/easyflow-ui-admin/app/src/components/upload/UploadAvatar.vue b/easyflow-ui-admin/app/src/components/upload/UploadAvatar.vue index fec20ad..710f96a 100644 --- a/easyflow-ui-admin/app/src/components/upload/UploadAvatar.vue +++ b/easyflow-ui-admin/app/src/components/upload/UploadAvatar.vue @@ -25,6 +25,18 @@ const props = defineProps({ default: () => ['image/gif', 'image/jpeg', 'image/png', 'image/webp'], }, modelValue: { type: String, default: '' }, + shape: { + type: String, + default: 'circle', + }, + size: { + type: Number, + default: 100, + }, + theme: { + type: String, + default: 'default', + }, }); const emit = defineEmits(['success', 'update:modelValue']); @@ -77,6 +89,11 @@ const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => { diff --git a/easyflow-ui-admin/app/src/views/ai/bots/modal.vue b/easyflow-ui-admin/app/src/views/ai/bots/modal.vue index ed782d6..a152e05 100644 --- a/easyflow-ui-admin/app/src/views/ai/bots/modal.vue +++ b/easyflow-ui-admin/app/src/views/ai/bots/modal.vue @@ -3,18 +3,12 @@ import type { BotInfo } from '@easyflow/types'; import type { SaveBotParams, UpdateBotParams } from '#/api/ai/bot'; -import { ref } from 'vue'; +import { computed, nextTick, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; import { $t } from '@easyflow/locales'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { tryit } from 'radash'; import { saveBot, updateBotApi } from '#/api/ai/bot'; @@ -23,98 +17,334 @@ import UploadAvatar from '#/components/upload/UploadAvatar.vue'; const emit = defineEmits(['success']); -const initialFormData = { - icon: '', - title: '', +const createInitialFormData = (): SaveBotParams => ({ alias: '', - description: '', categoryId: '', + description: '', + icon: '', status: 1, -}; + title: '', +}); + const dialogVisible = ref(false); const dialogType = ref<'create' | 'edit'>('create'); const formRef = ref>(); -const formData = ref(initialFormData); -const rules = { - title: [{ required: true, message: $t('message.required'), trigger: 'blur' }], - alias: [{ required: true, message: $t('message.required'), trigger: 'blur' }], -}; +const formData = ref(createInitialFormData()); const loading = ref(false); -const handleSubmit = async () => { +const rules = { + alias: [{ required: true, message: $t('message.required'), trigger: 'blur' }], + title: [{ required: true, message: $t('message.required'), trigger: 'blur' }], +}; + +const dialogTitle = computed(() => { + return `${$t(`button.${dialogType.value}`)}${$t('bot.chatAssistant')}`; +}); + +const dialogDescription = computed(() => { + return dialogType.value === 'create' + ? $t('bot.modal.createDescription') + : $t('bot.modal.editDescription'); +}); + +async function handleSubmit() { + const valid = await formRef.value?.validate().catch(() => false); + if (!valid) { + return; + } + loading.value = true; const [err, res] = await tryit( dialogType.value === 'create' ? saveBot : updateBotApi, - )(formData.value as any); + )(formData.value as SaveBotParams & UpdateBotParams); if (!err && res.errorCode === 0) { emit('success'); - ElMessage.success($t('message.saveOkMessage')); + ElMessage.success(res.message || $t('message.saveOkMessage')); dialogVisible.value = false; + loading.value = false; + return; } + + ElMessage.error(res?.message || $t('message.saveFail')); loading.value = false; -}; +} + +async function open(type: 'create' | 'edit', bot?: BotInfo) { + formData.value = bot + ? { + ...createInitialFormData(), + alias: bot.alias, + categoryId: bot.categoryId, + description: bot.description, + icon: bot.icon, + id: bot.id, + status: bot.status, + title: bot.title, + } + : createInitialFormData(); + dialogType.value = type; + dialogVisible.value = true; + + await nextTick(); + formRef.value?.clearValidate(); +} defineExpose({ - open(type: typeof dialogType.value, bot?: BotInfo) { - formData.value = bot - ? { - id: bot.id, - icon: bot.icon, - title: bot.title, - alias: bot.alias, - description: bot.description, - categoryId: bot.categoryId, - status: bot.status, - } - : initialFormData; - dialogType.value = type; - dialogVisible.value = true; - }, + open, }); + + diff --git a/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue b/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue index 7f3a174..8944942 100644 --- a/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue +++ b/easyflow-ui-admin/app/src/views/ai/bots/pages/setting/PromptChoreChatModal.vue @@ -1,9 +1,10 @@ - + diff --git a/easyflow-ui-admin/app/src/views/ai/documentCollection/ChunkDocumentTable.vue b/easyflow-ui-admin/app/src/views/ai/documentCollection/ChunkDocumentTable.vue index fc3889b..ed9f25b 100644 --- a/easyflow-ui-admin/app/src/views/ai/documentCollection/ChunkDocumentTable.vue +++ b/easyflow-ui-admin/app/src/views/ai/documentCollection/ChunkDocumentTable.vue @@ -1,12 +1,12 @@ diff --git a/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqCategoryDialog.vue b/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqCategoryDialog.vue index a483b58..b507e72 100644 --- a/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqCategoryDialog.vue +++ b/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqCategoryDialog.vue @@ -1,16 +1,10 @@ diff --git a/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqEditDialog.vue b/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqEditDialog.vue index 711909c..ef531a6 100644 --- a/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqEditDialog.vue +++ b/easyflow-ui-admin/app/src/views/ai/documentCollection/FaqEditDialog.vue @@ -3,13 +3,12 @@ import type { IDomEditor } from '@wangeditor/editor'; import { nextTick, onBeforeUnmount, ref, shallowRef, watch } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; import { $t } from '@easyflow/locales'; import { Editor, Toolbar } from '@wangeditor/editor-for-vue'; import DOMPurify from 'dompurify'; import { - ElButton, - ElDialog, ElForm, ElFormItem, ElInput, @@ -189,15 +188,20 @@ onBeforeUnmount(() => { diff --git a/easyflow-ui-admin/app/src/views/ai/plugin/CategoryPluginModal.vue b/easyflow-ui-admin/app/src/views/ai/plugin/CategoryPluginModal.vue index 33f60e0..8bd32dc 100644 --- a/easyflow-ui-admin/app/src/views/ai/plugin/CategoryPluginModal.vue +++ b/easyflow-ui-admin/app/src/views/ai/plugin/CategoryPluginModal.vue @@ -3,9 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + import { - ElButton, - ElDialog, ElForm, ElFormItem, ElMessage, @@ -87,16 +87,25 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/ai/plugin/Plugin.vue b/easyflow-ui-admin/app/src/views/ai/plugin/Plugin.vue index ff73c25..499b588 100644 --- a/easyflow-ui-admin/app/src/views/ai/plugin/Plugin.vue +++ b/easyflow-ui-admin/app/src/views/ai/plugin/Plugin.vue @@ -4,12 +4,11 @@ import type { ActionButton } from '#/components/page/CardList.vue'; import { onMounted, ref } from 'vue'; import { useRouter } from 'vue-router'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; import { $t } from '@easyflow/locales'; import { Delete, Edit, Plus } from '@element-plus/icons-vue'; import { - ElButton, - ElDialog, ElForm, ElFormItem, ElInput, @@ -276,27 +275,24 @@ const handleClickCategory = (item: PluginCategory) => { - - + - - - + diff --git a/easyflow-ui-admin/app/src/views/ai/plugin/PluginRunTestModal.vue b/easyflow-ui-admin/app/src/views/ai/plugin/PluginRunTestModal.vue index ee7ecab..0b47117 100644 --- a/easyflow-ui-admin/app/src/views/ai/plugin/PluginRunTestModal.vue +++ b/easyflow-ui-admin/app/src/views/ai/plugin/PluginRunTestModal.vue @@ -1,11 +1,12 @@ - + diff --git a/easyflow-ui-admin/app/src/views/ai/resource/ResourceList.vue b/easyflow-ui-admin/app/src/views/ai/resource/ResourceList.vue index 311a79c..1d78696 100644 --- a/easyflow-ui-admin/app/src/views/ai/resource/ResourceList.vue +++ b/easyflow-ui-admin/app/src/views/ai/resource/ResourceList.vue @@ -3,6 +3,7 @@ import type { FormInstance } from 'element-plus'; import { computed, onMounted, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; import { formatBytes } from '@easyflow/utils'; import { @@ -15,7 +16,6 @@ import { import { ElAvatar, ElButton, - ElDialog, ElDropdown, ElDropdownItem, ElDropdownMenu, @@ -418,16 +418,21 @@ const getSideList = async () => { - { /> - - - + diff --git a/easyflow-ui-admin/app/src/views/ai/resource/ResourceModal.vue b/easyflow-ui-admin/app/src/views/ai/resource/ResourceModal.vue index 49b9eb1..eb2744c 100644 --- a/easyflow-ui-admin/app/src/views/ai/resource/ResourceModal.vue +++ b/easyflow-ui-admin/app/src/views/ai/resource/ResourceModal.vue @@ -3,16 +3,10 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; import { getResourceType } from '@easyflow/utils'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; @@ -116,19 +110,23 @@ function uploadSuccess(res: any) { diff --git a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowList.vue b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowList.vue index c4e1289..97012de 100644 --- a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowList.vue +++ b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowList.vue @@ -5,6 +5,8 @@ import type { ActionButton } from '#/components/page/CardList.vue'; import { computed, markRaw, onMounted, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + import { CopyDocument, Delete, @@ -16,8 +18,6 @@ import { VideoPlay, } from '@element-plus/icons-vue'; import { - ElButton, - ElDialog, ElForm, ElFormItem, ElInput, @@ -404,16 +404,21 @@ function handleHeaderButtonClick(data: any) { - - - - + diff --git a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowModal.vue b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowModal.vue index 815b582..3db1b3c 100644 --- a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowModal.vue +++ b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowModal.vue @@ -3,15 +3,9 @@ import type { FormInstance, UploadInstance, UploadProps } from 'element-plus'; import { computed, onMounted, ref } from 'vue'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, - ElUpload, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElForm, ElFormItem, ElInput, ElMessage, ElUpload } from 'element-plus'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; @@ -148,9 +142,8 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/config/apikey/SysApiKey.vue b/easyflow-ui-admin/app/src/views/config/apikey/SysApiKey.vue index a97256e..3efceba 100644 --- a/easyflow-ui-admin/app/src/views/config/apikey/SysApiKey.vue +++ b/easyflow-ui-admin/app/src/views/config/apikey/SysApiKey.vue @@ -1,7 +1,7 @@ diff --git a/easyflow-ui-admin/app/src/views/config/apikey/SysApiKeyResourcePermissionSelectModal.vue b/easyflow-ui-admin/app/src/views/config/apikey/SysApiKeyResourcePermissionSelectModal.vue index 350b479..aa3aebf 100644 --- a/easyflow-ui-admin/app/src/views/config/apikey/SysApiKeyResourcePermissionSelectModal.vue +++ b/easyflow-ui-admin/app/src/views/config/apikey/SysApiKeyResourcePermissionSelectModal.vue @@ -1,24 +1,17 @@ diff --git a/easyflow-ui-admin/app/src/views/datacenter/BatchImportModal.vue b/easyflow-ui-admin/app/src/views/datacenter/BatchImportModal.vue index 850dd0a..7877296 100644 --- a/easyflow-ui-admin/app/src/views/datacenter/BatchImportModal.vue +++ b/easyflow-ui-admin/app/src/views/datacenter/BatchImportModal.vue @@ -3,15 +3,10 @@ import type { UploadFile } from 'element-plus'; import { onMounted, ref } from 'vue'; +import { EasyFlowPanelModal } from '@easyflow/common-ui'; import { downloadFileFromBlob } from '@easyflow/utils'; -import { - ElButton, - ElDialog, - ElMessage, - ElMessageBox, - ElUpload, -} from 'element-plus'; +import { ElButton, ElMessage, ElMessageBox, ElUpload } from 'element-plus'; import { api } from '#/api/request'; import uploadIcon from '#/assets/datacenter/upload.png'; @@ -99,12 +94,13 @@ function handleUpload() { - + diff --git a/easyflow-ui-admin/app/src/views/datacenter/RecordModal.vue b/easyflow-ui-admin/app/src/views/datacenter/RecordModal.vue index 62e696f..e3630ad 100644 --- a/easyflow-ui-admin/app/src/views/datacenter/RecordModal.vue +++ b/easyflow-ui-admin/app/src/views/datacenter/RecordModal.vue @@ -3,10 +3,10 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + import { - ElButton, ElDatePicker, - ElDialog, ElForm, ElFormItem, ElInput, @@ -80,20 +80,24 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountList.vue b/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountList.vue index bfec70d..21db836 100644 --- a/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountList.vue @@ -19,6 +19,7 @@ import { import { api } from '#/api/request'; import defaultAvatar from '#/assets/defaultUserAvatar.png'; import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; import { useDictStore } from '#/store'; @@ -91,13 +92,14 @@ function isAdmin(data: any) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountModal.vue b/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountModal.vue index 52994b0..f969d11 100644 --- a/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysAccount/SysAccountModal.vue @@ -3,14 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; @@ -101,19 +96,23 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysDept/SysDeptModal.vue b/easyflow-ui-admin/app/src/views/system/sysDept/SysDeptModal.vue index bdd440e..ec40a2d 100644 --- a/easyflow-ui-admin/app/src/views/system/sysDept/SysDeptModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysDept/SysDeptModal.vue @@ -3,14 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; @@ -87,19 +82,23 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysFeedback/sysFeedbackList.vue b/easyflow-ui-admin/app/src/views/system/sysFeedback/sysFeedbackList.vue index 6a07f19..394961d 100644 --- a/easyflow-ui-admin/app/src/views/system/sysFeedback/sysFeedbackList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysFeedback/sysFeedbackList.vue @@ -24,6 +24,7 @@ import { tryit } from 'radash'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; import { router } from '#/router'; @@ -102,41 +103,42 @@ async function markStatus(row: any, status: number) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysJob/SysJobList.vue b/easyflow-ui-admin/app/src/views/system/sysJob/SysJobList.vue index 4e187c0..4cae9a2 100644 --- a/easyflow-ui-admin/app/src/views/system/sysJob/SysJobList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysJob/SysJobList.vue @@ -24,6 +24,7 @@ import { import { api } from '#/api/request'; import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; import { router } from '#/router'; @@ -149,13 +150,14 @@ function toLogPage(row: any) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysJob/SysJobModal.vue b/easyflow-ui-admin/app/src/views/system/sysJob/SysJobModal.vue index a21d611..56245b3 100644 --- a/easyflow-ui-admin/app/src/views/system/sysJob/SysJobModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysJob/SysJobModal.vue @@ -3,15 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { - ElAlert, - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElAlert, ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { api } from '#/api/request'; import CronPicker from '#/components/cron/CronPicker.vue'; @@ -139,20 +133,24 @@ const str = '"param"'; diff --git a/easyflow-ui-admin/app/src/views/system/sysLog/SysLogList.vue b/easyflow-ui-admin/app/src/views/system/sysLog/SysLogList.vue index e777506..04d26d4 100644 --- a/easyflow-ui-admin/app/src/views/system/sysLog/SysLogList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysLog/SysLogList.vue @@ -6,6 +6,7 @@ import { ref } from 'vue'; import { ElTable, ElTableColumn } from 'element-plus'; import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; @@ -25,9 +26,10 @@ function reset(formEl?: FormInstance) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysLog/SysLogModal.vue b/easyflow-ui-admin/app/src/views/system/sysLog/SysLogModal.vue index a216b32..dd0e913 100644 --- a/easyflow-ui-admin/app/src/views/system/sysLog/SysLogModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysLog/SysLogModal.vue @@ -3,14 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElForm, ElFormItem, ElInput, ElMessage } from 'element-plus'; import { api } from '#/api/request'; import { $t } from '#/locales'; @@ -79,19 +74,23 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysMenu/SysMenuModal.vue b/easyflow-ui-admin/app/src/views/system/sysMenu/SysMenuModal.vue index fd1004d..815a27b 100644 --- a/easyflow-ui-admin/app/src/views/system/sysMenu/SysMenuModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysMenu/SysMenuModal.vue @@ -3,11 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { IconPicker } from '@easyflow/common-ui'; +import { EasyFlowFormModal, IconPicker } from '@easyflow/common-ui'; import { - ElButton, - ElDialog, ElForm, ElFormItem, ElInput, @@ -103,20 +101,24 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionList.vue b/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionList.vue index c4fdcb3..9db1a9e 100644 --- a/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionList.vue @@ -17,6 +17,7 @@ import { import { api } from '#/api/request'; import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; import { useDictStore } from '#/store'; @@ -124,13 +125,14 @@ function remove(row: any) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionModal.vue b/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionModal.vue index 7a8acc6..43448e6 100644 --- a/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysPosition/SysPositionModal.vue @@ -3,9 +3,9 @@ import type { FormInstance } from 'element-plus'; import { ref } from 'vue'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + import { - ElButton, - ElDialog, ElForm, ElFormItem, ElInput, @@ -94,20 +94,24 @@ function closeDialog() { diff --git a/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleList.vue b/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleList.vue index f8f6337..2cff697 100644 --- a/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleList.vue +++ b/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleList.vue @@ -17,6 +17,7 @@ import { import { api } from '#/api/request'; import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue'; +import ListPageShell from '#/components/page/ListPageShell.vue'; import PageData from '#/components/page/PageData.vue'; import { $t } from '#/locales'; import { useDictStore } from '#/store'; @@ -89,13 +90,14 @@ function remove(row: any) { - + diff --git a/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleModal.vue b/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleModal.vue index b85e69d..f132adc 100644 --- a/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleModal.vue +++ b/easyflow-ui-admin/app/src/views/system/sysRole/SysRoleModal.vue @@ -3,15 +3,9 @@ import type { FormInstance } from 'element-plus'; import { onMounted, ref } from 'vue'; -import { - ElButton, - ElDialog, - ElForm, - ElFormItem, - ElInput, - ElMessage, - ElSwitch, -} from 'element-plus'; +import { EasyFlowFormModal } from '@easyflow/common-ui'; + +import { ElForm, ElFormItem, ElInput, ElMessage, ElSwitch } from 'element-plus'; import { api } from '#/api/request'; import DictSelect from '#/components/dict/DictSelect.vue'; @@ -95,19 +89,23 @@ function getDeptIds(roleId: any) { diff --git a/easyflow-ui-admin/packages/@core/base/design/src/css/global.css b/easyflow-ui-admin/packages/@core/base/design/src/css/global.css index fb32b21..2703dbc 100644 --- a/easyflow-ui-admin/packages/@core/base/design/src/css/global.css +++ b/easyflow-ui-admin/packages/@core/base/design/src/css/global.css @@ -149,6 +149,109 @@ .card-box { @apply bg-card text-card-foreground border-border rounded-xl border; } + + .easyflow-modal-form { + display: flex; + flex-direction: column; + gap: 12px; + } + + .easyflow-modal-form--compact { + gap: 10px; + } + + .easyflow-modal-section { + background: hsl(var(--modal-content-surface-strong)); + border: 1px solid hsl(var(--modal-divider)); + border-radius: 14px; + box-shadow: none; + padding: 14px; + } + + .easyflow-modal-grid { + display: grid; + gap: 14px 16px; + } + + .easyflow-modal-grid--2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .easyflow-modal-field-tip { + color: hsl(var(--text-muted)); + font-size: 11px; + line-height: 1.5; + margin-top: 4px; + } + + .easyflow-modal-form .el-form-item { + margin-bottom: 0; + } + + .easyflow-modal-form .el-form-item__label { + color: hsl(var(--text-strong)); + font-size: 12px; + font-weight: 600; + line-height: 1.4; + padding-bottom: 6px; + } + + .easyflow-modal-form .el-input__wrapper, + .easyflow-modal-form .el-select__wrapper, + .easyflow-modal-form .el-textarea__inner, + .easyflow-modal-form .el-date-editor.el-input__wrapper { + background: hsl(var(--input-background)); + border-radius: 12px; + box-shadow: inset 0 0 0 1px hsl(var(--input) / 0.92); + transition: + box-shadow 0.2s ease, + border-color 0.2s ease, + transform 0.2s ease; + } + + .easyflow-modal-form .el-input__wrapper, + .easyflow-modal-form .el-select__wrapper, + .easyflow-modal-form .el-date-editor.el-input__wrapper { + min-height: 42px; + } + + .easyflow-modal-form .el-textarea__inner { + min-height: 96px; + padding: 10px 12px; + } + + .easyflow-modal-form .el-input__wrapper:hover, + .easyflow-modal-form .el-select__wrapper:hover, + .easyflow-modal-form .el-textarea__inner:hover, + .easyflow-modal-form .el-date-editor.el-input__wrapper:hover { + box-shadow: inset 0 0 0 1px hsl(var(--primary) / 0.18); + } + + .easyflow-modal-form .el-input__wrapper.is-focus, + .easyflow-modal-form .el-select__wrapper.is-focused, + .easyflow-modal-form .el-textarea__inner:focus, + .easyflow-modal-form .el-date-editor.el-input__wrapper.is-focus { + box-shadow: + inset 0 0 0 1px hsl(var(--primary) / 0.72), + 0 0 0 4px hsl(var(--primary) / 0.12); + } + + .easyflow-modal-form .el-form-item.is-error .el-input__wrapper, + .easyflow-modal-form .el-form-item.is-error .el-select__wrapper, + .easyflow-modal-form .el-form-item.is-error .el-textarea__inner, + .easyflow-modal-form + .el-form-item.is-error + .el-date-editor.el-input__wrapper { + box-shadow: + inset 0 0 0 1px hsl(var(--destructive) / 0.8), + 0 0 0 4px hsl(var(--destructive) / 0.08); + } + + @media (max-width: 768px) { + .easyflow-modal-grid--2 { + grid-template-columns: 1fr; + } + } } html.invert-mode { diff --git a/easyflow-ui-admin/packages/@core/base/design/src/design-tokens/dark.css b/easyflow-ui-admin/packages/@core/base/design/src/design-tokens/dark.css index 792b2e1..95b804f 100644 --- a/easyflow-ui-admin/packages/@core/base/design/src/design-tokens/dark.css +++ b/easyflow-ui-admin/packages/@core/base/design/src/design-tokens/dark.css @@ -2,11 +2,11 @@ .dark[data-theme='custom'], .dark[data-theme='default'] { /* Default background color of ...etc */ - --background: 222.34deg 10.43% 12.27%; + --background: 222 16% 10.5%; /* 主体区域背景色 */ - --background-deep: 220deg 13.06% 9%; - --foreground: 0 0% 95%; + --background-deep: 220 18% 8.6%; + --foreground: 210 18% 95%; /* Background color for */ --card: 222.34deg 10.43% 12.27%; @@ -73,12 +73,12 @@ --heavy-foreground: var(--accent-foreground); /* Default border color */ - --border: 240 3.7% 22%; + --border: 220 10% 21%; /* Border color for inputs such as ,