feat(@vben/web-antdv-next): migrate ant-design-vue to antdv-next

Migration Summary: ant-design-vue → antdv-next
Core Changes
package.json - Replaced "ant-design-vue": "catalog:" with "antdv-next": "catalog:"

bootstrap.ts - Changed @vben/styles/antd to @vben/styles/antdv-next

adapter/component/index.ts - Major rewrite:

Removed dynamic defineAsyncComponent imports from ant-design-vue/es/...
Added static imports from antdv-next main entry
Renamed RangePicker → DateRangePicker, Textarea → TextArea
Defined local types for Rule, Locale, UploadRequestOption, FileType, Key
Bulk Import Replacements (100+ files)
from ant-design-vue → from antdv-next
from ant-design-vue/es/locale/... → from antdv-next/locale/...
from ant-design-vue/es/... → removed (use main entry)
from ant-design-vue/lib/... → removed (use main entry)
Component API Differences Handled
ant-design-vue	antdv-next	Files affected
Form.Item	FormItem	475 references
Tabs.TabPane	TabPane	240 references
Select.Option	SelectOption	151 references
Descriptions.Item	DescriptionsItem	2 references
Timeline.Item	TimelineItem	2 references
Radio.Group	RadioGroup	20 references
Collapse.Panel	CollapsePanel	9 references
Layout.Content/Sider/Header/Footer	LayoutContent/LayoutSider/...	14 references
Dropdown#overlay slot	Dropdown#popupRender	6 references
RangePicker	DateRangePicker	15+ references
Textarea	TextArea	37 references
ButtonGroup	Space (fallback)	12 references
Known Issues (requires manual attention)
List component - Not available in antdv-next. 4 files have TODO comments where List/List.Item/List.Item.Meta are used
@form-create/ant-design-vue - Kept as-is (compatible with antdv-next at runtime)
Type errors - ~366 type errors remain (vs 189 in web-antd), mostly pre-existing business logic issues and minor API differences
pull/342/head
XuZhiqiang 2026-05-12 15:30:08 +08:00
parent 0fced45a9c
commit 40f0ba71f5
840 changed files with 2562 additions and 2096 deletions

View File

@ -46,7 +46,7 @@
"@videojs-player/vue": "catalog:",
"@vueuse/core": "catalog:",
"@vueuse/integrations": "catalog:",
"ant-design-vue": "catalog:",
"antdv-next": "catalog:",
"benz-amr-recorder": "catalog:",
"bpmn-js": "catalog:",
"bpmn-js-properties-panel": "catalog:",

View File

