mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-09 15:39:24 +08:00
chore: date time variables
This commit is contained in:
parent
ffdd03b4bc
commit
06f57e3b0f
@ -210,36 +210,17 @@ export const getDateRanges = (props?: {
|
|||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
now: () => toString(dayjs()),
|
now: () => toString(dayjs()),
|
||||||
today: (params?: any) => withParams(toString([getStart(0, 'day'), getEnd(0, 'day')]), params),
|
today: () => toString(getStart(0, 'day')),
|
||||||
yesterday: (params?: any) => withParams(toString([getStart(-1, 'day'), getEnd(-1, 'day')]), params),
|
yesterday: () => toString(getStart(-1, 'day')),
|
||||||
tomorrow: (params?: any) => withParams(toString([getStart(1, 'day'), getEnd(1, 'day')]), params),
|
tomorrow: () => toString(getStart(1, 'day')),
|
||||||
thisWeek: (params?: any) => withParams(toString([getStart(0, 'isoWeek'), getEnd(0, 'isoWeek')]), params),
|
|
||||||
lastWeek: (params?: any) => withParams(toString([getStart(-1, 'isoWeek'), getEnd(-1, 'isoWeek')]), params),
|
|
||||||
nextWeek: (params?: any) => withParams(toString([getStart(1, 'isoWeek'), getEnd(1, 'isoWeek')]), params),
|
|
||||||
thisIsoWeek: (params?: any) => withParams(toString([getStart(0, 'isoWeek'), getEnd(0, 'isoWeek')]), params),
|
|
||||||
lastIsoWeek: (params?: any) => withParams(toString([getStart(-1, 'isoWeek'), getEnd(-1, 'isoWeek')]), params),
|
|
||||||
nextIsoWeek: (params?: any) => withParams(toString([getStart(1, 'isoWeek'), getEnd(1, 'isoWeek')]), params),
|
|
||||||
thisMonth: (params?: any) => withParams(toString([getStart(0, 'month'), getEnd(0, 'month')]), params),
|
|
||||||
lastMonth: (params?: any) => withParams(toString([getStart(-1, 'month'), getEnd(-1, 'month')]), params),
|
|
||||||
nextMonth: (params?: any) => withParams(toString([getStart(1, 'month'), getEnd(1, 'month')]), params),
|
|
||||||
thisQuarter: (params?: any) => withParams(toString([getStart(0, 'quarter'), getEnd(0, 'quarter')]), params),
|
|
||||||
lastQuarter: (params?: any) => withParams(toString([getStart(-1, 'quarter'), getEnd(-1, 'quarter')]), params),
|
|
||||||
nextQuarter: (params?: any) => withParams(toString([getStart(1, 'quarter'), getEnd(1, 'quarter')]), params),
|
|
||||||
thisYear: (params?: any) => withParams(toString([getStart(0, 'year'), getEnd(0, 'year')]), params),
|
|
||||||
lastYear: (params?: any) => withParams(toString([getStart(-1, 'year'), getEnd(-1, 'year')]), params),
|
|
||||||
nextYear: (params?: any) => withParams(toString([getStart(1, 'year'), getEnd(1, 'year')]), params),
|
|
||||||
last7Days: (params?: any) => withParams(toString([getStart(-6, 'days'), getEnd(0, 'days')]), params),
|
|
||||||
next7Days: (params?: any) => withParams(toString([getStart(1, 'day'), getEnd(7, 'days')]), params),
|
|
||||||
last30Days: (params?: any) => withParams(toString([getStart(-29, 'days'), getEnd(0, 'days')]), params),
|
|
||||||
next30Days: (params?: any) => withParams(toString([getStart(1, 'day'), getEnd(30, 'days')]), params),
|
|
||||||
last90Days: (params?: any) => withParams(toString([getStart(-89, 'days'), getEnd(0, 'days')]), params),
|
|
||||||
next90Days: (params?: any) => withParams(toString([getStart(1, 'day'), getEnd(90, 'days')]), params),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
now: () => dayjs().toISOString(),
|
now: () => dayjs().toISOString(),
|
||||||
today: (params?: any) => withParams([getStart(0, 'day'), getEnd(0, 'day')], params),
|
today: (params?: any) => getStart(0, 'day').toISOString(),
|
||||||
|
// today: (params?: any) => withParams([getStart(0, 'day'), getEnd(0, 'day')], params),
|
||||||
|
|
||||||
yesterday: (params?: any) => withParams([getStart(-1, 'day'), getEnd(-1, 'day')], params),
|
yesterday: (params?: any) => withParams([getStart(-1, 'day'), getEnd(-1, 'day')], params),
|
||||||
tomorrow: (params?: any) => withParams([getStart(1, 'day'), getEnd(1, 'day')], params),
|
tomorrow: (params?: any) => withParams([getStart(1, 'day'), getEnd(1, 'day')], params),
|
||||||
thisWeek: (params?: any) => withParams([getStart(0, 'isoWeek'), getEnd(0, 'isoWeek')], params),
|
thisWeek: (params?: any) => withParams([getStart(0, 'isoWeek'), getEnd(0, 'isoWeek')], params),
|
||||||
|
@ -216,9 +216,9 @@ export const useDateVariable = ({ operator, schema, noDisabled }: Props) => {
|
|||||||
* 变量:`日期变量`的上下文
|
* 变量:`日期变量`的上下文
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export const useDatetimeVariableContext = () => {
|
export const useDatetimeVariableContext = (shouldBeString = false) => {
|
||||||
const { utc = true } = useDatePickerContext();
|
const { utc = true } = useDatePickerContext();
|
||||||
const datetimeCtx = useMemo(() => getDateRanges({ shouldBeString: true, utc }), [utc]);
|
const datetimeCtx = useMemo(() => getDateRanges({ shouldBeString, utc }), [utc]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
datetimeCtx,
|
datetimeCtx,
|
||||||
@ -226,6 +226,9 @@ export const useDatetimeVariableContext = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* 该 hook 已废弃,请使用 `useDateTimeVariables` 代替
|
||||||
|
*
|
||||||
* 变量:`日期变量`
|
* 变量:`日期变量`
|
||||||
* @param param0
|
* @param param0
|
||||||
* @returns
|
* @returns
|
||||||
@ -244,163 +247,218 @@ export const useDatetimeVariable = ({ operator, schema, noDisabled, targetFieldS
|
|||||||
key: 'now',
|
key: 'now',
|
||||||
value: 'now',
|
value: 'now',
|
||||||
label: t('Current time'),
|
label: t('Current time'),
|
||||||
disabled: noDisabled ? false : schema?.['x-component'] !== 'DatePicker' || operatorValue === '$dateBetween',
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'yesterday',
|
key: 'yesterday',
|
||||||
value: 'yesterday',
|
value: 'yesterday',
|
||||||
label: t('Yesterday'),
|
label: t('Yesterday'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'today',
|
key: 'today',
|
||||||
value: 'today',
|
value: 'today',
|
||||||
label: t('Today'),
|
label: t('Today'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'tomorrow',
|
key: 'tomorrow',
|
||||||
value: 'tomorrow',
|
value: 'tomorrow',
|
||||||
label: t('Tomorrow'),
|
label: t('Tomorrow'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'lastIsoWeek',
|
key: 'lastIsoWeek',
|
||||||
value: 'lastIsoWeek',
|
value: 'lastIsoWeek',
|
||||||
label: t('Last week'),
|
label: t('Last week'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'thisIsoWeek',
|
key: 'thisIsoWeek',
|
||||||
value: 'thisIsoWeek',
|
value: 'thisIsoWeek',
|
||||||
label: t('This week'),
|
label: t('This week'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'nextIsoWeek',
|
key: 'nextIsoWeek',
|
||||||
value: 'nextIsoWeek',
|
value: 'nextIsoWeek',
|
||||||
label: t('Next week'),
|
label: t('Next week'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'lastMonth',
|
key: 'lastMonth',
|
||||||
value: 'lastMonth',
|
value: 'lastMonth',
|
||||||
label: t('Last month'),
|
label: t('Last month'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'thisMonth',
|
key: 'thisMonth',
|
||||||
value: 'thisMonth',
|
value: 'thisMonth',
|
||||||
label: t('This month'),
|
label: t('This month'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'nextMonth',
|
key: 'nextMonth',
|
||||||
value: 'nextMonth',
|
value: 'nextMonth',
|
||||||
label: t('Next month'),
|
label: t('Next month'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'lastQuarter',
|
key: 'lastQuarter',
|
||||||
value: 'lastQuarter',
|
value: 'lastQuarter',
|
||||||
label: t('Last quarter'),
|
label: t('Last quarter'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'thisQuarter',
|
key: 'thisQuarter',
|
||||||
value: 'thisQuarter',
|
value: 'thisQuarter',
|
||||||
label: t('This quarter'),
|
label: t('This quarter'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'nextQuarter',
|
key: 'nextQuarter',
|
||||||
value: 'nextQuarter',
|
value: 'nextQuarter',
|
||||||
label: t('Next quarter'),
|
label: t('Next quarter'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'lastYear',
|
key: 'lastYear',
|
||||||
value: 'lastYear',
|
value: 'lastYear',
|
||||||
label: t('Last year'),
|
label: t('Last year'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'thisYear',
|
key: 'thisYear',
|
||||||
value: 'thisYear',
|
value: 'thisYear',
|
||||||
label: t('This year'),
|
label: t('This year'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'nextYear',
|
key: 'nextYear',
|
||||||
value: 'nextYear',
|
value: 'nextYear',
|
||||||
label: t('Next year'),
|
label: t('Next year'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'last7Days',
|
key: 'last7Days',
|
||||||
value: 'last7Days',
|
value: 'last7Days',
|
||||||
label: t('Last 7 days'),
|
label: t('Last 7 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'next7Days',
|
key: 'next7Days',
|
||||||
value: 'next7Days',
|
value: 'next7Days',
|
||||||
label: t('Next 7 days'),
|
label: t('Next 7 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'last30Days',
|
key: 'last30Days',
|
||||||
value: 'last30Days',
|
value: 'last30Days',
|
||||||
label: t('Last 30 days'),
|
label: t('Last 30 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'next30Days',
|
key: 'next30Days',
|
||||||
value: 'next30Days',
|
value: 'next30Days',
|
||||||
label: t('Next 30 days'),
|
label: t('Next 30 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'last90Days',
|
key: 'last90Days',
|
||||||
value: 'last90Days',
|
value: 'last90Days',
|
||||||
label: t('Last 90 days'),
|
label: t('Last 90 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'next90Days',
|
key: 'next90Days',
|
||||||
value: 'next90Days',
|
value: 'next90Days',
|
||||||
label: t('Next 90 days'),
|
label: t('Next 90 days'),
|
||||||
disabled,
|
disabled: true,
|
||||||
|
operators: datetime,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
label: t('Date variables(Deprecated)'),
|
||||||
|
value: '$nDate',
|
||||||
|
key: '$nDate',
|
||||||
|
disabled: true,
|
||||||
|
children: dateOptions,
|
||||||
|
};
|
||||||
|
}, [schema?.['x-component'], targetFieldSchema]);
|
||||||
|
|
||||||
|
const { datetimeCtx } = useDatetimeVariableContext(true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
datetimeSettings,
|
||||||
|
datetimeCtx,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 变量:`日期变量`
|
||||||
|
* @param param0
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export const useDateTimeVariables = ({ operator, schema, noDisabled, targetFieldSchema }: Props = {}) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { getOperator } = useOperators();
|
||||||
|
|
||||||
|
const dateTimePresetSettings = useMemo(() => {
|
||||||
|
const operatorValue = operator?.value || getOperator(targetFieldSchema?.name) || '';
|
||||||
|
|
||||||
|
const dateOptions = [
|
||||||
|
{
|
||||||
|
key: 'now',
|
||||||
|
value: 'now',
|
||||||
|
label: t('Current time'),
|
||||||
|
operators: datetime,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'yesterday',
|
||||||
|
value: 'yesterday',
|
||||||
|
label: t('Yesterday'),
|
||||||
|
operators: datetime,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'today',
|
||||||
|
value: 'today',
|
||||||
|
label: t('Today'),
|
||||||
|
operators: datetime,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'tomorrow',
|
||||||
|
value: 'tomorrow',
|
||||||
|
label: t('Tomorrow'),
|
||||||
operators: datetime,
|
operators: datetime,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: t('Date variables'),
|
label: t('Date variables'),
|
||||||
value: '$nDate',
|
value: '$nDateTime',
|
||||||
key: '$nDate',
|
key: '$nDateTime',
|
||||||
disabled: dateOptions.every((option) => option.disabled),
|
|
||||||
children: dateOptions,
|
children: dateOptions,
|
||||||
};
|
};
|
||||||
}, [schema?.['x-component'], targetFieldSchema]);
|
}, [schema?.['x-component'], targetFieldSchema]);
|
||||||
@ -408,7 +466,7 @@ export const useDatetimeVariable = ({ operator, schema, noDisabled, targetFieldS
|
|||||||
const { datetimeCtx } = useDatetimeVariableContext();
|
const { datetimeCtx } = useDatetimeVariableContext();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
datetimeSettings,
|
dateTimePresetSettings,
|
||||||
datetimeCtx,
|
dateTimePresetCtx: datetimeCtx,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -13,7 +13,7 @@ import { useMemo } from 'react';
|
|||||||
import { useVariables } from '../../../';
|
import { useVariables } from '../../../';
|
||||||
import { CollectionFieldOptions_deprecated } from '../../../collection-manager';
|
import { CollectionFieldOptions_deprecated } from '../../../collection-manager';
|
||||||
import { useAPITokenVariable } from './useAPITokenVariable';
|
import { useAPITokenVariable } from './useAPITokenVariable';
|
||||||
import { useDatetimeVariable } from './useDateVariable';
|
import { useDatetimeVariable, useDateTimeVariables } from './useDateVariable';
|
||||||
import { useCurrentFormVariable } from './useFormVariable';
|
import { useCurrentFormVariable } from './useFormVariable';
|
||||||
import { useCurrentObjectVariable } from './useIterationVariable';
|
import { useCurrentObjectVariable } from './useIterationVariable';
|
||||||
import { useParentObjectVariable } from './useParentIterationVariable';
|
import { useParentObjectVariable } from './useParentIterationVariable';
|
||||||
@ -77,6 +77,7 @@ export const useVariableOptions = ({
|
|||||||
});
|
});
|
||||||
const { apiTokenSettings } = useAPITokenVariable({ noDisabled });
|
const { apiTokenSettings } = useAPITokenVariable({ noDisabled });
|
||||||
const { datetimeSettings } = useDatetimeVariable({ operator, schema: uiSchema, noDisabled: true, targetFieldSchema });
|
const { datetimeSettings } = useDatetimeVariable({ operator, schema: uiSchema, noDisabled: true, targetFieldSchema });
|
||||||
|
const { dateTimePresetSettings } = useDateTimeVariables();
|
||||||
const { currentFormSettings, shouldDisplayCurrentForm } = useCurrentFormVariable({
|
const { currentFormSettings, shouldDisplayCurrentForm } = useCurrentFormVariable({
|
||||||
schema: uiSchema,
|
schema: uiSchema,
|
||||||
collectionField,
|
collectionField,
|
||||||
@ -128,6 +129,7 @@ export const useVariableOptions = ({
|
|||||||
currentRoleSettings,
|
currentRoleSettings,
|
||||||
apiTokenSettings,
|
apiTokenSettings,
|
||||||
datetimeSettings,
|
datetimeSettings,
|
||||||
|
dateTimePresetSettings,
|
||||||
shouldDisplayCurrentForm && currentFormSettings,
|
shouldDisplayCurrentForm && currentFormSettings,
|
||||||
shouldDisplayCurrentObject && currentObjectSettings,
|
shouldDisplayCurrentObject && currentObjectSettings,
|
||||||
shouldDisplayParentObject && parentObjectSettings,
|
shouldDisplayParentObject && parentObjectSettings,
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
import { dayjs } from '@nocobase/utils/client';
|
import { dayjs } from '@nocobase/utils/client';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { DEFAULT_DATA_SOURCE_KEY } from '../../data-source/data-source/DataSourceManager';
|
import { DEFAULT_DATA_SOURCE_KEY } from '../../data-source/data-source/DataSourceManager';
|
||||||
import { useCurrentUserVariable, useDatetimeVariable } from '../../schema-settings';
|
import { useCurrentUserVariable, useDatetimeVariable, useDateTimeVariables } from '../../schema-settings';
|
||||||
import { useAPITokenVariable } from '../../schema-settings/VariableInput/hooks/useAPITokenVariable';
|
import { useAPITokenVariable } from '../../schema-settings/VariableInput/hooks/useAPITokenVariable';
|
||||||
import { useCurrentRoleVariable } from '../../schema-settings/VariableInput/hooks/useRoleVariable';
|
import { useCurrentRoleVariable } from '../../schema-settings/VariableInput/hooks/useRoleVariable';
|
||||||
import { useURLSearchParamsVariable } from '../../schema-settings/VariableInput/hooks/useURLSearchParamsVariable';
|
import { useURLSearchParamsVariable } from '../../schema-settings/VariableInput/hooks/useURLSearchParamsVariable';
|
||||||
@ -26,6 +26,8 @@ const useBuiltInVariables = () => {
|
|||||||
const { currentRoleCtx } = useCurrentRoleVariable();
|
const { currentRoleCtx } = useCurrentRoleVariable();
|
||||||
const { apiTokenCtx } = useAPITokenVariable();
|
const { apiTokenCtx } = useAPITokenVariable();
|
||||||
const { datetimeCtx } = useDatetimeVariable();
|
const { datetimeCtx } = useDatetimeVariable();
|
||||||
|
const { dateTimePresetCtx } = useDateTimeVariables();
|
||||||
|
|
||||||
const { urlSearchParamsCtx, name: urlSearchParamsName, defaultValue } = useURLSearchParamsVariable();
|
const { urlSearchParamsCtx, name: urlSearchParamsName, defaultValue } = useURLSearchParamsVariable();
|
||||||
const envVariableCtx = useGlobalVariableCtx('$env');
|
const envVariableCtx = useGlobalVariableCtx('$env');
|
||||||
const builtinVariables: VariableOption[] = useMemo(() => {
|
const builtinVariables: VariableOption[] = useMemo(() => {
|
||||||
@ -60,6 +62,10 @@ const useBuiltInVariables = () => {
|
|||||||
name: '$nDate',
|
name: '$nDate',
|
||||||
ctx: datetimeCtx,
|
ctx: datetimeCtx,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: '$nDateTime',
|
||||||
|
ctx: dateTimePresetCtx,
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
* 兼容旧版本的 `$date` 变量,新版本已弃用
|
* 兼容旧版本的 `$date` 变量,新版本已弃用
|
||||||
@ -68,6 +74,7 @@ const useBuiltInVariables = () => {
|
|||||||
name: '$date',
|
name: '$date',
|
||||||
ctx: datetimeCtx,
|
ctx: datetimeCtx,
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
* 兼容旧版本的 `$system` 变量,新版本已弃用
|
* 兼容旧版本的 `$system` 变量,新版本已弃用
|
||||||
|
Loading…
x
Reference in New Issue
Block a user