diff --git a/.gitignore b/.gitignore index 0cbbe41..defc142 100644 --- a/.gitignore +++ b/.gitignore @@ -176,14 +176,18 @@ dmypy.json node_modules # ai-agent-admin: exclude legacy generated bundles and removed heavy modules +.ops-backups/ docker/web/ docker/uniapp/ +uniapp-zq/ web/apps/web-ele/src/components/screen-design/ web/apps/web-ele/src/components/form-design/ web/apps/web-ele/src/components/zq-editor/ web/apps/web-ele/src/components/whiteboard/ web/apps/web-ele/src/views/online-dev/ web/apps/web-ele/src/views/dashboard/ +web/apps/web-ele/src/views/demos/ +web/apps/web-ele/src/views/zq-smart-table/ web/apps/web-ele/src/api/online-dev/ web/apps/web-ele/src/components/dashboard-design/ web/apps/web-ele/src/components/document-designer/ @@ -194,28 +198,50 @@ web/packages/zq-univer/ web/apps/web-ele/src/locales/langs/*/dashboard-design.json* web/apps/web-ele/src/locales/langs/*/form-design.json web/apps/web-ele/src/locales/langs/*/screen-design.json -backend-fastapi/ai_platform/nodes/builtin/app_create_node.py -backend-fastapi/ai_platform/nodes/builtin/app_design_node.py -backend-fastapi/ai_platform/nodes/builtin/app_settings_node.py -backend-fastapi/ai_platform/nodes/builtin/app_update_node.py -backend-fastapi/ai_platform/nodes/builtin/dashboard_basic_info_node.py -backend-fastapi/ai_platform/nodes/builtin/dashboard_create_node.py -backend-fastapi/ai_platform/nodes/builtin/dashboard_design_node.py -backend-fastapi/ai_platform/nodes/builtin/dashboard_publish_node.py -backend-fastapi/ai_platform/nodes/builtin/form_basic_info_node.py -backend-fastapi/ai_platform/nodes/builtin/form_create_node.py -backend-fastapi/ai_platform/nodes/builtin/form_data_node.py -backend-fastapi/ai_platform/nodes/builtin/form_database_create_node.py -backend-fastapi/ai_platform/nodes/builtin/form_database_design_node.py -backend-fastapi/ai_platform/nodes/builtin/form_list_design_node.py -backend-fastapi/ai_platform/nodes/builtin/form_publish_node.py -backend-fastapi/ai_platform/nodes/builtin/form_ui_design_node.py +web/apps/web-ele/src/router/routes/modules/form-layout.ts +web/apps/web-ele/src/router/routes/modules/online-dev.ts +web/apps/web-ele/src/router/routes/modules/zq-smart-table.ts +web/apps/web-ele/src/components/report-design/ +backend-fastapi/online_dev/ +backend-fastapi/zq_demo/ +backend-fastapi/zq_smart_table/ +backend-fastapi/ai_platform/nodes/builtin/app_*_node.py +backend-fastapi/ai_platform/nodes/builtin/dashboard_*_node.py +backend-fastapi/ai_platform/nodes/builtin/form_*_node.py backend-fastapi/ai_platform/nodes/builtin/system_summary_node.py -web/apps/web-ele/src/components/form-editor/SystemSummaryConfirmPanel.vue +web/apps/web-ele/src/api/core/database-monitor.ts +web/apps/web-ele/src/api/core/demo.ts +web/apps/web-ele/src/api/core/dingtalk-sync.ts +web/apps/web-ele/src/api/core/feishu-sync.ts +web/apps/web-ele/src/api/core/link-preview.ts +web/apps/web-ele/src/api/core/redis-manager.ts +web/apps/web-ele/src/api/core/redis-monitor.ts +web/apps/web-ele/src/api/core/region.ts +web/apps/web-ele/src/api/core/scheduler.ts +web/apps/web-ele/src/api/core/server-monitor.ts +web/apps/web-ele/src/api/core/wecom-sync.ts +web/apps/web-ele/src/router/routes/modules/wiki.ts +web/apps/web-ele/src/views/_core/application/ +web/apps/web-ele/src/views/_core/approval-center/ +web/apps/web-ele/src/views/_core/data-source/ +web/apps/web-ele/src/views/_core/database-connection/ +web/apps/web-ele/src/views/_core/database-manager/ +web/apps/web-ele/src/views/_core/database-monitor/ +web/apps/web-ele/src/views/_core/demo/ +web/apps/web-ele/src/views/_core/mobile-signature/ +web/apps/web-ele/src/views/_core/post/ +web/apps/web-ele/src/views/_core/redis-manager/ +web/apps/web-ele/src/views/_core/redis-monitor/ +web/apps/web-ele/src/views/_core/region-manager/ +web/apps/web-ele/src/views/_core/scheduler/ +web/apps/web-ele/src/views/_core/server-monitor/ +web/apps/web-ele/src/views/_core/system-config/modules/dingtalk-sync-form.vue +web/apps/web-ele/src/views/_core/system-config/modules/feishu-sync-form.vue +web/apps/web-ele/src/views/_core/system-config/modules/wecom-sync-form.vue web/apps/web-ele/src/views/ai-platform/workflow/editor/nodes/SystemSummaryNode.vue web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/SystemSummaryPanel.vue -!web/apps/web-ele/src/components/form-editor/index.ts -web/apps/web-ele/src/components/report-design/ +web/apps/web-ele/src/views/wiki/ +web/apps/web-ele/src/components/zq-form/table-selector/types.ts # keep only lightweight form-editor barrel web/apps/web-ele/src/components/form-editor/* diff --git a/web/apps/web-ele/src/adapter/component/index.ts b/web/apps/web-ele/src/adapter/component/index.ts index 10e25af..b91e23c 100644 --- a/web/apps/web-ele/src/adapter/component/index.ts +++ b/web/apps/web-ele/src/adapter/component/index.ts @@ -89,11 +89,6 @@ const ZqIconPicker = defineAsyncComponent(() => (res) => res.default, ), ); -const CronSelector = defineAsyncComponent(() => - import('#/components/zq-form/cron-selector/cron-selector.vue').then( - (res) => res.default, - ), -); const CodeEditor = defineAsyncComponent(() => import('#/components/zq-form/code-editor/code-editor.vue').then( (res) => res.default, @@ -214,7 +209,6 @@ export type ComponentType = | 'Checkbox' | 'CheckboxGroup' | 'CodeEditor' - | 'CronSelector' | 'DatePicker' | 'DeptSelector' | 'Divider' @@ -309,7 +303,6 @@ async function initComponentAdapter() { Textarea: withDefaultPlaceholder(ElInput, 'input', { type: 'textarea' }), JsonEditor, CodeEditor, - CronSelector, InputNumber: withDefaultPlaceholder(ElInputNumber, 'input'), RadioGroup: (props, { attrs, slots }) => { let defaultSlot; diff --git a/web/apps/web-ele/src/components/ai-chat-panel/DesignPreviewDialog.vue b/web/apps/web-ele/src/components/ai-chat-panel/DesignPreviewDialog.vue new file mode 100644 index 0000000..4c354da --- /dev/null +++ b/web/apps/web-ele/src/components/ai-chat-panel/DesignPreviewDialog.vue @@ -0,0 +1,81 @@ + + + diff --git a/web/apps/web-ele/src/components/ai-chat-panel/form-editor-lite.ts b/web/apps/web-ele/src/components/ai-chat-panel/form-editor-lite.ts new file mode 100644 index 0000000..cc01bf1 --- /dev/null +++ b/web/apps/web-ele/src/components/ai-chat-panel/form-editor-lite.ts @@ -0,0 +1,23 @@ +import DesignPreviewDialog from './DesignPreviewDialog.vue'; + +type PreviewData = { + data?: Record; + [key: string]: any; +}; + +export type AppDesignData = PreviewData; +export type AppSettingsData = PreviewData; +export type DashboardBasicInfoData = PreviewData; +export type DashboardDesignData = PreviewData; +export type DashboardPublishData = PreviewData; +export type DesignData = PreviewData; +export type DesignType = string; +export type SystemSummaryData = PreviewData; + +export const AppDesignPanel = DesignPreviewDialog; +export const AppSettingsPanel = DesignPreviewDialog; +export const DashboardBasicInfoConfirmPanel = DesignPreviewDialog; +export const DashboardDesignConfirmPanel = DesignPreviewDialog; +export const DashboardPublishConfirmPanel = DesignPreviewDialog; +export const DesignEditorPanel = DesignPreviewDialog; +export const SystemSummaryConfirmPanel = DesignPreviewDialog; diff --git a/web/apps/web-ele/src/components/form-editor/index.ts b/web/apps/web-ele/src/components/form-editor/index.ts index 09c536b..a5331c6 100644 --- a/web/apps/web-ele/src/components/form-editor/index.ts +++ b/web/apps/web-ele/src/components/form-editor/index.ts @@ -1,45 +1,34 @@ -import type { Component } from 'vue'; +import DesignPreviewDialog from '#/components/ai-chat-panel/DesignPreviewDialog.vue'; -import { defineComponent, h } from 'vue'; +type PreviewData = { + data?: Record; + [key: string]: any; +}; -export type DesignEditorData = Record; -export type AppDesignData = Record; -export type DashboardBasicInfoData = Record; -export type DashboardDesignData = Record; -export type DashboardPublishData = Record; -export type SystemSummaryData = Record; +export type AppDesignData = PreviewData; +export type AppSettingsData = PreviewData; +export type BasicFormData = PreviewData; +export type DashboardBasicInfoData = PreviewData; +export type DashboardDesignData = PreviewData; +export type DashboardPublishData = PreviewData; +export type DesignData = PreviewData; +export type DesignType = string; +export type FormBasicData = PreviewData; +export type FormEditorData = PreviewData; +export type PageBasicInfo = PreviewData; +export type PageEditorData = PreviewData; +export type PagePublishInfo = PreviewData; +export type SystemSummaryData = PreviewData; -export interface FormEditorProps { - readonly?: boolean; - schema?: Record; -} - -export interface PageEditorProps { - readonly?: boolean; - schema?: Record; -} - -export const FORM_EDITOR_LIGHTWEIGHT = true; - -function createLitePanel(name: string): Component { - return defineComponent({ - name, - setup(_, { slots }) { - return () => h('div', { class: 'form-editor-lite-placeholder' }, slots.default?.()); - }, - }); -} - -export const BasicInfoEditor = createLitePanel('BasicInfoEditor'); -export const PublishInfoEditor = createLitePanel('PublishInfoEditor'); -export const PageBasicInfoEditor = createLitePanel('PageBasicInfoEditor'); -export const PagePublishInfoEditor = createLitePanel('PagePublishInfoEditor'); -export const FormEditorContent = createLitePanel('FormEditorContent'); -export const PageEditorContent = createLitePanel('PageEditorContent'); -export const DesignEditorPanel = createLitePanel('DesignEditorPanel'); -export const AppDesignPanel = createLitePanel('AppDesignPanel'); -export const AppSettingsPanel = createLitePanel('AppSettingsPanel'); -export const DashboardBasicInfoConfirmPanel = createLitePanel('DashboardBasicInfoConfirmPanel'); -export const DashboardDesignConfirmPanel = createLitePanel('DashboardDesignConfirmPanel'); -export const DashboardPublishConfirmPanel = createLitePanel('DashboardPublishConfirmPanel'); -export const SystemSummaryConfirmPanel = createLitePanel('SystemSummaryConfirmPanel'); +export const AppDesignPanel = DesignPreviewDialog; +export const AppSettingsPanel = DesignPreviewDialog; +export const BasicInfoEditor = DesignPreviewDialog; +export const DashboardBasicInfoConfirmPanel = DesignPreviewDialog; +export const DashboardDesignConfirmPanel = DesignPreviewDialog; +export const DashboardPublishConfirmPanel = DesignPreviewDialog; +export const DesignEditorPanel = DesignPreviewDialog; +export const FormEditorContent = DesignPreviewDialog; +export const PageBasicInfoEditor = DesignPreviewDialog; +export const PageEditorContent = DesignPreviewDialog; +export const PagePublishInfoEditor = DesignPreviewDialog; +export const SystemSummaryConfirmPanel = DesignPreviewDialog; diff --git a/web/apps/web-ele/src/components/zq-table/zq-table.vue b/web/apps/web-ele/src/components/zq-table/zq-table.vue index c0e10eb..d38691a 100644 --- a/web/apps/web-ele/src/components/zq-table/zq-table.vue +++ b/web/apps/web-ele/src/components/zq-table/zq-table.vue @@ -53,9 +53,7 @@ import { import draggable from 'vuedraggable'; import { DeptSelector } from '../zq-form/dept-selector'; -import { FormSelector } from '../zq-form/form-selector'; import { PostSelector } from '../zq-form/post-selector'; -import { TableSelector } from '../zq-form/table-selector'; import { UserSelector } from '../zq-form/user-selector'; import { useTableForm } from './init'; @@ -619,11 +617,9 @@ function isDialogFilterComponent(componentType: string): boolean { 'department-selector', 'dept-select', 'dept-selector', - 'form-selector', 'position-selector', 'post-select', 'post-selector', - 'table-selector', 'user-select', 'user-selector', ].includes(componentType); @@ -1291,35 +1287,6 @@ function getSummaryMethod(param: { columns: any[]; data: any[] }) { :placeholder="$t('common.select')" @change="handleSelectorFilterChange" /> - -
diff --git a/web/apps/web-ele/src/locales/index.ts b/web/apps/web-ele/src/locales/index.ts index 95a710f..b5c0da7 100644 --- a/web/apps/web-ele/src/locales/index.ts +++ b/web/apps/web-ele/src/locales/index.ts @@ -30,66 +30,24 @@ const modules = import.meta.glob([ './langs/*/authentication.json', './langs/*/chat.json', './langs/*/common.json', - './langs/*/database-connection.json', - './langs/*/data-source.json', - './langs/*/dept.json', - './langs/*/dict.json', - './langs/*/file-manager.json', './langs/*/loginLog.json', './langs/*/menu.json', './langs/*/menu-title.json', './langs/*/message.json', - './langs/*/org-chart.json', + './langs/*/page.json', './langs/*/permission.json', - './langs/*/post.json', './langs/*/role.json', - './langs/*/server-monitor.json', './langs/*/system-config.json', './langs/*/system.json', - './langs/*/ui-config.json', './langs/*/ui.json', './langs/*/user-avatar.json', './langs/*/user.json', - './langs/*/wiki.json', - './langs/*/workflow.json', - './langs/*/zq-smart-table.json', ]); const localesMap = loadLocalesMapFromDir( /\.\/langs\/([^/]+)\/(.*)\.json$/, modules, ); -/** zq-table 需要提升到根级的命名空间,以便 t('table.xxx') 等能正确解析 */ -const ZQ_TABLE_ROOT_KEYS = [ - 'common', - 'table', - 'toolbar', - 'filter', - 'field', - 'view', - 'kanban', - 'gantt', - 'calendar', - 'gallery', - 'form', - 'dashboard', - 'sidebar', - 'app', - 'theme', - 'language', - 'link', - 'cellRenderer', - 'permission', - 'summary', - 'formula', - 'validation', - 'comment', - 'mention', - 'document', - 'trash', - 'version', - 'template', -] as const; /** * 加载应用特有的语言包 @@ -101,30 +59,7 @@ async function loadMessages(lang: SupportedLanguagesType) { localesMap[lang]?.(), loadThirdPartyMessage(lang), ]); - const messages = appLocaleMessages?.default || {}; - // 将 zq-table / zq-smart-table 的 table/toolbar/filter 等命名空间提升到根级 - // 使用浅合并:zq-table 的子键补充到已有命名空间,app 级别的同名 key 优先保留 - const merged = { ...messages }; - for (const ns of ['zq-table', 'zq-smart-table'] as const) { - const src = messages[ns]; - if (src && typeof src === 'object') { - for (const key of ZQ_TABLE_ROOT_KEYS) { - if (key in src && src[key] != null) { - const existing = merged[key]; - if ( - existing && - typeof existing === 'object' && - typeof src[key] === 'object' - ) { - merged[key] = { ...src[key], ...existing }; - } else { - merged[key] = src[key]; - } - } - } - } - } - return merged; + return appLocaleMessages?.default || {}; } /** diff --git a/web/apps/web-ele/src/router/access.ts b/web/apps/web-ele/src/router/access.ts index db83128..140df6e 100644 --- a/web/apps/web-ele/src/router/access.ts +++ b/web/apps/web-ele/src/router/access.ts @@ -17,13 +17,29 @@ const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue'); async function generateAccess(options: GenerateMenuAndRoutesOptions) { const pageMap: ComponentRecordType = import.meta.glob([ - '../views/**/*.vue', - '!../views/**/components/**', - '!../views/**/modules/**', - '!../views/ai-platform/workflow/editor/components/**/*.vue', - '!../views/ai-platform/workflow/editor/edges/**/*.vue', - '!../views/ai-platform/workflow/editor/nodes/**/*.vue', - '!../views/ai-platform/workflow/editor/panels/**/*.vue', + '../views/_core/account-settings/**/*.vue', + '../views/_core/agent-chat/**/*.vue', + '../views/_core/announcement/index.vue', + '../views/_core/announcement/list.vue', + '../views/_core/authentication/**/*.vue', + '../views/_core/chat/**/*.vue', + '../views/_core/fallback/**/*.vue', + '../views/_core/file-preview/index.vue', + '../views/_core/login-log/index.vue', + '../views/_core/menu/index.vue', + '../views/_core/message/index.vue', + '../views/_core/mobile-signature/index.vue', + '../views/_core/permission/index.vue', + '../views/_core/role/index.vue', + '../views/_core/system-config/index.vue', + '../views/_core/user/index.vue', + '../views/ai-platform/agent/editor/index.vue', + '../views/ai-platform/agent/index.vue', + '../views/ai-platform/knowledge/detail/index.vue', + '../views/ai-platform/knowledge/index.vue', + '../views/ai-platform/workflow/editor/index.vue', + '../views/ai-platform/workflow/index.vue', + '../views/ai-platform/workflow-runs/index.vue', ]); const layoutMap: ComponentRecordType = { diff --git a/web/apps/web-ele/src/router/routes/core.ts b/web/apps/web-ele/src/router/routes/core.ts index ac3adfc..82fb730 100644 --- a/web/apps/web-ele/src/router/routes/core.ts +++ b/web/apps/web-ele/src/router/routes/core.ts @@ -97,6 +97,17 @@ const coreRoutes: RouteRecordRaw[] = [ title: 'OAuth Callback', }, }, + { + name: 'MobileSignature', + path: '/mobile-signature/:token', + component: () => import('#/views/_core/mobile-signature/index.vue'), + meta: { + hideInBreadcrumb: true, + hideInMenu: true, + hideInTab: true, + title: 'Mobile Signature', + }, + }, { name: 'FilePreview', path: '/file-preview/:id', diff --git a/web/apps/web-ele/src/router/routes/index.ts b/web/apps/web-ele/src/router/routes/index.ts index ad7393a..7814928 100644 --- a/web/apps/web-ele/src/router/routes/index.ts +++ b/web/apps/web-ele/src/router/routes/index.ts @@ -3,17 +3,16 @@ import type { RouteRecordRaw } from 'vue-router'; import { mergeRouteModules, traverseTreeValues } from '@vben/utils'; import { coreRoutes, fallbackNotFoundRoute } from './core'; - -const dynamicRouteFiles = import.meta.glob('./modules/**/*.ts', { - eager: true, -}); +import aiPlatformRoutes from './modules/ai-platform'; // 有需要可以自行打开注释,并创建文件夹 // const externalRouteFiles = import.meta.glob('./external/**/*.ts', { eager: true }); // const staticRouteFiles = import.meta.glob('./static/**/*.ts', { eager: true }); /** 动态路由 */ -const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles); +const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules({ + './modules/ai-platform.ts': { default: aiPlatformRoutes }, +}); /** 外部路由列表,访问这些页面可以不需要Layout,可能用于内嵌在别的系统(不会显示在菜单中) */ // const externalRoutes: RouteRecordRaw[] = mergeRouteModules(externalRouteFiles); @@ -37,13 +36,29 @@ const accessRoutes = [...dynamicRoutes, ...staticRoutes]; const componentKeys: string[] = Object.keys( import.meta.glob([ - '../../views/**/*.vue', - '!../../views/**/components/**', - '!../../views/**/modules/**', - '!../../views/ai-platform/workflow/editor/components/**/*.vue', - '!../../views/ai-platform/workflow/editor/edges/**/*.vue', - '!../../views/ai-platform/workflow/editor/nodes/**/*.vue', - '!../../views/ai-platform/workflow/editor/panels/**/*.vue', + '../../views/_core/account-settings/**/*.vue', + '../../views/_core/agent-chat/**/*.vue', + '../../views/_core/announcement/index.vue', + '../../views/_core/announcement/list.vue', + '../../views/_core/authentication/**/*.vue', + '../../views/_core/chat/**/*.vue', + '../../views/_core/fallback/**/*.vue', + '../../views/_core/file-preview/index.vue', + '../../views/_core/login-log/index.vue', + '../../views/_core/menu/index.vue', + '../../views/_core/message/index.vue', + '../../views/_core/mobile-signature/index.vue', + '../../views/_core/permission/index.vue', + '../../views/_core/role/index.vue', + '../../views/_core/system-config/index.vue', + '../../views/_core/user/index.vue', + '../../views/ai-platform/agent/editor/index.vue', + '../../views/ai-platform/agent/index.vue', + '../../views/ai-platform/knowledge/detail/index.vue', + '../../views/ai-platform/knowledge/index.vue', + '../../views/ai-platform/workflow/editor/index.vue', + '../../views/ai-platform/workflow/index.vue', + '../../views/ai-platform/workflow-runs/index.vue', ]), ) .filter((item) => !item.includes('/modules/')) diff --git a/web/apps/web-ele/src/views/_core/announcement/index.vue b/web/apps/web-ele/src/views/_core/announcement/index.vue index 4bb7bb9..b8b386f 100644 --- a/web/apps/web-ele/src/views/_core/announcement/index.vue +++ b/web/apps/web-ele/src/views/_core/announcement/index.vue @@ -815,7 +815,8 @@ onBeforeUnmount(() => { class="w-full" type="textarea" :placeholder="$t('announcement.formContentPlaceholder')" - :rows="12" + :autosize="{ minRows: 8, maxRows: 16 }" + resize="vertical" /> diff --git a/web/apps/web-ele/src/views/ai-platform/workflow-runs/index.vue b/web/apps/web-ele/src/views/ai-platform/workflow-runs/index.vue index 29bbc6d..9544061 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow-runs/index.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow-runs/index.vue @@ -1,16 +1,29 @@ diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/ChatPanel.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/ChatPanel.vue index 8e48f31..3574803 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/ChatPanel.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/ChatPanel.vue @@ -1,6 +1,16 @@