@ -18,6 +18,7 @@ import type {
MentionsProps,
RadioGroupProps,
RadioProps,
RangePickerProps,
RateProps,
SelectProps,
SpaceProps,
@ -28,8 +29,7 @@ import type {
UploadChangeParam,
UploadFile,
UploadProps,
} from 'ant-design-vue';
import type { RangePickerProps } from 'ant-design-vue/es/date-picker';
} from 'antdv-next';
import type { Component, Ref } from 'vue';
@ -43,7 +43,6 @@ import type { Recordable } from '@vben/types';
import {
computed,
defineAsyncComponent,
defineComponent,
h,
nextTick,
@ -66,7 +65,36 @@ import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { isEmpty } from '@vben/utils';
import { message, Modal, notification } from 'ant-design-vue';
import {
AutoComplete as AutoCompleteComponent,
Button,
Cascader as CascaderComponent,
Checkbox as CheckboxComponent,
CheckboxGroup as CheckboxGroupComponent,
DatePicker as DatePickerComponent,
Divider as DividerComponent,
Image as ImageComponent,
ImagePreviewGroup,
Input as InputComponent,
InputNumber as InputNumberComponent,
InputPassword,
Mentions as MentionsComponent,
message,
Modal,
notification,
Radio as RadioComponent,
RadioGroup as RadioGroupComponent,
DateRangePicker as RangePickerComponent,
Rate as RateComponent,
Select as SelectComponent,
Space as SpaceComponent,
Switch as SwitchComponent,
TextArea as TextareaComponent,
TimePicker as TimePickerComponent,
TimeRangePicker as TimeRangePickerComponent,
TreeSelect as TreeSelectComponent,
Upload as UploadComponent,
} from 'antdv-next';
import { Tinymce as RichTextarea } from '#/components/tinymce';
import { FileUpload, ImageUpload } from '#/components/upload';
@ -80,61 +108,29 @@ type AdapterUploadProps = UploadProps & {
onHandleChange?: (event: UploadChangeParam) => void;
};
const AutoComplete = defineAsyncComponent(
() => import('ant-design-vue/es/auto-complete'),
);
const Button = defineAsyncComponent(() => import('ant-design-vue/es/button'));
const Checkbox = defineAsyncComponent(
() => import('ant-design-vue/es/checkbox'),
);
const CheckboxGroup = defineAsyncComponent(() =>
import('ant-design-vue/es/checkbox').then((res) => res.CheckboxGroup),
);
const DatePicker = defineAsyncComponent(
() => import('ant-design-vue/es/date-picker'),
);
const Divider = defineAsyncComponent(() => import('ant-design-vue/es/divider'));
const Input = defineAsyncComponent(() => import('ant-design-vue/es/input'));
const InputNumber = defineAsyncComponent(
() => import('ant-design-vue/es/input-number'),
);
const InputPassword = defineAsyncComponent(() =>
import('ant-design-vue/es/input').then((res) => res.InputPassword),
);
const Mentions = defineAsyncComponent(
() => import('ant-design-vue/es/mentions'),
);
const Radio = defineAsyncComponent(() => import('ant-design-vue/es/radio'));
const RadioGroup = defineAsyncComponent(() =>
import('ant-design-vue/es/radio').then((res) => res.RadioGroup),
);
const RangePicker = defineAsyncComponent(() =>
import('ant-design-vue/es/date-picker').then((res) => res.RangePicker),
);
const Rate = defineAsyncComponent(() => import('ant-design-vue/es/rate'));
const Select = defineAsyncComponent(() => import('ant-design-vue/es/select'));
const Space = defineAsyncComponent(() => import('ant-design-vue/es/space'));
const Switch = defineAsyncComponent(() => import('ant-design-vue/es/switch'));
const Textarea = defineAsyncComponent(() =>
import('ant-design-vue/es/input').then((res) => res.Textarea),
);
const TimePicker = defineAsyncComponent(
() => import('ant-design-vue/es/time-picker'),
);
const TimeRangePicker = defineAsyncComponent(() =>
import('ant-design-vue/es/time-picker').then((res) => res.TimeRangePicker),
);
const TreeSelect = defineAsyncComponent(
() => import('ant-design-vue/es/tree-select'),
);
const Cascader = defineAsyncComponent(
() => import('ant-design-vue/es/cascader'),
);
const Upload = defineAsyncComponent(() => import('ant-design-vue/es/upload'));
const Image = defineAsyncComponent(() => import('ant-design-vue/es/image'));
const PreviewGroup = defineAsyncComponent(() =>
import('ant-design-vue/es/image').then((res) => res.ImagePreviewGroup),
);
const AutoComplete = AutoCompleteComponent;
const Checkbox = CheckboxComponent;
const CheckboxGroup = CheckboxGroupComponent;
const DatePicker = DatePickerComponent;
const Divider = DividerComponent;
const Input = InputComponent;
const InputNumber = InputNumberComponent;
const Mentions = MentionsComponent;
const Radio = RadioComponent;
const RadioGroup = RadioGroupComponent;
const RangePicker = RangePickerComponent;
const Rate = RateComponent;
const Select = SelectComponent;
const Space = SpaceComponent;
const Switch = SwitchComponent;
const Textarea = TextareaComponent;
const TimePicker = TimePickerComponent;
const TimeRangePicker = TimeRangePickerComponent;
const TreeSelect = TreeSelectComponent;
const Cascader = CascaderComponent;
const Upload = UploadComponent;
const Image = ImageComponent;
const PreviewGroup = ImagePreviewGroup;
const withDefaultPlaceholder = <T extends Component>(
component: T,
@ -745,7 +741,7 @@ async function initComponentAdapter() {
copyPreferencesSuccess: (title, content) => {
notification.success({
description: content,
message: title,
title,
placement: 'bottomRight',
});
},

View File

@ -31,7 +31,7 @@ import {
Popconfirm,
Switch,
Tag,
} from 'ant-design-vue';
} from 'antdv-next';
import { DictTag } from '#/components/dict-tag';
import { $t } from '#/locales';

View File

@ -14,7 +14,7 @@ import {
import { useAccessStore } from '@vben/stores';
import { createApiEncrypt } from '@vben/utils';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useAuthStore } from '#/store';

View File

@ -4,7 +4,7 @@ import { computed } from 'vue';
import { useAntdDesignTokens } from '@vben/hooks';
import { preferences, usePreferences } from '@vben/preferences';
import { App, ConfigProvider, theme } from 'ant-design-vue';
import { App, ConfigProvider, theme } from 'antdv-next';
import { antdLocale } from '#/locales';

View File

@ -6,7 +6,7 @@ import { registerLoadingDirective } from '@vben/common-ui/es/loading';
import { preferences } from '@vben/preferences';
import { initStores } from '@vben/stores';
import '@vben/styles';
import '@vben/styles/antd';
import '@vben/styles/antdv-next';
import { useTitle } from '@vueuse/core';

View File

@ -16,7 +16,7 @@ import {
RadioGroup,
Select,
Tabs,
} from 'ant-design-vue';
} from 'antdv-next';
import { CronDataDefault, CronValueDefault } from './types';
@ -417,20 +417,20 @@ function inputChange() {
>
<template #addonAfter>
<Select v-model:value="select" placeholder="生成器" class="w-36">
<Select.Option value="0 * * * * ?">每分钟</Select.Option>
<Select.Option value="0 0 * * * ?">每小时</Select.Option>
<Select.Option value="0 0 0 * * ?">每天零点</Select.Option>
<Select.Option value="0 0 0 1 * ?">每月一号零点</Select.Option>
<Select.Option value="0 0 0 L * ?">每月最后一天零点</Select.Option>
<Select.Option value="0 0 0 ? * 1">每周星期日零点</Select.Option>
<Select.Option
<SelectOption value="0 * * * * ?">每分钟</SelectOption>
<SelectOption value="0 0 * * * ?">每小时</SelectOption>
<SelectOption value="0 0 0 * * ?">每天零点</SelectOption>
<SelectOption value="0 0 0 1 * ?">每月一号零点</SelectOption>
<SelectOption value="0 0 0 L * ?">每月最后一天零点</SelectOption>
<SelectOption value="0 0 0 ? * 1">每周星期日零点</SelectOption>
<SelectOption
v-for="(item, index) in shortcuts"
:key="index"
:value="item.value"
>
{{ item.text }}
</Select.Option>
<Select.Option value="custom">自定义</Select.Option>
</SelectOption>
<SelectOption value="custom">自定义</SelectOption>
</Select>
</template>
</Input>
@ -443,7 +443,7 @@ function inputChange() {
>
<div class="sc-cron">
<Tabs>
<Tabs.TabPane key="second">
<TabPane key="second">
<template #tab>
<div class="sc-cron-num">
<h2></h2>
@ -451,15 +451,15 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.second.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
<RadioButton value="2">间隔</RadioButton>
<RadioButton value="3">指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.second.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.second.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.second.range.start"
:max="59"
@ -473,8 +473,8 @@ function inputChange() {
:min="0"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.second.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.second.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.second.loop.start"
:max="59"
@ -489,25 +489,25 @@ function inputChange() {
controls-position="right"
/>
秒执行一次
</Form.Item>
<Form.Item v-if="cronValue.second.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.second.type === '3'" label="指定">
<Select
v-model:value="cronValue.second.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.second"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="minute">
<TabPane key="minute">
<template #tab>
<div class="sc-cron-num">
<h2>分钟</h2>
@ -515,15 +515,15 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.minute.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
<RadioButton value="2">间隔</RadioButton>
<RadioButton value="3">指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.minute.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.minute.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.minute.range.start"
:max="59"
@ -537,8 +537,8 @@ function inputChange() {
:min="0"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.minute.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.minute.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.minute.loop.start"
:max="59"
@ -553,25 +553,25 @@ function inputChange() {
controls-position="right"
/>
分钟执行一次
</Form.Item>
<Form.Item v-if="cronValue.minute.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.minute.type === '3'" label="指定">
<Select
v-model:value="cronValue.minute.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.minute"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="hour">
<TabPane key="hour">
<template #tab>
<div class="sc-cron-num">
<h2>小时</h2>
@ -579,15 +579,15 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.hour.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
<RadioButton value="2">间隔</RadioButton>
<RadioButton value="3">指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.hour.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.hour.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.hour.range.start"
:max="23"
@ -601,8 +601,8 @@ function inputChange() {
:min="0"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.hour.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.hour.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.hour.loop.start"
:max="23"
@ -617,25 +617,25 @@ function inputChange() {
controls-position="right"
/>
小时执行一次
</Form.Item>
<Form.Item v-if="cronValue.hour.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.hour.type === '3'" label="指定">
<Select
v-model:value="cronValue.hour.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.hour"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="day">
<TabPane key="day">
<template #tab>
<div class="sc-cron-num">
<h2></h2>
@ -643,7 +643,7 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.day.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
@ -652,8 +652,8 @@ function inputChange() {
<RadioButton value="4">本月最后一天</RadioButton>
<RadioButton value="5">不指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.day.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.day.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.day.range.start"
:max="31"
@ -667,8 +667,8 @@ function inputChange() {
:min="1"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.day.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.day.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.day.loop.start"
:max="31"
@ -683,25 +683,25 @@ function inputChange() {
controls-position="right"
/>
天执行一次
</Form.Item>
<Form.Item v-if="cronValue.day.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.day.type === '3'" label="指定">
<Select
v-model:value="cronValue.day.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.day"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="month">
<TabPane key="month">
<template #tab>
<div class="sc-cron-num">
<h2></h2>
@ -709,15 +709,15 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.month.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
<RadioButton value="2">间隔</RadioButton>
<RadioButton value="3">指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.month.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.month.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.month.range.start"
:max="12"
@ -731,8 +731,8 @@ function inputChange() {
:min="1"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.month.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.month.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.month.loop.start"
:max="12"
@ -747,25 +747,25 @@ function inputChange() {
controls-position="right"
/>
月执行一次
</Form.Item>
<Form.Item v-if="cronValue.month.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.month.type === '3'" label="指定">
<Select
v-model:value="cronValue.month.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.month"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="week">
<TabPane key="week">
<template #tab>
<div class="sc-cron-num">
<h2></h2>
@ -773,7 +773,7 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.week.type">
<RadioButton value="0">任意值</RadioButton>
<RadioButton value="1">范围</RadioButton>
@ -782,10 +782,10 @@ function inputChange() {
<RadioButton value="4">本月最后一周</RadioButton>
<RadioButton value="5">不指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.week.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.week.type === '1'" label="范围">
<Select v-model:value="cronValue.week.range.start">
<Select.Option
<SelectOption
v-for="(item, index) in data.week"
:key="index"
:label="item.label"
@ -794,15 +794,15 @@ function inputChange() {
</Select>
<span style="padding: 0 15px">-</span>
<Select v-model:value="cronValue.week.range.end">
<Select.Option
<SelectOption
v-for="(item, index) in data.week"
:key="index"
:label="item.label"
:value="item.value"
/>
</Select>
</Form.Item>
<Form.Item v-if="cronValue.week.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.week.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.week.loop.start"
@ -812,7 +812,7 @@ function inputChange() {
/>
周的星期
<Select v-model:value="cronValue.week.loop.end">
<Select.Option
<SelectOption
v-for="(item, index) in data.week"
:key="index"
:label="item.label"
@ -820,35 +820,35 @@ function inputChange() {
/>
</Select>
执行一次
</Form.Item>
<Form.Item v-if="cronValue.week.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.week.type === '3'" label="指定">
<Select
v-model:value="cronValue.week.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.week"
:key="index"
:label="item.label"
:value="item.value"
/>
</Select>
</Form.Item>
<Form.Item v-if="cronValue.week.type === '4'" label="最后一周">
</FormItem>
<FormItem v-if="cronValue.week.type === '4'" label="最后一周">
<Select v-model:value="cronValue.week.last">
<Select.Option
<SelectOption
v-for="(item, index) in data.week"
:key="index"
:label="item.label"
:value="item.value"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
<Tabs.TabPane key="year">
<TabPane key="year">
<template #tab>
<div class="sc-cron-num">
<h2></h2>
@ -856,7 +856,7 @@ function inputChange() {
</div>
</template>
<Form>
<Form.Item label="类型">
<FormItem label="类型">
<RadioGroup v-model:value="cronValue.year.type">
<RadioButton value="-1">忽略</RadioButton>
<RadioButton value="0">任意值</RadioButton>
@ -864,8 +864,8 @@ function inputChange() {
<RadioButton value="2">间隔</RadioButton>
<RadioButton value="3">指定</RadioButton>
</RadioGroup>
</Form.Item>
<Form.Item v-if="cronValue.year.type === '1'" label="范围">
</FormItem>
<FormItem v-if="cronValue.year.type === '1'" label="范围">
<InputNumber
v-model:value="cronValue.year.range.start"
controls-position="right"
@ -875,8 +875,8 @@ function inputChange() {
v-model:value="cronValue.year.range.end"
controls-position="right"
/>
</Form.Item>
<Form.Item v-if="cronValue.year.type === '2'" label="间隔">
</FormItem>
<FormItem v-if="cronValue.year.type === '2'" label="间隔">
<InputNumber
v-model:value="cronValue.year.loop.start"
controls-position="right"
@ -888,23 +888,23 @@ function inputChange() {
controls-position="right"
/>
年执行一次
</Form.Item>
<Form.Item v-if="cronValue.year.type === '3'" label="指定">
</FormItem>
<FormItem v-if="cronValue.year.type === '3'" label="指定">
<Select
v-model:value="cronValue.year.appoint"
mode="multiple"
style="width: 100%"
>
<Select.Option
<SelectOption
v-for="(item, index) in data.year"
:key="index"
:label="item"
:value="item"
/>
</Select>
</Form.Item>
</FormItem>
</Form>
</Tabs.TabPane>
</TabPane>
</Tabs>
</div>

View File

@ -9,7 +9,7 @@ import { useVbenModal } from '@vben/common-ui';
import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { Button, message } from 'ant-design-vue';
import { Button, message } from 'antdv-next';
import cropperModal from './cropper-modal.vue';

View File

@ -8,14 +8,7 @@ import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { dataURLtoBlob, isFunction } from '@vben/utils';
import {
Avatar,
Button,
message,
Space,
Tooltip,
Upload,
} from 'ant-design-vue';
import { Avatar, Button, message, Space, Tooltip, Upload } from 'antdv-next';
import CropperImage from './cropper.vue';

View File

@ -1,4 +1,4 @@
import type { ButtonProps } from 'ant-design-vue';
import type { ButtonProps } from 'antdv-next';
import type Cropper from 'cropperjs';
import type { CSSProperties } from 'vue';

View File

@ -1,5 +1,5 @@
<script lang="tsx">
import type { DescriptionsProps } from 'ant-design-vue/es/descriptions';
import type { DescriptionsProps } from 'antdv-next';
import type { CSSProperties, PropType, Slots } from 'vue';
@ -9,7 +9,7 @@ import { computed, defineComponent, ref, unref, useAttrs } from 'vue';
import { get, getNestedValue, isFunction } from '@vben/utils';
import { Card, Descriptions } from 'ant-design-vue';
import { Card, Descriptions } from 'antdv-next';
const props = {
bordered: { default: true, type: Boolean },
@ -126,7 +126,7 @@ export default defineComponent({
const width = contentMinWidth;
return (
<Descriptions.Item
<DescriptionsItem
key={field}
label={renderLabel(item)}
span={span}
@ -143,7 +143,7 @@ export default defineComponent({
};
return <div style={style}>{getContent()}</div>;
}}
</Descriptions.Item>
</DescriptionsItem>
);
})
.filter((item) => !!item);

View File

@ -1,4 +1,4 @@
import type { DescriptionsProps } from 'ant-design-vue/es/descriptions';
import type { DescriptionsProps } from 'antdv-next';
import type { JSX } from 'vue/jsx-runtime';
import type { CSSProperties, VNode } from 'vue';

View File

@ -4,7 +4,7 @@ import { computed } from 'vue';
import { getDictObj } from '@vben/hooks';
import { isValidColor, TinyColor } from '@vben/utils';
import { Tag } from 'ant-design-vue';
import { Tag } from 'antdv-next';
interface DictTagProps {
type: string; //

View File

@ -4,7 +4,7 @@ import { onMounted, ref, watch } from 'vue';
import { AreaLevelEnum } from '@vben/constants';
import { Cascader } from 'ant-design-vue';
import { Cascader } from 'antdv-next';
import { getAreaTree } from '#/api/system/area';

View File

@ -5,7 +5,7 @@ import { onMounted, ref, watch } from 'vue';
import { useUserStore } from '@vben/stores';
import { handleTree } from '@vben/utils';
import { TreeSelect } from 'ant-design-vue';
import { TreeSelect } from 'antdv-next';
import { requestClient } from '#/api/request';

View File

@ -13,7 +13,7 @@ import {
RadioGroup,
Select,
SelectOption,
} from 'ant-design-vue';
} from 'antdv-next';
defineOptions({ name: 'DictSelect' });

View File

@ -12,7 +12,7 @@ import {
RadioGroup,
Select,
SelectOption,
} from 'ant-design-vue';
} from 'antdv-next';
import { requestClient } from '#/api/request';

View File

@ -4,7 +4,7 @@ import { nextTick, reactive, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { Button, Form, Input, Select, Space } from 'ant-design-vue';
import { Button, Form, Input, Select, Space } from 'antdv-next';
import { loadBaiduMapSdk } from './utils';
@ -229,7 +229,7 @@ defineExpose({ open });
<div class="w-full">
<!-- 第一行位置搜索 -->
<Form :label-col="{ span: 4 }">
<Form.Item label="定位位置">
<FormItem label="定位位置">
<Select
v-model:value="state.address"
:filter-option="false"
@ -247,9 +247,9 @@ defineExpose({ open });
@search="autoSearch"
@select="handleAddressSelect"
/>
</Form.Item>
</FormItem>
<!-- 第二行坐标显示 -->
<Form.Item label="当前坐标">
<FormItem label="当前坐标">
<Space>
<Input
:value="state.longitude"
@ -264,7 +264,7 @@ defineExpose({ open });
style="width: 180px"
/>
</Space>
</Form.Item>
</FormItem>
</Form>
<!-- 第三行地图 -->
<div

View File

@ -6,7 +6,7 @@ import { computed, onMounted, ref } from 'vue';
import { MarkdownIt } from '@vben/plugins/markmap';
import { useClipboard } from '@vueuse/core';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import hljs from 'highlight.js';
import 'highlight.js/styles/vs2015.min.css';

View File

@ -5,7 +5,7 @@ import { DICT_TYPE } from '@vben/constants';
import { getDictLabel, getDictObj } from '@vben/hooks';
import { formatDateTime } from '@vben/utils';
import { Tag, Timeline } from 'ant-design-vue';
import { Tag, Timeline } from 'antdv-next';
defineOptions({ name: 'OperateLogV2' });
@ -37,7 +37,7 @@ function getUserTypeColor(userType: number) {
<template>
<div class="pt-5">
<Timeline>
<Timeline.Item v-for="log in logList" :key="log.id">
<TimelineItem v-for="log in logList" :key="log.id">
<template #dot>
<span
:style="{ backgroundColor: getUserTypeColor(log.userType) }"
@ -53,7 +53,7 @@ function getUserTypeColor(userType: number) {
<Tag color="success" class="!mr-0">{{ log.userName }}</Tag>
<span>{{ log.action }}</span>
</div>
</Timeline.Item>
</TimelineItem>
</Timeline>
</div>
</template>

View File

@ -3,7 +3,7 @@ import type { Dayjs } from 'dayjs';
import { onMounted, ref } from 'vue';
import { DatePicker, Radio, RadioGroup } from 'ant-design-vue';
import { Radio, RadioGroup } from 'antdv-next';
import { getRangePickerDefaultProps } from '#/utils/rangePickerProps';
@ -75,7 +75,7 @@ onMounted(() => {
{{ option.label }}
</Radio>
</RadioGroup>
<DatePicker.RangePicker
<DateRangePicker
v-model:value="times"
:format="rangePickerProps.format"
:value-format="rangePickerProps.valueFormat"

View File

@ -11,14 +11,7 @@ import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { isBoolean, isFunction } from '@vben/utils';
import {
Button,
Dropdown,
Menu,
Popconfirm,
Space,
Tooltip,
} from 'ant-design-vue';
import { Button, Dropdown, Menu, Popconfirm, Space, Tooltip } from 'antdv-next';
const props = defineProps({
actions: {
@ -193,7 +186,7 @@ watch(
</template>
</Button>
</slot>
<template #overlay>
<template #popupRender>
<Menu>
<Menu.Item
v-for="(action, index) in getDropdownList"

View File

@ -1,8 +1,4 @@
import type {
ButtonProps,
ButtonType,
} from 'ant-design-vue/es/button/buttonTypes';
import type { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip';
import type { ButtonProps, ButtonType, TooltipProps } from 'antdv-next';
export interface PopConfirm {
title: string;

View File

@ -1,14 +1,14 @@
<script lang="ts" setup>
import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import { computed, ref } from 'vue';
import { $t } from '@vben/locales';
import { Button, Upload } from 'ant-design-vue';
import { Button, Upload } from 'antdv-next';
import { useUpload } from '#/components/upload/use-upload';
type UploadRequestOption = any;
defineOptions({ name: 'TinymceImageUpload' });
const props = defineProps({

View File

@ -1,6 +1,5 @@
<script lang="ts" setup>
import type { UploadFile, UploadProps } from 'ant-design-vue';
import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import type { UploadFile, UploadProps } from 'antdv-next';
import type { FileUploadProps } from './typing';
@ -12,11 +11,13 @@ import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { checkFileType, isFunction, isObject, isString } from '@vben/utils';
import { Button, message, Upload } from 'ant-design-vue';
import { Button, message, Upload } from 'antdv-next';
import { UploadResultStatus } from './typing';
import { useUpload, useUploadType } from './use-upload';
type UploadRequestOption = any;
defineOptions({ name: 'FileUpload', inheritAttrs: false });
const props = withDefaults(defineProps<FileUploadProps>(), {

View File

@ -1,6 +1,5 @@
<script lang="ts" setup>
import type { UploadFile, UploadProps } from 'ant-design-vue';
import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import type { UploadFile, UploadProps } from 'antdv-next';
import type { FileUploadProps } from './typing';
@ -18,11 +17,13 @@ import {
isString,
} from '@vben/utils';
import { message, Modal, Upload } from 'ant-design-vue';
import { message, Modal, Upload } from 'antdv-next';
import { UploadResultStatus } from './typing';
import { useUpload, useUploadType } from './use-upload';
type UploadRequestOption = any;
defineOptions({ name: 'ImageUpload', inheritAttrs: false });
const props = withDefaults(defineProps<FileUploadProps>(), {

View File

@ -1,12 +1,12 @@
<script setup lang="ts">
import type { InputProps, TextAreaProps } from 'ant-design-vue';
import type { InputProps, TextAreaProps } from 'antdv-next';
import type { FileUploadProps } from './typing';
import { computed } from 'vue';
import { useVModel } from '@vueuse/core';
import { Input, Textarea } from 'ant-design-vue';
import { Input, TextArea } from 'antdv-next';
import FileUpload from './file-upload.vue';
@ -69,7 +69,7 @@ const fileUploadProps = computed(() => {
</template>
</Input>
<div v-else class="relative w-full">
<Textarea readonly :rows="4" v-bind="textareaProps" />
<TextArea readonly :rows="4" v-bind="textareaProps" />
<div class="absolute bottom-2 right-2">
<FileUpload v-bind="fileUploadProps" @return-text="handleReturnText" />
</div>

View File

@ -27,7 +27,7 @@ import { preferences } from '@vben/preferences';
import { useAccessStore, useUserStore } from '@vben/stores';
import { formatDateTime, openWindow } from '@vben/utils';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import {
getUnreadNotifyMessageCount,

View File

@ -1,5 +1,3 @@
import type { Locale } from 'ant-design-vue/es/locale';
import type { App } from 'vue';
import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
@ -13,10 +11,12 @@ import {
} from '@vben/locales';
import { preferences } from '@vben/preferences';
import antdEnLocale from 'ant-design-vue/es/locale/en_US';
import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN';
import antdEnLocale from 'antdv-next/locale/en_US';
import antdDefaultLocale from 'antdv-next/locale/zh_CN';
import dayjs from 'dayjs';
type Locale = any;
const antdLocale = ref<Locale>(antdDefaultLocale);
const modules = import.meta.glob('./langs/**/*.json');

View File

@ -30,7 +30,7 @@ import {
Tabs,
Tag,
Transfer,
} from 'ant-design-vue';
} from 'antdv-next';
// ======================= 自定义组件 =======================
import { useApiSelect } from '#/components/form-create';

View File

@ -6,7 +6,7 @@ import { preferences } from '@vben/preferences';
import { useAccessStore, useDictStore, useUserStore } from '@vben/stores';
import { startProgress, stopProgress } from '@vben/utils';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { getSimpleDictDataList } from '#/api/system/dict/data';
import { accessRoutes, coreRouteNames } from '#/router/routes';

View File

@ -9,7 +9,7 @@ import { LOGIN_PATH } from '@vben/constants';
import { preferences } from '@vben/preferences';
import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores';
import { notification } from 'ant-design-vue';
import { notification } from 'antdv-next';
import { defineStore } from 'pinia';
import {

View File

@ -1,4 +1,4 @@
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
enum UploadType {
Image = 'image',

View File

@ -11,7 +11,7 @@ import { isTenantEnable } from '@vben/hooks';
import { $t } from '@vben/locales';
import { useAccessStore } from '@vben/stores';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { sendSmsCode } from '#/api';
import { getTenantByWebsite, getTenantSimpleList } from '#/api/core/auth';

View File

@ -12,7 +12,7 @@ import { isTenantEnable } from '@vben/hooks';
import { $t } from '@vben/locales';
import { useAccessStore } from '@vben/stores';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { sendSmsCode, smsResetPassword } from '#/api';
import { getTenantByWebsite, getTenantSimpleList } from '#/api/core/auth';

View File

@ -10,7 +10,7 @@ import { ProfileBaseSetting, z } from '@vben/common-ui';
import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { updateUserProfile } from '#/api/system/user/profile';
import { $t } from '#/locales';

View File

@ -6,7 +6,7 @@ import { onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { useUserStore } from '@vben/stores';
import { Card, Tabs } from 'ant-design-vue';
import { Card, Tabs } from 'antdv-next';
import { getAuthPermissionInfoApi } from '#/api';
import { getUserProfile } from '#/api/system/user/profile';
@ -50,15 +50,15 @@ onMounted(loadProfile);
<!-- 右侧 标签页 -->
<Card class="ml-3 w-3/5">
<Tabs v-model:active-key="activeName" class="-mt-4">
<Tabs.TabPane key="basicInfo" tab="基本设置">
<TabPane key="basicInfo" tab="基本设置">
<BaseInfo :profile="profile" @success="refreshProfile" />
</Tabs.TabPane>
<Tabs.TabPane key="resetPwd" tab="密码设置">
</TabPane>
<TabPane key="resetPwd" tab="密码设置">
<ResetPwd />
</Tabs.TabPane>
<Tabs.TabPane key="userSocial" tab="社交绑定" force-render>
</TabPane>
<TabPane key="userSocial" tab="社交绑定" force-render>
<UserSocial @update:active-name="activeName = $event" />
</Tabs.TabPane>
</TabPane>
<!-- TODO @芋艿在线设备 -->
</Tabs>
</Card>

View File

@ -9,7 +9,7 @@ import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { $t } from '@vben/locales';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useVbenForm, z } from '#/adapter/form';
import { updateUserProfile } from '#/api/system/user/profile';

View File

@ -7,7 +7,7 @@ import { IconifyIcon } from '@vben/icons';
import { preferences } from '@vben/preferences';
import { formatDateTime } from '@vben/utils';
import { Descriptions, DescriptionsItem, Tooltip } from 'ant-design-vue';
import { Descriptions, DescriptionsItem, Tooltip } from 'antdv-next';
import { updateUserProfile } from '#/api/system/user/profile';
import { CropperAvatar } from '#/components/cropper';

View File

@ -3,7 +3,7 @@ import type { Recordable } from '@vben/types';
import { $t } from '@vben/locales';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useVbenForm, z } from '#/adapter/form';
import { updateUserPassword } from '#/api/system/user/profile';

View File

@ -10,7 +10,7 @@ import { DICT_TYPE, SystemUserSocialTypeEnum } from '@vben/constants';
import { getDictLabel } from '@vben/hooks';
import { getUrlValue } from '@vben/utils';
import { Button, Card, Image, message } from 'ant-design-vue';
import { Button, Card, Image, message } from 'antdv-next';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { socialAuthRedirect } from '#/api/core/auth';

View File

@ -5,7 +5,7 @@ import { computed } from 'vue';
import { ProfilePasswordSetting, z } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
const formSchema = computed((): VbenFormSchema[] => {
return [

View File

@ -17,7 +17,7 @@ export function useFormSchema(): VbenFormSchema[] {
{
fieldName: 'systemMessage',
label: '角色设定',
component: 'Textarea',
component: 'TextArea',
componentProps: {
rows: 4,
placeholder: '请输入角色设定',

View File

@ -8,7 +8,7 @@ import { useRoute } from 'vue-router';
import { alert, confirm, Page, useVbenModal } from '@vben/common-ui';
import { IconifyIcon } from '@vben/icons';
import { Button, Layout, message, Switch } from 'ant-design-vue';
import { Button, Layout, message, Switch } from 'antdv-next';
import { getChatConversationMy } from '#/api/ai/chat/conversation';
import {
@ -553,7 +553,7 @@ onMounted(async () => {
<!-- 右侧详情部分 -->
<Layout class="mx-4 bg-card">
<Layout.Header
<LayoutHeader
class="flex !h-12 items-center justify-between border-b border-border !bg-card !px-4"
>
<div class="text-lg font-bold">
@ -585,9 +585,9 @@ onMounted(async () => {
<IconifyIcon icon="lucide:arrow-up" color="#787878" />
</Button>
</div>
</Layout.Header>
</LayoutHeader>
<Layout.Content class="relative m-0 h-full w-full p-0">
<LayoutContent class="relative m-0 h-full w-full p-0">
<div class="absolute inset-0 m-0 overflow-y-hidden p-0">
<MessageLoading v-if="activeMessageListLoading" />
<MessageNewConversation
@ -612,9 +612,9 @@ onMounted(async () => {
@on-refresh="handleMessageRefresh"
/>
</div>
</Layout.Content>
</LayoutContent>
<Layout.Footer class="flex flex-col !bg-card !p-0">
<LayoutFooter class="flex flex-col !bg-card !p-0">
<form
class="mx-4 mb-8 mt-2 flex flex-col rounded-xl border border-border p-2"
>
@ -668,7 +668,7 @@ onMounted(async () => {
</Button>
</div>
</form>
</Layout.Footer>
</LayoutFooter>
</Layout>
</Layout>
<FormModal @success="handleConversationUpdateSuccess" />

View File

@ -8,7 +8,7 @@ import { h, onMounted, ref, toRefs, watch } from 'vue';
import { confirm, prompt, useVbenDrawer } from '@vben/common-ui';
import { IconifyIcon, SvgGptIcon } from '@vben/icons';
import { Avatar, Button, Empty, Input, Layout, message } from 'ant-design-vue';
import { Avatar, Button, Empty, Input, message } from 'antdv-next';
import {
createChatConversationMy,
@ -297,7 +297,7 @@ onMounted(async () => {
</script>
<template>
<Layout.Sider
<LayoutSider
width="280px"
class="relative flex h-full flex-col justify-between overflow-hidden p-4"
>
@ -431,5 +431,5 @@ onMounted(async () => {
<span class="ml-1">清空未置顶对话</span>
</div>
</div>
</Layout.Sider>
</LayoutSider>
</template>

View File

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

View File

@ -4,7 +4,7 @@ import { computed, onUnmounted, ref, watch } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { formatFileSize, getFileIcon } from '@vben/utils';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useUpload } from '#/components/upload/use-upload';

View File

@ -3,7 +3,7 @@ import { computed, ref } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { Tooltip } from 'ant-design-vue';
import { Tooltip } from 'antdv-next';
const props = defineProps<{
segments: {

View File

@ -12,7 +12,7 @@ import { useUserStore } from '@vben/stores';
import { formatDateTime } from '@vben/utils';
import { useClipboard } from '@vueuse/core';
import { Avatar, Button, message } from 'ant-design-vue';
import { Avatar, Button, message } from 'antdv-next';
import { deleteChatMessage } from '#/api/ai/chat/message';
import { MarkdownView } from '#/components/markdown-view';

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { Skeleton } from 'ant-design-vue';
import { Skeleton } from 'antdv-next';
</script>
<template>

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { Button } from 'ant-design-vue';
import { Button } from 'antdv-next';
const emits = defineEmits(['onNewConversation']);

View File

@ -1,7 +1,7 @@
<script setup lang="ts">
import type { PropType } from 'vue';
import { Button } from 'ant-design-vue';
import { Button } from 'antdv-next';
defineProps({
categoryList: {

View File

@ -7,7 +7,7 @@ import { ref } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { Avatar, Button, Card, Dropdown, Menu } from 'ant-design-vue';
import { Avatar, Button, Card, Dropdown, Menu } from 'antdv-next';
const props = defineProps({
loading: {
@ -99,7 +99,7 @@ async function handleTabsScroll() {
<Button size="small">
<IconifyIcon icon="lucide:ellipsis" />
</Button>
<template #overlay>
<template #popupRender>
<Menu>
<Menu.Item @click="handleMoreClick(['delete', role])">
<div class="flex items-center">

View File

@ -8,7 +8,7 @@ import { useRouter } from 'vue-router';
import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { IconifyIcon } from '@vben/icons';
import { Button, Input, Layout, Tabs } from 'ant-design-vue';
import { Button, Input, Layout, Tabs } from 'antdv-next';
import { createChatConversationMy } from '#/api/ai/chat/conversation';
import { deleteMy, getCategoryList, getMyPage } from '#/api/ai/model/chatRole';
@ -180,7 +180,7 @@ onMounted(async () => {
>
<FormModal @success="handlerAddRoleSuccess" />
<Layout.Content class="relative m-0 flex-1 overflow-hidden p-0">
<LayoutContent class="relative m-0 flex-1 overflow-hidden p-0">
<div class="absolute right-0 top--1 z-100 mr-5 mt-5">
<!-- 搜索输入框 -->
<Input.Search
@ -206,7 +206,7 @@ onMounted(async () => {
class="relative h-full p-4"
@tab-click="handleTabsClick"
>
<Tabs.TabPane
<TabPane
key="my-role"
class="flex h-full flex-col overflow-y-auto"
tab="我的角色"
@ -220,8 +220,8 @@ onMounted(async () => {
@on-use="handlerCardUse"
@on-page="handlerCardPage('my')"
/>
</Tabs.TabPane>
<Tabs.TabPane
</TabPane>
<TabPane
key="public-role"
class="flex h-full flex-col overflow-y-auto"
tab="公共角色"
@ -241,9 +241,9 @@ onMounted(async () => {
class="mt-5"
loading
/>
</Tabs.TabPane>
</TabPane>
</Tabs>
</Layout.Content>
</LayoutContent>
</Layout>
</Drawer>
</template>

View File

@ -3,7 +3,7 @@ import { ref } from 'vue';
import { DocAlert, Page } from '@vben/common-ui';
import { Tabs } from 'ant-design-vue';
import { Tabs } from 'antdv-next';
import ChatConversationList from './modules/conversation-list.vue';
import ChatMessageList from './modules/message-list.vue';
@ -18,12 +18,12 @@ const activeTabName = ref('conversation');
</template>
<Tabs v-model:active-key="activeTabName">
<Tabs.TabPane tab="对话列表" key="conversation">
<TabPane tab="对话列表" key="conversation">
<ChatConversationList />
</Tabs.TabPane>
<Tabs.TabPane tab="消息列表" key="message">
</TabPane>
<TabPane tab="消息列表" key="message">
<ChatMessageList />
</Tabs.TabPane>
</TabPane>
</Tabs>
</Page>
</template>

View File

@ -4,7 +4,7 @@ import type { AiChatConversationApi } from '#/api/ai/chat/conversation';
import { Page } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {

View File

@ -4,7 +4,7 @@ import type { AiChatConversationApi } from '#/api/ai/chat/conversation';
import { Page } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {

View File

@ -7,7 +7,7 @@ import { nextTick, onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { AiModelTypeEnum, AiPlatformEnum } from '@vben/constants';
import { Segmented } from 'ant-design-vue';
import { Segmented } from 'antdv-next';
import { getModelSimpleList } from '#/api/ai/model/model';

View File

@ -9,7 +9,7 @@ import { confirm } from '@vben/common-ui';
import { AiImageStatusEnum } from '@vben/constants';
import { IconifyIcon } from '@vben/icons';
import { Button, Card, Image, message } from 'ant-design-vue';
import { Button, Card, Image, message } from 'antdv-next';
const props = defineProps({
detail: {

View File

@ -12,7 +12,7 @@ import {
OtherPlatformEnum,
} from '@vben/constants';
import { Button, InputNumber, Select, Space, Textarea } from 'ant-design-vue';
import { Button, InputNumber, Select, Space, TextArea } from 'antdv-next';
import { drawImage } from '#/api/ai/image';
@ -108,7 +108,7 @@ defineExpose({ settingValues });
<div class="prompt">
<b>画面描述</b>
<p>建议使用形容词 + 动词 + 风格的格式使用隔开</p>
<Textarea
<TextArea
v-model:value="prompt"
:maxlength="1024"
:rows="5"
@ -148,13 +148,13 @@ defineExpose({ settingValues });
class="!w-80"
@change="handlerPlatformChange"
>
<Select.Option
<SelectOption
v-for="item in OtherPlatformEnum"
:key="item.key"
:value="item.key"
>
{{ item.name }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>
@ -170,13 +170,13 @@ defineExpose({ settingValues });
size="large"
class="!w-80"
>
<Select.Option
<SelectOption
v-for="item in platformModels"
:key="item.id"
:value="item.id"
>
{{ item.name }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>

View File

@ -16,7 +16,7 @@ import {
ImageHotWords,
} from '@vben/constants';
import { Button, Image, message, Space, Textarea } from 'ant-design-vue';
import { Button, Image, message, Space, TextArea } from 'antdv-next';
import { drawImage } from '#/api/ai/image';
@ -144,7 +144,7 @@ defineExpose({ settingValues });
<div class="prompt">
<b>画面描述</b>
<p>建议使用"形容词 + 动词 + 风格"的格式使用""隔开</p>
<Textarea
<TextArea
v-model:value="prompt"
:maxlength="1024"
:rows="5"

View File

@ -12,7 +12,7 @@ import {
} from '@vben/constants';
import { formatDateTime } from '@vben/utils';
import { Image } from 'ant-design-vue';
import { Image } from 'antdv-next';
import { getImageMy } from '#/api/ai/image';

View File

@ -9,7 +9,7 @@ import { AiImageStatusEnum } from '@vben/constants';
import { downloadFileFromImageUrl } from '@vben/utils';
import { useDebounceFn } from '@vueuse/core';
import { Button, Card, message, Pagination } from 'ant-design-vue';
import { Button, Card, message, Pagination } from 'antdv-next';
import {
deleteImageMy,

View File

@ -17,14 +17,7 @@ import {
NijiVersionList,
} from '@vben/constants';
import {
Button,
Image,
message,
Select,
Space,
Textarea,
} from 'ant-design-vue';
import { Button, Image, message, Select, Space, TextArea } from 'antdv-next';
import { midjourneyImagine } from '#/api/ai/image';
import { ImageUpload } from '#/components/upload';
@ -141,7 +134,7 @@ defineExpose({ settingValues });
<div class="prompt">
<b>画面描述</b>
<p>建议使用形容词+动词+风格的格式使用隔开.</p>
<Textarea
<TextArea
v-model:value="prompt"
:maxlength="1024"
:rows="5"
@ -222,13 +215,13 @@ defineExpose({ settingValues });
allow-clear
placeholder="请选择版本"
>
<Select.Option
<SelectOption
v-for="item in versionList"
:key="item.value"
:value="item.value"
>
{{ item.label }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>

View File

@ -20,8 +20,8 @@ import {
message,
Select,
Space,
Textarea,
} from 'ant-design-vue';
TextArea,
} from 'antdv-next';
import { drawImage } from '#/api/ai/image';
@ -132,7 +132,7 @@ defineExpose({ settingValues });
<div class="prompt">
<b>画面描述</b>
<p>建议使用形容词 + 动词 + 风格的格式使用隔开</p>
<Textarea
<TextArea
v-model:value="prompt"
:maxlength="1024"
:rows="5"
@ -169,13 +169,13 @@ defineExpose({ settingValues });
size="large"
class="!w-80"
>
<Select.Option
<SelectOption
v-for="item in StableDiffusionSamplers"
:key="item.key"
:value="item.key"
>
{{ item.name }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>
@ -190,13 +190,13 @@ defineExpose({ settingValues });
size="large"
class="!w-80"
>
<Select.Option
<SelectOption
v-for="item in StableDiffusionClipGuidancePresets"
:key="item.key"
:value="item.key"
>
{{ item.name }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>
@ -211,14 +211,14 @@ defineExpose({ settingValues });
size="large"
class="!w-80"
>
<Select.Option
<SelectOption
v-for="item in StableDiffusionStylePresets"
:key="item.key"
:label="item.name"
:value="item.key"
>
{{ item.name }}
</Select.Option>
</SelectOption>
</Select>
</Space>
</div>

View File

@ -4,7 +4,7 @@ import type { AiImageApi } from '#/api/ai/image';
import { confirm, DocAlert, Page } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteImage, getImagePage, updateImage } from '#/api/ai/image';

View File

@ -6,7 +6,7 @@ import { onMounted, reactive, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { useDebounceFn } from '@vueuse/core';
import { Image, Input, Pagination } from 'ant-design-vue';
import { Image, Input, Pagination } from 'antdv-next';
import { getImagePageMy } from '#/api/ai/image';

View File

@ -28,7 +28,7 @@ export function useFormSchema(): VbenFormSchema[] {
{
fieldName: 'description',
label: '知识库描述',
component: 'Textarea',
component: 'TextArea',
componentProps: {
rows: 3,
placeholder: '请输入知识库描述',

View File

@ -12,7 +12,7 @@ import { Page } from '@vben/common-ui';
import { useTabs } from '@vben/hooks';
import { IconifyIcon } from '@vben/icons';
import { Card } from 'ant-design-vue';
import { Card } from 'antdv-next';
import { getKnowledgeDocument } from '#/api/ai/knowledge/document';

View File

@ -3,7 +3,7 @@ import { computed, inject, onBeforeUnmount, onMounted, ref } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { Button, Progress } from 'ant-design-vue';
import { Button, Progress } from 'antdv-next';
import { getKnowledgeSegmentProcessList } from '#/api/ai/knowledge/segment';

View File

@ -14,7 +14,7 @@ import {
Menu,
message,
Tooltip,
} from 'ant-design-vue';
} from 'antdv-next';
import {
createKnowledgeDocumentList,
@ -191,13 +191,13 @@ onMounted(async () => {
</div>
<div class="mb-5">
<Form :label-col="{ span: 5 }">
<Form.Item label="最大 Token 数">
<FormItem label="最大 Token 数">
<InputNumber
v-model:value="modelData.segmentMaxTokens"
:min="1"
:max="2048"
/>
</Form.Item>
</FormItem>
</Form>
</div>
</div>
@ -220,7 +220,7 @@ onMounted(async () => {
</span>
<IconifyIcon icon="lucide:chevron-down" class="ml-1" />
</div>
<template #overlay>
<template #popupRender>
<Menu>
<Menu.Item
v-for="(file, index) in modelData.list"

View File

@ -1,6 +1,5 @@
<script setup lang="ts">
import type { UploadProps } from 'ant-design-vue';
import type { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import type { UploadProps } from 'antdv-next';
import type { PropType } from 'vue';
@ -11,10 +10,10 @@ import { computed, getCurrentInstance, inject, onMounted, ref } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { generateAcceptedFileTypes } from '@vben/utils';
import { Button, Form, message, UploadDragger } from 'ant-design-vue';
import { Button, Form, message, UploadDragger } from 'antdv-next';
import { useUpload } from '#/components/upload/use-upload';
type UploadRequestOption = any;
const props = defineProps({
modelValue: {
type: Object as PropType<any>,
@ -187,7 +186,7 @@ onMounted(() => {
<template>
<Form ref="formRef" :model="modelData" label-width="0" class="mt-5">
<Form.Item class="mb-5">
<FormItem class="mb-5">
<div class="w-full">
<div
class="w-full rounded-md border-2 border-dashed border-gray-200 p-5 text-center hover:border-blue-500"
@ -248,8 +247,8 @@ onMounted(() => {
</div>
</div>
</div>
</Form.Item>
<Form.Item>
</FormItem>
<FormItem>
<div class="flex w-full justify-end">
<Button
type="primary"
@ -259,6 +258,6 @@ onMounted(() => {
下一步
</Button>
</div>
</Form.Item>
</FormItem>
</Form>
</template>

View File

@ -9,7 +9,7 @@ import { confirm, Page } from '@vben/common-ui';
import { DICT_TYPE } from '@vben/constants';
import { getDictLabel } from '@vben/hooks';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {

View File

@ -31,7 +31,7 @@ export function useFormSchema(): VbenFormSchema[] {
{
fieldName: 'description',
label: '知识库描述',
component: 'Textarea',
component: 'TextArea',
componentProps: {
rows: 3,
placeholder: '请输入知识库描述',

View File

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

View File

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

View File

@ -11,8 +11,8 @@ import {
Empty,
InputNumber,
message,
Textarea,
} from 'ant-design-vue';
TextArea,
} from 'antdv-next';
import { getKnowledge } from '#/api/ai/knowledge/knowledge';
import { searchKnowledgeSegment } from '#/api/ai/knowledge/segment';
@ -100,7 +100,7 @@ onMounted(() => {
</div>
<div>
<div class="relative m-2">
<Textarea
<TextArea
v-model:value="queryParams.content"
:rows="8"
placeholder="请输入文本"

View File

@ -27,7 +27,7 @@ export function useFormSchema(): VbenFormSchema[] {
{
fieldName: 'content',
label: '切片内容',
component: 'Textarea',
component: 'TextArea',
componentProps: {
placeholder: '请输入切片内容',
rows: 6,

View File

@ -9,7 +9,7 @@ import { confirm, Page, useVbenModal } from '@vben/common-ui';
import { DICT_TYPE } from '@vben/constants';
import { getDictLabel } from '@vben/hooks';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {

View File

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

View File

@ -6,7 +6,7 @@ import { nextTick, onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { MindMapContentExample } from '@vben/constants';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { generateMindMap } from '#/api/ai/mindmap';

View File

@ -3,7 +3,7 @@ import { reactive, ref } from 'vue';
import { MindMapContentExample } from '@vben/constants';
import { Button, Textarea } from 'ant-design-vue';
import { Button, TextArea } from 'antdv-next';
defineProps<{
isGenerating: boolean;
@ -32,7 +32,7 @@ defineExpose({
<div class="mt-4 flex-grow overflow-y-auto">
<div>
<b>您的需求</b>
<Textarea
<TextArea
v-model:value="formData.prompt"
:maxlength="1024"
:rows="8"
@ -51,7 +51,7 @@ defineExpose({
</div>
<div class="mt-7">
<b>使用已有内容生成</b>
<Textarea
<TextArea
v-model:value="generatedContent"
:maxlength="1024"
:rows="8"

View File

@ -10,7 +10,7 @@ import {
} from '@vben/plugins/markmap';
import { downloadImageByCanvas } from '@vben/utils';
import { Button, Card, message } from 'ant-design-vue';
import { Button, Card, message } from 'antdv-next';
const props = defineProps<{
generatedContent: string; //

View File

@ -4,7 +4,7 @@ import type { AiMindmapApi } from '#/api/ai/mindmap';
import { DocAlert, Page, useVbenDrawer } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteMindMap, getMindMapPage } from '#/api/ai/mindmap';

View File

@ -4,7 +4,7 @@ import type { AiModelApiKeyApi } from '#/api/ai/model/apiKey';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteApiKey, getApiKeyPage } from '#/api/ai/model/apiKey';

View File

@ -5,7 +5,7 @@ import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useVbenForm } from '#/adapter/form';
import { createApiKey, getApiKey, updateApiKey } from '#/api/ai/model/apiKey';

View File

@ -77,7 +77,7 @@ export function useFormSchema(): VbenFormSchema[] {
},
},
{
component: 'Textarea',
component: 'TextArea',
fieldName: 'description',
label: '角色描述',
componentProps: {
@ -88,7 +88,7 @@ export function useFormSchema(): VbenFormSchema[] {
{
fieldName: 'systemMessage',
label: '角色设定',
component: 'Textarea',
component: 'TextArea',
componentProps: {
placeholder: '请输入角色设定',
},

View File

@ -4,7 +4,7 @@ import type { AiModelChatRoleApi } from '#/api/ai/model/chatRole';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteChatRole, getChatRolePage } from '#/api/ai/model/chatRole';

View File

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

View File

@ -4,7 +4,7 @@ import type { AiModelModelApi } from '#/api/ai/model/model';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteModel, getModelPage } from '#/api/ai/model/model';

View File

@ -5,7 +5,7 @@ import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useVbenForm } from '#/adapter/form';
import { createModel, getModel, updateModel } from '#/api/ai/model/model';

View File

@ -27,7 +27,7 @@ export function useFormSchema(): VbenFormSchema[] {
},
},
{
component: 'Textarea',
component: 'TextArea',
fieldName: 'description',
label: '工具描述',
componentProps: {

View File

@ -4,7 +4,7 @@ import type { AiModelToolApi } from '#/api/ai/model/tool';
import { DocAlert, Page, useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { deleteTool, getToolPage } from '#/api/ai/model/tool';

View File

@ -5,7 +5,7 @@ import { computed, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message } from 'antdv-next';
import { useVbenForm } from '#/adapter/form';
import { createTool, getTool, updateTool } from '#/api/ai/model/tool';

View File

@ -4,7 +4,7 @@ import { inject, reactive, ref } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { formatPast } from '@vben/utils';
import { Image, Slider } from 'ant-design-vue';
import { Image, Slider } from 'antdv-next';
defineOptions({ name: 'AiMusicAudioBarIndex' });

View File

@ -3,7 +3,7 @@ import type { Recordable } from '@vben/types';
import { provide, ref } from 'vue';
import { Col, Empty, Row, TabPane, Tabs } from 'ant-design-vue';
import { Col, Empty, Row, TabPane, Tabs } from 'antdv-next';
import audioBar from './audioBar/index.vue';
import songCard from './songCard/index.vue';

View File

@ -3,7 +3,7 @@ import { inject } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { Image } from 'ant-design-vue';
import { Image } from 'antdv-next';
defineOptions({ name: 'AiMusicSongCardIndex' });

View File

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { inject } from 'vue';
import { Button, Card, Image } from 'ant-design-vue';
import { Button, Card, Image } from 'antdv-next';
defineOptions({ name: 'AiMusicSongInfoIndex' });

View File

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { reactive } from 'vue';
import { Select, Switch, Textarea } from 'ant-design-vue';
import { Select, Switch, TextArea } from 'antdv-next';
import Title from '../title/index.vue';
@ -24,7 +24,7 @@ defineExpose({
title="音乐/歌词说明"
desc="描述您想要的音乐风格和主题,使用流派和氛围而不是特定的艺术家和歌曲"
>
<Textarea
<TextArea
v-model:value="formData.desc"
:auto-size="{ minRows: 6, maxRows: 6 }"
:maxlength="1200"
@ -48,7 +48,7 @@ defineExpose({
class="w-full"
placeholder="请选择"
>
<Select.Option
<SelectOption
v-for="item in [
{
value: '3',
@ -63,7 +63,7 @@ defineExpose({
:value="item.value"
>
{{ item.label }}
</Select.Option>
</SelectOption>
</Select>
</Title>
</div>

View File

@ -3,7 +3,7 @@ import type { Nullable, Recordable } from '@vben/types';
import { ref, unref } from 'vue';
import { Button, Card, Radio } from 'ant-design-vue';
import { Button, Card } from 'antdv-next';
import desc from './desc.vue';
import lyric from './lyric.vue';
@ -23,10 +23,10 @@ function generateMusic() {
<template>
<Card class="!mb-0 h-full w-80">
<Radio.Group v-model:value="generateMode" class="mb-4">
<Radio.Button value="desc"> 描述模式 </Radio.Button>
<Radio.Button value="lyric"> 歌词模式 </Radio.Button>
</Radio.Group>
<RadioGroup v-model:value="generateMode" class="mb-4">
<RadioButton value="desc"> 描述模式 </RadioButton>
<RadioButton value="lyric"> 歌词模式 </RadioButton>
</RadioGroup>
<!-- 描述模式/歌词模式 切换 -->
<component :is="generateMode === 'desc' ? desc : lyric" ref="modeRef" />

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