Pre Merge pull request !344 from XuZhiqiang/feat-antdv-next
commit
fb4b5570b7
|
|
@ -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:*",
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -172,13 +172,15 @@ export default defineComponent({
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
bodyStyle={{ padding: '8px 0' }}
|
style={{ margin: 0 }}
|
||||||
headStyle={{
|
styles={{
|
||||||
|
body: { padding: '8px 0' },
|
||||||
|
header: {
|
||||||
padding: '8px 16px',
|
padding: '8px 16px',
|
||||||
fontSize: '14px',
|
fontSize: '14px',
|
||||||
minHeight: '24px',
|
minHeight: '24px',
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
style={{ margin: 0 }}
|
|
||||||
title={title}
|
title={title}
|
||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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'),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,8 @@ 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="{
|
||||||
|
body: {
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
|
|
@ -73,6 +74,7 @@ async function handleTabsScroll() {
|
||||||
width: '240px',
|
width: '240px',
|
||||||
maxWidth: '240px',
|
maxWidth: '240px',
|
||||||
padding: '15px',
|
padding: '15px',
|
||||||
|
},
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<!-- 头部:头像、名称 -->
|
<!-- 头部:头像、名称 -->
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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="{
|
||||||
|
body: {
|
||||||
margin: 0,
|
margin: 0,
|
||||||
padding: 0,
|
padding: 0,
|
||||||
height: '100%',
|
height: '100%',
|
||||||
position: 'relative',
|
position: 'relative',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
|
},
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<template #title>
|
<template #title>
|
||||||
|
|
|
||||||
|
|
@ -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]">
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ watch(
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
</Button>
|
</Button>
|
||||||
<Divider type="vertical" />
|
<Divider orientation="vertical" />
|
||||||
<Button
|
<Button
|
||||||
size="small"
|
size="small"
|
||||||
type="link"
|
type="link"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
<!-- 错误状态 -->
|
<!-- 错误状态 -->
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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="{
|
||||||
|
body: {
|
||||||
height: 'calc(100% - 112px)',
|
height: 'calc(100% - 112px)',
|
||||||
paddingTop: '12px',
|
paddingTop: '12px',
|
||||||
overflowY: 'auto',
|
overflowY: 'auto',
|
||||||
|
},
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<template #extra>
|
<template #extra>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 &&
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
<!-- 根据当前步骤显示对应的组件 -->
|
<!-- 根据当前步骤显示对应的组件 -->
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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: '时间',
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
<!-- 添加渐变背景层 -->
|
<!-- 添加渐变背景层 -->
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
<!-- 顶部标题区域 -->
|
<!-- 顶部标题区域 -->
|
||||||
|
|
|
||||||
|
|
@ -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: '操作',
|
||||||
|
|
|
||||||
|
|
@ -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: '任务描述',
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
<!-- 顶部标题区域 -->
|
<!-- 顶部标题区域 -->
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
Loading…
Reference in New Issue