Browse Source

chore: Refactor project structure

1. Remove unnecessary files
2. Upgrade ESLint to the latest version
main
刘凯 1 year ago
parent
commit
782bbfb73d
  1. 2
      .env
  2. 2
      .env.development
  3. 28
      .env.front
  4. 6
      .gitpod.yml
  5. 16
      .hintrc
  6. 9
      .prettierignore
  7. 2
      .vscode/launch.json
  8. 46
      .vscode/settings.json
  9. 23
      package.json
  10. 562
      pnpm-lock.yaml
  11. 2
      src/api/base/login.ts
  12. 2
      src/components/CronTab/src/tabs/WeekUI.vue
  13. 2
      src/components/Cropper/src/CopperModal.vue
  14. 2
      src/components/Cropper/src/CropperAvatar.vue
  15. 4
      src/components/Drawer/src/typing.ts
  16. 2
      src/components/Form/src/components/ApiRadioGroup.vue
  17. 2
      src/components/Form/src/components/ApiSelect.vue
  18. 2
      src/components/Form/src/components/FormItem.vue
  19. 2
      src/components/Form/src/components/RadioButtonGroup.vue
  20. 12
      src/components/Form/src/types/index.ts
  21. 12
      src/components/FormDesign/src/components/VFormDesign/components/LayoutItem.vue
  22. 7
      src/components/FormDesign/src/components/VFormDesign/modules/FormComponentPanel.vue
  23. 14
      src/components/FormDesign/src/typings/v-form-component.ts
  24. 4
      src/components/Menu/src/BasicMenu.vue
  25. 2
      src/components/Table/src/hooks/useDataSource.ts
  26. 2
      src/components/Table/src/props.ts
  27. 2
      src/components/Table/src/types/table.ts
  28. 2
      src/components/Tree/src/types/tree.ts
  29. 2
      src/components/Upload/src/data.tsx
  30. 2
      src/components/Verifition/src/Verify.vue
  31. 4
      src/components/Verifition/src/Verify/VerifyPoints.vue
  32. 4
      src/components/Verifition/src/Verify/VerifySlide.vue
  33. 2
      src/directives/ripple/index.ts
  34. 2
      src/router/guard/permissionGuard.ts
  35. 1
      src/utils/domUtils.ts
  36. 2
      src/utils/file/download.ts
  37. 4
      src/utils/helper/treeHelper.ts
  38. 3
      src/utils/index.ts
  39. 2
      src/utils/props.ts
  40. 4
      src/utils/tree.ts
  41. 22
      src/views/base/login/LoginForm.vue
  42. 2
      src/views/infra/webSocket/index.vue

2
.env

@ -1,5 +1,5 @@
# 端口号 # 端口号
VITE_PORT = 80 VITE_PORT = 3000
# 网站标题 # 网站标题
VITE_GLOB_APP_TITLE = 芋道管理系统 VITE_GLOB_APP_TITLE = 芋道管理系统

2
.env.development

@ -7,7 +7,7 @@ VITE_PUBLIC_PATH = /
# 本地开发代理,可以解决跨域及多地址代理 # 本地开发代理,可以解决跨域及多地址代理
# 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题 # 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题
# 可以有多个,注意多个不能换行,否则代理将会失效 # 可以有多个,注意多个不能换行,否则代理将会失效
VITE_PROXY = [["/dev-api","http://localhost:48080/admin-api"],["/upload","http://localhost:48080/admin-api/infra/file/upload"]] VITE_PROXY = [["/dev-api","http://192.168.1.100:48080/admin-api"],["/upload","http://192.168.1.100:48080/admin-api/infra/file/upload"]]
# VITE_PROXY=[["/api","http://vben.xingyuv.com/test"]] # VITE_PROXY=[["/api","http://vben.xingyuv.com/test"]]
# 是否删除Console.log # 是否删除Console.log

28
.env.front

@ -1,28 +0,0 @@
# 本地开发环境
NODE_ENV=development
# 资源公共路径,需要以 /开头和结尾
VITE_PUBLIC_PATH = /
# 本地开发代理,可以解决跨域及多地址代理
# 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题
# 可以有多个,注意多个不能换行,否则代理将会失效
VITE_PROXY = [["/dev-api","http://api-dashboard.yudao.iocoder.cn/admin-api"],["/upload","http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload"]]
# VITE_PROXY=[["/api","http://vben.xingyuv.com/test"]]
# 是否删除Console.log
VITE_DROP_CONSOLE = false
# 基础页面地址,例如 swagger 等页面
VITE_GLOB_BASE_URL = "http://api-dashboard.yudao.iocoder.cn"
# 接口地址,如果没有跨域问题,直接在这里配置即可
VITE_GLOB_API_URL = /dev-api
# 文件上传接口 可选
VITE_GLOB_UPLOAD_URL = /upload
# 接口地址前缀,有些系统所有接口地址都有前缀,可以在这里统一加,方便切换
VITE_GLOB_API_URL_PREFIX =
# 百度统计
VITE_APP_BAIDU_CODE = eb21166668bf766b9d059a6fd1c10777

