提交 8e5a6b7c 编写于 作者: V vben

perf: 修复部分 eslint 错误

上级 279977b8
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
"@typescript-eslint/parser": "^5.57.1", "@typescript-eslint/parser": "^5.57.1",
"eslint": "^8.37.0", "eslint": "^8.37.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-prettier": "^4.2.1", "eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.10.0", "eslint-plugin-vue": "^9.10.0",
"vue-eslint-parser": "^9.1.1" "vue-eslint-parser": "^9.1.1"
......
...@@ -17,7 +17,7 @@ export default { ...@@ -17,7 +17,7 @@ export default {
createDefaultProgram: false, createDefaultProgram: false,
extraFileExtensions: ['.vue'], extraFileExtensions: ['.vue'],
}, },
plugins: ['vue', '@typescript-eslint'], plugins: ['vue', '@typescript-eslint', 'import'],
extends: [ extends: [
'eslint:recommended', 'eslint:recommended',
'plugin:vue/vue3-recommended', 'plugin:vue/vue3-recommended',
...@@ -25,16 +25,20 @@ export default { ...@@ -25,16 +25,20 @@ export default {
'plugin:prettier/recommended', 'plugin:prettier/recommended',
], ],
rules: { rules: {
'no-unused-vars': 'off',
'no-case-declarations': 'off', 'no-case-declarations': 'off',
'vue/script-setup-uses-vars': 'error', 'no-use-before-define': 'off',
'vue/no-reserved-component-names': 'off', 'space-before-function-paren': 'off',
'import/first': 'error',
'import/newline-after-import': 'error',
'import/no-duplicates': 'error',
'@typescript-eslint/ban-ts-ignore': 'off', '@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-empty-function': 'off',
'vue/custom-event-name-casing': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off', '@typescript-eslint/ban-types': 'off',
...@@ -47,15 +51,9 @@ export default { ...@@ -47,15 +51,9 @@ export default {
varsIgnorePattern: '^_', varsIgnorePattern: '^_',
}, },
], ],
'no-unused-vars': [ 'vue/script-setup-uses-vars': 'error',
'error', 'vue/no-reserved-component-names': 'off',
{ 'vue/custom-event-name-casing': 'off',
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'space-before-function-paren': 'off',
'vue/attributes-order': 'off', 'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off', 'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off', 'vue/html-closing-bracket-newline': 'off',
...@@ -78,5 +76,15 @@ export default { ...@@ -78,5 +76,15 @@ export default {
}, },
], ],
'vue/multi-word-component-names': 'off', 'vue/multi-word-component-names': 'off',
// 'sort-imports': [
// 'error',
// {
// ignoreCase: true,
// ignoreDeclarationSort: false,
// ignoreMemberSort: false,
// memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
// allowSeparatedGroups: false,
// },
// ],
}, },
}; };
此差异已折叠。
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { DemoOptionsItem, selectParams } from './model/optionsModel'; import { DemoOptionsItem, selectParams } from './model/optionsModel';
enum Api { enum Api {
OPTIONS_LIST = '/select/getDemoOptions', OPTIONS_LIST = '/select/getDemoOptions',
} }
......
import type { RouteMeta } from 'vue-router'; import type { RouteMeta } from 'vue-router';
export interface RouteItem { export interface RouteItem {
path: string; path: string;
component: any; component: any;
......
import type { PropType } from 'vue'; import type { PropType } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n(); const { t } = useI18n();
export const footerProps = { export const footerProps = {
......
import type { ColEx } from '../types'; import type { ColEx } from '../types';
import type { AdvanceState } from '../types/hooks'; import type { AdvanceState } from '../types/hooks';
import { ComputedRef, getCurrentInstance, Ref, shallowReactive } from 'vue'; import { ComputedRef, getCurrentInstance, Ref, shallowReactive, computed, unref, watch } from 'vue';
import type { FormProps, FormSchema } from '../types/form'; import type { FormProps, FormSchema } from '../types/form';
import { computed, unref, watch } from 'vue';
import { isBoolean, isFunction, isNumber, isObject } from '/@/utils/is'; import { isBoolean, isFunction, isNumber, isObject } from '/@/utils/is';
import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
import { useDebounceFn } from '@vueuse/core'; import { useDebounceFn } from '@vueuse/core';
......
import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface'; import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface';
import type { VNode } from 'vue'; import type { VNode, CSSProperties } from 'vue';
import type { ButtonProps as AntdButtonProps } from '/@/components/Button'; import type { ButtonProps as AntdButtonProps } from '/@/components/Button';
import type { FormItem } from './formItem'; import type { FormItem } from './formItem';
import type { ColEx, ComponentType } from './index'; import type { ColEx, ComponentType } from './index';
import type { TableActionType } from '/@/components/Table/src/types/table'; import type { TableActionType } from '/@/components/Table/src/types/table';
import type { CSSProperties } from 'vue';
import type { RowProps } from 'ant-design-vue/lib/grid/Row'; import type { RowProps } from 'ant-design-vue/lib/grid/Row';
export type FieldMapToTime = [string, [string, string], (string | [string, string])?][]; export type FieldMapToTime = [string, [string, string], (string | [string, string])?][];
......
import { VNode, defineComponent } from 'vue'; import { VNode, defineComponent, createVNode, render, reactive, h } from 'vue';
import type { LoadingProps } from './typing'; import type { LoadingProps } from './typing';
import { createVNode, render, reactive, h } from 'vue';
import Loading from './Loading.vue'; import Loading from './Loading.vue';
export function createLoading(props?: Partial<LoadingProps>, target?: HTMLElement, wait = false) { export function createLoading(props?: Partial<LoadingProps>, target?: HTMLElement, wait = false) {
......
import Vditor from 'vditor'; import Vditor from 'vditor';
export interface MarkDownActionType { export interface MarkDownActionType {
getVditor: () => Vditor; getVditor: () => Vditor;
} }
...@@ -6,6 +6,7 @@ import { ThemeEnum } from '/@/enums/appEnum'; ...@@ -6,6 +6,7 @@ import { ThemeEnum } from '/@/enums/appEnum';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
import type { MenuTheme } from 'ant-design-vue'; import type { MenuTheme } from 'ant-design-vue';
import type { MenuMode } from 'ant-design-vue/lib/menu/src/interface'; import type { MenuMode } from 'ant-design-vue/lib/menu/src/interface';
export const basicProps = { export const basicProps = {
items: { items: {
type: Array as PropType<Menu[]>, type: Array as PropType<Menu[]>,
......
...@@ -2,9 +2,8 @@ import { MenuModeEnum } from '/@/enums/menuEnum'; ...@@ -2,9 +2,8 @@ import { MenuModeEnum } from '/@/enums/menuEnum';
import type { Menu as MenuType } from '/@/router/types'; import type { Menu as MenuType } from '/@/router/types';
import type { MenuState } from './types'; import type { MenuState } from './types';
import { computed, Ref, toRaw } from 'vue'; import { computed, Ref, toRaw, unref } from 'vue';
import { unref } from 'vue';
import { uniq } from 'lodash-es'; import { uniq } from 'lodash-es';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { getAllParentPath } from '/@/router/helper/menuHelper'; import { getAllParentPath } from '/@/router/helper/menuHelper';
......
...@@ -14,13 +14,13 @@ import { ...@@ -14,13 +14,13 @@ import {
watchEffect, watchEffect,
nextTick, nextTick,
toRaw, toRaw,
computed,
} from 'vue'; } from 'vue';
import { isProdMode } from '/@/utils/env'; import { isProdMode } from '/@/utils/env';
import { isFunction } from '/@/utils/is'; import { isFunction } from '/@/utils/is';
import { isEqual } from 'lodash-es'; import { isEqual } from 'lodash-es';
import { tryOnUnmounted } from '@vueuse/core'; import { tryOnUnmounted } from '@vueuse/core';
import { error } from '/@/utils/log'; import { error } from '/@/utils/log';
import { computed } from 'vue';
const dataTransfer = reactive<any>({}); const dataTransfer = reactive<any>({});
......
import { isString } from '/@/utils/is'; import { isString } from '/@/utils/is';
import { RenderQrCodeParams, LogoType } from './typing'; import { RenderQrCodeParams, LogoType } from './typing';
export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => { export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
if (!logo) { if (!logo) {
return new Promise((resolve) => { return new Promise((resolve) => {
......
// 参考 qr-code-with-logo 进行ts版本修改 // 参考 qr-code-with-logo 进行ts版本修改
import { toCanvas } from './toCanvas'; import { toCanvas } from './toCanvas';
export * from './typing'; export * from './typing';
export { toCanvas }; export { toCanvas };
import { renderQrCode } from './drawCanvas'; import { renderQrCode } from './drawCanvas';
import { drawLogo } from './drawLogo'; import { drawLogo } from './drawLogo';
import { RenderQrCodeParams } from './typing'; import { RenderQrCodeParams } from './typing';
export const toCanvas = (options: RenderQrCodeParams) => { export const toCanvas = (options: RenderQrCodeParams) => {
return renderQrCode(options) return renderQrCode(options)
.then(() => { .then(() => {
......
import type { BarMap } from './types'; import type { BarMap } from './types';
export const BAR_MAP: BarMap = { export const BAR_MAP: BarMap = {
vertical: { vertical: {
offset: 'offsetHeight', offset: 'offsetHeight',
......
import type { Menu as MenuType } from '/@/router/types'; import type { Menu as MenuType } from '/@/router/types';
import type { MenuState } from './types'; import type { MenuState } from './types';
import { computed, Ref, toRaw } from 'vue'; import { computed, Ref, toRaw, unref } from 'vue';
import { unref } from 'vue';
import { uniq } from 'lodash-es'; import { uniq } from 'lodash-es';
import { getAllParentPath } from '/@/router/helper/menuHelper'; import { getAllParentPath } from '/@/router/helper/menuHelper';
......
import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table'; import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table';
import { Ref, ComputedRef, ref } from 'vue'; import { Ref, ComputedRef, ref, computed, unref, nextTick, watch } from 'vue';
import { computed, unref, nextTick, watch } from 'vue';
import { getViewportOffset } from '/@/utils/domUtils'; import { getViewportOffset } from '/@/utils/domUtils';
import { isBoolean } from '/@/utils/is'; import { isBoolean } from '/@/utils/is';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
......
import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes'; import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip'; import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip';
import { RoleEnum } from '/@/enums/roleEnum'; import { RoleEnum } from '/@/enums/roleEnum';
export interface ActionItem extends ButtonProps { export interface ActionItem extends ButtonProps {
onClick?: Fn; onClick?: Fn;
label?: string; label?: string;
......
import { Ref, unref, computed } from 'vue'; import { Ref, unref, computed } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n(); const { t } = useI18n();
export function useUploadType({ export function useUploadType({
acceptRef, acceptRef,
......
import { defineComponent } from 'vue'; import { defineComponent, computed, ref } from 'vue';
import { computed, ref } from 'vue';
import { BasicTableProps } from './types'; import { BasicTableProps } from './types';
import { basicProps } from './props'; import { basicProps } from './props';
import { ignorePropKeys } from './const'; import { ignorePropKeys } from './const';
......
import type { Directive } from 'vue'; import type { Directive } from 'vue';
import './index.less'; import './index.less';
export interface RippleOptions { export interface RippleOptions {
event: string; event: string;
transition: number; transition: number;
......
import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue'; import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue';
import type { Ref } from 'vue'; import type { Ref } from 'vue';
interface Params { interface Params {
excludeListeners?: boolean; excludeListeners?: boolean;
excludeKeys?: string[]; excludeKeys?: string[];
......
import { onUnmounted, getCurrentInstance } from 'vue'; import { onUnmounted, getCurrentInstance } from 'vue';
import { createContextMenu, destroyContextMenu } from '/@/components/ContextMenu'; import { createContextMenu, destroyContextMenu } from '/@/components/ContextMenu';
import type { ContextMenuItem } from '/@/components/ContextMenu'; import type { ContextMenuItem } from '/@/components/ContextMenu';
export type { ContextMenuItem }; export type { ContextMenuItem };
export function useContextMenu(authRemove = true) { export function useContextMenu(authRemove = true) {
if (getCurrentInstance() && authRemove) { if (getCurrentInstance() && authRemove) {
......
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { isDef } from '/@/utils/is'; import { isDef } from '/@/utils/is';
interface Options { interface Options {
target?: HTMLElement; target?: HTMLElement;
} }
......
import type { EChartsOption } from 'echarts'; import type { EChartsOption } from 'echarts';
import type { Ref } from 'vue'; import type { Ref } from 'vue';
import { useTimeoutFn } from '/@/hooks/core/useTimeout'; import { useTimeoutFn } from '/@/hooks/core/useTimeout';
import { tryOnUnmounted } from '@vueuse/core'; import { tryOnUnmounted, useDebounceFn } from '@vueuse/core';
import { unref, nextTick, watch, computed, ref } from 'vue'; import { unref, nextTick, watch, computed, ref } from 'vue';
import { useDebounceFn } from '@vueuse/core';
import { useEventListener } from '/@/hooks/event/useEventListener'; import { useEventListener } from '/@/hooks/event/useEventListener';
import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
import echarts from '/@/utils/lib/echarts'; import echarts from '/@/utils/lib/echarts';
......
import type { AppRouteModule } from '/@/router/types'; import type { AppRouteModule } from '/@/router/types';
import { LAYOUT } from '/@/router/constant'; import { LAYOUT } from '/@/router/constant';
const IFrame = () => import('/@/views/sys/iframe/FrameBlank.vue');
import { t } from '/@/hooks/web/useI18n'; import { t } from '/@/hooks/web/useI18n';
const IFrame = () => import('/@/views/sys/iframe/FrameBlank.vue');
const iframe: AppRouteModule = { const iframe: AppRouteModule = {
path: '/frame', path: '/frame',
name: 'Frame', name: 'Frame',
......
...@@ -10,6 +10,7 @@ import { ...@@ -10,6 +10,7 @@ import {
SessionTimeoutProcessingEnum, SessionTimeoutProcessingEnum,
} from '/@/enums/appEnum'; } from '/@/enums/appEnum';
import { SIDE_BAR_BG_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST } from './designSetting'; import { SIDE_BAR_BG_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST } from './designSetting';
const primaryColor = '#0960bd'; const primaryColor = '#0960bd';
// ! You need to clear the browser cache after the change // ! You need to clear the browser cache after the change
......
import { Persistent, BasicKeys } from '/@/utils/cache/persistent'; import { Persistent, BasicKeys } from '/@/utils/cache/persistent';
import { CacheTypeEnum } from '/@/enums/cacheEnum'; import { CacheTypeEnum, TOKEN_KEY } from '/@/enums/cacheEnum';
import projectSetting from '/@/settings/projectSetting'; import projectSetting from '/@/settings/projectSetting';
import { TOKEN_KEY } from '/@/enums/cacheEnum';
const { permissionCacheType } = projectSetting; const { permissionCacheType } = projectSetting;
const isLocal = permissionCacheType === CacheTypeEnum.LOCAL; const isLocal = permissionCacheType === CacheTypeEnum.LOCAL;
......
import { getStorageShortName } from '/@/utils/env'; import { getStorageShortName } from '/@/utils/env';
import { createStorage as create, CreateStorageParams } from './storageCache'; import { createStorage as create, CreateStorageParams } from './storageCache';
import { enableStorageEncryption } from '/@/settings/encryptionSetting'; import { enableStorageEncryption, DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
export type Options = Partial<CreateStorageParams>; export type Options = Partial<CreateStorageParams>;
......
import { encrypt, decrypt } from 'crypto-js/aes'; import { encrypt, decrypt } from 'crypto-js/aes';
import { parse } from 'crypto-js/enc-utf8'; import UTF8, { parse } from 'crypto-js/enc-utf8';
import pkcs7 from 'crypto-js/pad-pkcs7'; import pkcs7 from 'crypto-js/pad-pkcs7';
import ECB from 'crypto-js/mode-ecb'; import ECB from 'crypto-js/mode-ecb';
import md5 from 'crypto-js/md5'; import md5 from 'crypto-js/md5';
import UTF8 from 'crypto-js/enc-utf8';
import Base64 from 'crypto-js/enc-base64'; import Base64 from 'crypto-js/enc-base64';
export interface EncryptionParams { export interface EncryptionParams {
......
...@@ -6,8 +6,7 @@ import qs from 'qs'; ...@@ -6,8 +6,7 @@ import qs from 'qs';
import { AxiosCanceler } from './axiosCancel'; import { AxiosCanceler } from './axiosCancel';
import { isFunction } from '/@/utils/is'; import { isFunction } from '/@/utils/is';
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { ContentTypeEnum } from '/@/enums/httpEnum'; import { ContentTypeEnum, RequestEnum } from '/@/enums/httpEnum';
import { RequestEnum } from '/@/enums/httpEnum';
export * from './axiosTransform'; export * from './axiosTransform';
......
import { FormSchema } from '/@/components/Form'; import { FormSchema } from '/@/components/Form';
const colProps = { const colProps = {
span: 8, span: 8,
}; };
......
import { getAllRoleList, isAccountExist } from '/@/api/demo/system'; import { getAllRoleList, isAccountExist } from '/@/api/demo/system';
import { BasicColumn } from '/@/components/Table'; import { BasicColumn, FormSchema } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
export const columns: BasicColumn[] = [ export const columns: BasicColumn[] = [
{ {
......
import { BasicColumn } from '/@/components/Table'; import { BasicColumn, FormSchema } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue'; import { h } from 'vue';
import { Tag } from 'ant-design-vue'; import { Tag } from 'ant-design-vue';
......
import { BasicColumn } from '/@/components/Table'; import { BasicColumn, FormSchema } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue'; import { h } from 'vue';
import { Tag } from 'ant-design-vue'; import { Tag } from 'ant-design-vue';
import { Icon } from '/@/components/Icon'; import { Icon } from '/@/components/Icon';
......
import { BasicColumn } from '/@/components/Table'; import { BasicColumn, FormSchema } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue'; import { h } from 'vue';
import { Switch } from 'ant-design-vue'; import { Switch } from 'ant-design-vue';
import { setRoleStatus } from '/@/api/demo/system'; import { setRoleStatus } from '/@/api/demo/system';
......
import { IAnyObject } from '../typings/base-type'; import { IAnyObject } from '../typings/base-type';
import { Ref, SetupContext } from 'vue'; import { Ref, SetupContext, getCurrentInstance, toRaw } from 'vue';
import { cloneDeep, forOwn, isFunction } from 'lodash-es'; import { cloneDeep, forOwn, isFunction } from 'lodash-es';
import { AForm, IVFormComponent } from '../typings/v-form-component'; import { AForm, IVFormComponent } from '../typings/v-form-component';
import { getCurrentInstance } from 'vue';
import { Form } from 'ant-design-vue'; import { Form } from 'ant-design-vue';
import { toRaw } from 'vue';
export function useFormInstanceMethods( export function useFormInstanceMethods(
props: IAnyObject, props: IAnyObject,
......
...@@ -8,6 +8,7 @@ import { SelectValue } from 'ant-design-vue/lib/select'; ...@@ -8,6 +8,7 @@ import { SelectValue } from 'ant-design-vue/lib/select';
import { validateOptions } from 'ant-design-vue/lib/form/useForm'; import { validateOptions } from 'ant-design-vue/lib/form/useForm';
import { RuleError } from 'ant-design-vue/lib/form/interface'; import { RuleError } from 'ant-design-vue/lib/form/interface';
import { FormItem } from '/@/components/Form'; import { FormItem } from '/@/components/Form';
type LayoutType = 'horizontal' | 'vertical' | 'inline'; type LayoutType = 'horizontal' | 'vertical' | 'inline';
type labelLayout = 'flex' | 'Grid'; type labelLayout = 'flex' | 'Grid';
export type PropsTabKey = 1 | 2 | 3; export type PropsTabKey = 1 | 2 | 3;
......
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const message = Object.assign({ const message = Object.assign({
success: (msg: string) => { success: (msg: string) => {
......
declare module '*.vue' { declare module '*.vue' {
import { DefineComponent } from 'vue'; import { DefineComponent } from 'vue';
const Component: DefineComponent<{}, {}, any>; const Component: DefineComponent<{}, {}, any>;
export default Component; export default Component;
} }
declare module 'ant-design-vue/es/locale/*' { declare module 'ant-design-vue/es/locale/*' {
import { Locale } from 'ant-design-vue/types/locale-provider'; import { Locale } from 'ant-design-vue/types/locale-provider';
const locale: Locale & ReadonlyRecordable; const locale: Locale & ReadonlyRecordable;
export default locale as Locale & ReadonlyRecordable; export default locale as Locale & ReadonlyRecordable;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册