Pre Merge pull request !344 from XuZhiqiang/feat-antdv-next

pull/344/MERGE
XuZhiqiang 2026-05-17 12:50:03 +00:00 committed by Gitee
commit fb4b5570b7
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
120 changed files with 381 additions and 289 deletions

View File

@ -26,8 +26,8 @@
"#/*": "./src/*" "#/*": "./src/*"
}, },
"dependencies": { "dependencies": {
"@form-create/ant-design-vue": "catalog:",
"@form-create/antd-designer": "catalog:", "@form-create/antd-designer": "catalog:",
"@form-create/antdv-next": "catalog:",
"@tinymce/tinymce-vue": "catalog:", "@tinymce/tinymce-vue": "catalog:",
"@vben/access": "workspace:*", "@vben/access": "workspace:*",
"@vben/common-ui": "workspace:*", "@vben/common-ui": "workspace:*",

View File

@ -279,9 +279,9 @@ async function previewImage(
{ {
class: 'hidden', class: 'hidden',
preview: { preview: {
visible: visible.value, open: visible.value,
current: currentIndex, current: currentIndex,
onVisibleChange: (value: boolean) => { onOpenChange: (value: boolean) => {
visible.value = value; visible.value = value;
if (!value) { if (!value) {
setTimeout(() => { setTimeout(() => {
@ -366,7 +366,7 @@ function cropImage(file: File, aspectRatio: string | undefined) {
closable: false, closable: false,
cancelText: $t('common.cancel'), cancelText: $t('common.cancel'),
okText: $t('ui.crop.confirm'), okText: $t('ui.crop.confirm'),
destroyOnClose: true, destroyOnHidden: true,
onOk: async () => { onOk: async () => {
const cropper = cropperRef.value; const cropper = cropperRef.value;
if (!cropper) { if (!cropper) {
@ -676,13 +676,13 @@ async function initComponentAdapter() {
fieldNames: { label: 'label', value: 'value', children: 'children' }, fieldNames: { label: 'label', value: 'value', children: 'children' },
loadingSlot: 'suffixIcon', loadingSlot: 'suffixIcon',
modelPropName: 'value', modelPropName: 'value',
visibleEvent: 'onVisibleChange', visibleEvent: 'onOpenChange',
}), }),
ApiSelect: withDefaultPlaceholder(ApiComponent, 'select', { ApiSelect: withDefaultPlaceholder(ApiComponent, 'select', {
component: Select, component: Select,
loadingSlot: 'suffixIcon', loadingSlot: 'suffixIcon',
modelPropName: 'value', modelPropName: 'value',
visibleEvent: 'onVisibleChange', visibleEvent: 'onOpenChange',
}), }),
ApiTreeSelect: withDefaultPlaceholder(ApiComponent, 'select', { ApiTreeSelect: withDefaultPlaceholder(ApiComponent, 'select', {
component: TreeSelect, component: TreeSelect,
@ -690,7 +690,7 @@ async function initComponentAdapter() {
loadingSlot: 'suffixIcon', loadingSlot: 'suffixIcon',
modelPropName: 'value', modelPropName: 'value',
optionsPropName: 'treeData', optionsPropName: 'treeData',
visibleEvent: 'onVisibleChange', visibleEvent: 'onOpenChange',
}), }),
AutoComplete, AutoComplete,
Cascader, Cascader,

View File

@ -15,6 +15,7 @@ import {
RadioButton, RadioButton,
RadioGroup, RadioGroup,
Select, Select,
TabPane,
Tabs, Tabs,
} from 'antdv-next'; } from 'antdv-next';
@ -438,7 +439,7 @@ function inputChange() {
<Modal <Modal
v-model:open="dialogVisible" v-model:open="dialogVisible"
:width="720" :width="720"
destroy-on-close destroy-on-hidden
title="cron规则生成器" title="cron规则生成器"
> >
<div class="sc-cron"> <div class="sc-cron">

View File

@ -97,7 +97,7 @@ async function handleOk() {
const uploadApi = props.uploadApi; const uploadApi = props.uploadApi;
if (uploadApi && isFunction(uploadApi)) { if (uploadApi && isFunction(uploadApi)) {
if (!previewSource.value) { if (!previewSource.value) {
message.warn('未选择图片'); message.warning('未选择图片');
return; return;
} }
const blob = dataURLtoBlob(previewSource.value); const blob = dataURLtoBlob(previewSource.value);

View File

@ -172,13 +172,15 @@ export default defineComponent({
return ( return (
<Card <Card
bodyStyle={{ padding: '8px 0' }}
headStyle={{
padding: '8px 16px',
fontSize: '14px',
minHeight: '24px',
}}
style={{ margin: 0 }} style={{ margin: 0 }}
styles={{
body: { padding: '8px 0' },
header: {
padding: '8px 16px',
fontSize: '14px',
minHeight: '24px',
},
}}
title={title} title={title}
> >
{{ {{

View File

@ -1,4 +1,4 @@
import type { Rule } from '@form-create/ant-design-vue'; import type { Rule } from '@form-create/antdv-next';
import type { Ref } from 'vue'; import type { Ref } from 'vue';
@ -6,7 +6,7 @@ import type { Menu } from '#/components/form-create/typing';
import { isRef, nextTick, onMounted } from 'vue'; import { isRef, nextTick, onMounted } from 'vue';
import formCreate from '@form-create/ant-design-vue'; import formCreate from '@form-create/antdv-next';
import { apiSelectRule } from '#/components/form-create/rules/data'; import { apiSelectRule } from '#/components/form-create/rules/data';

View File

@ -38,7 +38,7 @@ function getUserTypeColor(userType: number) {
<div class="pt-5"> <div class="pt-5">
<Timeline> <Timeline>
<TimelineItem v-for="log in logList" :key="log.id"> <TimelineItem v-for="log in logList" :key="log.id">
<template #dot> <template #icon>
<span <span
:style="{ backgroundColor: getUserTypeColor(log.userType) }" :style="{ backgroundColor: getUserTypeColor(log.userType) }"
class="flex h-5 w-5 items-center justify-center rounded-full text-[10px] text-white" class="flex h-5 w-5 items-center justify-center rounded-full text-[10px] text-white"

View File

@ -1,8 +1,8 @@
import type { App } from 'vue'; import type { App } from 'vue';
import formCreate from '@form-create/ant-design-vue';
import install from '@form-create/ant-design-vue/auto-import';
import FcDesigner from '@form-create/antd-designer'; import FcDesigner from '@form-create/antd-designer';
import formCreate from '@form-create/antdv-next';
import install from '@form-create/antdv-next/auto-import';
// 👇使用 form-create 需额外全局引入 ant-design-vue 组件 // 👇使用 form-create 需额外全局引入 ant-design-vue 组件
import { import {
Alert, Alert,

View File

@ -95,7 +95,7 @@ export const useAuthStore = defineStore('auth', () => {
notification.success({ notification.success({
description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.nickname}`, description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.nickname}`,
duration: 3, duration: 3,
message: $t('authentication.loginSuccess'), title: $t('authentication.loginSuccess'),
}); });
} }
} }

View File

@ -6,7 +6,7 @@ import { onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { useUserStore } from '@vben/stores'; import { useUserStore } from '@vben/stores';
import { Card, Tabs } from 'antdv-next'; import { Card, TabPane, Tabs } from 'antdv-next';
import { getAuthPermissionInfoApi } from '#/api'; import { getAuthPermissionInfoApi } from '#/api';
import { getUserProfile } from '#/api/system/user/profile'; import { getUserProfile } from '#/api/system/user/profile';

View File

@ -65,14 +65,16 @@ async function handleTabsScroll() {
<div class="mb-3 mr-3 inline-block" v-for="role in roleList" :key="role.id"> <div class="mb-3 mr-3 inline-block" v-for="role in roleList" :key="role.id">
<Card <Card
class="relative rounded-lg" class="relative rounded-lg"
:body-style="{ :styles="{
position: 'relative', body: {
display: 'flex', position: 'relative',
flexDirection: 'column', display: 'flex',
justifyContent: 'flex-start', flexDirection: 'column',
width: '240px', justifyContent: 'flex-start',
maxWidth: '240px', width: '240px',
padding: '15px', maxWidth: '240px',
padding: '15px',
},
}" }"
> >
<!-- 头部头像名称 --> <!-- 头部头像名称 -->

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { useVbenDrawer, useVbenModal } from '@vben/common-ui'; import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { IconifyIcon } from '@vben/icons'; import { IconifyIcon } from '@vben/icons';
import { Button, Input, Layout, Tabs } from 'antdv-next'; import { Button, Input, Layout, TabPane, Tabs } from 'antdv-next';
import { createChatConversationMy } from '#/api/ai/chat/conversation'; import { createChatConversationMy } from '#/api/ai/chat/conversation';
import { deleteMy, getCategoryList, getMyPage } from '#/api/ai/model/chatRole'; import { deleteMy, getCategoryList, getMyPage } from '#/api/ai/model/chatRole';

View File

@ -3,7 +3,7 @@ import { ref } from 'vue';
import { DocAlert, Page } from '@vben/common-ui'; import { DocAlert, Page } from '@vben/common-ui';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import ChatConversationList from './modules/conversation-list.vue'; import ChatConversationList from './modules/conversation-list.vue';
import ChatMessageList from './modules/message-list.vue'; import ChatMessageList from './modules/message-list.vue';

View File

@ -174,13 +174,15 @@ onUnmounted(async () => {
</Drawer> </Drawer>
<Card <Card
class="flex h-full w-full flex-col" class="flex h-full w-full flex-col"
:body-style="{ :styles="{
margin: 0, body: {
padding: 0, margin: 0,
height: '100%', padding: 0,
position: 'relative', height: '100%',
display: 'flex', position: 'relative',
flexDirection: 'column', display: 'flex',
flexDirection: 'column',
},
}" }"
> >
<template #title> <template #title>

View File

@ -178,7 +178,7 @@ onMounted(async () => {
</div> </div>
<!-- 主体内容 --> <!-- 主体内容 -->
<Card :body-style="{ padding: '10px' }" class="mb-4"> <Card :styles="{ body: { padding: '10px' } }" class="mb-4">
<div class="mt-12"> <div class="mt-12">
<!-- 第一步上传文档 --> <!-- 第一步上传文档 -->
<div v-if="currentStep === 0" class="mx-auto w-[560px]"> <div v-if="currentStep === 0" class="mx-auto w-[560px]">

View File

@ -62,7 +62,7 @@ provide('currentSong', currentSong);
<Tabs <Tabs
v-model:active-key="currentType" v-model:active-key="currentType"
class="flex-auto px-5" class="flex-auto px-5"
tab-position="bottom" tab-placement="bottom"
> >
<!-- 我的创作 --> <!-- 我的创作 -->
<TabPane key="mine" tab="我的创作" v-loading="loading"> <TabPane key="mine" tab="我的创作" v-loading="loading">

View File

@ -338,7 +338,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"
@ -554,7 +554,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"

View File

@ -334,7 +334,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"
@ -539,7 +539,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"

View File

@ -201,7 +201,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"

View File

@ -277,7 +277,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"
@ -316,7 +316,7 @@ watch(
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"

View File

@ -329,7 +329,7 @@ onMounted(async () => {
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"
@ -366,7 +366,7 @@ onMounted(async () => {
> >
编辑 编辑
</Button> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button <Button
size="small" size="small"
type="link" type="link"

View File

@ -172,7 +172,7 @@ defineExpose({ validate });
/> />
</div> </div>
</div> </div>
<Space direction="vertical" size="small" class="w-11/12 pl-1"> <Space orientation="vertical" size="small" class="w-11/12 pl-1">
<template #split> <template #split>
{{ condition.conditionGroups.and ? '且' : '或' }} {{ condition.conditionGroups.and ? '且' : '或' }}
</template> </template>

View File

@ -225,7 +225,7 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
<Form ref="formRef" :model="{ routerGroups }"> <Form ref="formRef" :model="{ routerGroups }">
<Card <Card
:body-style="{ padding: '10px' }" :styles="{ body: { padding: '10px' } }"
class="mt-4" class="mt-4"
v-for="(item, index) in routerGroups" v-for="(item, index) in routerGroups"
:key="index" :key="index"

View File

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
/** /**
* 移动端流程表单展示页面 - Ant Design Vue 版本 * 移动端流程表单展示页面 - Ant Design Vue 版本
* 使用 @form-create/ant-design-vue 渲染表单 * 使用 @form-create/antdv-next 渲染表单
* 用于 UniApp 通过 iframe/webview 嵌入 * 用于 UniApp 通过 iframe/webview 嵌入
* *
* URL 参数说明 * URL 参数说明
@ -330,7 +330,7 @@ function initApp() {
<div class="mobile-form-preview-antd"> <div class="mobile-form-preview-antd">
<!-- 加载状态 --> <!-- 加载状态 -->
<div v-if="loading" class="loading-container"> <div v-if="loading" class="loading-container">
<Spin size="large" tip="加载中..." /> <Spin size="large" description="加载中..." />
</div> </div>
<!-- 错误状态 --> <!-- 错误状态 -->

View File

@ -3,7 +3,7 @@ import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import FormCreate from '@form-create/ant-design-vue'; import FormCreate from '@form-create/antdv-next';
import { getForm } from '#/api/bpm/form'; import { getForm } from '#/api/bpm/form';
import { setConfAndFields2 } from '#/components/form-create'; import { setConfAndFields2 } from '#/components/form-create';
@ -40,8 +40,8 @@ const [Modal, modalApi] = useVbenModal({
<Modal <Modal
class="w-2/5" class="w-2/5"
title="流程表单详情" title="流程表单详情"
:body-style="{ :styles="{
maxHeight: '100px', body: { maxHeight: '100px' },
}" }"
> >
<FormCreate :option="formConfig.option" :rule="formConfig.rule" /> <FormCreate :option="formConfig.option" :rule="formConfig.rule" />

View File

@ -468,7 +468,7 @@ onBeforeUnmount(() => {
</div> </div>
</div> </div>
<!-- 主体内容 --> <!-- 主体内容 -->
<Card :body-style="{ padding: '10px' }" class="mb-4"> <Card :styles="{ body: { padding: '10px' } }" class="mb-4">
<div class="mt-12"> <div class="mt-12">
<!-- 第一步基本信息 --> <!-- 第一步基本信息 -->
<div v-if="currentStep === 0" class="mx-auto w-4/6"> <div v-if="currentStep === 0" class="mx-auto w-4/6">

View File

@ -7,7 +7,7 @@ import { BpmModelFormType, DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks'; import { getDictOptions } from '@vben/hooks';
import { IconifyIcon } from '@vben/icons'; import { IconifyIcon } from '@vben/icons';
import FormCreate from '@form-create/ant-design-vue'; import FormCreate from '@form-create/antdv-next';
import { import {
Form, Form,
FormItem, FormItem,

View File

@ -144,7 +144,7 @@ async function handleCategorySortSubmit() {
<!-- 流程分类表单弹窗 --> <!-- 流程分类表单弹窗 -->
<CategoryFormModal @success="getList" /> <CategoryFormModal @success="getList" />
<Card <Card
:body-style="{ padding: '10px' }" :styles="{ body: { padding: '10px' } }"
class="mb-4" class="mb-4"
title="流程模型" title="流程模型"
v-spinning="modelListSpinning" v-spinning="modelListSpinning"

View File

@ -459,7 +459,7 @@ function handleRenameSuccess() {
<template> <template>
<div> <div>
<Card <Card
:body-style="{ padding: 0 }" :styles="{ body: { padding: 0 } }"
class="category-draggable-model mb-5 rounded-lg transition-all duration-300 ease-in-out hover:shadow-xl" class="category-draggable-model mb-5 rounded-lg transition-all duration-300 ease-in-out hover:shadow-xl"
> >
<div class="flex h-12 items-center"> <div class="flex h-12 items-center">

View File

@ -48,7 +48,7 @@ onMounted(() => {
<template> <template>
<ContentWrap class="m-2"> <ContentWrap class="m-2">
<Spin :spinning="loading" tip="加载中..."> <Spin :spinning="loading" description="加载中...">
<Descriptions :data="formData" /> <Descriptions :data="formData" />
</Spin> </Spin>
</ContentWrap> </ContentWrap>

View File

@ -209,7 +209,7 @@ onMounted(() => {
</template> </template>
<div v-if="filteredProcessDefinitionList?.length" class="-ml-6"> <div v-if="filteredProcessDefinitionList?.length" class="-ml-6">
<Tabs v-model:active-key="activeCategory" tab-position="left"> <Tabs v-model:active-key="activeCategory" tab-placement="start">
<TabPane <TabPane
v-for="category in availableCategories" v-for="category in availableCategories"
:key="category.code" :key="category.code"
@ -233,9 +233,8 @@ onMounted(() => {
'animate-bounce-once !bg-[rgb(63_115_247_/_10%)]': 'animate-bounce-once !bg-[rgb(63_115_247_/_10%)]':
searchName.trim().length > 0, searchName.trim().length > 0,
}" }"
:body-style="{ :styles="{
width: '100%', body: { width: '100%', padding: '16px' },
padding: '16px',
}" }"
> >
<div class="flex items-center"> <div class="flex items-center">
@ -269,7 +268,7 @@ onMounted(() => {
</Tabs> </Tabs>
</div> </div>
<div v-else class="!py-48 text-center"> <div v-else class="!py-48 text-center">
<Space direction="vertical" size="large"> <Space orientation="vertical" size="large">
<span class="text-gray-500">没有找到搜索结果</span> <span class="text-gray-500">没有找到搜索结果</span>
</Space> </Space>
</div> </div>

View File

@ -14,8 +14,17 @@ import {
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { IconifyIcon } from '@vben/icons'; import { IconifyIcon } from '@vben/icons';
import formCreate from '@form-create/ant-design-vue'; import formCreate from '@form-create/antdv-next';
import { Button, Card, Col, message, Row, Space, Tabs } from 'antdv-next'; import {
Button,
Card,
Col,
message,
Row,
Space,
TabPane,
Tabs,
} from 'antdv-next';
import { getProcessDefinition } from '#/api/bpm/definition'; import { getProcessDefinition } from '#/api/bpm/definition';
import { import {
@ -265,10 +274,12 @@ defineExpose({ initProcessInfo });
<Card <Card
:title="getTitle" :title="getTitle"
class="h-full overflow-hidden" class="h-full overflow-hidden"
:body-style="{ :styles="{
height: 'calc(100% - 112px)', body: {
paddingTop: '12px', height: 'calc(100% - 112px)',
overflowY: 'auto', paddingTop: '12px',
overflowY: 'auto',
},
}" }"
> >
<template #extra> <template #extra>

View File

@ -227,10 +227,8 @@ onMounted(async () => {
<Page auto-content-height v-loading="loading"> <Page auto-content-height v-loading="loading">
<Card <Card
class="flex h-full flex-col" class="flex h-full flex-col"
:body-style="{ :styles="{
flex: 1, body: { flex: 1, overflowY: 'hidden', paddingTop: '12px' },
overflowY: 'hidden',
paddingTop: '12px',
}" }"
> >
<template #title> <template #title>

View File

@ -22,7 +22,7 @@ import { IconifyIcon } from '@vben/icons';
import { useUserStore } from '@vben/stores'; import { useUserStore } from '@vben/stores';
import { isEmpty } from '@vben/utils'; import { isEmpty } from '@vben/utils';
import FormCreate from '@form-create/ant-design-vue'; import FormCreate from '@form-create/antdv-next';
import { until, useDebounceFn } from '@vueuse/core'; import { until, useDebounceFn } from '@vueuse/core';
import { import {
Alert, Alert,
@ -766,7 +766,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.approve" v-model:open="popOverVisible.approve"
placement="top" placement="top"
:overlay-style="{ minWidth: '400px', zIndex: 300 }" :styles="{ root: { minWidth: '400px', zIndex: 300 } }"
trigger="click" trigger="click"
@open-change="handlePopoverVisible" @open-change="handlePopoverVisible"
v-if=" v-if="
@ -870,7 +870,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.reject" v-model:open="popOverVisible.reject"
placement="top" placement="top"
:overlay-style="{ minWidth: '400px' }" :styles="{ root: { minWidth: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&
@ -927,7 +927,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.copy" v-model:open="popOverVisible.copy"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&
@ -999,7 +999,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.transfer" v-model:open="popOverVisible.transfer"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&
@ -1072,7 +1072,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.delegate" v-model:open="popOverVisible.delegate"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&
@ -1145,7 +1145,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.addSign" v-model:open="popOverVisible.addSign"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&
@ -1230,7 +1230,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.deleteSign" v-model:open="popOverVisible.deleteSign"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if="runningTask?.children.length > 0" v-if="runningTask?.children.length > 0"
> >
@ -1296,7 +1296,7 @@ defineExpose({ loadTodoTask });
<Popover <Popover
v-model:open="popOverVisible.return" v-model:open="popOverVisible.return"
placement="top" placement="top"
:overlay-style="{ width: '400px' }" :styles="{ root: { width: '400px' } }"
trigger="click" trigger="click"
v-if=" v-if="
runningTask && runningTask &&

View File

@ -14,7 +14,14 @@ import {
import { IconifyIcon } from '@vben/icons'; import { IconifyIcon } from '@vben/icons';
import { formatDateTime, isEmpty } from '@vben/utils'; import { formatDateTime, isEmpty } from '@vben/utils';
import { Avatar, Button, Image, Timeline, Tooltip } from 'antdv-next'; import {
Avatar,
Button,
Image,
Timeline,
TimelineItem,
Tooltip,
} from 'antdv-next';
import { UserSelectModal } from '#/views/system/user/components'; import { UserSelectModal } from '#/views/system/user/components';
@ -238,7 +245,7 @@ defineExpose({ setCustomApproveUsers, batchSetCustomApproveUsers });
:key="index" :key="index"
:color="getApprovalNodeColor(activity.status)" :color="getApprovalNodeColor(activity.status)"
> >
<template #dot> <template #icon>
<div class="relative"> <div class="relative">
<div <div
class="position-absolute left--2.5 top--1.5 flex h-8 w-8 items-center justify-center rounded-full border border-solid border-gray-200 bg-blue-500 p-1.5" class="position-absolute left--2.5 top--1.5 flex h-8 w-8 items-center justify-center rounded-full border border-solid border-gray-200 bg-blue-500 p-1.5"

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Button, Card, Tabs } from 'antdv-next'; import { Button, Card, TabPane, Tabs } from 'antdv-next';
import { getBusiness } from '#/api/crm/business'; import { getBusiness } from '#/api/crm/business';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, message, Tabs } from 'antdv-next'; import { Card, message, TabPane, Tabs } from 'antdv-next';
import { getClue, transformClue } from '#/api/crm/clue'; import { getClue, transformClue } from '#/api/crm/clue';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteClue, exportClue, getCluePage } from '#/api/crm/clue'; import { deleteClue, exportClue, getCluePage } from '#/api/crm/clue';

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, Tabs } from 'antdv-next'; import { Card, TabPane, Tabs } from 'antdv-next';
import { getContact } from '#/api/crm/contact'; import { getContact } from '#/api/crm/contact';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, Tabs } from 'antdv-next'; import { Card, TabPane, Tabs } from 'antdv-next';
import { getContract } from '#/api/crm/contract'; import { getContract } from '#/api/crm/contract';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, message, Tabs } from 'antdv-next'; import { Card, message, TabPane, Tabs } from 'antdv-next';
import { import {
getCustomer, getCustomer,

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -6,7 +6,7 @@ import { ref } from 'vue';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Button, Card, Tabs } from 'antdv-next'; import { Button, Card, TabPane, Tabs } from 'antdv-next';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';
import { BizTypeEnum } from '#/api/crm/permission'; import { BizTypeEnum } from '#/api/crm/permission';

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, Tabs } from 'antdv-next'; import { Card, TabPane, Tabs } from 'antdv-next';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';
import { BizTypeEnum } from '#/api/crm/permission'; import { BizTypeEnum } from '#/api/crm/permission';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { useTabs } from '@vben/hooks'; import { useTabs } from '@vben/hooks';
import { Card, Tabs } from 'antdv-next'; import { Card, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction } from '#/adapter/vxe-table';
import { getOperateLogPage } from '#/api/crm/operateLog'; import { getOperateLogPage } from '#/api/crm/operateLog';

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { Button, message, Tabs } from 'antdv-next'; import { Button, message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -9,7 +9,7 @@ import { onMounted, ref } from 'vue';
import { ContentWrap, Page } from '@vben/common-ui'; import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';

View File

@ -12,7 +12,7 @@ import { reactive, ref } from 'vue';
import { ContentWrap, Page } from '@vben/common-ui'; import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { Button, Space, Tabs } from 'antdv-next'; import { Button, Space, TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';

View File

@ -10,7 +10,7 @@ import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { beginOfDay, endOfDay, formatDateTime } from '@vben/utils'; import { beginOfDay, endOfDay, formatDateTime } from '@vben/utils';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';

View File

@ -9,7 +9,7 @@ import { onMounted, ref } from 'vue';
import { ContentWrap, Page } from '@vben/common-ui'; import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';

View File

@ -9,7 +9,7 @@ import { onMounted, ref } from 'vue';
import { ContentWrap, Page } from '@vben/common-ui'; import { ContentWrap, Page } from '@vben/common-ui';
import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';

View File

@ -5,8 +5,8 @@ import { onMounted, ref, unref } from 'vue';
import { Page, useVbenModal } from '@vben/common-ui'; import { Page, useVbenModal } from '@vben/common-ui';
import { isString } from '@vben/utils'; import { isString } from '@vben/utils';
import formCreate from '@form-create/ant-design-vue';
import FcDesigner from '@form-create/antd-designer'; import FcDesigner from '@form-create/antd-designer';
import formCreate from '@form-create/antdv-next';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { Button, message } from 'antdv-next'; import { Button, message } from 'antdv-next';
import hljs from 'highlight.js'; import hljs from 'highlight.js';

View File

@ -49,12 +49,12 @@ async function submitForm() {
// //
const basicInfoValid = await basicInfoRef.value?.validate(); const basicInfoValid = await basicInfoRef.value?.validate();
if (!basicInfoValid) { if (!basicInfoValid) {
message.warn('保存失败,原因:基本信息表单校验失败请检查!!!'); message.warning('保存失败,原因:基本信息表单校验失败请检查!!!');
return; return;
} }
const generateInfoValid = await generateInfoRef.value?.validate(); const generateInfoValid = await generateInfoRef.value?.validate();
if (!generateInfoValid) { if (!generateInfoValid) {
message.warn('保存失败,原因:生成信息表单校验失败请检查!!!'); message.warning('保存失败,原因:生成信息表单校验失败请检查!!!');
return; return;
} }
@ -125,13 +125,8 @@ getDetail();
type="navigation" type="navigation"
v-model:current="currentStep" v-model:current="currentStep"
class="mb-8 rounded shadow-sm" class="mb-8 rounded shadow-sm"
> :items="steps.map((step) => ({ title: step.title }))"
<Steps.Step />
v-for="(step, index) in steps"
:key="index"
:title="step.title"
/>
</Steps>
<div class="flex-1 overflow-auto py-4"> <div class="flex-1 overflow-auto py-4">
<!-- 根据当前步骤显示对应的组件 --> <!-- 根据当前步骤显示对应的组件 -->

View File

@ -8,7 +8,7 @@ import { IconifyIcon } from '@vben/icons';
import { CodeEditor } from '@vben/plugins/code-editor'; import { CodeEditor } from '@vben/plugins/code-editor';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { Button, DirectoryTree, message, Tabs } from 'antdv-next'; import { Button, DirectoryTree, message, TabPane, Tabs } from 'antdv-next';
import { previewCodegen } from '#/api/infra/codegen'; import { previewCodegen } from '#/api/infra/codegen';

View File

@ -7,7 +7,7 @@ import { ref } from 'vue';
import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -7,7 +7,7 @@ import { ref } from 'vue';
import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -5,7 +5,7 @@ import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { import {

View File

@ -5,7 +5,7 @@ import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { import {

View File

@ -8,7 +8,7 @@ import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks'; import { getDictOptions } from '@vben/hooks';
import { formatDateTime } from '@vben/utils'; import { formatDateTime } from '@vben/utils';
import { Timeline } from 'antdv-next'; import { Timeline, TimelineItem } from 'antdv-next';
import { CronTab } from '#/components/cron-tab'; import { CronTab } from '#/components/cron-tab';
import { DictTag } from '#/components/dict-tag'; import { DictTag } from '#/components/dict-tag';

View File

@ -184,7 +184,7 @@ onMounted(async () => {
<div class="mt-4 flex flex-col gap-4 md:flex-row"> <div class="mt-4 flex flex-col gap-4 md:flex-row">
<!-- 左侧建立连接发送消息 --> <!-- 左侧建立连接发送消息 -->
<Card :bordered="false" class="w-full md:w-1/2"> <Card variant="borderless" class="w-full md:w-1/2">
<template #title> <template #title>
<div class="flex items-center"> <div class="flex items-center">
<Badge :status="getIsOpen ? 'success' : 'error'" /> <Badge :status="getIsOpen ? 'success' : 'error'" />
@ -274,7 +274,7 @@ onMounted(async () => {
</Card> </Card>
<!-- 右侧消息记录 --> <!-- 右侧消息记录 -->
<Card :bordered="false" class="w-full md:w-1/2"> <Card variant="borderless" class="w-full md:w-1/2">
<template #title> <template #title>
<div class="flex items-center"> <div class="flex items-center">
<IconifyIcon <IconifyIcon

View File

@ -212,7 +212,7 @@ onMounted(() => {
v-if="row.deviceMessage" v-if="row.deviceMessage"
placement="topLeft" placement="topLeft"
trigger="hover" trigger="hover"
:overlay-style="{ maxWidth: '600px' }" :styles="{ root: { maxWidth: '600px' } }"
> >
<template #content> <template #content>
<pre class="text-xs">{{ row.deviceMessage }}</pre> <pre class="text-xs">{{ row.deviceMessage }}</pre>

View File

@ -9,7 +9,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { DeviceTypeEnum } from '@vben/constants'; import { DeviceTypeEnum } from '@vben/constants';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { getDevice } from '#/api/iot/device/device'; import { getDevice } from '#/api/iot/device/device';
import { getProduct, ProtocolTypeEnum } from '#/api/iot/product/product'; import { getProduct, ProtocolTypeEnum } from '#/api/iot/product/product';

View File

@ -124,7 +124,7 @@ const tableColumns = computed(() => [
key: 'index', key: 'index',
width: 80, width: 80,
align: 'center' as const, align: 'center' as const,
customRender: ({ index }: { index: number }) => index + 1, render: ({ index }: { index: number }) => index + 1,
}, },
{ {
title: '时间', title: '时间',

View File

@ -322,7 +322,7 @@ onBeforeUnmount(() => {
class="mb-4" class="mb-4"
> >
<Card <Card
:body-style="{ padding: '0' }" :styles="{ body: { padding: '0' } }"
class="relative h-full overflow-hidden transition-colors" class="relative h-full overflow-hidden transition-colors"
> >
<!-- 添加渐变背景层 --> <!-- 添加渐变背景层 -->

View File

@ -6,7 +6,7 @@ import { ref } from 'vue';
import { ContentWrap } from '@vben/common-ui'; import { ContentWrap } from '@vben/common-ui';
import { Tabs } from 'antdv-next'; import { TabPane, Tabs } from 'antdv-next';
import DeviceDetailsThingModelEvent from './thing-model-event.vue'; import DeviceDetailsThingModelEvent from './thing-model-event.vue';
import DeviceDetailsThingModelProperty from './thing-model-property.vue'; import DeviceDetailsThingModelProperty from './thing-model-property.vue';

View File

@ -276,7 +276,7 @@ onMounted(async () => {
<DeviceImportFormModal @success="handleRefresh" /> <DeviceImportFormModal @success="handleRefresh" />
<!-- 统一搜索工具栏 --> <!-- 统一搜索工具栏 -->
<Card :body-style="{ padding: '16px' }" class="mb-4"> <Card :styles="{ body: { padding: '16px' } }" class="mb-4">
<!-- 搜索表单 --> <!-- 搜索表单 -->
<div class="mb-3 flex flex-wrap items-center gap-3"> <div class="mb-3 flex flex-wrap items-center gap-3">
<Select <Select

View File

@ -115,7 +115,7 @@ onMounted(() => {
:lg="6" :lg="6"
> >
<Card <Card
:body-style="{ padding: '16px' }" :styles="{ body: { padding: '16px' } }"
class="device-card h-full rounded-lg transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg" class="device-card h-full rounded-lg transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg"
> >
<!-- 顶部标题区域 --> <!-- 顶部标题区域 -->

View File

@ -104,7 +104,7 @@ const columns: TableColumnsType = [
key: 'updateTime', key: 'updateTime',
align: 'center' as const, align: 'center' as const,
width: 180, width: 180,
customRender: ({ text }: any) => formatDate(text, 'YYYY-MM-DD HH:mm:ss'), render: ({ text }: any) => formatDate(text, 'YYYY-MM-DD HH:mm:ss'),
}, },
{ {
title: '操作', title: '操作',

View File

@ -143,7 +143,7 @@ const columns: TableColumnsType = [
dataIndex: 'createTime', dataIndex: 'createTime',
key: 'createTime', key: 'createTime',
align: 'center' as const, align: 'center' as const,
customRender: ({ text }: any) => formatDate(text, 'YYYY-MM-DD HH:mm:ss'), render: ({ text }: any) => formatDate(text, 'YYYY-MM-DD HH:mm:ss'),
}, },
{ {
title: '任务描述', title: '任务描述',

View File

@ -6,7 +6,7 @@ import { useRoute, useRouter } from 'vue-router';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { getDeviceCount } from '#/api/iot/device/device'; import { getDeviceCount } from '#/api/iot/device/device';
import { getProduct } from '#/api/iot/product/product'; import { getProduct } from '#/api/iot/product/product';

View File

@ -175,7 +175,7 @@ onMounted(() => {
<FormModal @success="handleRefresh" /> <FormModal @success="handleRefresh" />
<!-- 统一搜索工具栏 --> <!-- 统一搜索工具栏 -->
<Card :body-style="{ padding: '16px' }" class="mb-4"> <Card :styles="{ body: { padding: '16px' } }" class="mb-4">
<!-- 搜索表单 --> <!-- 搜索表单 -->
<div class="mb-3 flex items-center gap-3"> <div class="mb-3 flex items-center gap-3">
<Input <Input

View File

@ -101,7 +101,7 @@ onMounted(() => {
:lg="6" :lg="6"
> >
<Card <Card
:body-style="{ padding: '16px' }" :styles="{ body: { padding: '16px' } }"
class="product-card h-full rounded-lg transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg" class="product-card h-full rounded-lg transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg"
> >
<!-- 顶部标题区域 --> <!-- 顶部标题区域 -->

View File

@ -134,7 +134,7 @@ onMounted(async () => {
<span>参数{{ item.name }}</span> <span>参数{{ item.name }}</span>
<div class="btn"> <div class="btn">
<Button type="link" @click="openStructForm(item)"> </Button> <Button type="link" @click="openStructForm(item)"> </Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button type="link" danger @click="deleteStructItem(index)"> <Button type="link" danger @click="deleteStructItem(index)">
删除 删除
</Button> </Button>

View File

@ -131,7 +131,7 @@ function resetForm() {
<span>参数名称{{ item.name }}</span> <span>参数名称{{ item.name }}</span>
<div class="btn"> <div class="btn">
<Button type="link" @click="openParamForm(item)"></Button> <Button type="link" @click="openParamForm(item)"></Button>
<Divider type="vertical" /> <Divider orientation="vertical" />
<Button type="link" danger @click="deleteParamItem(index)"></Button> <Button type="link" danger @click="deleteParamItem(index)"></Button>
</div> </div>
</div> </div>

View File

@ -48,7 +48,7 @@ const formattedReference = computed(() => {
</script> </script>
<template> <template>
<Card :bordered="false" class="h-full"> <Card variant="borderless" class="h-full">
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<div class="flex items-center justify-between text-gray-500"> <div class="flex items-center justify-between text-gray-500">
<span>{{ title }}</span> <span>{{ title }}</span>

View File

@ -95,7 +95,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false"> <Card variant="borderless">
<template #title> <template #title>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span>用户统计</span> <span>用户统计</span>

View File

@ -102,7 +102,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false" title="运营数据"> <Card variant="borderless" title="运营数据">
<div class="flex flex-row flex-wrap items-center gap-8 p-4"> <div class="flex flex-row flex-wrap items-center gap-8 p-4">
<div <div
v-for="(item, key) in data" v-for="(item, key) in data"

View File

@ -69,7 +69,7 @@ function handleMenuClick(routerName: string) {
</script> </script>
<template> <template>
<Card :bordered="false" title="快捷入口"> <Card variant="borderless" title="快捷入口">
<div class="flex flex-row flex-wrap gap-8 p-4"> <div class="flex flex-row flex-wrap gap-8 p-4">
<div <div
v-for="menu in menuList" v-for="menu in menuList"

View File

@ -182,7 +182,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false"> <Card variant="borderless">
<template #title> <template #title>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span>交易量趋势</span> <span>交易量趋势</span>

View File

@ -87,7 +87,7 @@ defineExpose({
v-model:open="visible" v-model:open="visible"
title="选择规格" title="选择规格"
width="700px" width="700px"
:destroy-on-close="true" :destroy-on-hidden="true"
:footer="null" :footer="null"
@cancel="closeModal" @cancel="closeModal"
> >

View File

@ -294,7 +294,7 @@ onMounted(async () => {
v-model:open="visible" v-model:open="visible"
title="商品选择" title="商品选择"
width="70%" width="70%"
:destroy-on-close="true" :destroy-on-hidden="true"
@ok="handleConfirm" @ok="handleConfirm"
@cancel="closeModal" @cancel="closeModal"
> >

View File

@ -231,7 +231,7 @@ onMounted(async () => {
v-model:open="visible" v-model:open="visible"
title="选择商品" title="选择商品"
width="950px" width="950px"
:destroy-on-close="true" :destroy-on-hidden="true"
:footer="props.multiple ? undefined : null" :footer="props.multiple ? undefined : null"
@ok="handleConfirm" @ok="handleConfirm"
@cancel="closeModal" @cancel="closeModal"

View File

@ -9,7 +9,7 @@ import { confirm, DocAlert, Page } from '@vben/common-ui';
import { ProductSpuStatusEnum } from '@vben/constants'; import { ProductSpuStatusEnum } from '@vben/constants';
import { downloadFileFromBlobPart } from '@vben/utils'; import { downloadFileFromBlobPart } from '@vben/utils';
import { message, Tabs } from 'antdv-next'; import { message, TabPane, Tabs } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {

View File

@ -92,7 +92,7 @@ if (!formData.value._local) {
<span class="mb-2 ml-2 text-xs text-gray-400">建议宽度750</span> <span class="mb-2 ml-2 text-xs text-gray-400">建议宽度750</span>
</div> </div>
</FormItem> </FormItem>
<Card class="property-group" :bordered="false"> <Card class="property-group" variant="borderless">
<template #title> <template #title>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span>内容小程序</span> <span>内容小程序</span>
@ -110,7 +110,7 @@ if (!formData.value._local) {
</template> </template>
<NavigationBarCellProperty v-model="formData.mpCells" is-mp /> <NavigationBarCellProperty v-model="formData.mpCells" is-mp />
</Card> </Card>
<Card class="property-group" :bordered="false"> <Card class="property-group" variant="borderless">
<template #title> <template #title>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span>内容非小程序</span> <span>内容非小程序</span>

View File

@ -20,7 +20,7 @@ defineProps<{ property: NoticeBarProperty }>();
}" }"
> >
<Image :src="property.iconUrl" class="h-[18px]" :preview="false" /> <Image :src="property.iconUrl" class="h-[18px]" :preview="false" />
<Divider type="vertical" /> <Divider orientation="vertical" />
<Carousel <Carousel
:autoplay="true" :autoplay="true"
:dots="false" :dots="false"

View File

@ -39,10 +39,10 @@ const formData = useVModel(props, 'modelValue', emit);
:wrapper-col="{ span: 18 }" :wrapper-col="{ span: 18 }"
:model="formData" :model="formData"
> >
<Card title="商品列表" class="property-group" :bordered="false"> <Card title="商品列表" class="property-group" variant="borderless">
<SpuShowcase v-model="formData.spuIds" /> <SpuShowcase v-model="formData.spuIds" />
</Card> </Card>
<Card title="商品样式" class="property-group" :bordered="false"> <Card title="商品样式" class="property-group" variant="borderless">
<FormItem label="布局" name="type"> <FormItem label="布局" name="type">
<RadioGroup v-model:value="formData.layoutType"> <RadioGroup v-model:value="formData.layoutType">
<Tooltip title="双列" placement="bottom"> <Tooltip title="双列" placement="bottom">
@ -81,7 +81,7 @@ const formData = useVModel(props, 'modelValue', emit);
</div> </div>
</FormItem> </FormItem>
</Card> </Card>
<Card title="角标" class="property-group" :bordered="false"> <Card title="角标" class="property-group" variant="borderless">
<FormItem label="角标" name="badge.show"> <FormItem label="角标" name="badge.show">
<Switch v-model:checked="formData.badge.show" /> <Switch v-model:checked="formData.badge.show" />
</FormItem> </FormItem>
@ -97,7 +97,7 @@ const formData = useVModel(props, 'modelValue', emit);
</UploadImg> </UploadImg>
</FormItem> </FormItem>
</Card> </Card>
<Card title="商品样式" class="property-group" :bordered="false"> <Card title="商品样式" class="property-group" variant="borderless">
<FormItem label="上圆角" name="borderRadiusTop"> <FormItem label="上圆角" name="borderRadiusTop">
<Slider <Slider
v-model:value="formData.borderRadiusTop" v-model:value="formData.borderRadiusTop"

View File

@ -40,10 +40,10 @@ const formData = useVModel(props, 'modelValue', emit);
:wrapper-col="{ span: 18 }" :wrapper-col="{ span: 18 }"
:model="formData" :model="formData"
> >
<Card title="拼团活动" class="property-group" :bordered="false"> <Card title="拼团活动" class="property-group" variant="borderless">
<CombinationShowcase v-model="formData.activityIds" /> <CombinationShowcase v-model="formData.activityIds" />
</Card> </Card>
<Card title="商品样式" class="property-group" :bordered="false"> <Card title="商品样式" class="property-group" variant="borderless">
<FormItem label="布局" name="type"> <FormItem label="布局" name="type">
<RadioGroup v-model:value="formData.layoutType"> <RadioGroup v-model:value="formData.layoutType">
<Tooltip title="单列大图" placement="bottom"> <Tooltip title="单列大图" placement="bottom">
@ -109,7 +109,7 @@ const formData = useVModel(props, 'modelValue', emit);
</div> </div>
</FormItem> </FormItem>
</Card> </Card>
<Card title="角标" class="property-group" :bordered="false"> <Card title="角标" class="property-group" variant="borderless">
<FormItem label="角标" name="badge.show"> <FormItem label="角标" name="badge.show">
<Switch v-model:checked="formData.badge.show" /> <Switch v-model:checked="formData.badge.show" />
</FormItem> </FormItem>
@ -120,7 +120,7 @@ const formData = useVModel(props, 'modelValue', emit);
</UploadImg> </UploadImg>
</FormItem> </FormItem>
</Card> </Card>
<Card title="按钮" class="property-group" :bordered="false"> <Card title="按钮" class="property-group" variant="borderless">
<FormItem label="按钮类型" name="btnBuy.type"> <FormItem label="按钮类型" name="btnBuy.type">
<RadioGroup v-model:value="formData.btnBuy.type"> <RadioGroup v-model:value="formData.btnBuy.type">
<RadioButton value="text">文字</RadioButton> <RadioButton value="text">文字</RadioButton>
@ -152,7 +152,7 @@ const formData = useVModel(props, 'modelValue', emit);
</FormItem> </FormItem>
</template> </template>
</Card> </Card>
<Card title="商品样式" class="property-group" :bordered="false"> <Card title="商品样式" class="property-group" variant="borderless">
<FormItem label="上圆角" name="borderRadiusTop"> <FormItem label="上圆角" name="borderRadiusTop">
<Slider <Slider
v-model:value="formData.borderRadiusTop" v-model:value="formData.borderRadiusTop"

View File

@ -307,7 +307,7 @@ onMounted(() => {
</Col> </Col>
<!-- 右侧操作区 --> <!-- 右侧操作区 -->
<Col :span="8"> <Col :span="8">
<Space direction="vertical" size="large" class="flex justify-end"> <Space orientation="vertical" size="large" class="flex justify-end">
<Tooltip title="重置"> <Tooltip title="重置">
<Button @click="handleReset"> <Button @click="handleReset">
<IconifyIcon class="size-5" icon="lucide:refresh-cw" /> <IconifyIcon class="size-5" icon="lucide:refresh-cw" />
@ -466,8 +466,10 @@ onMounted(() => {
<Col :span="6" v-if="selectedComponent?.property"> <Col :span="6" v-if="selectedComponent?.property">
<Card <Card
class="h-[calc(80vh)] px-2 py-4" class="h-[calc(80vh)] px-2 py-4"
:body-style="{ padding: 0 }" :styles="{
:head-style="{ padding: 0, minHeight: '40px' }" body: { padding: 0 },
header: { padding: 0, minHeight: '40px' },
}"
> >
<!-- 组件名称 --> <!-- 组件名称 -->
<template #title> <template #title>

View File

@ -10,7 +10,7 @@ defineOptions({ name: 'VerticalSpace' });
<template> <template>
<Space v-bind="$attrs"> <Space v-bind="$attrs">
<Space.Compact direction="vertical"> <Space.Compact orientation="vertical">
<slot></slot> <slot></slot>
</Space.Compact> </Space.Compact>
</Space> </Space>

View File

@ -86,7 +86,7 @@ defineExpose({
v-model:open="visible" v-model:open="visible"
title="选择优惠券" title="选择优惠券"
width="65%" width="65%"
:destroy-on-close="true" :destroy-on-hidden="true"
@ok="handleConfirm" @ok="handleConfirm"
@cancel="closeModal" @cancel="closeModal"
> >

View File

@ -170,7 +170,7 @@ async function handleSendMessage(event: any) {
} }
// 1. // 1.
if (isEmpty(unref(message.value)?.trim())) { if (isEmpty(unref(message.value)?.trim())) {
notification.warning({ message: '请输入消息后再发送哦!' }); notification.warning({ title: '请输入消息后再发送哦!' });
message.value = ''; message.value = '';
return; return;
} }

View File

@ -85,7 +85,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false" title="会员地域分布" class="h-full"> <Card variant="borderless" title="会员地域分布" class="h-full">
<Spin :spinning="loading"> <Spin :spinning="loading">
<div class="flex gap-4"> <div class="flex gap-4">
<div class="w-2/5"> <div class="w-2/5">

View File

@ -46,7 +46,7 @@ const calculateRelativeRate = (value?: number, reference?: number) => {
</script> </script>
<template> <template>
<Card :bordered="false" :loading="loading"> <Card variant="borderless" :loading="loading">
<template #title> <template #title>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<span>会员概览</span> <span>会员概览</span>

View File

@ -54,7 +54,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false" title="会员性别比例" class="h-full"> <Card variant="borderless" title="会员性别比例" class="h-full">
<Spin :spinning="loading"> <Spin :spinning="loading">
<EchartsUI ref="chartRef" /> <EchartsUI ref="chartRef" />
</Spin> </Spin>

View File

@ -48,7 +48,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<Card :bordered="false" title="会员终端" class="h-full"> <Card variant="borderless" title="会员终端" class="h-full">
<Spin :spinning="loading"> <Spin :spinning="loading">
<EchartsUI ref="chartRef" /> <EchartsUI ref="chartRef" />
</Spin> </Spin>

Some files were not shown because too many files have changed in this diff Show More