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 differencespull/342/head
parent
0fced45a9c
commit
40f0ba71f5
|
|
@ -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:",
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
});
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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; // 字典类型
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import {
|
|||
RadioGroup,
|
||||
Select,
|
||||
SelectOption,
|
||||
} from 'ant-design-vue';
|
||||
} from 'antdv-next';
|
||||
|
||||
defineOptions({ name: 'DictSelect' });
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import {
|
|||
RadioGroup,
|
||||
Select,
|
||||
SelectOption,
|
||||
} from 'ant-design-vue';
|
||||
} from 'antdv-next';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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>(), {
|
||||
|
|
|
|||
|
|
@ -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>(), {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import {
|
|||
Tabs,
|
||||
Tag,
|
||||
Transfer,
|
||||
} from 'ant-design-vue';
|
||||
} from 'antdv-next';
|
||||
|
||||
// ======================= 自定义组件 =======================
|
||||
import { useApiSelect } from '#/components/form-create';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { message } from 'ant-design-vue';
|
||||
import { message } from 'antdv-next';
|
||||
|
||||
enum UploadType {
|
||||
Image = 'image',
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 [
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
{
|
||||
fieldName: 'systemMessage',
|
||||
label: '角色设定',
|
||||
component: 'Textarea',
|
||||
component: 'TextArea',
|
||||
componentProps: {
|
||||
rows: 4,
|
||||
placeholder: '请输入角色设定',
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
import { Skeleton } from 'ant-design-vue';
|
||||
import { Skeleton } from 'antdv-next';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
import { Button } from 'ant-design-vue';
|
||||
import { Button } from 'antdv-next';
|
||||
|
||||
const emits = defineEmits(['onNewConversation']);
|
||||
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
{
|
||||
fieldName: 'description',
|
||||
label: '知识库描述',
|
||||
component: 'Textarea',
|
||||
component: 'TextArea',
|
||||
componentProps: {
|
||||
rows: 3,
|
||||
placeholder: '请输入知识库描述',
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
{
|
||||
fieldName: 'description',
|
||||
label: '知识库描述',
|
||||
component: 'Textarea',
|
||||
component: 'TextArea',
|
||||
componentProps: {
|
||||
rows: 3,
|
||||
placeholder: '请输入知识库描述',
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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="请输入文本"
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
{
|
||||
fieldName: 'content',
|
||||
label: '切片内容',
|
||||
component: 'Textarea',
|
||||
component: 'TextArea',
|
||||
componentProps: {
|
||||
placeholder: '请输入切片内容',
|
||||
rows: 6,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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; // 生成结果
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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: '请输入角色设定',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export function useFormSchema(): VbenFormSchema[] {
|
|||
},
|
||||
},
|
||||
{
|
||||
component: 'Textarea',
|
||||
component: 'TextArea',
|
||||
fieldName: 'description',
|
||||
label: '工具描述',
|
||||
componentProps: {
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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' });
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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' });
|
||||
|
||||
|
|
|
|||
|
|
@ -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' });
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue