mirror of
https://gitee.com/dapppp/ruoyi-plus-vben5.git
synced 2025-12-30 01:32:26 +00:00
chore: merge
This commit is contained in:
@@ -112,11 +112,16 @@ function handleViewAll() {
|
|||||||
message.warning('暂未开放');
|
message.warning('暂未开放');
|
||||||
}
|
}
|
||||||
watch(
|
watch(
|
||||||
() => preferences.app.watermark,
|
() => ({
|
||||||
async (enable) => {
|
enable: preferences.app.watermark,
|
||||||
|
content: preferences.app.watermarkContent,
|
||||||
|
}),
|
||||||
|
async ({ enable, content }) => {
|
||||||
if (enable) {
|
if (enable) {
|
||||||
await updateWatermark({
|
await updateWatermark({
|
||||||
content: `${userStore.userInfo?.username} - ${userStore.userInfo?.realName}`,
|
content:
|
||||||
|
content ||
|
||||||
|
`${userStore.userInfo?.username} - ${userStore.userInfo?.realName}`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
destroyWatermark();
|
destroyWatermark();
|
||||||
|
|||||||
@@ -473,6 +473,8 @@ export interface FormSchema<
|
|||||||
fieldName: string;
|
fieldName: string;
|
||||||
/** 帮助信息 */
|
/** 帮助信息 */
|
||||||
help?: CustomRenderType;
|
help?: CustomRenderType;
|
||||||
|
/** 是否隐藏表单项 */
|
||||||
|
hide?: boolean;
|
||||||
/** 表单的标签(如果是一个string,会用于默认必选规则的消息提示) */
|
/** 表单的标签(如果是一个string,会用于默认必选规则的消息提示) */
|
||||||
label?: CustomRenderType;
|
label?: CustomRenderType;
|
||||||
/** 自定义组件内部渲染 */
|
/** 自定义组件内部渲染 */
|
||||||
|
|||||||
@@ -85,3 +85,17 @@
|
|||||||
.z-popup {
|
.z-popup {
|
||||||
z-index: var(--popup-z-index);
|
z-index: var(--popup-z-index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes shrink {
|
||||||
|
0% {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
transform: scale(0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ const defaultPreferences: Preferences = {
|
|||||||
name: 'Vben Admin',
|
name: 'Vben Admin',
|
||||||
preferencesButtonPosition: 'auto',
|
preferencesButtonPosition: 'auto',
|
||||||
watermark: false,
|
watermark: false,
|
||||||
|
watermarkContent: '',
|
||||||
zIndex: 200,
|
zIndex: 200,
|
||||||
},
|
},
|
||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
|
|||||||
@@ -75,6 +75,10 @@ interface AppPreferences {
|
|||||||
* @zh_CN 是否开启水印
|
* @zh_CN 是否开启水印
|
||||||
*/
|
*/
|
||||||
watermark: boolean;
|
watermark: boolean;
|
||||||
|
/**
|
||||||
|
* @zh_CN 水印文案
|
||||||
|
*/
|
||||||
|
watermarkContent: string;
|
||||||
/** z-index */
|
/** z-index */
|
||||||
zIndex: number;
|
zIndex: number;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -342,13 +342,12 @@ export class FormApi {
|
|||||||
isObject(obj[key]) &&
|
isObject(obj[key]) &&
|
||||||
!isDayjsObject(obj[key]) &&
|
!isDayjsObject(obj[key]) &&
|
||||||
!isDate(obj[key])
|
!isDate(obj[key])
|
||||||
? fieldMergeFn(obj[key], value)
|
? fieldMergeFn(value, obj[key])
|
||||||
: value;
|
: value;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
const filteredFields = fieldMergeFn(fields, form.values);
|
const filteredFields = fieldMergeFn(fields, form.values);
|
||||||
this.handleStringToArrayFields(filteredFields);
|
|
||||||
form.setValues(filteredFields, shouldValidate);
|
form.setValues(filteredFields, shouldValidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +357,6 @@ export class FormApi {
|
|||||||
const form = await this.getForm();
|
const form = await this.getForm();
|
||||||
await form.submitForm();
|
await form.submitForm();
|
||||||
const rawValues = toRaw(await this.getValues());
|
const rawValues = toRaw(await this.getValues());
|
||||||
this.handleArrayToStringFields(rawValues);
|
|
||||||
await this.state?.handleSubmit?.(rawValues);
|
await this.state?.handleSubmit?.(rawValues);
|
||||||
|
|
||||||
return rawValues;
|
return rawValues;
|
||||||
@@ -458,16 +456,31 @@ export class FormApi {
|
|||||||
return this.form;
|
return this.form;
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleArrayToStringFields = (originValues: Record<string, any>) => {
|
private handleMultiFields = (originValues: Record<string, any>) => {
|
||||||
const arrayToStringFields = this.state?.arrayToStringFields;
|
const arrayToStringFields = this.state?.arrayToStringFields;
|
||||||
if (!arrayToStringFields || !Array.isArray(arrayToStringFields)) {
|
if (!arrayToStringFields || !Array.isArray(arrayToStringFields)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const processFields = (fields: string[], separator: string = ',') => {
|
const processFields = (fields: string[], separator: string = ',') => {
|
||||||
this.processFields(fields, separator, originValues, (value, sep) =>
|
this.processFields(fields, separator, originValues, (value, sep) => {
|
||||||
Array.isArray(value) ? value.join(sep) : value,
|
if (Array.isArray(value)) {
|
||||||
);
|
return value.join(sep);
|
||||||
|
} else if (typeof value === 'string') {
|
||||||
|
// 处理空字符串的情况
|
||||||
|
if (value === '') {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// 处理复杂分隔符的情况
|
||||||
|
const escapedSeparator = sep.replaceAll(
|
||||||
|
/[.*+?^${}()|[\]\\]/g,
|
||||||
|
String.raw`\$&`,
|
||||||
|
);
|
||||||
|
return value.split(new RegExp(escapedSeparator));
|
||||||
|
} else {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理简单数组格式 ['field1', 'field2', ';'] 或 ['field1', 'field2']
|
// 处理简单数组格式 ['field1', 'field2', ';'] 或 ['field1', 'field2']
|
||||||
@@ -503,8 +516,7 @@ export class FormApi {
|
|||||||
const values = { ...originValues };
|
const values = { ...originValues };
|
||||||
const fieldMappingTime = this.state?.fieldMappingTime;
|
const fieldMappingTime = this.state?.fieldMappingTime;
|
||||||
|
|
||||||
this.handleStringToArrayFields(values);
|
this.handleMultiFields(values);
|
||||||
|
|
||||||
if (!fieldMappingTime || !Array.isArray(fieldMappingTime)) {
|
if (!fieldMappingTime || !Array.isArray(fieldMappingTime)) {
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
@@ -550,65 +562,6 @@ export class FormApi {
|
|||||||
return values;
|
return values;
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleStringToArrayFields = (originValues: Record<string, any>) => {
|
|
||||||
const arrayToStringFields = this.state?.arrayToStringFields;
|
|
||||||
if (!arrayToStringFields || !Array.isArray(arrayToStringFields)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const processFields = (fields: string[], separator: string = ',') => {
|
|
||||||
this.processFields(fields, separator, originValues, (value, sep) => {
|
|
||||||
if (typeof value !== 'string') {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
// 处理空字符串的情况
|
|
||||||
if (value === '') {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
// 处理复杂分隔符的情况
|
|
||||||
const escapedSeparator = sep.replaceAll(
|
|
||||||
/[.*+?^${}()|[\]\\]/g,
|
|
||||||
String.raw`\$&`,
|
|
||||||
);
|
|
||||||
return value.split(new RegExp(escapedSeparator));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// 处理简单数组格式 ['field1', 'field2', ';'] 或 ['field1', 'field2']
|
|
||||||
if (arrayToStringFields.every((item) => typeof item === 'string')) {
|
|
||||||
const lastItem =
|
|
||||||
arrayToStringFields[arrayToStringFields.length - 1] || '';
|
|
||||||
const fields =
|
|
||||||
lastItem.length === 1
|
|
||||||
? arrayToStringFields.slice(0, -1)
|
|
||||||
: arrayToStringFields;
|
|
||||||
const separator = lastItem.length === 1 ? lastItem : ',';
|
|
||||||
processFields(fields, separator);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理嵌套数组格式 [['field1'], ';']
|
|
||||||
arrayToStringFields.forEach((fieldConfig) => {
|
|
||||||
if (Array.isArray(fieldConfig)) {
|
|
||||||
const [fields, separator = ','] = fieldConfig;
|
|
||||||
if (Array.isArray(fields)) {
|
|
||||||
processFields(fields, separator);
|
|
||||||
} else if (typeof originValues[fields] === 'string') {
|
|
||||||
const value = originValues[fields];
|
|
||||||
if (value === '') {
|
|
||||||
originValues[fields] = [];
|
|
||||||
} else {
|
|
||||||
const escapedSeparator = separator.replaceAll(
|
|
||||||
/[.*+?^${}()|[\]\\]/g,
|
|
||||||
String.raw`\$&`,
|
|
||||||
);
|
|
||||||
originValues[fields] = value.split(new RegExp(escapedSeparator));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
private processFields = (
|
private processFields = (
|
||||||
fields: string[],
|
fields: string[],
|
||||||
separator: string,
|
separator: string,
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ const {
|
|||||||
emptyStateValue,
|
emptyStateValue,
|
||||||
fieldName,
|
fieldName,
|
||||||
formFieldProps,
|
formFieldProps,
|
||||||
|
hide,
|
||||||
label,
|
label,
|
||||||
labelClass,
|
labelClass,
|
||||||
labelWidth,
|
labelWidth,
|
||||||
@@ -95,7 +96,7 @@ const currentRules = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const visible = computed(() => {
|
const visible = computed(() => {
|
||||||
return isIf.value && isShow.value;
|
return !hide && isIf.value && isShow.value;
|
||||||
});
|
});
|
||||||
|
|
||||||
const shouldRequired = computed(() => {
|
const shouldRequired = computed(() => {
|
||||||
@@ -283,7 +284,7 @@ onUnmounted(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<FormField
|
<FormField
|
||||||
v-if="isIf"
|
v-if="!hide && isIf"
|
||||||
v-bind="fieldProps"
|
v-bind="fieldProps"
|
||||||
v-slot="slotProps"
|
v-slot="slotProps"
|
||||||
:name="fieldName"
|
:name="fieldName"
|
||||||
|
|||||||
@@ -255,6 +255,8 @@ export interface FormSchema<
|
|||||||
fieldName: string;
|
fieldName: string;
|
||||||
/** 帮助信息 */
|
/** 帮助信息 */
|
||||||
help?: CustomRenderType;
|
help?: CustomRenderType;
|
||||||
|
/** 是否隐藏表单项 */
|
||||||
|
hide?: boolean;
|
||||||
/** 表单项 */
|
/** 表单项 */
|
||||||
label?: CustomRenderType;
|
label?: CustomRenderType;
|
||||||
// 自定义组件内部渲染
|
// 自定义组件内部渲染
|
||||||
@@ -277,7 +279,8 @@ export interface FormRenderProps<
|
|||||||
*/
|
*/
|
||||||
arrayToStringFields?: ArrayToStringFields;
|
arrayToStringFields?: ArrayToStringFields;
|
||||||
/**
|
/**
|
||||||
* 是否展开,在showCollapseButton=true下生效
|
* 是否折叠,在showCollapseButton=true下生效
|
||||||
|
* true:折叠 false:展开
|
||||||
*/
|
*/
|
||||||
collapsed?: boolean;
|
collapsed?: boolean;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -21,7 +21,10 @@ isFullscreen.value = !!(
|
|||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VbenIconButton @click="toggle">
|
<VbenIconButton
|
||||||
|
class="hover:animate-[shrink_0.3s_ease-in-out]"
|
||||||
|
@click="toggle"
|
||||||
|
>
|
||||||
<Minimize v-if="isFullscreen" class="text-foreground size-4" />
|
<Minimize v-if="isFullscreen" class="text-foreground size-4" />
|
||||||
<Maximize v-else class="text-foreground size-4" />
|
<Maximize v-else class="text-foreground size-4" />
|
||||||
</VbenIconButton>
|
</VbenIconButton>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
import { RiDingding } from '@vben/icons';
|
import { SvgDingDingIcon } from '@vben/icons';
|
||||||
import { $t } from '@vben/locales';
|
import { $t } from '@vben/locales';
|
||||||
|
|
||||||
import { alert, useVbenModal } from '@vben-core/popup-ui';
|
import { alert, useVbenModal } from '@vben-core/popup-ui';
|
||||||
@@ -96,7 +96,7 @@ const handleLogin = () => {
|
|||||||
:tooltip="$t('authentication.dingdingLogin')"
|
:tooltip="$t('authentication.dingdingLogin')"
|
||||||
tooltip-side="top"
|
tooltip-side="top"
|
||||||
>
|
>
|
||||||
<RiDingding />
|
<SvgDingDingIcon />
|
||||||
</VbenIconButton>
|
</VbenIconButton>
|
||||||
<Modal>
|
<Modal>
|
||||||
<div id="dingding_qrcode_login_element"></div>
|
<div id="dingding_qrcode_login_element"></div>
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ async function handleUpdate(value: string | undefined) {
|
|||||||
:model-value="preferences.app.locale"
|
:model-value="preferences.app.locale"
|
||||||
@update:model-value="handleUpdate"
|
@update:model-value="handleUpdate"
|
||||||
>
|
>
|
||||||
<VbenIconButton>
|
<VbenIconButton class="hover:animate-[shrink_0.3s_ease-in-out]">
|
||||||
<Languages class="text-foreground size-4" />
|
<Languages class="text-foreground size-4" />
|
||||||
</VbenIconButton>
|
</VbenIconButton>
|
||||||
</VbenDropdownRadioMenu>
|
</VbenDropdownRadioMenu>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { SUPPORT_LANGUAGES } from '@vben/constants';
|
import { SUPPORT_LANGUAGES } from '@vben/constants';
|
||||||
import { $t } from '@vben/locales';
|
import { $t } from '@vben/locales';
|
||||||
|
|
||||||
|
import InputItem from '../input-item.vue';
|
||||||
import SelectItem from '../select-item.vue';
|
import SelectItem from '../select-item.vue';
|
||||||
import SwitchItem from '../switch-item.vue';
|
import SwitchItem from '../switch-item.vue';
|
||||||
|
|
||||||
@@ -12,6 +13,7 @@ defineOptions({
|
|||||||
const appLocale = defineModel<string>('appLocale');
|
const appLocale = defineModel<string>('appLocale');
|
||||||
const appDynamicTitle = defineModel<boolean>('appDynamicTitle');
|
const appDynamicTitle = defineModel<boolean>('appDynamicTitle');
|
||||||
const appWatermark = defineModel<boolean>('appWatermark');
|
const appWatermark = defineModel<boolean>('appWatermark');
|
||||||
|
const appWatermarkContent = defineModel<string>('appWatermarkContent');
|
||||||
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -22,9 +24,23 @@ const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
|||||||
<SwitchItem v-model="appDynamicTitle">
|
<SwitchItem v-model="appDynamicTitle">
|
||||||
{{ $t('preferences.dynamicTitle') }}
|
{{ $t('preferences.dynamicTitle') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
<SwitchItem v-model="appWatermark">
|
<SwitchItem
|
||||||
|
v-model="appWatermark"
|
||||||
|
@update:model-value="
|
||||||
|
(val) => {
|
||||||
|
if (!val) appWatermarkContent = '';
|
||||||
|
}
|
||||||
|
"
|
||||||
|
>
|
||||||
{{ $t('preferences.watermark') }}
|
{{ $t('preferences.watermark') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
|
<InputItem
|
||||||
|
v-if="appWatermark"
|
||||||
|
v-model="appWatermarkContent"
|
||||||
|
:placeholder="$t('preferences.watermarkContent')"
|
||||||
|
>
|
||||||
|
{{ $t('preferences.watermarkContent') }}
|
||||||
|
</InputItem>
|
||||||
<SwitchItem v-model="appEnableCheckUpdates">
|
<SwitchItem v-model="appEnableCheckUpdates">
|
||||||
{{ $t('preferences.checkUpdates') }}
|
{{ $t('preferences.checkUpdates') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { SelectOption } from '@vben/types';
|
import type { SelectOption } from '@vben/types';
|
||||||
|
|
||||||
import { CircleHelp } from '@vben/icons';
|
|
||||||
import { Input, VbenTooltip } from '@vben-core/shadcn-ui';
|
|
||||||
import { useSlots } from 'vue';
|
import { useSlots } from 'vue';
|
||||||
|
|
||||||
|
import { CircleHelp, CircleX } from '@vben/icons';
|
||||||
|
|
||||||
|
import { Input, VbenTooltip } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'PreferenceSelectItem',
|
name: 'PreferenceSelectItem',
|
||||||
});
|
});
|
||||||
@@ -45,6 +47,17 @@ const slots = useSlots();
|
|||||||
<slot name="tip"></slot>
|
<slot name="tip"></slot>
|
||||||
</VbenTooltip>
|
</VbenTooltip>
|
||||||
</span>
|
</span>
|
||||||
<Input v-model="inputValue" class="h-8 w-[165px]" />
|
<div class="relative">
|
||||||
|
<Input
|
||||||
|
v-model="inputValue"
|
||||||
|
class="h-8 w-[165px]"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
/>
|
||||||
|
<CircleX
|
||||||
|
v-if="inputValue"
|
||||||
|
class="hover:text-foreground text-foreground/60 absolute right-2 top-1/2 size-3 -translate-y-1/2 transform cursor-pointer"
|
||||||
|
@click="() => (inputValue = '')"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ function clearPreferencesAndLogout() {
|
|||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<Preferences @clear-preferences-and-logout="clearPreferencesAndLogout">
|
<Preferences @clear-preferences-and-logout="clearPreferencesAndLogout">
|
||||||
<VbenIconButton>
|
<VbenIconButton class="hover:animate-[shrink_0.3s_ease-in-out]">
|
||||||
<Settings class="text-foreground size-4" />
|
<Settings class="text-foreground size-4" />
|
||||||
</VbenIconButton>
|
</VbenIconButton>
|
||||||
</Preferences>
|
</Preferences>
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ const appColorGrayMode = defineModel<boolean>('appColorGrayMode');
|
|||||||
const appColorWeakMode = defineModel<boolean>('appColorWeakMode');
|
const appColorWeakMode = defineModel<boolean>('appColorWeakMode');
|
||||||
const appContentCompact = defineModel<ContentCompactType>('appContentCompact');
|
const appContentCompact = defineModel<ContentCompactType>('appContentCompact');
|
||||||
const appWatermark = defineModel<boolean>('appWatermark');
|
const appWatermark = defineModel<boolean>('appWatermark');
|
||||||
|
const appWatermarkContent = defineModel<string>('appWatermarkContent');
|
||||||
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
||||||
const appPreferencesButtonPosition = defineModel<PreferencesButtonPositionType>(
|
const appPreferencesButtonPosition = defineModel<PreferencesButtonPositionType>(
|
||||||
'appPreferencesButtonPosition',
|
'appPreferencesButtonPosition',
|
||||||
@@ -267,6 +268,7 @@ async function handleReset() {
|
|||||||
v-model:app-enable-check-updates="appEnableCheckUpdates"
|
v-model:app-enable-check-updates="appEnableCheckUpdates"
|
||||||
v-model:app-locale="appLocale"
|
v-model:app-locale="appLocale"
|
||||||
v-model:app-watermark="appWatermark"
|
v-model:app-watermark="appWatermark"
|
||||||
|
v-model:app-watermark-content="appWatermarkContent"
|
||||||
/>
|
/>
|
||||||
</Block>
|
</Block>
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ function toggleTheme(event: MouseEvent) {
|
|||||||
`circle(0px at ${x}px ${y}px)`,
|
`circle(0px at ${x}px ${y}px)`,
|
||||||
`circle(${endRadius}px at ${x}px ${y}px)`,
|
`circle(${endRadius}px at ${x}px ${y}px)`,
|
||||||
];
|
];
|
||||||
document.documentElement.animate(
|
const animate = document.documentElement.animate(
|
||||||
{
|
{
|
||||||
clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
|
clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
|
||||||
},
|
},
|
||||||
@@ -76,6 +76,9 @@ function toggleTheme(event: MouseEvent) {
|
|||||||
: '::view-transition-new(root)',
|
: '::view-transition-new(root)',
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
animate.onfinish = () => {
|
||||||
|
transition.skipTransition();
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -85,7 +88,7 @@ function toggleTheme(event: MouseEvent) {
|
|||||||
:aria-label="theme"
|
:aria-label="theme"
|
||||||
:class="[`is-${theme}`]"
|
:class="[`is-${theme}`]"
|
||||||
aria-live="polite"
|
aria-live="polite"
|
||||||
class="theme-toggle cursor-pointer border-none bg-none"
|
class="theme-toggle cursor-pointer border-none bg-none hover:animate-[shrink_0.3s_ease-in-out]"
|
||||||
v-bind="bindProps"
|
v-bind="bindProps"
|
||||||
@click.stop="toggleTheme"
|
@click.stop="toggleTheme"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -32,6 +32,21 @@ function useEcharts(chartRef: Ref<EchartsUIType>) {
|
|||||||
const { height, width } = useWindowSize();
|
const { height, width } = useWindowSize();
|
||||||
const resizeHandler: () => void = useDebounceFn(resize, 200);
|
const resizeHandler: () => void = useDebounceFn(resize, 200);
|
||||||
|
|
||||||
|
const getChartEl = (): HTMLElement | null => {
|
||||||
|
const refValue = chartRef?.value as unknown;
|
||||||
|
if (!refValue) return null;
|
||||||
|
if (refValue instanceof HTMLElement) {
|
||||||
|
return refValue;
|
||||||
|
}
|
||||||
|
const maybeComponent = refValue as { $el?: HTMLElement };
|
||||||
|
return maybeComponent.$el ?? null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const isElHidden = (el: HTMLElement | null): boolean => {
|
||||||
|
if (!el) return true;
|
||||||
|
return el.offsetHeight === 0 || el.offsetWidth === 0;
|
||||||
|
};
|
||||||
|
|
||||||
const getOptions = computed((): EChartsOption => {
|
const getOptions = computed((): EChartsOption => {
|
||||||
if (!isDark.value) {
|
if (!isDark.value) {
|
||||||
return {};
|
return {};
|
||||||
@@ -69,6 +84,13 @@ function useEcharts(chartRef: Ref<EchartsUIType>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
|
const el = getChartEl();
|
||||||
|
if (isElHidden(el)) {
|
||||||
|
useTimeoutFn(async () => {
|
||||||
|
resolve(await renderEcharts(currentOptions));
|
||||||
|
}, 30);
|
||||||
|
return;
|
||||||
|
}
|
||||||
useTimeoutFn(() => {
|
useTimeoutFn(() => {
|
||||||
if (!chartInstance) {
|
if (!chartInstance) {
|
||||||
const instance = initCharts();
|
const instance = initCharts();
|
||||||
@@ -83,6 +105,10 @@ function useEcharts(chartRef: Ref<EchartsUIType>) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function resize(withAnimation = true) {
|
function resize(withAnimation = true) {
|
||||||
|
const el = getChartEl();
|
||||||
|
if (isElHidden(el)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
chartInstance?.resize({
|
chartInstance?.resize({
|
||||||
animation: withAnimation
|
animation: withAnimation
|
||||||
? {
|
? {
|
||||||
|
|||||||
1
packages/icons/src/svg/icons/dingding.svg
Normal file
1
packages/icons/src/svg/icons/dingding.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="200" height="200"><path d="M512 2C230.2 2 2 230.2 2 512s228.2 510 510 510 510-228.2 510-510S793.3 2 512 2z m235.9 442c-1 4.6-3.6 10.8-7.2 19.1l-0.5 0.5c-21.6 45.8-77.3 135.5-77.3 135.5l-0.5-0.5-16.5 28.3h78.8L574.3 826.8l34-136h-61.8l21.6-90.2c-17.5 4.1-38.1 9.8-62.3 18 0 0-33 19.1-94.8-37.1 0 0-41.7-37.1-17.5-45.8 10.3-4.1 50-8.8 81.4-12.9 42.2-5.7 68.5-8.8 68.5-8.8s-130.3 2.1-161.2-3.1c-30.9-4.6-70.1-56.7-78.3-102 0 0-12.9-24.7 27.8-12.9 40.2 11.8 209.2 45.8 209.2 45.8S321.4 375 307 358.5c-14.4-16.5-42.8-89.6-39.2-134.5 0 0 1.5-11.3 12.9-8.2 0 0 161.8 74.2 272.5 114.4C664.5 371.4 760.8 392 747.9 444z" fill="#3296FA"/></svg>
|
||||||
|
After Width: | Height: | Size: 705 B |
1
packages/icons/src/svg/icons/github.svg
Normal file
1
packages/icons/src/svg/icons/github.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="200" height="200"><path d="M517.30912244 23.0407001c-277.94803947-0.11230224-503.114027 225.0536853-503.11402702 503.00172479 0 219.66317786 140.82700667 406.42179996 337.01901675 475.03846748 26.39102597 6.73813429 22.34814539-12.24094396 22.3481454-25.04339914v-87.14653682c-152.61874168 17.9683581-158.68306256-83.10365624-169.01486845-99.94899196-20.77591406-35.37520501-69.62738767-44.35938408-55.0280967-61.20471981 34.81369383-17.9683581 70.18889885 4.49208953 111.17921577 65.13529813 29.76009311 43.91017513 87.48344355 36.49822743 116.90662996 29.19858195 6.40122758-26.39102597 20.21440287-49.97449598 38.96887665-68.39206307-157.89694687-28.07555954-223.93066292-124.65548435-223.93066294-239.42837176 0-55.5896079 18.30526482-106.7994285 54.35428331-148.01434994-22.90965658-68.16745859 2.13374251-126.34001793 5.50280964-134.98729027 65.3599026-5.95201861 133.07815223 46.71773107 138.46865968 50.87291388 37.17204084-9.99489919 79.50998463-15.38540662 126.90152914-15.38540659 47.72845123 0 90.29099949 5.50280967 127.57534256 15.61001106 12.69015291-9.65799248 75.69170854-54.80349223 136.33491714-49.30068255 3.25676491 8.64727234 27.73865283 65.47220485 6.1766231 132.74124553 36.49822743 41.32722364 54.91579446 92.87395098 54.91579447 148.80046559 0 114.99749189-66.25832052 211.57741672-224.82908082 239.54067401 26.5033282 26.05411926 42.89945497 62.32774217 42.89945498 102.41964122v126.45232019c0.89841792 9.99489919 0 20.21440287 16.95763795 20.21440287 199.22417052-67.26904065 342.52182644-255.3752896 342.52182644-477.05990776 0-277.94803947-225.27828977-503.114027-503.11402701-503.11402703z" fill="currentColor"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
1
packages/icons/src/svg/icons/google.svg
Normal file
1
packages/icons/src/svg/icons/google.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="200" height="200"><path d="M213.573746 512.08574a296.892457 296.892457 0 0 1 15.663636-94.698456L53.712514 286.089155a504.154105 504.154105 0 0 0 0 451.737229l175.422492-131.502883a296.022255 296.022255 0 0 1-15.356507-94.288949" fill="#FBBC05"/><path d="M521.881206 208.845928a305.696854 305.696854 0 0 1 192.007518 67.210309l151.773472-148.446228A527.547183 527.547183 0 0 0 53.763703 284.195186l175.422491 131.349318a306.771809 306.771809 0 0 1 292.541447-206.698576" fill="#EA4335"/><path d="M521.881206 815.325553a307.130128 307.130128 0 0 1-292.643824-206.698576l-175.524868 131.29813A521.148639 521.148639 0 0 0 521.881206 1023.969287a503.130338 503.130338 0 0 0 339.839486-127.100685l-166.771659-126.128105a327.861412 327.861412 0 0 1-173.221392 44.585056" fill="#34A853"/><path d="M1023.475893 513.774956a415.64944 415.64944 0 0 0-11.875698-92.70211h-486.289369v197.023977h279.744358a229.528582 229.528582 0 0 1-106.522966 152.43892l166.618094 126.128106a502.004194 502.004194 0 0 0 158.069639-382.888893" fill="#4285F4"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
1
packages/icons/src/svg/icons/qqchat.svg
Normal file
1
packages/icons/src/svg/icons/qqchat.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="200" height="200"><path d="M511.09761 957.257c-80.159 0-153.737-25.019-201.11-62.386-24.057 6.702-54.831 17.489-74.252 30.864-16.617 11.439-14.546 23.106-11.55 27.816 13.15 20.689 225.583 13.211 286.912 6.767v-3.061z" fill="#FAAD08"/><path d="M496.65061 957.257c80.157 0 153.737-25.019 201.11-62.386 24.057 6.702 54.83 17.489 74.253 30.864 16.616 11.439 14.543 23.106 11.55 27.816-13.15 20.689-225.584 13.211-286.914 6.767v-3.061z" fill="#FAAD08"/><path d="M497.12861 474.524c131.934-0.876 237.669-25.783 273.497-35.34 8.541-2.28 13.11-6.364 13.11-6.364 0.03-1.172 0.542-20.952 0.542-31.155C784.27761 229.833 701.12561 57.173 496.64061 57.162 292.15661 57.173 209.00061 229.832 209.00061 401.665c0 10.203 0.516 29.983 0.547 31.155 0 0 3.717 3.821 10.529 5.67 33.078 8.98 140.803 35.139 276.08 36.034h0.972z" fill="#000000"/><path d="M860.28261 619.782c-8.12-26.086-19.204-56.506-30.427-85.72 0 0-6.456-0.795-9.718 0.148-100.71 29.205-222.773 47.818-315.792 46.695h-0.962C410.88561 582.017 289.65061 563.617 189.27961 534.698 185.44461 533.595 177.87261 534.063 177.87261 534.063 166.64961 563.276 155.56661 593.696 147.44761 619.782 108.72961 744.168 121.27261 795.644 130.82461 796.798c20.496 2.474 79.78-93.637 79.78-93.637 0 97.66 88.324 247.617 290.576 248.996a718.01 718.01 0 0 1 5.367 0C708.80161 950.778 797.12261 800.822 797.12261 703.162c0 0 59.284 96.111 79.783 93.637 9.55-1.154 22.093-52.63-16.623-177.017" fill="#000000"/><path d="M434.38261 316.917c-27.9 1.24-51.745-30.106-53.24-69.956-1.518-39.877 19.858-73.207 47.764-74.454 27.875-1.224 51.703 30.109 53.218 69.974 1.527 39.877-19.853 73.2-47.742 74.436m206.67-69.956c-1.494 39.85-25.34 71.194-53.24 69.956-27.888-1.238-49.269-34.559-47.742-74.435 1.513-39.868 25.341-71.201 53.216-69.974 27.909 1.247 49.285 34.576 47.767 74.453" fill="#FFFFFF"/><path d="M683.94261 368.627c-7.323-17.609-81.062-37.227-172.353-37.227h-0.98c-91.29 0-165.031 19.618-172.352 37.227a6.244 6.244 0 0 0-0.535 2.505c0 1.269 0.393 2.414 1.006 3.386 6.168 9.765 88.054 58.018 171.882 58.018h0.98c83.827 0 165.71-48.25 171.881-58.016a6.352 6.352 0 0 0 1.002-3.395c0-0.897-0.2-1.736-0.531-2.498" fill="#FAAD08"/><path d="M467.63161 256.377c1.26 15.886-7.377 30-19.266 31.542-11.907 1.544-22.569-10.083-23.836-25.978-1.243-15.895 7.381-30.008 19.25-31.538 11.927-1.549 22.607 10.088 23.852 25.974m73.097 7.935c2.533-4.118 19.827-25.77 55.62-17.886 9.401 2.07 13.75 5.116 14.668 6.316 1.355 1.77 1.726 4.29 0.352 7.684-2.722 6.725-8.338 6.542-11.454 5.226-2.01-0.85-26.94-15.889-49.905 6.553-1.579 1.545-4.405 2.074-7.085 0.242-2.678-1.834-3.786-5.553-2.196-8.135" fill="#000000"/><path d="M504.33261 584.495h-0.967c-63.568 0.752-140.646-7.504-215.286-21.92-6.391 36.262-10.25 81.838-6.936 136.196 8.37 137.384 91.62 223.736 220.118 224.996H506.48461c128.498-1.26 211.748-87.612 220.12-224.996 3.314-54.362-0.547-99.938-6.94-136.203-74.654 14.423-151.745 22.684-215.332 21.927" fill="#FFFFFF"/><path d="M323.27461 577.016v137.468s64.957 12.705 130.031 3.91V591.59c-41.225-2.262-85.688-7.304-130.031-14.574" fill="#EB1C26"/><path d="M788.09761 432.536s-121.98 40.387-283.743 41.539h-0.962c-161.497-1.147-283.328-41.401-283.744-41.539l-40.854 106.952c102.186 32.31 228.837 53.135 324.598 51.926l0.96-0.002c95.768 1.216 222.4-19.61 324.6-51.924l-40.855-106.952z" fill="#EB1C26"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -1 +1 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742660391897" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3162" xmlns:xlink="http://www.w3.org/1999/xlink" width="292.5" height="256"><path d="M331.429 263.429q0-23.429-14.286-37.715t-37.714-14.285q-24.572 0-43.429 14.571t-18.857 37.429q0 22.285 18.857 36.857t43.429 14.571q23.428 0 37.714-14t14.286-37.428zM756 553.143q0-16-14.571-28.572T704 512q-15.429 0-28.286 12.857t-12.857 28.286q0 16 12.857 28.857T704 594.857q22.857 0 37.429-12.571T756 553.143zM621.143 263.429q0-23.429-14-37.715t-37.429-14.285q-24.571 0-43.428 14.571t-18.857 37.429q0 22.285 18.857 36.857t43.428 14.571q23.429 0 37.429-14t14-37.428zM984 553.143q0-16-14.857-28.572T932 512q-15.429 0-28.286 12.857t-12.857 28.286q0 16 12.857 28.857T932 594.857q22.286 0 37.143-12.571T984 553.143zM832 326.286Q814.286 324 792 324q-96.571 0-177.714 44T486.57 487.143 440 651.429q0 44.571 13.143 86.857-20 1.714-38.857 1.714-14.857 0-28.572-0.857t-31.428-3.714-25.429-4-31.143-6-28.571-6L124.57 792l41.143-124.571Q0 551.429 0 387.429q0-96.572 55.714-177.715T206.571 82t207.715-46.571q100.571 0 190 37.714T754 177.429t78 148.857z m338.286 320.571q0 66.857-39.143 127.714t-106 110.572l31.428 103.428-113.714-62.285q-85.714 21.143-124.571 21.143-96.572 0-177.715-40.286T512.857 797.714t-46.571-150.857T512.857 496t127.714-109.429 177.715-40.285q92 0 173.143 40.285t130 109.715 48.857 150.571z" fill="#0e932e" p-id="3163"></path></svg>
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742660391897" class="icon" viewBox="0 0 1170 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3162" xmlns:xlink="http://www.w3.org/1999/xlink" width="292.5" height="256"><path d="M331.429 263.429q0-23.429-14.286-37.715t-37.714-14.285q-24.572 0-43.429 14.571t-18.857 37.429q0 22.285 18.857 36.857t43.429 14.571q23.428 0 37.714-14t14.286-37.428zM756 553.143q0-16-14.571-28.572T704 512q-15.429 0-28.286 12.857t-12.857 28.286q0 16 12.857 28.857T704 594.857q22.857 0 37.429-12.571T756 553.143zM621.143 263.429q0-23.429-14-37.715t-37.429-14.285q-24.571 0-43.428 14.571t-18.857 37.429q0 22.285 18.857 36.857t43.428 14.571q23.429 0 37.429-14t14-37.428zM984 553.143q0-16-14.857-28.572T932 512q-15.429 0-28.286 12.857t-12.857 28.286q0 16 12.857 28.857T932 594.857q22.286 0 37.143-12.571T984 553.143zM832 326.286Q814.286 324 792 324q-96.571 0-177.714 44T486.57 487.143 440 651.429q0 44.571 13.143 86.857-20 1.714-38.857 1.714-14.857 0-28.572-0.857t-31.428-3.714-25.429-4-31.143-6-28.571-6L124.57 792l41.143-124.571Q0 551.429 0 387.429q0-96.572 55.714-177.715T206.571 82t207.715-46.571q100.571 0 190 37.714T754 177.429t78 148.857z m338.286 320.571q0 66.857-39.143 127.714t-106 110.572l31.428 103.428-113.714-62.285q-85.714 21.143-124.571 21.143-96.572 0-177.715-40.286T512.857 797.714t-46.571-150.857T512.857 496t127.714-109.429 177.715-40.285q92 0 173.143 40.285t130 109.715 48.857 150.571z" fill="#0e932e" p-id="3163"></path></svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -51,6 +51,10 @@
|
|||||||
"sendCode": "Get Security code",
|
"sendCode": "Get Security code",
|
||||||
"sendText": "Resend in {0}s",
|
"sendText": "Resend in {0}s",
|
||||||
"thirdPartyLogin": "Or continue with",
|
"thirdPartyLogin": "Or continue with",
|
||||||
|
"weChat": "WeChat",
|
||||||
|
"qq": "QQ",
|
||||||
|
"gitHub": "GitHub",
|
||||||
|
"google": "Google",
|
||||||
"loginAgainTitle": "Please Log In Again",
|
"loginAgainTitle": "Please Log In Again",
|
||||||
"loginAgainSubTitle": "Your login session has expired. Please log in again to continue.",
|
"loginAgainSubTitle": "Your login session has expired. Please log in again to continue.",
|
||||||
"layout": {
|
"layout": {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
"language": "Language",
|
"language": "Language",
|
||||||
"dynamicTitle": "Dynamic Title",
|
"dynamicTitle": "Dynamic Title",
|
||||||
"watermark": "Watermark",
|
"watermark": "Watermark",
|
||||||
|
"watermarkContent": "Please input Watermark content",
|
||||||
"checkUpdates": "Periodic update check",
|
"checkUpdates": "Periodic update check",
|
||||||
"position": {
|
"position": {
|
||||||
"title": "Preferences Postion",
|
"title": "Preferences Postion",
|
||||||
|
|||||||
@@ -51,6 +51,10 @@
|
|||||||
"sendCode": "获取验证码",
|
"sendCode": "获取验证码",
|
||||||
"sendText": "{0}秒后重新获取",
|
"sendText": "{0}秒后重新获取",
|
||||||
"thirdPartyLogin": "其他登录方式",
|
"thirdPartyLogin": "其他登录方式",
|
||||||
|
"weChat": "微信",
|
||||||
|
"qq": "QQ",
|
||||||
|
"gitHub": "GitHub",
|
||||||
|
"google": "Google",
|
||||||
"loginAgainTitle": "重新登录",
|
"loginAgainTitle": "重新登录",
|
||||||
"loginAgainSubTitle": "您的登录状态已过期,请重新登录以继续。",
|
"loginAgainSubTitle": "您的登录状态已过期,请重新登录以继续。",
|
||||||
"layout": {
|
"layout": {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
"language": "语言",
|
"language": "语言",
|
||||||
"dynamicTitle": "动态标题",
|
"dynamicTitle": "动态标题",
|
||||||
"watermark": "水印",
|
"watermark": "水印",
|
||||||
|
"watermarkContent": "请输入水印文案",
|
||||||
"checkUpdates": "定时检查更新",
|
"checkUpdates": "定时检查更新",
|
||||||
"position": {
|
"position": {
|
||||||
"title": "偏好设置位置",
|
"title": "偏好设置位置",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { computed, onBeforeMount, ref, watch } from 'vue';
|
|||||||
import { AuthenticationLoginExpiredModal } from '@vben/common-ui';
|
import { AuthenticationLoginExpiredModal } from '@vben/common-ui';
|
||||||
import { VBEN_DOC_URL, VBEN_GITHUB_URL } from '@vben/constants';
|
import { VBEN_DOC_URL, VBEN_GITHUB_URL } from '@vben/constants';
|
||||||
import { useWatermark } from '@vben/hooks';
|
import { useWatermark } from '@vben/hooks';
|
||||||
import { BookOpenText, CircleHelp, MdiGithub } from '@vben/icons';
|
import { BookOpenText, CircleHelp, SvgGithubIcon } from '@vben/icons';
|
||||||
import {
|
import {
|
||||||
BasicLayout,
|
BasicLayout,
|
||||||
LockScreen,
|
LockScreen,
|
||||||
@@ -89,7 +89,7 @@ const menus = computed(() => [
|
|||||||
target: '_blank',
|
target: '_blank',
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
icon: MdiGithub,
|
icon: SvgGithubIcon,
|
||||||
text: 'GitHub',
|
text: 'GitHub',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -122,11 +122,16 @@ function handleMakeAll() {
|
|||||||
function handleClickLogo() {}
|
function handleClickLogo() {}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => preferences.app.watermark,
|
() => ({
|
||||||
async (enable) => {
|
enable: preferences.app.watermark,
|
||||||
|
content: preferences.app.watermarkContent,
|
||||||
|
}),
|
||||||
|
async ({ enable, content }) => {
|
||||||
if (enable) {
|
if (enable) {
|
||||||
await updateWatermark({
|
await updateWatermark({
|
||||||
content: `${userStore.userInfo?.username} - ${userStore.userInfo?.realName}`,
|
content:
|
||||||
|
content ||
|
||||||
|
`${userStore.userInfo?.username} - ${userStore.userInfo?.realName}`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
destroyWatermark();
|
destroyWatermark();
|
||||||
|
|||||||
@@ -3,11 +3,7 @@ import { h, ref } from 'vue';
|
|||||||
|
|
||||||
import { IconPicker, Page } from '@vben/common-ui';
|
import { IconPicker, Page } from '@vben/common-ui';
|
||||||
import {
|
import {
|
||||||
MdiGithub,
|
|
||||||
MdiGoogle,
|
|
||||||
MdiKeyboardEsc,
|
MdiKeyboardEsc,
|
||||||
MdiQqchat,
|
|
||||||
MdiWechat,
|
|
||||||
SvgAvatar1Icon,
|
SvgAvatar1Icon,
|
||||||
SvgAvatar2Icon,
|
SvgAvatar2Icon,
|
||||||
SvgAvatar3Icon,
|
SvgAvatar3Icon,
|
||||||
@@ -16,6 +12,10 @@ import {
|
|||||||
SvgCakeIcon,
|
SvgCakeIcon,
|
||||||
SvgCardIcon,
|
SvgCardIcon,
|
||||||
SvgDownloadIcon,
|
SvgDownloadIcon,
|
||||||
|
SvgGithubIcon,
|
||||||
|
SvgGoogleIcon,
|
||||||
|
SvgQQChatIcon,
|
||||||
|
SvgWeChatIcon,
|
||||||
} from '@vben/icons';
|
} from '@vben/icons';
|
||||||
|
|
||||||
import { Card, Input } from 'ant-design-vue';
|
import { Card, Input } from 'ant-design-vue';
|
||||||
@@ -46,10 +46,10 @@ const inputComponent = h(Input);
|
|||||||
|
|
||||||
<Card class="mb-5" title="Iconify">
|
<Card class="mb-5" title="Iconify">
|
||||||
<div class="flex items-center gap-5">
|
<div class="flex items-center gap-5">
|
||||||
<MdiGithub class="size-8" />
|
<SvgGithubIcon class="size-8" />
|
||||||
<MdiGoogle class="size-8 text-red-500" />
|
<SvgGoogleIcon class="size-8" />
|
||||||
<MdiQqchat class="size-8 text-green-500" />
|
<SvgQQChatIcon class="size-8" />
|
||||||
<MdiWechat class="size-8" />
|
<SvgWeChatIcon class="size-8" />
|
||||||
<MdiKeyboardEsc class="size-8" />
|
<MdiKeyboardEsc class="size-8" />
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const { destroyWatermark, updateWatermark, watermark } = useWatermark();
|
|||||||
|
|
||||||
async function recreateWaterMark() {
|
async function recreateWaterMark() {
|
||||||
destroyWatermark();
|
destroyWatermark();
|
||||||
await updateWatermark({});
|
await createWaterMark();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createWaterMark() {
|
async function createWaterMark() {
|
||||||
|
|||||||
Reference in New Issue
Block a user