6
.gitpod.yml

@ -1,6 +0,0 @@
ports:
- port: 3344
onOpen: open-preview
tasks:
- init: pnpm install
command: pnpm run dev

16
.hintrc

@ -1,16 +0,0 @@
{
"extends": [
"development"
],
"hints": {
"compat-api/css": [
"default",
{
"ignore": [
"-webkit-tap-highlight-color",
"text-size-adjust"
]
}
]
}
}

9
.prettierignore

@ -1,9 +0,0 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

2
.vscode/launch.json vendored

@ -5,7 +5,7 @@
"type": "chrome", "type": "chrome",
"request": "launch", "request": "launch",
"name": "Launch Chrome", "name": "Launch Chrome",
"url": "http://localhost:80", "url": "http://localhost:3000",
"webRoot": "${workspaceFolder}/src", "webRoot": "${workspaceFolder}/src",
"sourceMaps": true "sourceMaps": true
} }

46
.vscode/settings.json vendored

@ -2,8 +2,6 @@
"typescript.tsdk": "./node_modules/typescript/lib", "typescript.tsdk": "./node_modules/typescript/lib",
"npm.packageManager": "pnpm", "npm.packageManager": "pnpm",
"editor.tabSize": 2, "editor.tabSize": 2,
"prettier.printWidth": 140, //
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.eol": "\n", "files.eol": "\n",
"search.exclude": { "search.exclude": {
"**/node_modules": true, "**/node_modules": true,
@ -60,8 +58,8 @@
"path-intellisense.mappings": { "path-intellisense.mappings": {
"@/": "${workspaceRoot}/src" "@/": "${workspaceRoot}/src"
}, },
"eslint.experimental.useFlatConfig": true,
"prettier.enable": false, "prettier.enable": false,
"eslint.experimental.useFlatConfig": true,
"editor.formatOnSave": false, "editor.formatOnSave": false,
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll": "explicit", "source.fixAll": "explicit",
@ -90,35 +88,11 @@
"jsonc", "jsonc",
"yaml" "yaml"
], ],
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[vue]": { "[vue]": {
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true, "source.fixAll.eslint": "explicit",
"source.organizeImports": false, "source.organizeImports": "never",
"source.fixAll.stylelint": true "source.fixAll.stylelint": "explicit"
} }
}, },
"i18n-ally.localesPaths": ["src/locales/lang"], "i18n-ally.localesPaths": ["src/locales/lang"],
@ -173,18 +147,8 @@
"yudao", "yudao",
"zxcvbn" "zxcvbn"
], ],
//
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": {
"*.ts": "$(capture).test.ts, $(capture).test.tsx",
"*.tsx": "$(capture).test.ts, $(capture).test.tsx",
"*.env": "$(capture).env.*",
"package.json": ".hintrc,pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.gitignore,stylelint.config.js,eslint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
},
"eslint.codeAction.showDocumentation": { "eslint.codeAction.showDocumentation": {
"enable": true "enable": true
}, },
"terminal.integrated.scrollback": 10000, "terminal.integrated.scrollback": 10000
"nuxt.isNuxtApp": false
} }

23
package.json

@ -22,25 +22,18 @@
}, },
"scripts": { "scripts": {
"commit": "czg", "commit": "czg",
"bootstrap": "pnpm install",
"serve": "pnpm dev",
"dev": "vite", "dev": "vite",
"front": "vite --mode front",
"build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts", "build": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts",
"build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts", "build:test": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode test && esno ./build/script/postBuild.ts",
"build:static": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode static && esno ./build/script/postBuild.ts", "build:static": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode static && esno ./build/script/postBuild.ts",
"build:no-cache": "pnpm store prune && pnpm build", "build:no-cache": "pnpm store prune && pnpm build",
"report": "cross-env REPORT=true pnpm build", "report": "cross-env REPORT=true pnpm build",
"type:check": "vue-tsc --noEmit --skipLibCheck", "type:check": "vue-tsc --noEmit --skipLibCheck",
"preview": "pnpm build && vite preview", "preview": "vite preview",
"preview:dist": "vite preview",
"clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
"clean:lib": "rimraf node_modules",
"lint": "eslint .", "lint": "eslint .",
"lint:fix": "eslint . --fix", "lint:fix": "eslint . --fix",
"lint:stylelint": "stylelint \"**/*.{vue,css,less,scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/", "lint:stylelint": "stylelint \"**/*.{vue,css,less,scss}\" --fix --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged", "lint:lint-staged": "lint-staged",
"reinstall": "rimraf pnpm-lock.yaml && rimraf node_modules && npm run bootstrap",
"prepare": "husky install", "prepare": "husky install",
"gen:icon": "esno ./build/generate/icon/index.ts" "gen:icon": "esno ./build/generate/icon/index.ts"
}, },
@ -82,7 +75,7 @@
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^1.1.1", "@antfu/eslint-config": "^2.6.1",
"@commitlint/cli": "^18.4.1", "@commitlint/cli": "^18.4.1",
"@commitlint/config-conventional": "^18.4.0", "@commitlint/config-conventional": "^18.4.0",
"@iconify/json": "^2.2.141", "@iconify/json": "^2.2.141",
@ -104,7 +97,7 @@
"cz-git": "^1.7.1", "cz-git": "^1.7.1",
"czg": "^1.7.1", "czg": "^1.7.1",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"eslint": "^8.53.0", "eslint": "^8.56.0",
"esno": "^4.0.0", "esno": "^4.0.0",
"fs-extra": "^11.1.1", "fs-extra": "^11.1.1",
"husky": "^8.0.3", "husky": "^8.0.3",
@ -115,7 +108,6 @@
"postcss": "^8.4.31", "postcss": "^8.4.31",
"postcss-html": "^1.5.0", "postcss-html": "^1.5.0",
"postcss-less": "^6.0.0", "postcss-less": "^6.0.0",
"prettier": "^3.1.0",
"rimraf": "^5.0.5", "rimraf": "^5.0.5",
"rollup": "^4.4.0", "rollup": "^4.4.0",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
@ -143,21 +135,12 @@
"*.{js,jsx,ts,tsx}": [ "*.{js,jsx,ts,tsx}": [
"eslint --fix" "eslint --fix"
], ],
"{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
"prettier --write--parser json"
],
"package.json": [
"prettier --write"
],
"*.vue": [ "*.vue": [
"eslint --fix", "eslint --fix",
"stylelint --fix" "stylelint --fix"
], ],
"*.{scss,less,styl,html}": [ "*.{scss,less,styl,html}": [
"stylelint --fix" "stylelint --fix"
],
"*.md": [
"prettier --write"
] ]
}, },
"config": { "config": {

562
pnpm-lock.yaml

File diff suppressed because it is too large Load Diff

2
src/api/base/login.ts

@ -25,7 +25,7 @@ export function getTenantIdByName(name: string) {
// 使用租户域名,获得租户信息 // 使用租户域名,获得租户信息
export function getTenantByWebsite(website: string) { export function getTenantByWebsite(website: string) {
return defHttp.get({ url: `/system/tenant/get-by-website?website=${website}` }) return defHttp.get({ url: `/system/tenant/get-by-website?website=${website}` }, { errorMessageMode: 'none' })
} }
// 登出 // 登出

2
src/components/CronTab/src/tabs/WeekUI.vue

@ -48,7 +48,7 @@ export default defineComponent({
disabled: disabledChoice, disabled: disabledChoice,
}) })
const weekOptions = computed(() => { const weekOptions = computed(() => {
const options: { label: string; value: number }[] = [] const options: { label: string, value: number }[] = []
for (const weekKey of Object.keys(WEEK_MAP_CN)) { for (const weekKey of Object.keys(WEEK_MAP_CN)) {
const weekName: string = WEEK_MAP_CN[weekKey] const weekName: string = WEEK_MAP_CN[weekKey]
options.push({ options.push({

2
src/components/Cropper/src/CopperModal.vue

@ -22,7 +22,7 @@ const props = defineProps({
const emit = defineEmits(['uploadSuccess', 'uploadError', 'register']) const emit = defineEmits(['uploadSuccess', 'uploadError', 'register'])
interface apiFunParams { file: Blob; name: string; filename: string } interface apiFunParams { file: Blob, name: string, filename: string }
let filename = '' let filename = ''
const src = ref(props.src || '') const src = ref(props.src || '')

2
src/components/Cropper/src/CropperAvatar.vue

@ -19,7 +19,7 @@ const props = defineProps({
btnProps: { type: Object as PropType<ButtonProps> }, btnProps: { type: Object as PropType<ButtonProps> },
btnText: { type: String, default: '' }, btnText: { type: String, default: '' },
uploadApi: { uploadApi: {
type: Function as PropType<({ file, name }: { file: Blob; name: string }) => Promise<void>>, type: Function as PropType<({ file, name }: { file: Blob, name: string }) => Promise<void>>,
}, },
size: { type: Number, default: 5 }, size: { type: Number, default: 5 },
}) })

4
src/components/Drawer/src/typing.ts

@ -52,13 +52,13 @@ export interface DrawerFooterProps {
* The ok button props, follow jsx rules * The ok button props, follow jsx rules
* @type object * @type object
*/ */
okButtonProps: { props: ButtonProps; on: object } okButtonProps: { props: ButtonProps, on: object }
/** /**
* The cancel button props, follow jsx rules * The cancel button props, follow jsx rules
* @type object * @type object
*/ */
cancelButtonProps: { props: ButtonProps; on: object } cancelButtonProps: { props: ButtonProps, on: object }
/** /**
* Whether to apply loading visual effect for OK button or not * Whether to apply loading visual effect for OK button or not
* @default false * @default false

2
src/components/Form/src/components/ApiRadioGroup.vue

@ -11,7 +11,7 @@ import { useRuleFormItem } from '@/hooks/component/useFormItem'
import { useAttrs } from '@/hooks/core/useAttrs' import { useAttrs } from '@/hooks/core/useAttrs'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
interface OptionsItem { label: string; value: string | number | boolean; disabled?: boolean; [name: string]: any } interface OptionsItem { label: string, value: string | number | boolean, disabled?: boolean, [name: string]: any }
defineOptions({ name: 'ApiRadioGroup' }) defineOptions({ name: 'ApiRadioGroup' })

2
src/components/Form/src/components/ApiSelect.vue

@ -10,7 +10,7 @@ import { useRuleFormItem } from '@/hooks/component/useFormItem'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
interface OptionsItem { label: string; value: string; disabled?: boolean } interface OptionsItem { label: string, value: string, disabled?: boolean }
defineOptions({ name: 'ApiSelect', inheritAttrs: false }) defineOptions({ name: 'ApiSelect', inheritAttrs: false })

2
src/components/Form/src/components/FormItem.vue

@ -108,7 +108,7 @@ export default defineComponent({
return disabled return disabled
}) })
function getShow(): { isShow: boolean; isIfShow: boolean } { function getShow(): { isShow: boolean, isIfShow: boolean } {
const { show, ifShow } = props.schema const { show, ifShow } = props.schema
const { showAdvancedButton } = props.formProps const { showAdvancedButton } = props.formProps
const itemIsAdvanced = showAdvancedButton const itemIsAdvanced = showAdvancedButton

2
src/components/Form/src/components/RadioButtonGroup.vue

@ -9,7 +9,7 @@ import { isString } from '@/utils/is'
import { useRuleFormItem } from '@/hooks/component/useFormItem' import { useRuleFormItem } from '@/hooks/component/useFormItem'
import { useAttrs } from '@/hooks/core/useAttrs' import { useAttrs } from '@/hooks/core/useAttrs'
interface OptionsItem { label: string; value: string | number | boolean; disabled?: boolean } interface OptionsItem { label: string, value: string | number | boolean, disabled?: boolean }
type RadioItem = string | OptionsItem type RadioItem = string | OptionsItem
defineOptions({ name: 'RadioButtonGroup' }) defineOptions({ name: 'RadioButtonGroup' })

12
src/components/Form/src/types/index.ts

@ -47,37 +47,37 @@ export interface ColEx {
* <576px and also default setting, could be a span value or an object containing above props * <576px and also default setting, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xs?: { span: ColSpanType; offset: ColSpanType } | ColSpanType xs?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 576px, could be a span value or an object containing above props * 576px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
sm?: { span: ColSpanType; offset: ColSpanType } | ColSpanType sm?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 768px, could be a span value or an object containing above props * 768px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
md?: { span: ColSpanType; offset: ColSpanType } | ColSpanType md?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 992px, could be a span value or an object containing above props * 992px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
lg?: { span: ColSpanType; offset: ColSpanType } | ColSpanType lg?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 1200px, could be a span value or an object containing above props * 1200px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xl?: { span: ColSpanType; offset: ColSpanType } | ColSpanType xl?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 1600px, could be a span value or an object containing above props * 1600px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xxl?: { span: ColSpanType; offset: ColSpanType } | ColSpanType xxl?: { span: ColSpanType, offset: ColSpanType } | ColSpanType
} }
export type ComponentType = export type ComponentType =

12
src/components/FormDesign/src/components/VFormDesign/components/LayoutItem.vue

@ -30,18 +30,18 @@ const emit = defineEmits(['dragStart', 'handleColAdd', 'handle-copy', 'handle-de
const Draggable = draggable const Draggable = draggable
const { formDesignMethods: { handleSetSelectItem }, formConfig } = useFormDesignState() const { formDesignMethods: { handleSetSelectItem } } = useFormDesignState()
const colPropsComputed = computed(() => { const colPropsComputed = computed(() => {
const { colProps = {} } = props.schema const { colProps = {} } = props.schema
return colProps return colProps
}) })
const list1 = computed(() => props.schema.columns) // const list1 = computed(() => props.schema.columns)
// AColdiv // // AColdiv
const layoutTag = computed(() => { // const layoutTag = computed(() => {
return formConfig.value.layout === 'horizontal' ? 'Col' : 'div' // return formConfig.value.layout === 'horizontal' ? 'Col' : 'div'
}) // })
</script> </script>
<template> <template>

7
src/components/FormDesign/src/components/VFormDesign/modules/FormComponentPanel.vue

@ -4,7 +4,6 @@
--> -->
<script lang="ts" setup> <script lang="ts" setup>
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
import { computed } from 'vue'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import { Empty, Form } from 'ant-design-vue' import { Empty, Form } from 'ant-design-vue'
import { useFormDesignState } from '../../../hooks/useFormDesignState' import { useFormDesignState } from '../../../hooks/useFormDesignState'
@ -38,9 +37,9 @@ function handleDragStart(e: any) {
// currentItem // currentItem
// AColdiv // AColdiv
const layoutTag = computed(() => { // const layoutTag = computed(() => {
return formConfig.value.layout === 'horizontal' ? 'Col' : 'div' // return formConfig.value.layout === 'horizontal' ? 'Col' : 'div'
}) // })
</script> </script>
<template> <template>

14
src/components/FormDesign/src/typings/v-form-component.ts

@ -67,7 +67,7 @@ export interface IVFormComponent {
// 组件布局 // 组件布局
wrapperCol?: IAnyObject wrapperCol?: IAnyObject
// 子控件 // 子控件
columns?: Array<{ span: number; children: any[] }> columns?: Array<{ span: number, children: any[] }>
} }
declare type namesType = string | string[] declare type namesType = string | string[]
@ -241,37 +241,37 @@ interface IACol {
* <576px and also default setting, could be a span value or an object containing above props * <576px and also default setting, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xs: { span: ColSpanType; offset: ColSpanType } | ColSpanType xs: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 576px, could be a span value or an object containing above props * 576px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
sm: { span: ColSpanType; offset: ColSpanType } | ColSpanType sm: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 768px, could be a span value or an object containing above props * 768px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
md: { span: ColSpanType; offset: ColSpanType } | ColSpanType md: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 992px, could be a span value or an object containing above props * 992px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
lg: { span: ColSpanType; offset: ColSpanType } | ColSpanType lg: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 1200px, could be a span value or an object containing above props * 1200px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xl: { span: ColSpanType; offset: ColSpanType } | ColSpanType xl: { span: ColSpanType, offset: ColSpanType } | ColSpanType
/** /**
* 1600px, could be a span value or an object containing above props * 1600px, could be a span value or an object containing above props
* @type { span: ColSpanType, offset: ColSpanType } | ColSpanType * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType
*/ */
xxl: { span: ColSpanType; offset: ColSpanType } | ColSpanType xxl: { span: ColSpanType, offset: ColSpanType } | ColSpanType
} }
export interface IValidationRule { export interface IValidationRule {

4
src/components/Menu/src/BasicMenu.vue

@ -82,12 +82,12 @@ listenerRouteChange((route) => {
}) })
!props.mixSider !props.mixSider
&& watch( && watch(
() => props.items, () => props.items,
() => { () => {
handleMenuChange() handleMenuChange()
}, },
) )
const handleMenuClick: MenuProps['onClick'] = async ({ key }) => { const handleMenuClick: MenuProps['onClick'] = async ({ key }) => {
const { beforeClickFn } = props const { beforeClickFn } = props

2
src/components/Table/src/hooks/useDataSource.ts

@ -161,7 +161,7 @@ export function useDataSource(
const rowKeys = !Array.isArray(rowKey) ? [rowKey] : rowKey const rowKeys = !Array.isArray(rowKey) ? [rowKey] : rowKey
function deleteRow(data, key) { function deleteRow(data, key) {
const row: { index: number; data: [] } = findRow(data, key) const row: { index: number, data: [] } = findRow(data, key)
if (row === null || row.index === -1) if (row === null || row.index === -1)
return return

2
src/components/Table/src/props.ts

@ -131,7 +131,7 @@ export const basicProps = {
type: Function as PropType<(record: TableCustomRecord<any>, index: number) => string>, type: Function as PropType<(record: TableCustomRecord<any>, index: number) => string>,
}, },
scroll: { scroll: {
type: Object as PropType<{ x: number | string | true; y: number | string }>, type: Object as PropType<{ x: number | string | true, y: number | string }>,
default: null, default: null,
}, },
beforeEditSubmit: { beforeEditSubmit: {

2
src/components/Table/src/types/table.ts

@ -314,7 +314,7 @@ export interface BasicTableProps<T = any> {
* you need to add style .ant-table td { white-space: nowrap; }. * you need to add style .ant-table td { white-space: nowrap; }.
* @type object * @type object
*/ */
scroll?: { x?: number | string | true; y?: number | string } scroll?: { x?: number | string | true, y?: number | string }
/** /**
* Whether to show table header * Whether to show table header

2
src/components/Tree/src/types/tree.ts

@ -29,7 +29,7 @@ export interface FieldNames {
export type KeyType = string | number export type KeyType = string | number
export type CheckKeys = KeyType[] | { checked: string[] | number[]; halfChecked: string[] | number[] } export type CheckKeys = KeyType[] | { checked: string[] | number[], halfChecked: string[] | number[] }
export const treeProps = buildProps({ export const treeProps = buildProps({
value: { value: {

2
src/components/Upload/src/data.tsx

@ -108,7 +108,7 @@ export function createPreviewColumns(): BasicColumn[] {
] ]
} }
export function createPreviewActionColumn({ handleRemove, handleDownload }: { handleRemove: Fn; handleDownload: Fn }): BasicColumn { export function createPreviewActionColumn({ handleRemove, handleDownload }: { handleRemove: Fn, handleDownload: Fn }): BasicColumn {
return { return {
width: 160, width: 160,
title: t('component.upload.operating'), title: t('component.upload.operating'),

2
src/components/Verifition/src/Verify.vue

@ -123,7 +123,7 @@ export default {
<!-- 验证码容器 --> <!-- 验证码容器 -->
<component <component
:is="componentType" v-if="componentType" ref="instance" :captcha-type="captchaType" :type="verifyType" :is="componentType" v-if="componentType" ref="instance" :captcha-type="captchaType" :type="verifyType"
:figure="figure" :arith="arith" :mode="mode" :v-space="vSpace" :explain="explain" :img-size="imgSize" :figure="figure" :arith="arith" :mode="mode" :spaces="vSpace" :explain="explain" :img-size="imgSize"
:block-size="blockSize" :bar-size="barSize" :block-size="blockSize" :bar-size="barSize"
/> />
</div> </div>

4
src/components/Verifition/src/Verify/VerifyPoints.vue

@ -19,7 +19,7 @@ const props = defineProps({
type: String, type: String,
}, },
// //
vSpace: { spaces: {
type: Number, type: Number,
default: 5, default: 5,
}, },
@ -204,7 +204,7 @@ async function getPictrue() {
'width': setSize.imgWidth, 'width': setSize.imgWidth,
'height': setSize.imgHeight, 'height': setSize.imgHeight,
'background-size': `${setSize.imgWidth} ${setSize.imgHeight}`, 'background-size': `${setSize.imgWidth} ${setSize.imgHeight}`,
'margin-bottom': `${vSpace}px`, 'margin-bottom': `${spaces}px`,
}" }"
> >
<div v-show="showRefresh" class="verify-refresh" style="z-index: 3" @click="refresh"> <div v-show="showRefresh" class="verify-refresh" style="z-index: 3" @click="refresh">

4
src/components/Verifition/src/Verify/VerifySlide.vue

@ -22,7 +22,7 @@ const props = defineProps({
type: String, type: String,
default: 'fixed', default: 'fixed',
}, },
vSpace: { spaces: {
type: Number, type: Number,
default: 5, default: 5,
}, },
@ -306,7 +306,7 @@ async function getPictrue() {
<template> <template>
<div style="position: relative"> <div style="position: relative">
<div v-if="type === '2'" class="verify-img-out" :style="{ height: `${parseInt(setSize.imgHeight) + vSpace}px` }"> <div v-if="type === '2'" class="verify-img-out" :style="{ height: `${parseInt(setSize.imgHeight) + spaces}px` }">
<div class="verify-img-panel" :style="{ width: setSize.imgWidth, height: setSize.imgHeight }"> <div class="verify-img-panel" :style="{ width: setSize.imgWidth, height: setSize.imgHeight }">
<img :src="`data:image/png;base64,${backImgBase}`" alt="" style=" display: block;width: 100%; height: 100%"> <img :src="`data:image/png;base64,${backImgBase}`" alt="" style=" display: block;width: 100%; height: 100%">
<div v-show="showRefresh" class="verify-refresh" @click="refresh"> <div v-show="showRefresh" class="verify-refresh" @click="refresh">

2
src/directives/ripple/index.ts

@ -48,7 +48,7 @@ const RippleDirective: Directive & RippleProto = {
}, },
} }
function rippler({ event, el, zIndex, background }: { event: EventType; el: HTMLElement } & RippleProto) { function rippler({ event, el, zIndex, background }: { event: EventType, el: HTMLElement } & RippleProto) {
const targetBorder = Number.parseInt(getComputedStyle(el).borderWidth.replace('px', '')) const targetBorder = Number.parseInt(getComputedStyle(el).borderWidth.replace('px', ''))
const clientX = event.clientX || event.touches[0].clientX const clientX = event.clientX || event.touches[0].clientX
const clientY = event.clientY || event.touches[0].clientY const clientY = event.clientY || event.touches[0].clientY

2
src/router/guard/permissionGuard.ts

@ -59,7 +59,7 @@ export function createPermissionGuard(router: Router) {
} }
// redirect login page // redirect login page
const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = { const redirectData: { path: string, replace: boolean, query?: Recordable<string> } = {
path: LOGIN_PATH, path: LOGIN_PATH,
replace: true, replace: true,
} }

1
src/utils/domUtils.ts

@ -163,7 +163,6 @@ export function useRafThrottle<T extends FunctionArgs>(fn: T): T {
return return
locked = true locked = true
window.requestAnimationFrame(() => { window.requestAnimationFrame(() => {
// eslint-disable-next-line ts/no-invalid-this
fn.apply(this, args) fn.apply(this, args)
locked = false locked = false
}) })

2
src/utils/file/download.ts

@ -55,7 +55,7 @@ export function downloadByData(data: BlobPart, filename: string, mime?: string,
* Download file according to file address * Download file according to file address
* @param {*} sUrl * @param {*} sUrl
*/ */
export function downloadByUrl({ url, target = '_blank', fileName }: { url: string; target?: TargetContext; fileName?: string }): boolean { export function downloadByUrl({ url, target = '_blank', fileName }: { url: string, target?: TargetContext, fileName?: string }): boolean {
const isChrome = window.navigator.userAgent.toLowerCase().includes('chrome') const isChrome = window.navigator.userAgent.toLowerCase().includes('chrome')
const isSafari = window.navigator.userAgent.toLowerCase().includes('safari') const isSafari = window.navigator.userAgent.toLowerCase().includes('safari')

4
src/utils/helper/treeHelper.ts

@ -156,7 +156,7 @@ export function forEach<T = any>(tree: T[], func: (n: T) => any, config: Partial
* @description: Extract tree specified structure * @description: Extract tree specified structure
* @description: * @description:
*/ */
export function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] { export function treeMap<T = any>(treeData: T[], opt: { children?: string, conversion: Fn }): T[] {
return treeData.map(item => treeMapEach(item, opt)) return treeData.map(item => treeMapEach(item, opt))
} }
@ -164,7 +164,7 @@ export function treeMap<T = any>(treeData: T[], opt: { children?: string; conver
* @description: Extract tree specified structure * @description: Extract tree specified structure
* @description: * @description:
*/ */
export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) { export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string, conversion: Fn }) {
const haveChildren = Array.isArray(data[children]) && data[children].length > 0 const haveChildren = Array.isArray(data[children]) && data[children].length > 0
const conversionData = conversion(data) || {} const conversionData = conversion(data) || {}
if (haveChildren) { if (haveChildren) {

3
src/utils/index.ts

@ -81,7 +81,7 @@ export function deepMerge<T extends object | null | undefined, U extends object
export function openWindow( export function openWindow(
url: string, url: string,
opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean }, opt?: { target?: TargetContext | string, noopener?: boolean, noreferrer?: boolean },
) { ) {
const { target = '__blank', noopener = true, noreferrer = true } = opt || {} const { target = '__blank', noopener = true, noreferrer = true } = opt || {}
const feature: string[] = [] const feature: string[] = []
@ -167,7 +167,6 @@ export function simpleDebounce(fn, delay = 100) {
clearTimeout(timer) clearTimeout(timer)
timer = setTimeout(() => { timer = setTimeout(() => {
// eslint-disable-next-line ts/no-invalid-this
fn.apply(this, args) fn.apply(this, args)
}, delay) }, delay)
} }

2
src/utils/props.ts

@ -12,7 +12,7 @@ export interface PropWrapper<T> { [wrapperKey]: T }
export const propKey = Symbol('propKey') export const propKey = Symbol('propKey')
type ResolveProp<T> = ExtractPropTypes<{ type ResolveProp<T> = ExtractPropTypes<{
key: { type: T; required: true } key: { type: T, required: true }
}>['key'] }>['key']
type ResolvePropType<T> = ResolveProp<T> extends { type: infer V } ? V : ResolveProp<T> type ResolvePropType<T> = ResolveProp<T> extends { type: infer V } ? V : ResolveProp<T>
type ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<Array<infer A>> ? ResolvePropType<A[]> : ResolvePropType<T> type ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<Array<infer A>> ? ResolvePropType<A[]> : ResolvePropType<T>

4
src/utils/tree.ts

@ -146,14 +146,14 @@ export function forEach<T = any>(tree: T[], func: (n: T) => any, config: Partial
/** /**
* @description: Extract tree specified structure * @description: Extract tree specified structure
*/ */
export function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] { export function treeMap<T = any>(treeData: T[], opt: { children?: string, conversion: Fn }): T[] {
return treeData.map(item => treeMapEach(item, opt)) return treeData.map(item => treeMapEach(item, opt))
} }
/** /**
* @description: Extract tree specified structure * @description: Extract tree specified structure
*/ */
export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) { export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string, conversion: Fn }) {
const haveChildren = Array.isArray(data[children]) && data[children].length > 0 const haveChildren = Array.isArray(data[children]) && data[children].length > 0
const conversionData = conversion(data) || {} const conversionData = conversion(data) || {}
if (haveChildren) { if (haveChildren) {

22
src/views/base/login/LoginForm.vue

@ -19,6 +19,7 @@ import * as authUtil from '@/utils/auth'
import { Verify } from '@/components/Verifition' import { Verify } from '@/components/Verifition'
import { getTenantByWebsite, getTenantIdByName } from '@/api/base/login' import { getTenantByWebsite, getTenantIdByName } from '@/api/base/login'
import { noop } from '@/utils'
const FormItem = Form.Item const FormItem = Form.Item
const InputPassword = Input.Password const InputPassword = Input.Password
@ -71,7 +72,7 @@ async function getCode() {
async function getTenantId() { async function getTenantId() {
if (tenantEnable === 'true') { if (tenantEnable === 'true') {
const website = location.host const website = location.host
const tenant = await getTenantByWebsite(website) const tenant = await getTenantByWebsite(website).catch(noop)
if (tenant) { if (tenant) {
formData.tenantName = tenant.name formData.tenantName = tenant.name
authUtil.setTenantId(tenant.id) authUtil.setTenantId(tenant.id)
@ -205,25 +206,6 @@ async function handleLogin(params) {
<!-- <GoogleCircleFilled /> --> <!-- <GoogleCircleFilled /> -->
<!-- <TwitterCircleFilled /> --> <!-- <TwitterCircleFilled /> -->
</div> </div>
<!-- 萌新必读 -->
<Divider class="enter-x">
萌新必读
</Divider>
<div class="enter-x flex justify-evenly" :class="`${prefixCls}-sign-in-way`">
<a-button href="https://doc.iocoder.cn/" target="_blank" class="w-1/4">
📚开发指南
</a-button>
<a-button href="https://doc.iocoder.cn/video/" target="_blank" class="w-1/4 pl-1">
🔥视频教程
</a-button>
<a-button href="https://www.iocoder.cn/Interview/good-collection/" target="_blank" class="w-1/4 pl-1">
面试手册
</a-button>
<a-button href="http://static.yudao.iocoder.cn/mp/xinyu370.jpeg" target="_blank" class="w-1/4 pl-1">
🤝外包咨询
</a-button>
</div>
</Form> </Form>
<Verify ref="verify" mode="pop" :captcha-type="captchaType" :img-size="{ width: '360px', height: '180px' }" @success="handleLogin" /> <Verify ref="verify" mode="pop" :captcha-type="captchaType" :img-size="{ width: '360px', height: '180px' }" @success="handleLogin" />
</template> </template>

2
src/views/infra/webSocket/index.vue

@ -14,7 +14,7 @@ const userStore = useUserStore()
const state = reactive({ const state = reactive({
sendValue: '', sendValue: '',
recordList: [] as { id: number; time: number; res: string }[], recordList: [] as { id: number, time: number, res: string }[],
}) })
const server = ref( const server = ref(
`${(`${import.meta.env.VITE_GLOB_BASE_URL}/websocket/message`).replace('http', 'ws')}?userId=${userStore.getUserInfo.user.id}`, `${(`${import.meta.env.VITE_GLOB_BASE_URL}/websocket/message`).replace('http', 'ws')}?userId=${userStore.getUserInfo.user.id}`,