diff --git a/grailed-ui-admin-vue3/.editorconfig b/grailed-ui-admin-vue3/.editorconfig new file mode 100644 index 0000000..79a12ff --- /dev/null +++ b/grailed-ui-admin-vue3/.editorconfig @@ -0,0 +1,12 @@ +root = true +[*.{js,ts,vue}] +charset = utf-8 # 设置文件字符集为 utf-8 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +insert_final_newline = true # 始终在文件末尾插入一个新行 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +max_line_length = 100 # 最大行长度 + +[*.md] # 仅 md 文件适用以下规则 +max_line_length = off # 关闭最大行长度限制 +trim_trailing_whitespace = false # 关闭末尾空格修剪 diff --git a/grailed-ui-admin-vue3/.env b/grailed-ui-admin-vue3/.env new file mode 100644 index 0000000..6ea7eec --- /dev/null +++ b/grailed-ui-admin-vue3/.env @@ -0,0 +1,14 @@ + + +# 项目本地运行端口号 +VITE_PORT=80 + +# open 运行 npm run dev 时自动打开浏览器 +VITE_OPEN=true + +# 租户开关 +VITE_APP_TENANT_ENABLE=false + +# 验证码的开关 +VITE_APP_CAPTCHA_ENABLE=false + diff --git a/grailed-ui-admin-vue3/.env - 副本.da b/grailed-ui-admin-vue3/.env - 副本.da new file mode 100644 index 0000000..06e9a40 --- /dev/null +++ b/grailed-ui-admin-vue3/.env - 副本.da @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=丹麦后台 +# 请求路径 +VITE_BASE_URL='https://backend.dabackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-da diff --git a/grailed-ui-admin-vue3/.env.base b/grailed-ui-admin-vue3/.env.base new file mode 100644 index 0000000..2258461 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.base @@ -0,0 +1,19 @@ +# 本地开发环境 +NODE_ENV=development +VITE_APP_TITLE=LUALAIR +VITE_DEV=true + +# 请求路径 +VITE_BASE_URL='http://localhost:48080' + +# 上传路径 +VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH=/dev-api + +# 接口地址 +VITE_API_URL=/admin-api + +# 打包路径 +VITE_BASE_PATH=/ diff --git a/grailed-ui-admin-vue3/.env.da b/grailed-ui-admin-vue3/.env.da new file mode 100644 index 0000000..23d4ae4 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.da @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=成都演示后台 +# 请求路径 +VITE_BASE_URL='https://backend.22y.fun' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-da diff --git a/grailed-ui-admin-vue3/.env.dev b/grailed-ui-admin-vue3/.env.dev new file mode 100644 index 0000000..befca23 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.dev @@ -0,0 +1,31 @@ +# 开发环境 +NODE_ENV=development + +VITE_DEV=false +VITE_APP_TITLE=成都演示后台 +# 请求路径 +VITE_BASE_URL='http://127.0.0.1:48080' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH=/dev-api + +# 接口地址 +VITE_API_URL=/admin-api + +# 打包路径 +VITE_BASE_PATH=/ + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=false + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 输出路径 +VITE_OUT_DIR=dist diff --git a/grailed-ui-admin-vue3/.env.in b/grailed-ui-admin-vue3/.env.in new file mode 100644 index 0000000..cd52810 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.in @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=印度后台 +# 请求路径 +VITE_BASE_URL='https://backend.inbackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-in diff --git a/grailed-ui-admin-vue3/.env.nz b/grailed-ui-admin-vue3/.env.nz new file mode 100644 index 0000000..b83d456 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.nz @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=新西兰后台 +# 请求路径 +VITE_BASE_URL='https://backend.nzbackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-nz diff --git a/grailed-ui-admin-vue3/.env.pro b/grailed-ui-admin-vue3/.env.pro new file mode 100644 index 0000000..8cb2754 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.pro @@ -0,0 +1,31 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false + +# 请求路径 +VITE_BASE_URL='https://backend-us.order-sys.xyz' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-pro diff --git a/grailed-ui-admin-vue3/.env.pt b/grailed-ui-admin-vue3/.env.pt new file mode 100644 index 0000000..1222dfb --- /dev/null +++ b/grailed-ui-admin-vue3/.env.pt @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=葡萄牙后台 +# 请求路径 +VITE_BASE_URL='https://backend.ptbackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-pt diff --git a/grailed-ui-admin-vue3/.env.uk b/grailed-ui-admin-vue3/.env.uk new file mode 100644 index 0000000..bf5ba06 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.uk @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=英国后台 +# 请求路径 +VITE_BASE_URL='https://backend.ukbackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-uk diff --git a/grailed-ui-admin-vue3/.env.us b/grailed-ui-admin-vue3/.env.us new file mode 100644 index 0000000..9cc2989 --- /dev/null +++ b/grailed-ui-admin-vue3/.env.us @@ -0,0 +1,32 @@ +# 生产环境 +NODE_ENV=production + +VITE_DEV=false +# 标题 +VITE_APP_TITLE=美国后台 +# 请求路径 +VITE_BASE_URL='https://backend.usbackend.site' + +# 上传路径 +VITE_UPLOAD_URL='/admin-api/infra/file/upload' + +# 接口前缀 +VITE_API_BASEPATH= + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=true + +# 是否删除console.log +VITE_DROP_CONSOLE=true + +# 是否sourcemap +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist-us diff --git a/grailed-ui-admin-vue3/.eslintignore b/grailed-ui-admin-vue3/.eslintignore new file mode 100644 index 0000000..1e85c0f --- /dev/null +++ b/grailed-ui-admin-vue3/.eslintignore @@ -0,0 +1,8 @@ +/build/ +/config/ +/dist/ +/*.js +/test/unit/coverage/ +/node_modules/* +/dist* +/src/main.ts diff --git a/grailed-ui-admin-vue3/.eslintrc-auto-import.json b/grailed-ui-admin-vue3/.eslintrc-auto-import.json new file mode 100644 index 0000000..024c96a --- /dev/null +++ b/grailed-ui-admin-vue3/.eslintrc-auto-import.json @@ -0,0 +1,259 @@ +{ + "globals": { + "EffectScope": true, + "ElMessage": true, + "ElMessageBox": true, + "ElTag": true, + "asyncComputed": true, + "autoResetRef": true, + "computed": true, + "computedAsync": true, + "computedEager": true, + "computedInject": true, + "computedWithControl": true, + "controlledComputed": true, + "controlledRef": true, + "createApp": true, + "createEventHook": true, + "createGlobalState": true, + "createInjectionState": true, + "createReactiveFn": true, + "createSharedComposable": true, + "createUnrefFn": true, + "customRef": true, + "debouncedRef": true, + "debouncedWatch": true, + "defineAsyncComponent": true, + "defineComponent": true, + "eagerComputed": true, + "effectScope": true, + "extendRef": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "ignorableWatch": true, + "inject": true, + "isDefined": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "makeDestructurable": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onClickOutside": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onKeyStroke": true, + "onLongPress": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onStartTyping": true, + "onUnmounted": true, + "onUpdated": true, + "pausableWatch": true, + "provide": true, + "reactify": true, + "reactifyObject": true, + "reactive": true, + "reactiveComputed": true, + "reactiveOmit": true, + "reactivePick": true, + "readonly": true, + "ref": true, + "refAutoReset": true, + "refDebounced": true, + "refDefault": true, + "refThrottled": true, + "refWithControl": true, + "resolveComponent": true, + "resolveRef": true, + "resolveUnref": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "syncRef": true, + "syncRefs": true, + "templateRef": true, + "throttledRef": true, + "throttledWatch": true, + "toRaw": true, + "toReactive": true, + "toRef": true, + "toRefs": true, + "triggerRef": true, + "tryOnBeforeMount": true, + "tryOnBeforeUnmount": true, + "tryOnMounted": true, + "tryOnScopeDispose": true, + "tryOnUnmounted": true, + "unref": true, + "unrefElement": true, + "until": true, + "useActiveElement": true, + "useArrayEvery": true, + "useArrayFilter": true, + "useArrayFind": true, + "useArrayFindIndex": true, + "useArrayJoin": true, + "useArrayMap": true, + "useArrayReduce": true, + "useArraySome": true, + "useAsyncQueue": true, + "useAsyncState": true, + "useAttrs": true, + "useBase64": true, + "useBattery": true, + "useBluetooth": true, + "useBreakpoints": true, + "useBroadcastChannel": true, + "useBrowserLocation": true, + "useCached": true, + "useClipboard": true, + "useColorMode": true, + "useConfirmDialog": true, + "useCounter": true, + "useCssModule": true, + "useCssVar": true, + "useCssVars": true, + "useCurrentElement": true, + "useCycleList": true, + "useDark": true, + "useDateFormat": true, + "useDebounce": true, + "useDebounceFn": true, + "useDebouncedRefHistory": true, + "useDeviceMotion": true, + "useDeviceOrientation": true, + "useDevicePixelRatio": true, + "useDevicesList": true, + "useDisplayMedia": true, + "useDocumentVisibility": true, + "useDraggable": true, + "useDropZone": true, + "useElementBounding": true, + "useElementByPoint": true, + "useElementHover": true, + "useElementSize": true, + "useElementVisibility": true, + "useEventBus": true, + "useEventListener": true, + "useEventSource": true, + "useEyeDropper": true, + "useFavicon": true, + "useFetch": true, + "useFileDialog": true, + "useFileSystemAccess": true, + "useFocus": true, + "useFocusWithin": true, + "useFps": true, + "useFullscreen": true, + "useGamepad": true, + "useGeolocation": true, + "useIdle": true, + "useImage": true, + "useInfiniteScroll": true, + "useIntersectionObserver": true, + "useInterval": true, + "useIntervalFn": true, + "useKeyModifier": true, + "useLastChanged": true, + "useLocalStorage": true, + "useMagicKeys": true, + "useManualRefHistory": true, + "useMediaControls": true, + "useMediaQuery": true, + "useMemoize": true, + "useMemory": true, + "useMounted": true, + "useMouse": true, + "useMouseInElement": true, + "useMousePressed": true, + "useMutationObserver": true, + "useNavigatorLanguage": true, + "useNetwork": true, + "useNow": true, + "useObjectUrl": true, + "useOffsetPagination": true, + "useOnline": true, + "usePageLeave": true, + "useParallax": true, + "usePermission": true, + "usePointer": true, + "usePointerSwipe": true, + "usePreferredColorScheme": true, + "usePreferredDark": true, + "usePreferredLanguages": true, + "useRafFn": true, + "useRefHistory": true, + "useResizeObserver": true, + "useRoute": true, + "useRouter": true, + "useScreenOrientation": true, + "useScreenSafeArea": true, + "useScriptTag": true, + "useScroll": true, + "useScrollLock": true, + "useSessionStorage": true, + "useShare": true, + "useSlots": true, + "useSpeechRecognition": true, + "useSpeechSynthesis": true, + "useStepper": true, + "useStorage": true, + "useStorageAsync": true, + "useStyleTag": true, + "useSupported": true, + "useSwipe": true, + "useTemplateRefsList": true, + "useTextDirection": true, + "useTextSelection": true, + "useTextareaAutosize": true, + "useThrottle": true, + "useThrottleFn": true, + "useThrottledRefHistory": true, + "useTimeAgo": true, + "useTimeout": true, + "useTimeoutFn": true, + "useTimeoutPoll": true, + "useTimestamp": true, + "useTitle": true, + "useToggle": true, + "useTransition": true, + "useUrlSearchParams": true, + "useUserMedia": true, + "useVModel": true, + "useVModels": true, + "useVibrate": true, + "useVirtualList": true, + "useWakeLock": true, + "useWebNotification": true, + "useWebSocket": true, + "useWebWorker": true, + "useWebWorkerFn": true, + "useWindowFocus": true, + "useWindowScroll": true, + "useWindowSize": true, + "watch": true, + "watchArray": true, + "watchAtMost": true, + "watchDebounced": true, + "watchEffect": true, + "watchIgnorable": true, + "watchOnce": true, + "watchPausable": true, + "watchPostEffect": true, + "watchSyncEffect": true, + "watchThrottled": true, + "watchTriggerable": true, + "watchWithFilter": true, + "whenever": true + } +} diff --git a/grailed-ui-admin-vue3/.eslintrc.js b/grailed-ui-admin-vue3/.eslintrc.js new file mode 100644 index 0000000..31c239b --- /dev/null +++ b/grailed-ui-admin-vue3/.eslintrc.js @@ -0,0 +1,71 @@ +// @ts-check +const { defineConfig } = require('eslint-define-config') +module.exports = defineConfig({ + root: true, + env: { + browser: true, + node: true, + es6: true + }, + parser: 'vue-eslint-parser', + plugins: ['vue'], + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 2020, + sourceType: 'module', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true + } + }, + extends: [ + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + 'plugin:prettier/recommended' + ], + rules: { + 'vue/script-setup-uses-vars': 'error', + 'vue/no-reserved-component-names': 'off', + 'vue/no-setup-props-destructure': 'off', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': '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/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'no-unused-vars': 'off', + 'space-before-function-paren': 'off', + + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/require-explicit-emits': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always' + }, + svg: 'always', + math: 'always' + } + ], + 'vue/multi-word-component-names': 'off', + 'vue/no-v-html': 'off' + } +}) diff --git a/grailed-ui-admin-vue3/.gitignore b/grailed-ui-admin-vue3/.gitignore new file mode 100644 index 0000000..9114a0d --- /dev/null +++ b/grailed-ui-admin-vue3/.gitignore @@ -0,0 +1,12 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +/dist* +*-lock.* +pnpm-debug +auto-*.d.ts +.idea +.history +dist* diff --git a/grailed-ui-admin-vue3/.prettierignore b/grailed-ui-admin-vue3/.prettierignore new file mode 100644 index 0000000..f68ea86 --- /dev/null +++ b/grailed-ui-admin-vue3/.prettierignore @@ -0,0 +1,11 @@ +/node_modules/** +/dist/ +/dist* +/public/* +/docs/* +/vite.config.ts +/src/types/env.d.ts +/src/types/auto-components.d.ts +/src/types/auto-imports.d.ts +/docs/**/* +CHANGELOG diff --git a/grailed-ui-admin-vue3/.stylelintignore b/grailed-ui-admin-vue3/.stylelintignore new file mode 100644 index 0000000..aa605b4 --- /dev/null +++ b/grailed-ui-admin-vue3/.stylelintignore @@ -0,0 +1,6 @@ +/dist/* +/public/* +public/* +/dist* +/src/types/env.d.ts +/docs/**/* diff --git a/grailed-ui-admin-vue3/.vscode/extensions.json b/grailed-ui-admin-vue3/.vscode/extensions.json new file mode 100644 index 0000000..5d7e57f --- /dev/null +++ b/grailed-ui-admin-vue3/.vscode/extensions.json @@ -0,0 +1,19 @@ +{ + "recommendations": [ + "christian-kohler.path-intellisense", + "vscode-icons-team.vscode-icons", + "davidanson.vscode-markdownlint", + "stylelint.vscode-stylelint", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "mrmlnc.vscode-less", + "lokalise.i18n-ally", + "redhat.vscode-yaml", + "csstools.postcss", + "mikestead.dotenv", + "eamodio.gitlens", + "antfu.iconify", + "antfu.unocss", + "Vue.volar" + ] +} diff --git a/grailed-ui-admin-vue3/.vscode/launch.json b/grailed-ui-admin-vue3/.vscode/launch.json new file mode 100644 index 0000000..64dbf1d --- /dev/null +++ b/grailed-ui-admin-vue3/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Launch Edge against 47.250.38.157", + "url": "http://47.250.38.157", + "webRoot": "${workspaceFolder}/src", + "sourceMaps": true + } + ] +} diff --git a/grailed-ui-admin-vue3/.vscode/settings.json b/grailed-ui-admin-vue3/.vscode/settings.json new file mode 100644 index 0000000..90cca6f --- /dev/null +++ b/grailed-ui-admin-vue3/.vscode/settings.json @@ -0,0 +1,167 @@ +{ + "typescript.tsdk": "./node_modules/typescript/lib", + "volar.tsPlugin": true, + "volar.tsPluginStatus": false, + "npm.packageManager": "pnpm", + "editor.tabSize": 2, + "prettier.printWidth": 100, // 超过最大值换行 + "editor.defaultFormatter": "esbenp.prettier-vscode", + "files.eol": "\n", + "search.exclude": { + "**/node_modules": true, + "**/*.log": true, + "**/*.log*": true, + "**/bower_components": true, + "**/dist": true, + "**/elehukouben": true, + "**/.git": true, + "**/.gitignore": true, + "**/.svn": true, + "**/.DS_Store": true, + "**/.idea": true, + "**/.vscode": false, + "**/yarn.lock": true, + "**/tmp": true, + "out": true, + "dist": true, + "node_modules": true, + "CHANGELOG.md": true, + "examples": true, + "res": true, + "screenshots": true, + "yarn-error.log": true, + "**/.yarn": true + }, + "files.exclude": { + "**/.cache": true, + "**/.editorconfig": true, + "**/.eslintcache": true, + "**/bower_components": true, + "**/.idea": true, + "**/tmp": true, + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true + }, + "files.watcherExclude": { + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/.vscode/**": true, + "**/node_modules/**": true, + "**/tmp/**": true, + "**/bower_components/**": true, + "**/dist/**": true, + "**/yarn.lock": true + }, + "stylelint.enable": true, + "stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"], + "path-intellisense.mappings": { + "@/": "${workspaceRoot}/src" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + }, + "[less]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "[vue]": { + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true, + "source.fixAll.stylelint": true + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "i18n-ally.localesPaths": ["src/locales"], + "i18n-ally.keystyle": "nested", + "i18n-ally.sortKeys": true, + "i18n-ally.namespace": true, + "i18n-ally.enabledParsers": ["ts"], + "i18n-ally.sourceLanguage": "zh-CN", + "i18n-ally.displayLanguage": "zh-CN", + "i18n-ally.enabledFrameworks": ["vue", "react"], + "cSpell.words": [ + "brotli", + "browserslist", + "codemirror", + "commitlint", + "cropperjs", + "echarts", + "esnext", + "esno", + "iconify", + "INTLIFY", + "lintstagedrc", + "logicflow", + "nprogress", + "Permi", + "pinia", + "pnpm", + "qrcode", + "sider", + "sortablejs", + "stylelint", + "unocss", + "unplugin", + "videojs", + "vitejs", + "vueuse", + "wangeditor", + "xingyu", + "yudao", + "zxcvbn" + ], + "vetur.format.scriptInitialIndent": true, + "vetur.format.styleInitialIndent": true, + "vetur.validation.script": false, + "MicroPython.executeButton": [ + { + "text": "▶", + "tooltip": "运行", + "alignment": "left", + "command": "extension.executeFile", + "priority": 3.5 + } + ], + "MicroPython.syncButton": [ + { + "text": "$(sync)", + "tooltip": "同步", + "alignment": "left", + "command": "extension.execute", + "priority": 4 + } + ], + // 控制相关文件嵌套展示 + "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": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore" + }, + "terminal.integrated.scrollback": 10000 +} diff --git a/grailed-ui-admin-vue3/LICENSE b/grailed-ui-admin-vue3/LICENSE new file mode 100644 index 0000000..9861118 --- /dev/null +++ b/grailed-ui-admin-vue3/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Archer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/grailed-ui-admin-vue3/README.md b/grailed-ui-admin-vue3/README.md new file mode 100644 index 0000000..c9b9f71 --- /dev/null +++ b/grailed-ui-admin-vue3/README.md @@ -0,0 +1,235 @@ +**严肃声明:现在、未来都不会有商业版本,所有代码全部开源!!** + +**「我喜欢写代码,乐此不疲」** +**「我喜欢做开源,以此为乐」** + +我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。 + +如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 + +## 🐶 新手必读 + +* nodejs > 16.0.0 && pnpm > 8.6.0 (强制使用pnpm) +* 演示地址【Vue3 + element-plus】: +* 演示地址【Vue3 + vben(ant-design-vue)】: +* 演示地址【Vue2 + element-ui】: +* 启动文档: +* 视频教程: + +## 🐯 平台简介 + +**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。 + +* 采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin) 实现 +* 改换 saas,自动引入等功能 +* 使用 Element Plus 免费开源的中后台模版,具备如下特性: + +![首页](public/home.png) + +* **最新技术栈**:使用 Vue3、Vite4 等前端前沿技术开发 +* **TypeScript**: 应用程序级 JavaScript 的语言 +* **主题**: 可配置的主题 +* **国际化**:内置完善的国际化方案 +* **权限**:内置完善的动态路由权限生成方案 +* **组件**:二次封装了多个常用的组件 +* **示例**:内置丰富的示例 + +## 技术栈 + +| 框架 | 说明 | 版本 | +|----------------------------------------------------------------------|------------------|--------| +| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.3.4 | +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.4.8 | +| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.3.9 | +| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 5.1.6 | +| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.6 | +| [vueuse](https://vueuse.org/) | 常用工具集 | 10.3.0 | +| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | +| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.2.4 | +| [unocss](https://uno.antfu.me/) | 原子 css | 0.54.1 | +| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.1.1 | +| [wangeditor](https://www.wangeditor.com/) | 富文本编辑器 | 5.1.23 | + +## 开发工具 + +推荐 VS Code 开发,配合插件如下: + +| 插件名 | 功能 | +|-------------------------------|--------------------------| +| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件 | +| Vue Language Features (Volar) | Vue3.0 语法支持 | +| unocss | unocss for vscode | +| Iconify IntelliSense | Iconify 预览和搜索 | +| i18n Ally | 国际化智能提示 | +| Stylelint | Css 格式化 | +| Prettier | 代码格式化 | +| ESLint | 脚本代码检查 | +| DotENV | env 文件高亮 | + +## 内置功能 + +系统内置多种多种业务功能,可以用于快速你的业务系统: + +* 系统功能 +* 基础设施 +* 工作流程 +* 支付系统 +* 会员中心 +* 数据报表 +* 商城系统 +* 微信公众号 + +### 系统功能 + +| | 功能 | 描述 | +|-----|-------|---------------------------------| +| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | +| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | +| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | +| | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 | +| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | +| | 岗位管理 | 配置系统用户所属担任职务 | +| 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 | +| 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 | +| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | +| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台 | +| 🚀 | 邮件管理 | 邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台 | +| 🚀 | 站内信 | 系统内的消息通知,提供站内信模版、站内信消息 | +| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | +| ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 | +| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 | +| | 通知公告 | 系统通知公告信息发布维护 | +| 🚀 | 敏感词 | 配置系统敏感词,支持标签分组 | +| 🚀 | 应用管理 | 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 | +| 🚀 | 地区管理 | 展示省份、城市、区镇等城市信息,支持 IP 对应城市 | + +### 工作流程 + +| | 功能 | 描述 | +|-----|-------|----------------------------------------| +| 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 | +| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 | +| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 | +| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 | +| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 | +| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 | +| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 | + +### 支付系统 + +| | 功能 | 描述 | +|-----|------|---------------------------| +| 🚀 | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能 | +| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 | +| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 | +| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 | + +ps:核心功能已经实现,正在对接微信小程序中... + +### 基础设施 + +| | 功能 | 描述 | +|-----|----------|----------------------------------------------| +| 🚀 | 代码生成 | 前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | +| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | +| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | +| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 | +| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | +| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | +| 🚀 | 文件服务 | 支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等 | +| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | +| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | +| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | +| 🚀 | 消息队列 | 基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费 | +| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | +| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 | +| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 | +| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | +| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 | +| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 | +| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | +| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | + +### 数据报表 + +| | 功能 | 描述 | +|-----|-------|--------------------| +| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 | +| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 | + +### 微信公众号 + +| | 功能 | 描述 | +|-----|--------|-------------------------------| +| 🚀 | 账号管理 | 配置接入的微信公众号,可支持多个公众号 | +| 🚀 | 数据统计 | 统计公众号的用户增减、累计用户、消息概况、接口分析等数据 | +| 🚀 | 粉丝管理 | 查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作 | +| 🚀 | 消息管理 | 查看粉丝发送的消息列表,可主动回复粉丝消息 | +| 🚀 | 自动回复 | 自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复 | +| 🚀 | 标签管理 | 对公众号的标签进行创建、查询、修改、删除等操作 | +| 🚀 | 菜单管理 | 自定义公众号的菜单,也可以从公众号同步菜单 | +| 🚀 | 素材管理 | 管理公众号的图片、语音、视频等素材,支持在线播放语音、视频 | +| 🚀 | 图文草稿箱 | 新增常用的图文素材到草稿箱,可发布到公众号 | +| 🚀 | 图文发表记录 | 查看已发布成功的图文素材,支持删除操作 | + +### 商城系统 + +建设中... + +![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png) + +![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif) + +![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif) + +## 🐷 演示图 + +### 系统功能 + +| 模块 | biu | biu | biu | +|------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------| +| 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) | +| 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) | +| 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - | +| 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - | +| 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - | +| 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - | +| 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) | +| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) | +| 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - | + +### 工作流程 + +| 模块 | biu | biu | biu | +|---------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| +| 流程模型 | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg?imageView2/2/format/webp/w/1280) | +| 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg?imageView2/2/format/webp/w/1280) | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg?imageView2/2/format/webp/w/1280) | - | +| 我的流程 | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg?imageView2/2/format/webp/w/1280) | +| 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg?imageView2/2/format/webp/w/1280) | +| OA 请假 | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg?imageView2/2/format/webp/w/1280) | + +### 基础设施 + +| 模块 | biu | biu | biu | +|---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------| +| 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg?imageView2/2/format/webp/w/1280) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg?imageView2/2/format/webp/w/1280) | - | +| 文档 | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg?imageView2/2/format/webp/w/1280) | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg?imageView2/2/format/webp/w/1280) | - | +| 文件 & 配置 | ![文件配置](https://static.iocoder.cn/images/ruoyi-vue-pro/文件配置.jpg?imageView2/2/format/webp/w/1280) | ![文件管理](https://static.iocoder.cn/images/ruoyi-vue-pro/文件管理2.jpg?imageView2/2/format/webp/w/1280) | ![配置管理](https://static.iocoder.cn/images/ruoyi-vue-pro/配置管理.jpg?imageView2/2/format/webp/w/1280) | +| 定时任务 | ![定时任务](https://static.iocoder.cn/images/ruoyi-vue-pro/定时任务.jpg?imageView2/2/format/webp/w/1280) | ![任务日志](https://static.iocoder.cn/images/ruoyi-vue-pro/任务日志.jpg?imageView2/2/format/webp/w/1280) | - | +| API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg?imageView2/2/format/webp/w/1280) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg?imageView2/2/format/webp/w/1280) | - | +| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg?imageView2/2/format/webp/w/1280) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg?imageView2/2/format/webp/w/1280) | - | +| 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg?imageView2/2/format/webp/w/1280) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg?imageView2/2/format/webp/w/1280) | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg?imageView2/2/format/webp/w/1280) | + +### 支付系统 + +| 模块 | biu | biu | biu | +|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| +| 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg?imageView2/2/format/webp/w/1280) | +| 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg?imageView2/2/format/webp/w/1280) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg?imageView2/2/format/webp/w/1280) | --- | + +### 数据报表 + +| 模块 | biu | biu | biu | +|-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| +| 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) | +| 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280) | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280) | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280) | diff --git a/grailed-ui-admin-vue3/build/vite/index.ts b/grailed-ui-admin-vue3/build/vite/index.ts new file mode 100644 index 0000000..377e5a7 --- /dev/null +++ b/grailed-ui-admin-vue3/build/vite/index.ts @@ -0,0 +1,108 @@ +import { resolve } from 'path' +import Vue from '@vitejs/plugin-vue' +import VueJsx from '@vitejs/plugin-vue-jsx' +import progress from 'vite-plugin-progress' +import EslintPlugin from 'vite-plugin-eslint' +import PurgeIcons from 'vite-plugin-purge-icons' +import { ViteEjsPlugin } from 'vite-plugin-ejs' +// @ts-ignore +import ElementPlus from 'unplugin-element-plus/vite' +import AutoImport from 'unplugin-auto-import/vite' +import Components from 'unplugin-vue-components/vite' +import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +import viteCompression from 'vite-plugin-compression' +import topLevelAwait from 'vite-plugin-top-level-await' +import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import UnoCSS from 'unocss/vite' + +export function createVitePlugins() { + const root = process.cwd() + + // 路径查找 + function pathResolve(dir: string) { + return resolve(root, '.', dir) + } + + return [ + Vue(), + VueJsx(), + UnoCSS(), + progress(), + PurgeIcons(), + ElementPlus({}), + AutoImport({ + include: [ + /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx + /\.vue$/, + /\.vue\?vue/, // .vue + /\.md$/ // .md + ], + imports: [ + 'vue', + 'vue-router', + // 可额外添加需要 autoImport 的组件 + { + '@/hooks/web/useI18n': ['useI18n'], + '@/hooks/web/useMessage': ['useMessage'], + '@/hooks/web/useTable': ['useTable'], + '@/hooks/web/useCrudSchemas': ['useCrudSchemas'], + '@/utils/formRules': ['required'], + '@/utils/dict': ['DICT_TYPE'] + } + ], + dts: 'src/types/auto-imports.d.ts', + resolvers: [ElementPlusResolver()], + eslintrc: { + enabled: false, // Default `false` + filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json` + globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') + } + }), + Components({ + // 要搜索组件的目录的相对路径 + dirs: ['src/components'], + // 组件的有效文件扩展名 + extensions: ['vue', 'md'], + // 搜索子目录 + deep: true, + include: [/\.vue$/, /\.vue\?vue/], + // 生成自定义 `auto-components.d.ts` 全局声明 + dts: 'src/types/auto-components.d.ts', + // 自定义组件的解析器 + resolvers: [ElementPlusResolver()], + exclude: [/[\\/]node_modules[\\/]/] + }), + EslintPlugin({ + cache: false, + include: ['src/**/*.tsx'] // 检查的文件 + // include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件 + }), + VueI18nPlugin({ + runtimeOnly: true, + compositionOnly: true, + include: [resolve(__dirname, 'src/locales/**')] + }), + createSvgIconsPlugin({ + iconDirs: [pathResolve('src/assets/svgs')], + symbolId: 'icon-[dir]-[name]', + svgoOptions: true + }), + viteCompression({ + verbose: true, // 是否在控制台输出压缩结果 + disable: false, // 是否禁用 + threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b + algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw'] + ext: '.gz', // 生成的压缩包后缀 + deleteOriginFile: false //压缩后是否删除源文件 + }), + ViteEjsPlugin(), + topLevelAwait({ + // https://juejin.cn/post/7152191742513512485 + // The export name of top-level await promise for each chunk module + promiseExportName: '__tla', + // The function to generate import names of top-level await promise in each chunk module + promiseImportName: (i) => `__tla_${i}` + }) + ] +} diff --git a/grailed-ui-admin-vue3/build/vite/optimize.ts b/grailed-ui-admin-vue3/build/vite/optimize.ts new file mode 100644 index 0000000..d34e1b3 --- /dev/null +++ b/grailed-ui-admin-vue3/build/vite/optimize.ts @@ -0,0 +1,110 @@ +const include = [ + 'qs', + 'url', + 'vue', + 'sass', + 'mitt', + 'axios', + 'pinia', + 'dayjs', + 'qrcode', + 'unocss', + 'vue-router', + 'vue-types', + 'vue-i18n', + 'crypto-js', + 'cropperjs', + 'lodash-es', + 'nprogress', + 'web-storage-cache', + '@iconify/iconify', + '@vueuse/core', + '@zxcvbn-ts/core', + 'echarts/core', + 'echarts/charts', + 'echarts/components', + 'echarts/renderers', + 'echarts-wordcloud', + '@wangeditor/editor', + '@wangeditor/editor-for-vue', + 'element-plus', + 'element-plus/es', + 'element-plus/es/locale/lang/zh-cn', + 'element-plus/es/locale/lang/en', + 'element-plus/es/components/backtop/style/css', + 'element-plus/es/components/form/style/css', + 'element-plus/es/components/radio-group/style/css', + 'element-plus/es/components/radio/style/css', + 'element-plus/es/components/checkbox/style/css', + 'element-plus/es/components/checkbox-group/style/css', + 'element-plus/es/components/switch/style/css', + 'element-plus/es/components/time-picker/style/css', + 'element-plus/es/components/date-picker/style/css', + 'element-plus/es/components/descriptions/style/css', + 'element-plus/es/components/descriptions-item/style/css', + 'element-plus/es/components/link/style/css', + 'element-plus/es/components/tooltip/style/css', + 'element-plus/es/components/drawer/style/css', + 'element-plus/es/components/dialog/style/css', + 'element-plus/es/components/checkbox-button/style/css', + 'element-plus/es/components/option-group/style/css', + 'element-plus/es/components/radio-button/style/css', + 'element-plus/es/components/cascader/style/css', + 'element-plus/es/components/color-picker/style/css', + 'element-plus/es/components/input-number/style/css', + 'element-plus/es/components/rate/style/css', + 'element-plus/es/components/select-v2/style/css', + 'element-plus/es/components/tree-select/style/css', + 'element-plus/es/components/slider/style/css', + 'element-plus/es/components/time-select/style/css', + 'element-plus/es/components/autocomplete/style/css', + 'element-plus/es/components/image-viewer/style/css', + 'element-plus/es/components/upload/style/css', + 'element-plus/es/components/col/style/css', + 'element-plus/es/components/form-item/style/css', + 'element-plus/es/components/alert/style/css', + 'element-plus/es/components/breadcrumb/style/css', + 'element-plus/es/components/select/style/css', + 'element-plus/es/components/input/style/css', + 'element-plus/es/components/breadcrumb-item/style/css', + 'element-plus/es/components/tag/style/css', + 'element-plus/es/components/pagination/style/css', + 'element-plus/es/components/table/style/css', + 'element-plus/es/components/table-v2/style/css', + 'element-plus/es/components/table-column/style/css', + 'element-plus/es/components/card/style/css', + 'element-plus/es/components/row/style/css', + 'element-plus/es/components/button/style/css', + 'element-plus/es/components/menu/style/css', + 'element-plus/es/components/sub-menu/style/css', + 'element-plus/es/components/menu-item/style/css', + 'element-plus/es/components/option/style/css', + 'element-plus/es/components/dropdown/style/css', + 'element-plus/es/components/dropdown-menu/style/css', + 'element-plus/es/components/dropdown-item/style/css', + 'element-plus/es/components/skeleton/style/css', + 'element-plus/es/components/skeleton/style/css', + 'element-plus/es/components/backtop/style/css', + 'element-plus/es/components/menu/style/css', + 'element-plus/es/components/sub-menu/style/css', + 'element-plus/es/components/menu-item/style/css', + 'element-plus/es/components/dropdown/style/css', + 'element-plus/es/components/tree/style/css', + 'element-plus/es/components/dropdown-menu/style/css', + 'element-plus/es/components/dropdown-item/style/css', + 'element-plus/es/components/badge/style/css', + 'element-plus/es/components/breadcrumb/style/css', + 'element-plus/es/components/breadcrumb-item/style/css', + 'element-plus/es/components/image/style/css', + 'element-plus/es/components/collapse-transition/style/css', + 'element-plus/es/components/timeline/style/css', + 'element-plus/es/components/timeline-item/style/css', + 'element-plus/es/components/collapse/style/css', + 'element-plus/es/components/collapse-item/style/css', + 'element-plus/es/components/button-group/style/css', + 'element-plus/es/components/text/style/css' +] + +const exclude = ['@iconify/json'] + +export { include, exclude } diff --git a/grailed-ui-admin-vue3/index.html b/grailed-ui-admin-vue3/index.html new file mode 100644 index 0000000..544b91a --- /dev/null +++ b/grailed-ui-admin-vue3/index.html @@ -0,0 +1,147 @@ + + + + + + + + + + %VITE_APP_TITLE% + + +
+ +
+
+
+
+
+
+
+
+
+ + + diff --git a/grailed-ui-admin-vue3/package.json b/grailed-ui-admin-vue3/package.json new file mode 100644 index 0000000..331ba2d --- /dev/null +++ b/grailed-ui-admin-vue3/package.json @@ -0,0 +1,152 @@ +{ + "name": "grailed-ui-admin-vue3", + "version": "1.8.0-snapshot", + "description": "基于vue3、vite4、element-plus、typesScript", + "author": "xingyu", + "private": false, + "scripts": { + "i": "pnpm install", + "dev": "vite --mode base", + "front": "vite --mode front", + "ts:check": "vue-tsc --noEmit", + "build:pro": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode pro", + "build:da": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode da", + "build:us": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode us", + "build:uk": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode uk", + "build:pt": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode pt", + "build:nz": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode nz", + "build:in": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode in", + "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev", + "build:base": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode base", + "build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage", + "build:static": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode static", + "build:front": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode front", + "serve:pro": "vite preview --mode pro", + "serve:dev": "vite preview --mode dev", + "preview": "pnpm build:base && vite preview", + "clean": "npx rimraf node_modules", + "clean:cache": "npx rimraf node_modules/.cache", + "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", + "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged -c " + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@form-create/designer": "^3.1.0", + "@form-create/element-ui": "^3.1.17", + "@iconify/iconify": "^3.1.1", + "@stomp/stompjs": "^7.0.0", + "@videojs-player/vue": "^1.0.0", + "@vueuse/core": "^10.3.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.10", + "@zxcvbn-ts/core": "^3.0.3", + "animate.css": "^4.1.1", + "axios": "^1.4.0", + "benz-amr-recorder": "^1.1.5", + "bpmn-js-token-simulation": "^0.10.0", + "camunda-bpmn-moddle": "^7.0.1", + "cropperjs": "^1.5.13", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.9", + "diagram-js": "^11.6.0", + "echarts": "^5.4.3", + "echarts-wordcloud": "^2.1.0", + "element-plus": "2.3.9", + "fast-xml-parser": "^4.2.7", + "highlight.js": "^11.8.0", + "intro.js": "^7.0.1", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "min-dash": "^4.1.1", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.1.6", + "qrcode": "^1.5.3", + "qs": "^6.11.2", + "steady-xml": "^0.1.0", + "url": "^0.11.1", + "video.js": "^7.21.5", + "vue": "3.3.4", + "vue-dompurify-html": "^4.1.4", + "vue-i18n": "9.2.2", + "vue-router": "^4.2.4", + "vue-types": "^5.1.1", + "vuedraggable": "^4.1.0", + "web-storage-cache": "^1.1.1", + "xml-js": "^1.6.11" + }, + "devDependencies": { + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "@iconify/json": "^2.2.98", + "@intlify/unplugin-vue-i18n": "^0.12.2", + "@purge-icons/generated": "^0.9.0", + "@types/intro.js": "^5.1.1", + "@types/lodash-es": "^4.17.8", + "@types/node": "^20.4.0", + "@types/nprogress": "^0.2.0", + "@types/qrcode": "^1.5.1", + "@types/qs": "^6.9.7", + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "@unocss/transformer-variant-group": "^0.54.1", + "@vitejs/plugin-legacy": "^4.1.1", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue-macros/volar": "^0.13.2", + "autoprefixer": "^10.4.14", + "bpmn-js": "^8.9.0", + "bpmn-js-properties-panel": "^0.46.0", + "consola": "^3.2.3", + "eslint": "^8.46.0", + "eslint-config-prettier": "^8.10.0", + "eslint-define-config": "^1.22.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-vue": "^9.16.1", + "lint-staged": "^13.2.3", + "postcss": "^8.4.27", + "postcss-html": "^1.5.0", + "postcss-scss": "^4.0.6", + "prettier": "^3.0.1", + "rimraf": "^5.0.1", + "rollup": "^3.27.2", + "sass": "^1.64.2", + "stylelint": "^15.10.2", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recommended": "^13.0.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-order": "^6.0.3", + "terser": "^5.19.2", + "typescript": "5.1.6", + "unocss": "^0.54.1", + "unplugin-auto-import": "^0.16.6", + "unplugin-element-plus": "^0.8.0", + "unplugin-vue-components": "^0.25.1", + "vite": "4.4.8", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-ejs": "^1.6.4", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-progress": "^0.0.7", + "vite-plugin-purge-icons": "^0.9.2", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-top-level-await": "^1.3.1", + "vue-eslint-parser": "^9.3.1", + "vue-tsc": "^1.8.8" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://gitee.com/yudaocode/yudao-ui-admin-vue3" + }, + "bugs": { + "url": "https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues" + }, + "homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3", + "packageManager": "pnpm@8.6.0", + "engines": { + "node": ">= 16.0.0", + "pnpm": ">=8.6.0" + } +} diff --git a/grailed-ui-admin-vue3/postcss.config.js b/grailed-ui-admin-vue3/postcss.config.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/grailed-ui-admin-vue3/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/grailed-ui-admin-vue3/prettier.config.js b/grailed-ui-admin-vue3/prettier.config.js new file mode 100644 index 0000000..b014bbf --- /dev/null +++ b/grailed-ui-admin-vue3/prettier.config.js @@ -0,0 +1,22 @@ +module.exports = { + printWidth: 100, // 每行代码长度(默认80) + tabWidth: 2, // 每个tab相当于多少个空格(默认2)ab进行缩进(默认false) + useTabs: false, // 是否使用tab + semi: false, // 声明结尾使用分号(默认true) + vueIndentScriptAndStyle: false, + singleQuote: true, // 使用单引号(默认false) + quoteProps: 'as-needed', + bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) + trailingComma: 'none', // 多行使用拖尾逗号(默认none) + jsxSingleQuote: false, + // 箭头函数参数括号 默认avoid 可选 avoid| always + // avoid 能省略括号的时候就省略 例如x => x + // always 总是有括号 + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + endOfLine: 'auto', + rangeStart: 0 +} diff --git a/grailed-ui-admin-vue3/public/favicon.ico b/grailed-ui-admin-vue3/public/favicon.ico new file mode 100644 index 0000000..5a7de08 Binary files /dev/null and b/grailed-ui-admin-vue3/public/favicon.ico differ diff --git a/grailed-ui-admin-vue3/public/home.png b/grailed-ui-admin-vue3/public/home.png new file mode 100644 index 0000000..ccd4145 Binary files /dev/null and b/grailed-ui-admin-vue3/public/home.png differ diff --git a/grailed-ui-admin-vue3/public/logo.gif b/grailed-ui-admin-vue3/public/logo.gif new file mode 100644 index 0000000..79cdc0a Binary files /dev/null and b/grailed-ui-admin-vue3/public/logo.gif differ diff --git a/grailed-ui-admin-vue3/public/logo2.png b/grailed-ui-admin-vue3/public/logo2.png new file mode 100644 index 0000000..f4de9ac Binary files /dev/null and b/grailed-ui-admin-vue3/public/logo2.png differ diff --git a/grailed-ui-admin-vue3/src/App.vue b/grailed-ui-admin-vue3/src/App.vue new file mode 100644 index 0000000..7407d97 --- /dev/null +++ b/grailed-ui-admin-vue3/src/App.vue @@ -0,0 +1,57 @@ + + + diff --git a/grailed-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts b/grailed-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts new file mode 100644 index 0000000..c6b4b45 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/apiAccessLog/index.ts @@ -0,0 +1,30 @@ +import request from '@/config/axios' + +export interface ApiAccessLogVO { + id: number + traceId: string + userId: number + userType: number + applicationName: string + requestMethod: string + requestParams: string + requestUrl: string + userIp: string + userAgent: string + beginTime: Date + endTIme: Date + duration: number + resultCode: number + resultMsg: string + createTime: Date +} + +// 查询列表API 访问日志 +export const getApiAccessLogPage = (params: PageParam) => { + return request.get({ url: '/infra/api-access-log/page', params }) +} + +// 导出API 访问日志 +export const exportApiAccessLog = (params) => { + return request.download({ url: '/infra/api-access-log/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts b/grailed-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts new file mode 100644 index 0000000..59ee214 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/apiErrorLog/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface ApiErrorLogVO { + id: number + traceId: string + userId: number + userType: number + applicationName: string + requestMethod: string + requestParams: string + requestUrl: string + userIp: string + userAgent: string + exceptionTime: Date + exceptionName: string + exceptionMessage: string + exceptionRootCauseMessage: string + exceptionStackTrace: string + exceptionClassName: string + exceptionFileName: string + exceptionMethodName: string + exceptionLineNumber: number + processUserId: number + processStatus: number + processTime: Date + resultCode: number + createTime: Date +} + +// 查询列表API 访问日志 +export const getApiErrorLogPage = (params: PageParam) => { + return request.get({ url: '/infra/api-error-log/page', params }) +} + +// 更新 API 错误日志的处理状态 +export const updateApiErrorLogPage = (id: number, processStatus: number) => { + return request.put({ + url: '/infra/api-error-log/update-status?id=' + id + '&processStatus=' + processStatus + }) +} + +// 导出API 访问日志 +export const exportApiErrorLog = (params) => { + return request.download({ + url: '/infra/api-error-log/export-excel', + params + }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/codegen/index.ts b/grailed-ui-admin-vue3/src/api/infra/codegen/index.ts new file mode 100644 index 0000000..64701ef --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/codegen/index.ts @@ -0,0 +1,123 @@ +import request from '@/config/axios' + +export type CodegenTableVO = { + id: number + tableId: number + isParentMenuIdValid: boolean + dataSourceConfigId: number + scene: number + tableName: string + tableComment: string + remark: string + moduleName: string + businessName: string + className: string + classComment: string + author: string + createTime: Date + updateTime: Date + templateType: number + parentMenuId: number +} + +export type CodegenColumnVO = { + id: number + tableId: number + columnName: string + dataType: string + columnComment: string + nullable: number + primaryKey: number + autoIncrement: string + ordinalPosition: number + javaType: string + javaField: string + dictType: string + example: string + createOperation: number + updateOperation: number + listOperation: number + listOperationCondition: string + listOperationResult: number + htmlType: string +} + +export type DatabaseTableVO = { + name: string + comment: string +} + +export type CodegenDetailVO = { + table: CodegenTableVO + columns: CodegenColumnVO[] +} + +export type CodegenPreviewVO = { + filePath: string + code: string +} + +export type CodegenUpdateReqVO = { + table: CodegenTableVO | any + columns: CodegenColumnVO[] +} + +export type CodegenCreateListReqVO = { + dataSourceConfigId: number + tableNames: string[] +} + +// 查询列表代码生成表定义 +export const getCodegenTablePage = (params: PageParam) => { + return request.get({ url: '/infra/codegen/table/page', params }) +} + +// 查询详情代码生成表定义 +export const getCodegenTable = (id: number) => { + return request.get({ url: '/infra/codegen/detail?tableId=' + id }) +} + +// 新增代码生成表定义 +export const createCodegenTable = (data: CodegenCreateListReqVO) => { + return request.post({ url: '/infra/codegen/create', data }) +} + +// 修改代码生成表定义 +export const updateCodegenTable = (data: CodegenUpdateReqVO) => { + return request.put({ url: '/infra/codegen/update', data }) +} + +// 基于数据库的表结构,同步数据库的表和字段定义 +export const syncCodegenFromDB = (id: number) => { + return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id }) +} + +// 基于 SQL 建表语句,同步数据库的表和字段定义 +export const syncCodegenFromSQL = (id: number, sql: string) => { + return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql }) +} + +// 预览生成代码 +export const previewCodegen = (id: number) => { + return request.get({ url: '/infra/codegen/preview?tableId=' + id }) +} + +// 下载生成代码 +export const downloadCodegen = (id: number) => { + return request.download({ url: '/infra/codegen/download?tableId=' + id }) +} + +// 获得表定义 +export const getSchemaTableList = (params) => { + return request.get({ url: '/infra/codegen/db/table/list', params }) +} + +// 基于数据库的表结构,创建代码生成器的表定义 +export const createCodegenList = (data) => { + return request.post({ url: '/infra/codegen/create-list', data }) +} + +// 删除代码生成表定义 +export const deleteCodegenTable = (id: number) => { + return request.delete({ url: '/infra/codegen/delete?tableId=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/config/index.ts b/grailed-ui-admin-vue3/src/api/infra/config/index.ts new file mode 100644 index 0000000..e8e8f14 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/config/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface ConfigVO { + id: number | undefined + category: string + name: string + key: string + value: string + type: number + visible: boolean + remark: string + createTime: Date +} + +// 查询参数列表 +export const getConfigPage = (params: PageParam) => { + return request.get({ url: '/infra/config/page', params }) +} + +// 查询参数详情 +export const getConfig = (id: number) => { + return request.get({ url: '/infra/config/get?id=' + id }) +} + +// 根据参数键名查询参数值 +export const getConfigKey = (configKey: string) => { + return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey }) +} + +// 新增参数 +export const createConfig = (data: ConfigVO) => { + return request.post({ url: '/infra/config/create', data }) +} + +// 修改参数 +export const updateConfig = (data: ConfigVO) => { + return request.put({ url: '/infra/config/update', data }) +} + +// 删除参数 +export const deleteConfig = (id: number) => { + return request.delete({ url: '/infra/config/delete?id=' + id }) +} + +// 导出参数 +export const exportConfig = (params) => { + return request.download({ url: '/infra/config/export', params }) +} + +export const batchCreateSiteConfig = (data: any) => { + return request.post({ url: '/infra/config/site-config', data }) +} + +export const batchCreateTaskConfig = (data: any) => { + return request.post({ url: '/infra/config/task-config', data }) +} + +export const batchCreateFinanceConfig = (data: any) => { + return request.post({ url: '/infra/config/finance-config', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts b/grailed-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts new file mode 100644 index 0000000..b413f34 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/dataSourceConfig/index.ts @@ -0,0 +1,35 @@ +import request from '@/config/axios' + +export interface DataSourceConfigVO { + id: number | undefined + name: string + url: string + username: string + password: string + createTime?: Date +} + +// 新增数据源配置 +export const createDataSourceConfig = (data: DataSourceConfigVO) => { + return request.post({ url: '/infra/data-source-config/create', data }) +} + +// 修改数据源配置 +export const updateDataSourceConfig = (data: DataSourceConfigVO) => { + return request.put({ url: '/infra/data-source-config/update', data }) +} + +// 删除数据源配置 +export const deleteDataSourceConfig = (id: number) => { + return request.delete({ url: '/infra/data-source-config/delete?id=' + id }) +} + +// 查询数据源配置详情 +export const getDataSourceConfig = (id: number) => { + return request.get({ url: '/infra/data-source-config/get?id=' + id }) +} + +// 查询数据源配置列表 +export const getDataSourceConfigList = () => { + return request.get({ url: '/infra/data-source-config/list' }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/dbDoc/index.ts b/grailed-ui-admin-vue3/src/api/infra/dbDoc/index.ts new file mode 100644 index 0000000..1a1a36b --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/dbDoc/index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios' + +// 导出Html +export const exportHtml = () => { + return request.download({ url: '/infra/db-doc/export-html' }) +} + +// 导出Word +export const exportWord = () => { + return request.download({ url: '/infra/db-doc/export-word' }) +} + +// 导出Markdown +export const exportMarkdown = () => { + return request.download({ url: '/infra/db-doc/export-markdown' }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/file/index.ts b/grailed-ui-admin-vue3/src/api/infra/file/index.ts new file mode 100644 index 0000000..f64bc0d --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/file/index.ts @@ -0,0 +1,17 @@ +import request from '@/config/axios' + +export interface FilePageReqVO extends PageParam { + path?: string + type?: string + createTime?: Date[] +} + +// 查询文件列表 +export const getFilePage = (params: FilePageReqVO) => { + return request.get({ url: '/infra/file/page', params }) +} + +// 删除文件 +export const deleteFile = (id: number) => { + return request.delete({ url: '/infra/file/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/fileConfig/index.ts b/grailed-ui-admin-vue3/src/api/infra/fileConfig/index.ts new file mode 100644 index 0000000..b72f18b --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/fileConfig/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface FileClientConfig { + basePath: string + host?: string + port?: number + username?: string + password?: string + mode?: string + endpoint?: string + bucket?: string + accessKey?: string + accessSecret?: string + domain: string +} + +export interface FileConfigVO { + id: number + name: string + storage: any + master: boolean + visible: boolean + config: FileClientConfig + remark: string + createTime: Date +} + +// 查询文件配置列表 +export const getFileConfigPage = (params: PageParam) => { + return request.get({ url: '/infra/file-config/page', params }) +} + +// 查询文件配置详情 +export const getFileConfig = (id: number) => { + return request.get({ url: '/infra/file-config/get?id=' + id }) +} + +// 更新文件配置为主配置 +export const updateFileConfigMaster = (id: number) => { + return request.put({ url: '/infra/file-config/update-master?id=' + id }) +} + +// 新增文件配置 +export const createFileConfig = (data: FileConfigVO) => { + return request.post({ url: '/infra/file-config/create', data }) +} + +// 修改文件配置 +export const updateFileConfig = (data: FileConfigVO) => { + return request.put({ url: '/infra/file-config/update', data }) +} + +// 删除文件配置 +export const deleteFileConfig = (id: number) => { + return request.delete({ url: '/infra/file-config/delete?id=' + id }) +} + +// 测试文件配置 +export const testFileConfig = (id: number) => { + return request.get({ url: '/infra/file-config/test?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/job/index.ts b/grailed-ui-admin-vue3/src/api/infra/job/index.ts new file mode 100644 index 0000000..033b2cb --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/job/index.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' + +export interface JobVO { + id: number + name: string + status: number + handlerName: string + handlerParam: string + cronExpression: string + retryCount: number + retryInterval: number + monitorTimeout: number + createTime: Date +} + +// 任务列表 +export const getJobPage = (params: PageParam) => { + return request.get({ url: '/infra/job/page', params }) +} + +// 任务详情 +export const getJob = (id: number) => { + return request.get({ url: '/infra/job/get?id=' + id }) +} + +// 新增任务 +export const createJob = (data: JobVO) => { + return request.post({ url: '/infra/job/create', data }) +} + +// 修改定时任务调度 +export const updateJob = (data: JobVO) => { + return request.put({ url: '/infra/job/update', data }) +} + +// 删除定时任务调度 +export const deleteJob = (id: number) => { + return request.delete({ url: '/infra/job/delete?id=' + id }) +} + +// 导出定时任务调度 +export const exportJob = (params) => { + return request.download({ url: '/infra/job/export-excel', params }) +} + +// 任务状态修改 +export const updateJobStatus = (id: number, status: number) => { + const params = { + id, + status + } + return request.put({ url: '/infra/job/update-status', params }) +} + +// 定时任务立即执行一次 +export const runJob = (id: number) => { + return request.put({ url: '/infra/job/trigger?id=' + id }) +} + +// 获得定时任务的下 n 次执行时间 +export const getJobNextTimes = (id: number) => { + return request.get({ url: '/infra/job/get_next_times?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/jobLog/index.ts b/grailed-ui-admin-vue3/src/api/infra/jobLog/index.ts new file mode 100644 index 0000000..f429cd9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/jobLog/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +export interface JobLogVO { + id: number + jobId: number + handlerName: string + handlerParam: string + cronExpression: string + executeIndex: string + beginTime: string + endTime: string + duration: string + status: number + createTime: string +} + +// 任务日志列表 +export const getJobLogPage = (params: PageParam) => { + return request.get({ url: '/infra/job-log/page', params }) +} + +// 任务日志详情 +export const getJobLog = (id: number) => { + return request.get({ url: '/infra/job-log/get?id=' + id }) +} + +// 导出定时任务日志 +export const exportJobLog = (params) => { + return request.download({ + url: '/infra/job-log/export-excel', + params + }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/redis/index.ts b/grailed-ui-admin-vue3/src/api/infra/redis/index.ts new file mode 100644 index 0000000..f27be77 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/redis/index.ts @@ -0,0 +1,8 @@ +import request from '@/config/axios' + +/** + * 获取redis 监控信息 + */ +export const getCache = () => { + return request.get({ url: '/infra/redis/get-monitor-info' }) +} diff --git a/grailed-ui-admin-vue3/src/api/infra/redis/types.ts b/grailed-ui-admin-vue3/src/api/infra/redis/types.ts new file mode 100644 index 0000000..548bfe9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/infra/redis/types.ts @@ -0,0 +1,176 @@ +export interface RedisMonitorInfoVO { + info: RedisInfoVO + dbSize: number + commandStats: RedisCommandStatsVO[] +} + +export interface RedisInfoVO { + io_threaded_reads_processed: string + tracking_clients: string + uptime_in_seconds: string + cluster_connections: string + current_cow_size: string + maxmemory_human: string + aof_last_cow_size: string + master_replid2: string + mem_replication_backlog: string + aof_rewrite_scheduled: string + total_net_input_bytes: string + rss_overhead_ratio: string + hz: string + current_cow_size_age: string + redis_build_id: string + errorstat_BUSYGROUP: string + aof_last_bgrewrite_status: string + multiplexing_api: string + client_recent_max_output_buffer: string + allocator_resident: string + mem_fragmentation_bytes: string + aof_current_size: string + repl_backlog_first_byte_offset: string + tracking_total_prefixes: string + redis_mode: string + redis_git_dirty: string + aof_delayed_fsync: string + allocator_rss_bytes: string + repl_backlog_histlen: string + io_threads_active: string + rss_overhead_bytes: string + total_system_memory: string + loading: string + evicted_keys: string + maxclients: string + cluster_enabled: string + redis_version: string + repl_backlog_active: string + mem_aof_buffer: string + allocator_frag_bytes: string + io_threaded_writes_processed: string + instantaneous_ops_per_sec: string + used_memory_human: string + total_error_replies: string + role: string + maxmemory: string + used_memory_lua: string + rdb_current_bgsave_time_sec: string + used_memory_startup: string + used_cpu_sys_main_thread: string + lazyfree_pending_objects: string + aof_pending_bio_fsync: string + used_memory_dataset_perc: string + allocator_frag_ratio: string + arch_bits: string + used_cpu_user_main_thread: string + mem_clients_normal: string + expired_time_cap_reached_count: string + unexpected_error_replies: string + mem_fragmentation_ratio: string + aof_last_rewrite_time_sec: string + master_replid: string + aof_rewrite_in_progress: string + lru_clock: string + maxmemory_policy: string + run_id: string + latest_fork_usec: string + tracking_total_items: string + total_commands_processed: string + expired_keys: string + errorstat_ERR: string + used_memory: string + module_fork_in_progress: string + errorstat_WRONGPASS: string + aof_buffer_length: string + dump_payload_sanitizations: string + mem_clients_slaves: string + keyspace_misses: string + server_time_usec: string + executable: string + lazyfreed_objects: string + db0: string + used_memory_peak_human: string + keyspace_hits: string + rdb_last_cow_size: string + aof_pending_rewrite: string + used_memory_overhead: string + active_defrag_hits: string + tcp_port: string + uptime_in_days: string + used_memory_peak_perc: string + current_save_keys_processed: string + blocked_clients: string + total_reads_processed: string + expire_cycle_cpu_milliseconds: string + sync_partial_err: string + used_memory_scripts_human: string + aof_current_rewrite_time_sec: string + aof_enabled: string + process_supervised: string + master_repl_offset: string + used_memory_dataset: string + used_cpu_user: string + rdb_last_bgsave_status: string + tracking_total_keys: string + atomicvar_api: string + allocator_rss_ratio: string + client_recent_max_input_buffer: string + clients_in_timeout_table: string + aof_last_write_status: string + mem_allocator: string + used_memory_scripts: string + used_memory_peak: string + process_id: string + master_failover_state: string + errorstat_NOAUTH: string + used_cpu_sys: string + repl_backlog_size: string + connected_slaves: string + current_save_keys_total: string + gcc_version: string + total_system_memory_human: string + sync_full: string + connected_clients: string + module_fork_last_cow_size: string + total_writes_processed: string + allocator_active: string + total_net_output_bytes: string + pubsub_channels: string + current_fork_perc: string + active_defrag_key_hits: string + rdb_changes_since_last_save: string + instantaneous_input_kbps: string + used_memory_rss_human: string + configured_hz: string + expired_stale_perc: string + active_defrag_misses: string + used_cpu_sys_children: string + number_of_cached_scripts: string + sync_partial_ok: string + used_memory_lua_human: string + rdb_last_save_time: string + pubsub_patterns: string + slave_expires_tracked_keys: string + redis_git_sha1: string + used_memory_rss: string + rdb_last_bgsave_time_sec: string + os: string + mem_not_counted_for_evict: string + active_defrag_running: string + rejected_connections: string + aof_rewrite_buffer_length: string + total_forks: string + active_defrag_key_misses: string + allocator_allocated: string + aof_base_size: string + instantaneous_output_kbps: string + second_repl_offset: string + rdb_bgsave_in_progress: string + used_cpu_user_children: string + total_connections_received: string + migrate_cached_sockets: string +} + +export interface RedisCommandStatsVO { + command: string + calls: number + usec: number +} diff --git a/grailed-ui-admin-vue3/src/api/login/index.ts b/grailed-ui-admin-vue3/src/api/login/index.ts new file mode 100644 index 0000000..b65a90c --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/login/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' +import { getRefreshToken } from '@/utils/auth' +import type { UserLoginVO } from './types' + +export interface SmsCodeVO { + mobile: string + scene: number +} + +export interface SmsLoginVO { + mobile: string + code: string +} + +// 登录 +export const login = (data: UserLoginVO) => { + return request.post({ url: '/system/auth/login', data }) +} + +// 刷新访问令牌 +export const refreshToken = () => { + return request.post({ url: '/system/auth/refresh-token?refreshToken=' + getRefreshToken() }) +} + +// 使用租户名,获得租户编号 +export const getTenantIdByName = (name: string) => { + return request.get({ url: '/system/tenant/get-id-by-name?name=' + name }) +} + +// 登出 +export const loginOut = () => { + return request.post({ url: '/system/auth/logout' }) +} + +// 获取用户权限信息 +export const getInfo = () => { + return request.get({ url: '/system/auth/get-permission-info' }) +} + +//获取登录验证码 +export const sendSmsCode = (data: SmsCodeVO) => { + return request.post({ url: '/system/auth/send-sms-code', data }) +} + +// 短信验证码登录 +export const smsLogin = (data: SmsLoginVO) => { + return request.post({ url: '/system/auth/sms-login', data }) +} + +// 社交授权的跳转 +export const socialAuthRedirect = (type: number, redirectUri: string) => { + return request.get({ + url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri + }) +} +// 获取验证图片以及 token +export const getCode = (data) => { + return request.postOriginal({ url: 'system/captcha/get', data }) +} + +// 滑动或者点选验证 +export const reqCheck = (data) => { + return request.postOriginal({ url: 'system/captcha/check', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/login/oauth2/index.ts b/grailed-ui-admin-vue3/src/api/login/oauth2/index.ts new file mode 100644 index 0000000..aef1820 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/login/oauth2/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +// 获得授权信息 +export const getAuthorize = (clientId: string) => { + return request.get({ url: '/system/oauth2/authorize?clientId=' + clientId }) +} + +// 发起授权 +export const authorize = ( + responseType: string, + clientId: string, + redirectUri: string, + state: string, + autoApprove: boolean, + checkedScopes: string[], + uncheckedScopes: string[] +) => { + // 构建 scopes + const scopes = {} + for (const scope of checkedScopes) { + scopes[scope] = true + } + for (const scope of uncheckedScopes) { + scopes[scope] = false + } + // 发起请求 + return request.post({ + url: '/system/oauth2/authorize', + headers: { + 'Content-type': 'application/x-www-form-urlencoded' + }, + params: { + response_type: responseType, + client_id: clientId, + redirect_uri: redirectUri, + state: state, + auto_approve: autoApprove, + scope: JSON.stringify(scopes) + } + }) +} diff --git a/grailed-ui-admin-vue3/src/api/login/types.ts b/grailed-ui-admin-vue3/src/api/login/types.ts new file mode 100644 index 0000000..b2173f7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/login/types.ts @@ -0,0 +1,28 @@ +export type UserLoginVO = { + username: string + password: string + captchaVerification: string +} + +export type TokenType = { + id: number // 编号 + accessToken: string // 访问令牌 + refreshToken: string // 刷新令牌 + userId: number // 用户编号 + userType: number //用户类型 + clientId: string //客户端编号 + expiresTime: number //过期时间 +} + +export type UserVO = { + id: number + username: string + nickname: string + deptId: number + email: string + mobile: string + sex: number + avatar: string + loginIp: string + loginDate: string +} diff --git a/grailed-ui-admin-vue3/src/api/mall/product/brand.ts b/grailed-ui-admin-vue3/src/api/mall/product/brand.ts new file mode 100644 index 0000000..94d5370 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/product/brand.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +/** + * 商品品牌 + */ +export interface BrandVO { + /** + * 品牌编号 + */ + id?: number + /** + * 品牌名称 + */ + name: string + /** + * 品牌图片 + */ + picUrl: string + /** + * 品牌排序 + */ + sort?: number + /** + * 品牌描述 + */ + description?: string + /** + * 开启状态 + */ + status: number +} + +// 创建商品品牌 +export const createBrand = (data: BrandVO) => { + return request.post({ url: '/product/brand/create', data }) +} + +// 更新商品品牌 +export const updateBrand = (data: BrandVO) => { + return request.put({ url: '/product/brand/update', data }) +} + +// 删除商品品牌 +export const deleteBrand = (id: number) => { + return request.delete({ url: `/product/brand/delete?id=${id}` }) +} + +// 获得商品品牌 +export const getBrand = (id: number) => { + return request.get({ url: `/product/brand/get?id=${id}` }) +} + +// 获得商品品牌列表 +export const getBrandParam = (params: PageParam) => { + return request.get({ url: '/product/brand/page', params }) +} + +// 获得商品品牌精简信息列表 +export const getSimpleBrandList = () => { + return request.get({ url: '/product/brand/list-all-simple' }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/product/category.ts b/grailed-ui-admin-vue3/src/api/mall/product/category.ts new file mode 100644 index 0000000..8158fc0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/product/category.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +/** + * 产品分类 + */ +export interface CategoryVO { + /** + * 分类编号 + */ + id?: number + /** + * 父分类编号 + */ + parentId?: number + /** + * 分类名称 + */ + name: string + /** + * 移动端分类图 + */ + picUrl: string + /** + * PC 端分类图 + */ + bigPicUrl?: string + /** + * 分类排序 + */ + sort: number + /** + * 开启状态 + */ + status: number +} + +// 创建商品分类 +export const createCategory = (data: CategoryVO) => { + return request.post({ url: '/product/category/create', data }) +} + +// 更新商品分类 +export const updateCategory = (data: CategoryVO) => { + return request.put({ url: '/product/category/update', data }) +} + +// 删除商品分类 +export const deleteCategory = (id: number) => { + return request.delete({ url: `/product/category/delete?id=${id}` }) +} + +// 获得商品分类 +export const getCategory = (id: number) => { + return request.get({ url: `/product/category/get?id=${id}` }) +} + +// 获得商品分类列表 +export const getCategoryList = (params: any) => { + return request.get({ url: '/product/category/list', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/product/property.ts b/grailed-ui-admin-vue3/src/api/mall/product/property.ts new file mode 100644 index 0000000..ac8bac5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/product/property.ts @@ -0,0 +1,103 @@ +import request from '@/config/axios' + +/** + * 商品属性 + */ +export interface PropertyVO { + id?: number + /** 名称 */ + name: string + /** 备注 */ + remark?: string +} + +/** + * 属性值 + */ +export interface PropertyValueVO { + id?: number + /** 属性项的编号 */ + propertyId?: number + /** 名称 */ + name: string + /** 备注 */ + remark?: string +} + +/** + * 商品属性值的明细 + */ +export interface PropertyValueDetailVO { + /** 属性项的编号 */ + propertyId: number // 属性的编号 + /** 属性的名称 */ + propertyName: string + /** 属性值的编号 */ + valueId: number + /** 属性值的名称 */ + valueName: string +} + +// ------------------------ 属性项 ------------------- + +// 创建属性项 +export const createProperty = (data: PropertyVO) => { + return request.post({ url: '/product/property/create', data }) +} + +// 更新属性项 +export const updateProperty = (data: PropertyVO) => { + return request.put({ url: '/product/property/update', data }) +} + +// 删除属性项 +export const deleteProperty = (id: number) => { + return request.delete({ url: `/product/property/delete?id=${id}` }) +} + +// 获得属性项 +export const getProperty = (id: number): Promise => { + return request.get({ url: `/product/property/get?id=${id}` }) +} + +// 获得属性项分页 +export const getPropertyPage = (params: PageParam) => { + return request.get({ url: '/product/property/page', params }) +} + +// 获得属性项列表 +export const getPropertyList = (params: any) => { + return request.get({ url: '/product/property/list', params }) +} + +// 获得属性项列表 +export const getPropertyListAndValue = (data: any) => { + return request.post({ url: '/product/property/get-value-list', data }) +} + +// ------------------------ 属性值 ------------------- + +// 获得属性值分页 +export const getPropertyValuePage = (params: PageParam & any) => { + return request.get({ url: '/product/property/value/page', params }) +} + +// 获得属性值 +export const getPropertyValue = (id: number): Promise => { + return request.get({ url: `/product/property/value/get?id=${id}` }) +} + +// 创建属性值 +export const createPropertyValue = (data: PropertyValueVO) => { + return request.post({ url: '/product/property/value/create', data }) +} + +// 更新属性值 +export const updatePropertyValue = (data: PropertyValueVO) => { + return request.put({ url: '/product/property/value/update', data }) +} + +// 删除属性值 +export const deletePropertyValue = (id: number) => { + return request.delete({ url: `/product/property/value/delete?id=${id}` }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/product/spu.ts b/grailed-ui-admin-vue3/src/api/mall/product/spu.ts new file mode 100644 index 0000000..0ea324b --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/product/spu.ts @@ -0,0 +1,107 @@ +import request from '@/config/axios' + +export interface Property { + propertyId?: number // 属性编号 + propertyName?: string // 属性名称 + valueId?: number // 属性值编号 + valueName?: string // 属性值名称 +} + +export interface Sku { + id?: number // 商品 SKU 编号 + spuId?: number // SPU 编号 + properties?: Property[] // 属性数组 + price?: number // 商品价格 + marketPrice?: number // 市场价 + costPrice?: number // 成本价 + barCode?: string // 商品条码 + picUrl?: string // 图片地址 + stock?: number // 库存 + weight?: number // 商品重量,单位:kg 千克 + volume?: number // 商品体积,单位:m^3 平米 + subCommissionFirstPrice?: number // 一级分销的佣金 + subCommissionSecondPrice?: number // 二级分销的佣金 + salesCount?: number // 商品销量 +} + +export interface Spu { + id?: number + name?: string // 商品名称 + categoryId?: number | null // 商品分类 + keyword?: string // 关键字 + unit?: number | null // 单位 + picUrl?: string // 商品封面图 + sliderPicUrls?: string[] // 商品轮播图 + introduction?: string // 商品简介 + deliveryTemplateId?: number | null // 运费模版 + brandId?: number | null // 商品品牌编号 + specType?: boolean // 商品规格 + subCommissionType?: boolean // 分销类型 + skus?: Sku[] // sku数组 + description?: string // 商品详情 + sort?: number // 商品排序 + giveIntegral?: number // 赠送积分 + virtualSalesCount?: number // 虚拟销量 + recommendHot?: boolean // 是否热卖 + recommendBenefit?: boolean // 是否优惠 + recommendBest?: boolean // 是否精品 + recommendNew?: boolean // 是否新品 + recommendGood?: boolean // 是否优品 + price?: number // 商品价格 + salesCount?: number // 商品销量 + marketPrice?: number // 市场价 + costPrice?: number // 成本价 + stock?: number // 商品库存 + createTime?: Date // 商品创建时间 + status?: number // 商品状态 +} + +// 获得 Spu 列表 +export const getSpuPage = (params: PageParam) => { + return request.get({ url: '/product/spu/page', params }) +} + +// 获得 Spu 列表 tabsCount +export const getTabsCount = () => { + return request.get({ url: '/product/spu/get-count' }) +} + +// 创建商品 Spu +export const createSpu = (data: Spu) => { + return request.post({ url: '/product/spu/create', data }) +} + +// 更新商品 Spu +export const updateSpu = (data: Spu) => { + return request.put({ url: '/product/spu/update', data }) +} + +// 更新商品 Spu status +export const updateStatus = (data: { id: number; status: number }) => { + return request.put({ url: '/product/spu/update-status', data }) +} + +// 获得商品 Spu +export const getSpu = (id: number) => { + return request.get({ url: `/product/spu/get-detail?id=${id}` }) +} + +// 获得商品 Spu 详情列表 +export const getSpuDetailList = (ids: number[]) => { + return request.get({ url: `/product/spu/list?spuIds=${ids}` }) +} + +// 删除商品 Spu +export const deleteSpu = (id: number) => { + return request.delete({ url: `/product/spu/delete?id=${id}` }) +} + +// 导出商品 Spu Excel +export const exportSpu = async (params) => { + return await request.download({ url: '/product/spu/export', params }) +} + +// 获得商品 SPU 精简列表 +export const getSpuSimpleList = async () => { + return request.get({ url: '/product/spu/get-simple-list' }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/promotion/combination/combinationActivity.ts b/grailed-ui-admin-vue3/src/api/mall/promotion/combination/combinationActivity.ts new file mode 100644 index 0000000..1e211c8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/promotion/combination/combinationActivity.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' +import { Sku, Spu } from '@/api/mall/product/spu' + +export interface CombinationActivityVO { + id?: number + name?: string + spuId?: number + totalLimitCount?: number + singleLimitCount?: number + startTime?: Date + endTime?: Date + userSize?: number + totalNum?: number + successNum?: number + orderUserCount?: number + virtualGroup?: number + status?: number + limitDuration?: number + products: CombinationProductVO[] +} + +// 拼团活动所需属性 +export interface CombinationProductVO { + spuId: number + skuId: number + activePrice: number // 拼团价格 +} + +// 扩展 Sku 配置 +export type SkuExtension = Sku & { + productConfig: CombinationProductVO +} + +export interface SpuExtension extends Spu { + skus: SkuExtension[] // 重写类型 +} + +// 查询拼团活动列表 +export const getCombinationActivityPage = async (params) => { + return await request.get({ url: '/promotion/combination-activity/page', params }) +} + +// 查询拼团活动详情 +export const getCombinationActivity = async (id: number) => { + return await request.get({ url: '/promotion/combination-activity/get?id=' + id }) +} + +// 新增拼团活动 +export const createCombinationActivity = async (data: CombinationActivityVO) => { + return await request.post({ url: '/promotion/combination-activity/create', data }) +} + +// 修改拼团活动 +export const updateCombinationActivity = async (data: CombinationActivityVO) => { + return await request.put({ url: '/promotion/combination-activity/update', data }) +} + +// 删除拼团活动 +export const deleteCombinationActivity = async (id: number) => { + return await request.delete({ url: '/promotion/combination-activity/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/promotion/coupon.ts b/grailed-ui-admin-vue3/src/api/mall/promotion/coupon.ts new file mode 100644 index 0000000..565b86f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/promotion/coupon.ts @@ -0,0 +1,18 @@ +import request from '@/config/axios' + +// TODO @dhb52:vo 缺少 + +// 删除优惠劵 +export const deleteCoupon = async (id: number) => { + return request.delete({ + url: `/promotion/coupon/delete?id=${id}` + }) +} + +// 获得优惠劵分页 +export const getCouponPage = async (params: PageParam) => { + return request.get({ + url: '/promotion/coupon/page', + params: params + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/promotion/couponTemplate.ts b/grailed-ui-admin-vue3/src/api/mall/promotion/couponTemplate.ts new file mode 100644 index 0000000..6a58876 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/promotion/couponTemplate.ts @@ -0,0 +1,83 @@ +import request from '@/config/axios' + +export interface CouponTemplateVO { + id: number + name: string + status: number + totalCount: number + takeLimitCount: number + takeType: number + usePrice: number + productScope: number + productSpuIds: string + validityType: number + validStartTime: Date + validEndTime: Date + fixedStartTerm: number + fixedEndTerm: number + discountType: number + discountPercent: number + discountPrice: number + discountLimitPrice: number + takeCount: number + useCount: number +} + +// 创建优惠劵模板 +export function createCouponTemplate(data: CouponTemplateVO) { + return request.post({ + url: '/promotion/coupon-template/create', + data: data + }) +} + +// 更新优惠劵模板 +export function updateCouponTemplate(data: CouponTemplateVO) { + return request.put({ + url: '/promotion/coupon-template/update', + data: data + }) +} + +// 更新优惠劵模板的状态 +export function updateCouponTemplateStatus(id: number, status: [0, 1]) { + const data = { + id, + status + } + return request.put({ + url: '/promotion/coupon-template/update-status', + data: data + }) +} + +// 删除优惠劵模板 +export function deleteCouponTemplate(id: number) { + return request.delete({ + url: '/promotion/coupon-template/delete?id=' + id + }) +} + +// 获得优惠劵模板 +export function getCouponTemplate(id: number) { + return request.get({ + url: '/promotion/coupon-template/get?id=' + id + }) +} + +// 获得优惠劵模板分页 +export function getCouponTemplatePage(params: PageParam) { + return request.get({ + url: '/promotion/coupon-template/page', + params: params + }) +} + +// 导出优惠劵模板 Excel +export function exportCouponTemplateExcel(params: PageParam) { + return request.get({ + url: '/promotion/coupon-template/export-excel', + params: params, + responseType: 'blob' + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillActivity.ts b/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillActivity.ts new file mode 100644 index 0000000..42c1c31 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillActivity.ts @@ -0,0 +1,63 @@ +import request from '@/config/axios' +import { Sku, Spu } from '@/api/mall/product/spu' + +export interface SeckillActivityVO { + id?: number + spuId?: number + name?: string + status?: number + remark?: string + startTime?: Date + endTime?: Date + sort?: number + configIds?: string + orderCount?: number + userCount?: number + totalPrice?: number + totalLimitCount?: number + singleLimitCount?: number + stock?: number + totalStock?: number + products?: SeckillProductVO[] +} + +// 秒杀活动所需属性 +export interface SeckillProductVO { + skuId: number + seckillPrice: number + stock: number +} + +// 扩展 Sku 配置 +export type SkuExtension = Sku & { + productConfig: SeckillProductVO +} + +export interface SpuExtension extends Spu { + skus: SkuExtension[] // 重写类型 +} + +// 查询秒杀活动列表 +export const getSeckillActivityPage = async (params) => { + return await request.get({ url: '/promotion/seckill-activity/page', params }) +} + +// 查询秒杀活动详情 +export const getSeckillActivity = async (id: number) => { + return await request.get({ url: '/promotion/seckill-activity/get?id=' + id }) +} + +// 新增秒杀活动 +export const createSeckillActivity = async (data: SeckillActivityVO) => { + return await request.post({ url: '/promotion/seckill-activity/create', data }) +} + +// 修改秒杀活动 +export const updateSeckillActivity = async (data: SeckillActivityVO) => { + return await request.put({ url: '/promotion/seckill-activity/update', data }) +} + +// 删除秒杀活动 +export const deleteSeckillActivity = async (id: number) => { + return await request.delete({ url: '/promotion/seckill-activity/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillConfig.ts b/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillConfig.ts new file mode 100644 index 0000000..eee8211 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/promotion/seckill/seckillConfig.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface SeckillConfigVO { + id: number + name: string + startTime: string + endTime: string + sliderPicUrls: string[] + status: number +} + +// 查询秒杀时段配置列表 +export const getSeckillConfigPage = async (params) => { + return await request.get({ url: '/promotion/seckill-config/page', params }) +} + +// 查询秒杀时段配置详情 +export const getSeckillConfig = async (id: number) => { + return await request.get({ url: '/promotion/seckill-config/get?id=' + id }) +} + +// 获得所有开启状态的秒杀时段精简列表 +export const getListAllSimple = async () => { + return await request.get({ url: '/promotion/seckill-config/list-all-simple' }) +} + +// 新增秒杀时段配置 +export const createSeckillConfig = async (data: SeckillConfigVO) => { + return await request.post({ url: '/promotion/seckill-config/create', data }) +} + +// 修改秒杀时段配置 +export const updateSeckillConfig = async (data: SeckillConfigVO) => { + return await request.put({ url: '/promotion/seckill-config/update', data }) +} + +// 修改时段配置状态 +export const updateSeckillConfigStatus = (id: number, status: number) => { + const data = { + id, + status + } + return request.put({ url: '/promotion/seckill-config/update-status', data: data }) +} + +// 删除秒杀时段配置 +export const deleteSeckillConfig = async (id: number) => { + return await request.delete({ url: '/promotion/seckill-config/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/trade/delivery/express/index.ts b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/express/index.ts new file mode 100644 index 0000000..95429a4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/express/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface DeliveryExpressVO { + id: number + code: string + name: string + logo: string + sort: number + status: number +} + +// 查询快递公司列表 +export const getDeliveryExpressPage = async (params: PageParam) => { + return await request.get({ url: '/trade/delivery/express/page', params }) +} + +// 查询快递公司详情 +export const getDeliveryExpress = async (id: number) => { + return await request.get({ url: '/trade/delivery/express/get?id=' + id }) +} + +// 新增快递公司 +export const createDeliveryExpress = async (data: DeliveryExpressVO) => { + return await request.post({ url: '/trade/delivery/express/create', data }) +} + +// 修改快递公司 +export const updateDeliveryExpress = async (data: DeliveryExpressVO) => { + return await request.put({ url: '/trade/delivery/express/update', data }) +} + +// 删除快递公司 +export const deleteDeliveryExpress = async (id: number) => { + return await request.delete({ url: '/trade/delivery/express/delete?id=' + id }) +} + +// 导出快递公司 Excel +export const exportDeliveryExpressApi = async (params) => { + return await request.download({ url: '/trade/delivery/express/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/trade/delivery/expressTemplate/index.ts b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/expressTemplate/index.ts new file mode 100644 index 0000000..9ed23bc --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/expressTemplate/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface DeliveryExpressTemplateVO { + id: number + name: string + chargeMode: number + sort: number + templateCharge: ExpressTemplateChargeVO[] + templateFree: ExpressTemplateFreeVO[] +} + +export declare type ExpressTemplateChargeVO = { + areaIds: number[] + startCount: number + startPrice: number + extraCount: number + extraPrice: number +} + +export declare type ExpressTemplateFreeVO = { + areaIds: number[] + freeCount: number + freePrice: number +} + +// 查询快递运费模板列表 +export const getDeliveryExpressTemplatePage = async (params: PageParam) => { + return await request.get({ url: '/trade/delivery/express-template/page', params }) +} + +// 查询快递运费模板详情 +export const getDeliveryExpressTemplate = async (id: number) => { + return await request.get({ url: '/trade/delivery/express-template/get?id=' + id }) +} + +// 查询快递运费模板详情 +export const getSimpleTemplateList = async () => { + return await request.get({ url: '/trade/delivery/express-template/list-all-simple' }) +} + +// 新增快递运费模板 +export const createDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => { + return await request.post({ url: '/trade/delivery/express-template/create', data }) +} + +// 修改快递运费模板 +export const updateDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => { + return await request.put({ url: '/trade/delivery/express-template/update', data }) +} + +// 删除快递运费模板 +export const deleteDeliveryExpressTemplate = async (id: number) => { + return await request.delete({ url: '/trade/delivery/express-template/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/trade/delivery/pickUpStore/index.ts b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/pickUpStore/index.ts new file mode 100644 index 0000000..90fb3d0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/trade/delivery/pickUpStore/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface DeliveryPickUpStoreVO { + id: number + name: string + introduction: string + phone: string + areaId: number + detailAddress: string + logo: string + openingTime: string + closingTime: string + latitude: number + longitude: number + status: number +} + +// 查询自提门店列表 +export const getDeliveryPickUpStorePage = async (params: DeliveryPickUpStorePageReqVO) => { + return await request.get({ url: '/trade/delivery/pick-up-store/page', params }) +} + +// 查询自提门店详情 +export const getDeliveryPickUpStore = async (id: number) => { + return await request.get({ url: '/trade/delivery/pick-up-store/get?id=' + id }) +} + +// 新增自提门店 +export const createDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => { + return await request.post({ url: '/trade/delivery/pick-up-store/create', data }) +} + +// 修改自提门店 +export const updateDeliveryPickUpStore = async (data: DeliveryPickUpStoreVO) => { + return await request.put({ url: '/trade/delivery/pick-up-store/update', data }) +} + +// 删除自提门店 +export const deleteDeliveryPickUpStore = async (id: number) => { + return await request.delete({ url: '/trade/delivery/pick-up-store/delete?id=' + id }) +} + +// 导出自提门店 Excel +export const exportDeliveryPickUpStoreApi = async (params) => { + return await request.download({ url: '/trade/delivery/pick-up-store/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/trade/order/index.ts b/grailed-ui-admin-vue3/src/api/mall/trade/order/index.ts new file mode 100644 index 0000000..462c69f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/trade/order/index.ts @@ -0,0 +1,12 @@ +import request from '@/config/axios' + +// 获得交易订单分页 +// TODO @xiaobai:改成 getOrderPage +export const getOrderList = (params: PageParam) => { + return request.get({ url: '/trade/order/page', params }) +} + +// 获得交易订单详情 +export const getOrderDetail = (id: number) => { + return request.get({ url: '/trade/order/get-detail?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mall/trade/order/type/orderType.ts b/grailed-ui-admin-vue3/src/api/mall/trade/order/type/orderType.ts new file mode 100644 index 0000000..24606a3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mall/trade/order/type/orderType.ts @@ -0,0 +1,228 @@ +// TODO @xiaobai:这个放到 order/index.ts 里哈 +// TODO @xiaobai:注释放到变量后面,这样简洁一点 +// TODO @xiaobai:这个改成 TradeOrderRespVO +export interface TradeOrderPageItemRespVO { + // 订单编号 + id?: number + // 订单流水号 + no?: string + // 下单时间 + createTime?: Date + // 订单类型 + type?: number + // 订单来源 + terminal?: number + // 用户编号 + userId?: number + // 用户 IP + userIp?: string + // 用户备注 + userRemark?: string + // 订单状态 + status?: number + // 购买的商品数量 + productCount?: number + // 订单完成时间 + finishTime?: Date + // 订单取消时间 + cancelTime?: Date + // 取消类型 + cancelType?: number + // 商家备注 + remark?: string + // 支付订单编号 + payOrderId: number + // 是否已支付 + payed?: boolean + // 付款时间 + payTime?: Date + // 支付渠道 + payChannelCode?: string + // 商品原价(总) + originalPrice?: number + // 订单原价(总) + orderPrice?: number + // 订单优惠(总) + discountPrice?: number + // 运费金额 + deliveryPrice?: number + // 订单调价(总) + adjustPrice?: number + // 应付金额(总) + payPrice?: number + // 配送模板编号 + deliveryTemplateId?: number + // 发货物流公司编号 + logisticsId?: number + // 发货物流单号 + logisticsNo?: string + // 发货状态 + deliveryStatus?: number + // 发货时间 + deliveryTime?: Date + // 收货时间 + receiveTime?: Date + // 收件人名称 + receiverName?: string + // 收件人手机 + receiverMobile?: string + // 收件人地区编号 + receiverAreaId?: number + // 收件人邮编 + receiverPostCode?: number + // 收件人详细地址 + receiverDetailAddress?: string + // 售后状态 + afterSaleStatus?: number + // 退款金额 + refundPrice?: number + // 优惠劵编号 + couponId?: number + // 优惠劵减免金额 + couponPrice?: number + // 积分抵扣的金额 + pointPrice?: number + //收件人地区名字 + receiverAreaName?: string + // 订单项列表 + items?: TradeOrderItemBaseVO[] + //用户信息 + user?: MemberUserRespDTO +} + +// TODO @xiaobai:这个改成 TradeOrderItemRespVO +/** + * 交易订单项 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +export interface TradeOrderItemBaseVO { + // ========== 订单项基本信息 ========== + /** + * 编号 + */ + id?: number + /** + * 用户编号 + */ + userId?: number + /** + * 订单编号 + */ + orderId?: number + // ========== 商品基本信息 ========== + /** + * 商品 SPU 编号 + */ + spuId?: number + /** + * 商品 SPU 名称 + */ + spuName?: string + /** + * 商品 SKU 编号 + */ + skuId?: number + /** + * 商品图片 + */ + picUrl?: string + /** + * 购买数量 + */ + count?: number + // ========== 价格 + 支付基本信息 ========== + /** + * 商品原价(总) + */ + originalPrice?: number + /** + * 商品原价(单) + */ + originalUnitPrice?: number + /** + * 商品优惠(总) + */ + discountPrice?: number + /** + * 商品实付金额(总) + */ + payPrice?: number + /** + * 子订单分摊金额(总) + */ + orderPartPrice?: number + /** + * 分摊后子订单实付金额(总) + */ + orderDividePrice?: number + // ========== 营销基本信息 ========== + // TODO 芋艿:在捉摸一下 + // ========== 售后基本信息 ========== + /** + * 售后状态 + */ + afterSaleStatus?: number + //属性数组 + properties?: ProductPropertyValueDetailRespVO[] +} + +/** + * 管理后台 - 商品属性值的明细 Response VO + */ +export interface ProductPropertyValueDetailRespVO { + /** + * 属性的编号 + */ + propertyId?: number + /** + * 属性的名称 + */ + propertyName?: string + /** + * 属性值的编号 + */ + valueId?: number + /** + * 属性值的名称 + */ + valueName?: string +} + +/** + * 订单详情查询 请求 + */ +export interface TradeOrderPageReqVO { + pageNo: number + pageSize: number + no?: string + userId?: string + userNickname?: string + userMobile?: string + receiverName?: string + receiverMobile?: string + terminal?: string + type?: number + status?: number + payChannelCode?: string + createTime?: [Date, Date] + spuName?: string + itemCount?: string + all?: string +} + +//用户信息 +export interface MemberUserRespDTO { + id?: number + nickname?: string + status?: number + avatar?: string + mobile?: string +} +//订单详情选中type +export interface SelectType { + queryParams: TradeOrderPageReqVO + selectTotal: number //选中的数量 + selectAllFlag: boolean //全选标识 + selectData: Map> //存放涉及选中得页面以及每页选中得数据订单号 全选时根据条件查询 排除取消的list订单 + unSelectList: Set //登记取消的list 全选标识为true 时登记单独取消的list,再次选中时排除, 全选标识为false 时清空list +} diff --git a/grailed-ui-admin-vue3/src/api/member/balanceAccount/index.ts b/grailed-ui-admin-vue3/src/api/member/balanceAccount/index.ts new file mode 100644 index 0000000..bb34e34 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/balanceAccount/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface BalanceAccountVO { + userId: number + balance: number + freezeBalance: number + password: string + status: number +} + +// 查询会员账户列表 +export const getBalanceAccountPage = async (params) => { + return await request.get({ url: `/member/balance-account/page`, params }) +} + +// 查询会员账户详情 +export const getBalanceAccount = async (id: number) => { + return await request.get({ url: `/member/balance-account/get?id=` + id }) +} + +// 新增会员账户 +export const createBalanceAccount = async (data: BalanceAccountVO) => { + return await request.post({ url: `/member/balance-account/create`, data }) +} + +// 修改会员账户 +export const updateBalanceAccount = async (data: BalanceAccountVO) => { + return await request.put({ url: `/member/balance-account/update`, data }) +} + +// 删除会员账户 +export const deleteBalanceAccount = async (id: number) => { + return await request.delete({ url: `/member/balance-account/delete?id=` + id }) +} + +// 导出会员账户 Excel +export const exportBalanceAccount = async (params) => { + return await request.download({ url: `/member/balance-account/export-excel`, params }) +} + +// 查询会员账户by userId +export const getBalanceAccountByUseId = async (params) => { + return await request.get({ url: `/member/balance-account/get/${params.userId}` }) +} + +// 修改账户余额 +export const updateBalanceAccountByUser = async (data: any) => { + return await request.post({ url: `/member/balance-account/update-balance`, data }) +} + +// 修改取款密码 +export const updateBalanceAccountPassword = async (data: any) => { + return await request.put({ url: `/member/balance-account/update-password`, data }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/balanceRecord/index.ts b/grailed-ui-admin-vue3/src/api/member/balanceRecord/index.ts new file mode 100644 index 0000000..a037cae --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/balanceRecord/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface BalanceRecordVO { + id: number + userId: number + beforeAmount: number + amount: number + afterAmount: number + type: string + flow: string + description: string +} + +// 查询余额日志列表 +export const getBalanceRecordPage = async (params) => { + return await request.get({ url: `/member/balance-record/page`, params }) +} + +// 查询余额日志详情 +export const getBalanceRecord = async (id: number) => { + return await request.get({ url: `/member/balance-record/get?id=` + id }) +} + +// 新增余额日志 +export const createBalanceRecord = async (data: BalanceRecordVO) => { + return await request.post({ url: `/member/balance-record/create`, data }) +} + +// 修改余额日志 +export const updateBalanceRecord = async (data: BalanceRecordVO) => { + return await request.put({ url: `/member/balance-record/update`, data }) +} + +// 删除余额日志 +export const deleteBalanceRecord = async (id: number) => { + return await request.delete({ url: `/member/balance-record/delete?id=` + id }) +} + +// 导出余额日志 Excel +export const exportBalanceRecord = async (params) => { + return await request.download({ url: `/member/balance-record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/bankWithdrawalDetail/index.ts b/grailed-ui-admin-vue3/src/api/member/bankWithdrawalDetail/index.ts new file mode 100644 index 0000000..d4c2e2d --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/bankWithdrawalDetail/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface BankWithdrawalDetailVO { + id: number + withdrawalId: number + bankName: string + bankCountry: string + accountName: string + accountNumber: string + iban: string + swiftBicCode: string + bankAddress: string + branchName: string + branchAddress: string + bankFee: number +} + +// 查询银行卡提现详情列表 +export const getBankWithdrawalDetailPage = async (params) => { + return await request.get({ url: `/member/bank-withdrawal-detail/page`, params }) +} + +// 查询银行卡提现详情详情 +export const getBankWithdrawalDetail = async (id: number) => { + return await request.get({ url: `/member/bank-withdrawal-detail/get?id=` + id }) +} + +// 新增银行卡提现详情 +export const createBankWithdrawalDetail = async (data: BankWithdrawalDetailVO) => { + return await request.post({ url: `/member/bank-withdrawal-detail/create`, data }) +} + +// 修改银行卡提现详情 +export const updateBankWithdrawalDetail = async (data: BankWithdrawalDetailVO) => { + return await request.put({ url: `/member/bank-withdrawal-detail/update`, data }) +} + +// 删除银行卡提现详情 +export const deleteBankWithdrawalDetail = async (id: number) => { + return await request.delete({ url: `/member/bank-withdrawal-detail/delete?id=` + id }) +} + +// 导出银行卡提现详情 Excel +export const exportBankWithdrawalDetail = async (params) => { + return await request.download({ url: `/member/bank-withdrawal-detail/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/brand/index.ts b/grailed-ui-admin-vue3/src/api/member/brand/index.ts new file mode 100644 index 0000000..da83606 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/brand/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface BrandVO { + id: number + name: string + picUrl: string + description: string + sort: number + status: number +} + +// 查询商品品牌列表 +export const getBrandPage = async (params) => { + return await request.get({ url: `/member/brand/page`, params }) +} + +// 查询商品品牌详情 +export const getBrand = async (id: number) => { + return await request.get({ url: `/member/brand/get?id=` + id }) +} + +// 新增商品品牌 +export const createBrand = async (data: BrandVO) => { + return await request.post({ url: `/member/brand/create`, data }) +} + +// 修改商品品牌 +export const updateBrand = async (data: BrandVO) => { + return await request.put({ url: `/member/brand/update`, data }) +} + +// 删除商品品牌 +export const deleteBrand = async (id: number) => { + return await request.delete({ url: `/member/brand/delete?id=` + id }) +} + +// 导出商品品牌 Excel +export const exportBrand = async (params) => { + return await request.download({ url: `/member/brand/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/category/index.ts b/grailed-ui-admin-vue3/src/api/member/category/index.ts new file mode 100644 index 0000000..6da0657 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/category/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export interface CategoryVO { + id: number + parentId: number + name: string + picUrl: string + bigPicUrl: string + sort: number + status: number +} + +// 查询商品分类列表 +export const getCategoryPage = async (params) => { + return await request.get({ url: `/member/category/page`, params }) +} + +// 查询商品分类详情 +export const getCategory = async (id: number) => { + return await request.get({ url: `/member/category/get?id=` + id }) +} + +// 新增商品分类 +export const createCategory = async (data: CategoryVO) => { + return await request.post({ url: `/member/category/create`, data }) +} + +// 修改商品分类 +export const updateCategory = async (data: CategoryVO) => { + return await request.put({ url: `/member/category/update`, data }) +} + +// 删除商品分类 +export const deleteCategory = async (id: number) => { + return await request.delete({ url: `/member/category/delete?id=` + id }) +} + +// 导出商品分类 Excel +export const exportCategory = async (params) => { + return await request.download({ url: `/member/category/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/channel/index.ts b/grailed-ui-admin-vue3/src/api/member/channel/index.ts new file mode 100644 index 0000000..bdb4505 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/channel/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface ChannelVO { + accountCode: string + accountName: string + bankName: string + bankCountry: string + iban: string + bankAddress: string + branchName: string + branchAddress: string + configId: number +} + +// 查询渠道列列表 +export const getChannelPage = async (params) => { + return await request.get({ url: `/member/channel/page`, params }) +} + +// 查询渠道列详情 +export const getChannel = async (id: number) => { + return await request.get({ url: `/member/channel/get?id=` + id }) +} + +// 新增渠道列 +export const createChannel = async (data: ChannelVO) => { + return await request.post({ url: `/member/channel/create`, data }) +} + +// 修改渠道列 +export const updateChannel = async (data: ChannelVO) => { + return await request.put({ url: `/member/channel/update`, data }) +} + +// 删除渠道列 +export const deleteChannel = async (id: number) => { + return await request.delete({ url: `/member/channel/delete?id=` + id }) +} + +// 导出渠道列 Excel +export const exportChannel = async (params) => { + return await request.download({ url: `/member/channel/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/channelConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/channelConfig/index.ts new file mode 100644 index 0000000..1c4a64b --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/channelConfig/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface ChannelConfigVO { + id: number + channelName: string + channelType: number + iconLink: string + scenario: number + status: number +} + +// 查询渠道配置列表 +export const getChannelConfigPage = async (params) => { + return await request.get({ url: `/member/channel-config/page`, params }) +} + +// 查询渠道配置详情 +export const getChannelConfig = async (id: number) => { + return await request.get({ url: `/member/channel-config/get?id=` + id }) +} + +// 新增渠道配置 +export const createChannelConfig = async (data: ChannelConfigVO) => { + return await request.post({ url: `/member/channel-config/create`, data }) +} + +// 修改渠道配置 +export const updateChannelConfig = async (data: ChannelConfigVO) => { + return await request.put({ url: `/member/channel-config/update`, data }) +} + +// 删除渠道配置 +export const deleteChannelConfig = async (id: number) => { + return await request.delete({ url: `/member/channel-config/delete?id=` + id }) +} + +// 导出渠道配置 Excel +export const exportChannelConfig = async (params) => { + return await request.download({ url: `/member/channel-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/checkIn/index.ts b/grailed-ui-admin-vue3/src/api/member/checkIn/index.ts new file mode 100644 index 0000000..59cba40 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/checkIn/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface CheckInVO { + id: number + userId : number + checkInMonth: number + checkInDate: string + receivedReward: string +} + +// 查询用户签到列表 +export const getCheckInPage = async (params) => { + return await request.get({ url: `/member/check-in/page`, params }) +} + +// 查询用户签到详情 +export const getCheckIn = async (id: number) => { + return await request.get({ url: `/member/check-in/get?id=` + id }) +} + +// 新增用户签到 +export const createCheckIn = async (data: CheckInVO) => { + return await request.post({ url: `/member/check-in/create`, data }) +} + +// 修改用户签到 +export const updateCheckIn = async (data: CheckInVO) => { + return await request.put({ url: `/member/check-in/update`, data }) +} + +// 删除用户签到 +export const deleteCheckIn = async (id: number) => { + return await request.delete({ url: `/member/check-in/delete?id=` + id }) +} + +// 导出用户签到 Excel +export const exportCheckIn = async (params) => { + return await request.download({ url: `/member/check-in/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/combinationConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/combinationConfig/index.ts new file mode 100644 index 0000000..1a5100e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/combinationConfig/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface CombinationConfigVO { + id: number + userId: number + comboSequence: number + executeStatus: number + multiplier: number + deleteStatus: number + description: string +} + +// 查询连单设置列表 +export const getCombinationConfigPage = async (params) => { + return await request.get({ url: `/member/combination-config/page`, params }) +} + +// 查询连单设置详情 +export const getCombinationConfig = async (id: number) => { + return await request.get({ url: `/member/combination-config/get?id=` + id }) +} + +// 新增连单设置 +export const createCombinationConfig = async (data: any) => { + return await request.post({ url: `/member/combination-config/create`, data }) +} + +// 修改连单设置 +export const updateCombinationConfig = async (data: CombinationConfigVO) => { + return await request.put({ url: `/member/combination-config/update`, data }) +} + +// 删除连单设置 +export const deleteCombinationConfig = async (id: number) => { + return await request.delete({ url: `/member/combination-config/delete?id=` + id }) +} + +// 导出连单设置 Excel +export const exportCombinationConfig = async (params) => { + return await request.download({ url: `/member/combination-config/export-excel`, params }) +} + +// 修改执行状态 +export const updateCombinationExecuteStatus = async (data: any) => { + return await request.put({ url: `/member/combination-config/execute-status`, data }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/combinationRecord/index.ts b/grailed-ui-admin-vue3/src/api/member/combinationRecord/index.ts new file mode 100644 index 0000000..ff0fea8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/combinationRecord/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface CombinationRecordVO { + id: number + combinationId: number + productId: number + unitPrice: number + totalPrice: number + quantity: number + executeStatus: number + submitTime: Date +} + +// 查询连单记录列表 +export const getCombinationRecordPage = async (params) => { + return await request.get({ url: `/member/combination-record/page`, params }) +} + +// 查询连单记录详情 +export const getCombinationRecord = async (id: number) => { + return await request.get({ url: `/member/combination-record/get?id=` + id }) +} + +// 新增连单记录 +export const createCombinationRecord = async (data: CombinationRecordVO) => { + return await request.post({ url: `/member/combination-record/create`, data }) +} + +// 修改连单记录 +export const updateCombinationRecord = async (data: CombinationRecordVO) => { + return await request.put({ url: `/member/combination-record/update`, data }) +} + +// 删除连单记录 +export const deleteCombinationRecord = async (id: number) => { + return await request.delete({ url: `/member/combination-record/delete?id=` + id }) +} + +// 导出连单记录 Excel +export const exportCombinationRecord = async (params) => { + return await request.download({ url: `/member/combination-record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/combinationReocrd/index.ts b/grailed-ui-admin-vue3/src/api/member/combinationReocrd/index.ts new file mode 100644 index 0000000..030e297 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/combinationReocrd/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface CombinationReocrdVO { + id: number + combinationId: number + productId: number + unitPrice: number + totalPrice: number + quantity: number + executeStatus: number + submitTime: Date +} + +// 查询连单记录列表 +export const getCombinationReocrdPage = async (params) => { + return await request.get({ url: `/member/combination-reocrd/page`, params }) +} + +// 查询连单记录详情 +export const getCombinationReocrd = async (id: number) => { + return await request.get({ url: `/member/combination-reocrd/get?id=` + id }) +} + +// 新增连单记录 +export const createCombinationReocrd = async (data: CombinationReocrdVO) => { + return await request.post({ url: `/member/combination-reocrd/create`, data }) +} + +// 修改连单记录 +export const updateCombinationReocrd = async (data: CombinationReocrdVO) => { + return await request.put({ url: `/member/combination-reocrd/update`, data }) +} + +// 删除连单记录 +export const deleteCombinationReocrd = async (id: number) => { + return await request.delete({ url: `/member/combination-reocrd/delete?id=` + id }) +} + +// 导出连单记录 Excel +export const exportCombinationReocrd = async (params) => { + return await request.download({ url: `/member/combination-reocrd/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/contentCarouse/index.ts b/grailed-ui-admin-vue3/src/api/member/contentCarouse/index.ts new file mode 100644 index 0000000..1305222 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/contentCarouse/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface ContentCarouseVO { + id: number + carouseName: string + link: string + sort: number + linkTo: string + status: number +} + +// 查询轮播图列表 +export const getContentCarousePage = async (params) => { + return await request.get({ url: `/member/content-carouse/page`, params }) +} + +// 查询轮播图详情 +export const getContentCarouse = async (id: number) => { + return await request.get({ url: `/member/content-carouse/get?id=` + id }) +} + +// 新增轮播图 +export const createContentCarouse = async (data: ContentCarouseVO) => { + return await request.post({ url: `/member/content-carouse/create`, data }) +} + +// 修改轮播图 +export const updateContentCarouse = async (data: ContentCarouseVO) => { + return await request.put({ url: `/member/content-carouse/update`, data }) +} + +// 删除轮播图 +export const deleteContentCarouse = async (id: number) => { + return await request.delete({ url: `/member/content-carouse/delete?id=` + id }) +} + +// 导出轮播图 Excel +export const exportContentCarouse = async (params) => { + return await request.download({ url: `/member/content-carouse/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/continuousSignInConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/continuousSignInConfig/index.ts new file mode 100644 index 0000000..d227efe --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/continuousSignInConfig/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface ContinuousSignInConfigVO { + id: number + continuousDays: number + rewardAmount : number + comment: string +} + +// 查询连续签到配置列表 +export const getContinuousSignInConfigPage = async (params) => { + return await request.get({ url: `/member/continuous-sign-in-config/page`, params }) +} + +// 查询连续签到配置详情 +export const getContinuousSignInConfig = async (id: number) => { + return await request.get({ url: `/member/continuous-sign-in-config/get?id=` + id }) +} + +// 新增连续签到配置 +export const createContinuousSignInConfig = async (data: ContinuousSignInConfigVO) => { + return await request.post({ url: `/member/continuous-sign-in-config/create`, data }) +} + +// 修改连续签到配置 +export const updateContinuousSignInConfig = async (data: ContinuousSignInConfigVO) => { + return await request.put({ url: `/member/continuous-sign-in-config/update`, data }) +} + +// 删除连续签到配置 +export const deleteContinuousSignInConfig = async (id: number) => { + return await request.delete({ url: `/member/continuous-sign-in-config/delete?id=` + id }) +} + +// 导出连续签到配置 Excel +export const exportContinuousSignInConfig = async (params) => { + return await request.download({ url: `/member/continuous-sign-in-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/countries/index.ts b/grailed-ui-admin-vue3/src/api/member/countries/index.ts new file mode 100644 index 0000000..3587ebd --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/countries/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export interface CountriesVO { + id: number + cnName: string + enName: string + localName: string + countryCode: string + phoneCode: string + flagIcon: string +} + +// 查询国家列列表 +export const getCountriesPage = async (params) => { + return await request.get({ url: `/member/countries/page`, params }) +} + +// 查询国家列详情 +export const getCountries = async (id: number) => { + return await request.get({ url: `/member/countries/get?id=` + id }) +} + +// 新增国家列 +export const createCountries = async (data: CountriesVO) => { + return await request.post({ url: `/member/countries/create`, data }) +} + +// 修改国家列 +export const updateCountries = async (data: CountriesVO) => { + return await request.put({ url: `/member/countries/update`, data }) +} + +// 删除国家列 +export const deleteCountries = async (id: number) => { + return await request.delete({ url: `/member/countries/delete?id=` + id }) +} + +// 导出国家列 Excel +export const exportCountries = async (params) => { + return await request.download({ url: `/member/countries/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/cryptoWithdrawalDetail/index.ts b/grailed-ui-admin-vue3/src/api/member/cryptoWithdrawalDetail/index.ts new file mode 100644 index 0000000..55c40bd --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/cryptoWithdrawalDetail/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface CryptoWithdrawalDetailVO { + id: number + withdrawalId: number + cryptoType : string + network: string + cryptoAddress: string + cryptoTag: string + transactionHash: string + networkFee: string +} + +// 查询数字货币提现详情列表 +export const getCryptoWithdrawalDetailPage = async (params) => { + return await request.get({ url: `/member/crypto-withdrawal-detail/page`, params }) +} + +// 查询数字货币提现详情详情 +export const getCryptoWithdrawalDetail = async (id: number) => { + return await request.get({ url: `/member/crypto-withdrawal-detail/get?id=` + id }) +} + +// 新增数字货币提现详情 +export const createCryptoWithdrawalDetail = async (data: CryptoWithdrawalDetailVO) => { + return await request.post({ url: `/member/crypto-withdrawal-detail/create`, data }) +} + +// 修改数字货币提现详情 +export const updateCryptoWithdrawalDetail = async (data: CryptoWithdrawalDetailVO) => { + return await request.put({ url: `/member/crypto-withdrawal-detail/update`, data }) +} + +// 删除数字货币提现详情 +export const deleteCryptoWithdrawalDetail = async (id: number) => { + return await request.delete({ url: `/member/crypto-withdrawal-detail/delete?id=` + id }) +} + +// 导出数字货币提现详情 Excel +export const exportCryptoWithdrawalDetail = async (params) => { + return await request.download({ url: `/member/crypto-withdrawal-detail/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/cumulativeSignInConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/cumulativeSignInConfig/index.ts new file mode 100644 index 0000000..841dbc2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/cumulativeSignInConfig/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface CumulativeSignInConfigVO { + id: number + totalDays: number + rewardAmount : number + comment: string +} + +// 查询累计签到配置列表 +export const getCumulativeSignInConfigPage = async (params) => { + return await request.get({ url: `/member/cumulative-sign-in-config/page`, params }) +} + +// 查询累计签到配置详情 +export const getCumulativeSignInConfig = async (id: number) => { + return await request.get({ url: `/member/cumulative-sign-in-config/get?id=` + id }) +} + +// 新增累计签到配置 +export const createCumulativeSignInConfig = async (data: CumulativeSignInConfigVO) => { + return await request.post({ url: `/member/cumulative-sign-in-config/create`, data }) +} + +// 修改累计签到配置 +export const updateCumulativeSignInConfig = async (data: CumulativeSignInConfigVO) => { + return await request.put({ url: `/member/cumulative-sign-in-config/update`, data }) +} + +// 删除累计签到配置 +export const deleteCumulativeSignInConfig = async (id: number) => { + return await request.delete({ url: `/member/cumulative-sign-in-config/delete?id=` + id }) +} + +// 导出累计签到配置 Excel +export const exportCumulativeSignInConfig = async (params) => { + return await request.download({ url: `/member/cumulative-sign-in-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/customTask/index.ts b/grailed-ui-admin-vue3/src/api/member/customTask/index.ts new file mode 100644 index 0000000..28a99b6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/customTask/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface CustomTaskVO { + id: number + userId: number + taskLimit: number + updateCount: number + effectDate: Date + description: string +} + +// 查询任务单数列表 +export const getCustomTaskPage = async (params) => { + return await request.get({ url: `/member/custom-task/page`, params }) +} + +// 查询任务单数详情 +export const getCustomTask = async (id: number) => { + return await request.get({ url: `/member/custom-task/get?id=` + id }) +} + +// 新增任务单数 +export const createCustomTask = async (data: CustomTaskVO) => { + return await request.post({ url: `/member/custom-task/create`, data }) +} + +// 修改任务单数 +export const updateCustomTask = async (data: CustomTaskVO) => { + return await request.put({ url: `/member/custom-task/update`, data }) +} + +// 删除任务单数 +export const deleteCustomTask = async (id: number) => { + return await request.delete({ url: `/member/custom-task/delete?id=` + id }) +} + +// 导出任务单数 Excel +export const exportCustomTask = async (params) => { + return await request.download({ url: `/member/custom-task/export-excel`, params }) +} + +export const getCustomTaskByUserId = async (params) => { + return await request.get({ url: `/member/custom-task/user`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/dailySignInConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/dailySignInConfig/index.ts new file mode 100644 index 0000000..5e35523 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/dailySignInConfig/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface DailySignInConfigVO { + id: number + dayOfMonth: number + rewardAmount : number + comment: string +} + +// 查询每日签到配置列表 +export const getDailySignInConfigPage = async (params) => { + return await request.get({ url: `/member/daily-sign-in-config/page`, params }) +} + +// 查询每日签到配置详情 +export const getDailySignInConfig = async (id: number) => { + return await request.get({ url: `/member/daily-sign-in-config/get?id=` + id }) +} + +// 新增每日签到配置 +export const createDailySignInConfig = async (data: DailySignInConfigVO) => { + return await request.post({ url: `/member/daily-sign-in-config/create`, data }) +} + +// 修改每日签到配置 +export const updateDailySignInConfig = async (data: DailySignInConfigVO) => { + return await request.put({ url: `/member/daily-sign-in-config/update`, data }) +} + +// 删除每日签到配置 +export const deleteDailySignInConfig = async (id: number) => { + return await request.delete({ url: `/member/daily-sign-in-config/delete?id=` + id }) +} + +// 导出每日签到配置 Excel +export const exportDailySignInConfig = async (params) => { + return await request.download({ url: `/member/daily-sign-in-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/h5Pages/index.ts b/grailed-ui-admin-vue3/src/api/member/h5Pages/index.ts new file mode 100644 index 0000000..a487854 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/h5Pages/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface H5PagesVO { + id: number + country: string + language: string + name: string + logo: string + favicon: string + title: string + description: string + keywords: string + themeColor: string + font: string + cssUrl: string + jsUrl: string +} + +// 查询H5配置列表 +export const getH5PagesPage = async (params) => { + return await request.get({ url: `/member/H5-pages/page`, params }) +} + +// 查询H5配置详情 +export const getH5Pages = async (id: number) => { + return await request.get({ url: `/member/H5-pages/get` }) +} + +// 新增H5配置 +export const createH5Pages = async (data: H5PagesVO) => { + return await request.post({ url: `/member/H5-pages/create`, data }) +} + +// 修改H5配置 +export const updateH5Pages = async (data: H5PagesVO) => { + return await request.put({ url: `/member/H5-pages/update`, data }) +} + +// 删除H5配置 +export const deleteH5Pages = async (id: number) => { + return await request.delete({ url: `/member/H5-pages/delete?id=` + id }) +} + +// 导出H5配置 Excel +export const exportH5Pages = async (params) => { + return await request.download({ url: `/member/H5-pages/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/levelConfig/index.ts b/grailed-ui-admin-vue3/src/api/member/levelConfig/index.ts new file mode 100644 index 0000000..72b520f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/levelConfig/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface LevelConfigVO { + id: number + level: number + displayName: string + taskLimit: number + commissionRate: number + minimumWithdrawalAmount: number + price: number + teamMembers: number + activeTeamMembers: number + description: string +} + +// 查询会员级别列表 +export const getLevelConfigPage = async (params) => { + return await request.get({ url: `/member/level-config/page`, params }) +} + +// 查询会员级别详情 +export const getLevelConfig = async (id: number) => { + return await request.get({ url: `/member/level-config/get?id=` + id }) +} + +// 新增会员级别 +export const createLevelConfig = async (data: LevelConfigVO) => { + return await request.post({ url: `/member/level-config/create`, data }) +} + +// 修改会员级别 +export const updateLevelConfig = async (data: LevelConfigVO) => { + return await request.put({ url: `/member/level-config/update`, data }) +} + +// 删除会员级别 +export const deleteLevelConfig = async (id: number) => { + return await request.delete({ url: `/member/level-config/delete?id=` + id }) +} + +// 导出会员级别 Excel +export const exportLevelConfig = async (params) => { + return await request.download({ url: `/member/level-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/messageSession/index.ts b/grailed-ui-admin-vue3/src/api/member/messageSession/index.ts new file mode 100644 index 0000000..07bb3aa --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/messageSession/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface MessageSessionVO { + id: number + userId: number + sessionId: string + connectedAt: Date + lastActivityAt: Date +} + +// 查询用户记录列表 +export const getMessageSessionPage = async (params) => { + return await request.get({ url: `/member/message-session/page`, params }) +} + +// 查询用户记录详情 +export const getMessageSession = async (id: number) => { + return await request.get({ url: `/member/message-session/get?id=` + id }) +} + +// 新增用户记录 +export const createMessageSession = async (data: MessageSessionVO) => { + return await request.post({ url: `/member/message-session/create`, data }) +} + +// 修改用户记录 +export const updateMessageSession = async (data: MessageSessionVO) => { + return await request.put({ url: `/member/message-session/update`, data }) +} + +// 删除用户记录 +export const deleteMessageSession = async (id: number) => { + return await request.delete({ url: `/member/message-session/delete?id=` + id }) +} + +// 导出用户记录 Excel +export const exportMessageSession = async (params) => { + return await request.download({ url: `/member/message-session/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/payOrder/index.ts b/grailed-ui-admin-vue3/src/api/member/payOrder/index.ts new file mode 100644 index 0000000..cc02d46 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/payOrder/index.ts @@ -0,0 +1,65 @@ +import request from '@/config/axios' + +export interface PayOrderVO { + id: number + merchantId: number + channelId: number + channelCode: string + merchantOrderId: string + subject: string + body: string + notifyUrl: string + notifyStatus: number + amount: number + channelFeeRate: object + channelFeeAmount: number + status: number + userIp: string + expireTime: Date + successTime: Date + notifyTime: Date + successExtensionId: number + refundStatus: number + refundTimes: number + refundAmount: number + channelUserId: string + channelOrderNo: string +} + +// 查询支付订单列表 +export const getPayOrderPage = async (params) => { + return await request.get({ url: `/member/pay-order/page`, params }) +} + +// 查询支付订单详情 +export const getPayOrder = async (id: number) => { + return await request.get({ url: `/member/pay-order/get?id=` + id }) +} + +// 新增支付订单 + +export const createPayOrder = async (data: PayOrderVO) => { + return await request.post({ url: `/member/pay-order/create`, data }) +} + +// 修改支付订单 + +export const updatePayOrder = async (data: PayOrderVO) => { + return await request.put({ url: `/member/pay-order/update`, data }) +} + +// 删除支付订单 + +export const deletePayOrder = async (id: number) => { + return await request.delete({ url: `/member/pay-order/delete?id=` + id }) +} + +// 导出支付订单Excel +export const exportPayOrder = async (params) => { + return await request.download({ url: `/member/pay-order/export-excel`, params }) +} + +// 审批支付订单 +export const approvePayOrder = async (data: any) => { + return await request.post({ url: `/member/pay-order/approve`, data }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/payOrderExtension/index.ts b/grailed-ui-admin-vue3/src/api/member/payOrderExtension/index.ts new file mode 100644 index 0000000..1a806da --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/payOrderExtension/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface PayOrderExtensionVO { + id: number + no: string + orderId: number + channelId: number + accountCode: string + userIp: string + status: number + channelExtras: string + channelNotifyData: string + accountName: string +} + +// 查询支付订单列表 +export const getPayOrderExtensionPage = async (params) => { + return await request.get({ url: `/member/pay-order-extension/page`, params }) +} + +// 查询支付订单详情 +export const getPayOrderExtension = async (id: number) => { + return await request.get({ url: `/member/pay-order-extension/get?id=` + id }) +} + +// 新增支付订单 + +export const createPayOrderExtension = async (data: PayOrderExtensionVO) => { + return await request.post({ url: `/member/pay-order-extension/create`, data }) +} + +// 修改支付订单 + +export const updatePayOrderExtension = async (data: PayOrderExtensionVO) => { + return await request.put({ url: `/member/pay-order-extension/update`, data }) +} + +// 删除支付订单 + +export const deletePayOrderExtension = async (id: number) => { + return await request.delete({ url: `/member/pay-order-extension/delete?id=` + id }) +} + +// 导出支付订单Excel +export const exportPayOrderExtension = async (params) => { + return await request.download({ url: `/member/pay-order-extension/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/product/index.ts b/grailed-ui-admin-vue3/src/api/member/product/index.ts new file mode 100644 index 0000000..03c735f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/product/index.ts @@ -0,0 +1,54 @@ +import request from '@/config/axios' + +export interface ProductVO { + id: number + name: string + keyword: string + introduction: string + description: string + categoryId: number + brandId: number + picUrl: string + sliderPicUrls: object + videoUrl: string + unit: number + sort: number + status: number + price: number + stock: number +} + +// 查询商品信息列表 +export const getProductPage = async (params) => { + return await request.get({ url: `/member/product/page`, params }) +} + +// 查询商品信息详情 +export const getProduct = async (id: number) => { + return await request.get({ url: `/member/product/get?id=` + id }) +} + +// 新增商品信息 +export const createProduct = async (data: ProductVO) => { + return await request.post({ url: `/member/product/create`, data }) +} + +// 修改商品信息 +export const updateProduct = async (data: ProductVO) => { + return await request.put({ url: `/member/product/update`, data }) +} + +// 删除商品信息 +export const deleteProduct = async (id: number) => { + return await request.delete({ url: `/member/product/delete?id=` + id }) +} + +// 导出商品信息 Excel +export const exportProduct = async (params) => { + return await request.download({ url: `/member/product/export-excel`, params }) +} + +// 根据输入价格查询一个商品 +export const getProductByPrice = async (data: any) => { + return await request.post({ url: `/member/product/get-by-price`, data}) +} \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/api/member/signInRecord/index.ts b/grailed-ui-admin-vue3/src/api/member/signInRecord/index.ts new file mode 100644 index 0000000..cb3103f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/signInRecord/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface SignInRecordVO { + id: number + userId: number + signInDate: string + signInMonth: string + rewardIssued: number + reward: number +} + +// 查询用户签到记录列表 +export const getSignInRecordPage = async (params) => { + return await request.get({ url: `/member/sign-in-record/page`, params }) +} + +// 查询用户签到记录详情 +export const getSignInRecord = async (id: number) => { + return await request.get({ url: `/member/sign-in-record/get?id=` + id }) +} + +// 新增用户签到记录 +export const createSignInRecord = async (data: SignInRecordVO) => { + return await request.post({ url: `/member/sign-in-record/create`, data }) +} + +// 修改用户签到记录 +export const updateSignInRecord = async (data: SignInRecordVO) => { + return await request.put({ url: `/member/sign-in-record/update`, data }) +} + +// 删除用户签到记录 +export const deleteSignInRecord = async (id: number) => { + return await request.delete({ url: `/member/sign-in-record/delete?id=` + id }) +} + +// 导出用户签到记录 Excel +export const exportSignInRecord = async (params) => { + return await request.download({ url: `/member/sign-in-record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/tagRelations/index.ts b/grailed-ui-admin-vue3/src/api/member/tagRelations/index.ts new file mode 100644 index 0000000..aa7e58d --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/tagRelations/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface TagRelationsVO { + id: number + memberId: number + tagId: number +} + +// 查询会员标签列表 +export const getTagRelationsPage = async (params) => { + return await request.get({ url: `/member/tag-relations/page`, params }) +} + +// 查询会员标签详情 +export const getTagRelations = async (id: number) => { + return await request.get({ url: `/member/tag-relations/get?id=` + id }) +} + +// 新增会员标签 +export const createTagRelations = async (data: TagRelationsVO) => { + return await request.post({ url: `/member/tag-relations/create`, data }) +} + +// 修改会员标签 +export const updateTagRelations = async (data: TagRelationsVO) => { + return await request.put({ url: `/member/tag-relations/update`, data }) +} + +// 删除会员标签 +export const deleteTagRelations = async (id: number) => { + return await request.delete({ url: `/member/tag-relations/delete?id=` + id }) +} + +// 导出会员标签 Excel +export const exportTagRelations = async (params) => { + return await request.download({ url: `/member/tag-relations/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/tags/index.ts b/grailed-ui-admin-vue3/src/api/member/tags/index.ts new file mode 100644 index 0000000..486d162 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/tags/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface TagsVO { + id: number + tagName: string + textColor: string + bgColor: string +} + +// 查询标签管理列表 +export const getTagsPage = async (params) => { + return await request.get({ url: `/member/tags/page`, params }) +} + +// 查询标签管理详情 +export const getTags = async (id: number) => { + return await request.get({ url: `/member/tags/get?id=` + id }) +} + +// 新增标签管理 +export const createTags = async (data: TagsVO) => { + return await request.post({ url: `/member/tags/create`, data }) +} + +// 修改标签管理 +export const updateTags = async (data: TagsVO) => { + return await request.put({ url: `/member/tags/update`, data }) +} + +// 删除标签管理 +export const deleteTags = async (id: number) => { + return await request.delete({ url: `/member/tags/delete?id=` + id }) +} + +// 导出标签管理 Excel +export const exportTags = async (params) => { + return await request.download({ url: `/member/tags/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/taskComment/index.ts b/grailed-ui-admin-vue3/src/api/member/taskComment/index.ts new file mode 100644 index 0000000..0cbcacf --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/taskComment/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface TaskCommentVO { + id: number + userId: number + userNickname: string + userAvatar: string + anonymous: boolean + taskRecordId: number + productId: number + productName: string + visible: boolean + scores: number + content: string + picUrls: object + replyStatus: boolean + replyUserId: number + replyContent: string + replyTime: Date +} + +// 查询任务评论列表 +export const getTaskCommentPage = async (params) => { + return await request.get({ url: `/member/task-comment/page`, params }) +} + +// 查询任务评论详情 +export const getTaskComment = async (id: number) => { + return await request.get({ url: `/member/task-comment/get?id=` + id }) +} + +// 新增任务评论 +export const createTaskComment = async (data: TaskCommentVO) => { + return await request.post({ url: `/member/task-comment/create`, data }) +} + +// 修改任务评论 +export const updateTaskComment = async (data: TaskCommentVO) => { + return await request.put({ url: `/member/task-comment/update`, data }) +} + +// 删除任务评论 +export const deleteTaskComment = async (id: number) => { + return await request.delete({ url: `/member/task-comment/delete?id=` + id }) +} + +// 导出任务评论 Excel +export const exportTaskComment = async (params) => { + return await request.download({ url: `/member/task-comment/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/taskRecord/index.ts b/grailed-ui-admin-vue3/src/api/member/taskRecord/index.ts new file mode 100644 index 0000000..565a528 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/taskRecord/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface TaskRecordVO { + id: number + orderNo: string + userId: number + quantity: number + productId: number + unitPrice: number + totalPrice: number + combination: number + taskSequence: number + status: number + orderTime: Date + submitTime: Date + starRating: number + description: string +} + +// 查询任务记录列表 +export const getTaskRecordPage = async (params) => { + return await request.get({ url: `/member/task-record/page`, params }) +} + +// 查询任务记录详情 +export const getTaskRecord = async (id: number) => { + return await request.get({ url: `/member/task-record/get?id=` + id }) +} + +// 新增任务记录 +export const createTaskRecord = async (data: TaskRecordVO) => { + return await request.post({ url: `/member/task-record/create`, data }) +} + +// 修改任务记录 +export const updateTaskRecord = async (data: TaskRecordVO) => { + return await request.put({ url: `/member/task-record/update`, data }) +} + +// 删除任务记录 +export const deleteTaskRecord = async (id: number) => { + return await request.delete({ url: `/member/task-record/delete?id=` + id }) +} + +// 导出任务记录 Excel +export const exportTaskRecord = async (params) => { + return await request.download({ url: `/member/task-record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/user/index.ts b/grailed-ui-admin-vue3/src/api/member/user/index.ts new file mode 100644 index 0000000..cdcdda3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/user/index.ts @@ -0,0 +1,94 @@ +import request from '@/config/axios' + +export interface UserVO { + id: number + parentId: number + username: string + password: string + nickname: string + remark: string + email: string + mobile: string + countryCode: string + invitationCode: string + memberLevel: number + creditScore: number + userType: number + sex: number + avatar: string + status: number + loginIp: string + loginDate: Date +} + +export interface UserUpdateVO { + id: number + nickname: string + remark: string + email: string + countryCode: string + sex: number + avatar: string + status: number + userType: number +} + +// 查询会员信息列表 +export const getUserPage = async (params) => { + return await request.get({ url: `/admin/member/user/page`, params }) +} + +// 查询会员信息详情 +export const getUser = async (id: number) => { + return await request.get({ url: `/admin/member/user/get?id=` + id }) +} + +// 新增会员信息 +export const createUser = async (data: UserVO) => { + return await request.post({ url: `/admin/member/user/create`, data }) +} + +// 修改会员信息 +export const updateUser = async (data: UserUpdateVO) => { + return await request.put({ url: `/admin/member/user/update`, data }) +} + +// 删除会员信息 +export const deleteUser = async (id: number) => { + return await request.delete({ url: `/admin/member/user/delete?id=` + id }) +} + +// 导出会员信息 Excel +export const exportUser = async (params) => { + return await request.download({ url: `/admin/member/user/export-excel`, params }) +} + +// 根据用户名查询会员信息 +export const getUserByUsername = async (params) => { + return await request.get({ url: `/admin/member/user/get/` + params }) +} + +// 查询用户任务完成情况 +export const getUserTaskInfo = async (params) => { + return await request.get({ url: `/admin/member/user/user-task-info`, params }) +} + +// 修改密码 +export const updatePassword = async (data) => { + return await request.put({ url: `/admin/member/user/update-password`, data }) +} + +// 修改用户等级 +export const updateUserLevel = async (data) => { + return await request.put({ url: `/admin/member/user/update-level`, data }) +} + +// 修改信誉分 +export const updateCreditScore = async (data) => { + return await request.put({ url: `/admin/member/user/update-credit-score`, data }) +} + +// 计算余额 +export const calcUserBalance = async (params: any) => { + return await request.get({ url: '/admin/member/user/calc-balance', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/userBank/index.ts b/grailed-ui-admin-vue3/src/api/member/userBank/index.ts new file mode 100644 index 0000000..9c27a54 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/userBank/index.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +export interface UserBankVO { + id: number + userId: number + bankName: string + bankCountry: string + accountName: string + accountNumber: string + iban: string + swiftBicCode: string + bankAddress: string + branchName: string + branchAddress: string +} + +// 查询会员银行卡列表 +export const getUserBankPage = async (params) => { + return await request.get({ url: `/member/user-bank/page`, params }) +} + +// 查询会员银行卡详情 +export const getUserBank = async (id: number) => { + return await request.get({ url: `/member/user-bank/get?id=` + id }) +} + +// 新增会员银行卡 +export const createUserBank = async (data: UserBankVO) => { + return await request.post({ url: `/member/user-bank/create`, data }) +} + +// 修改会员银行卡 +export const updateUserBank = async (data: UserBankVO) => { + return await request.put({ url: `/member/user-bank/update`, data }) +} + +// 删除会员银行卡 +export const deleteUserBank = async (id: number) => { + return await request.delete({ url: `/member/user-bank/delete?id=` + id }) +} + +// 导出会员银行卡 Excel +export const exportUserBank = async (params) => { + return await request.download({ url: `/member/user-bank/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/userCrypto/index.ts b/grailed-ui-admin-vue3/src/api/member/userCrypto/index.ts new file mode 100644 index 0000000..4d66c28 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/userCrypto/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface UserCryptoVO { + id: number + userId: number + currencyType: string + address: string + label: string + primary: number + qrCode: string + cryptoTag: string + verified: number + network: string +} + +// 查询会员数字货币地址列表 +export const getUserCryptoPage = async (params) => { + return await request.get({ url: `/member/user-crypto/page`, params }) +} + +// 查询会员数字货币地址详情 +export const getUserCrypto = async (id: number) => { + return await request.get({ url: `/member/user-crypto/get?id=` + id }) +} + +// 新增会员数字货币地址 +export const createUserCrypto = async (data: UserCryptoVO) => { + return await request.post({ url: `/member/user-crypto/create`, data }) +} + +// 修改会员数字货币地址 +export const updateUserCrypto = async (data: UserCryptoVO) => { + return await request.put({ url: `/member/user-crypto/update`, data }) +} + +// 删除会员数字货币地址 +export const deleteUserCrypto = async (id: number) => { + return await request.delete({ url: `/member/user-crypto/delete?id=` + id }) +} + +// 导出会员数字货币地址 Excel +export const exportUserCrypto = async (params) => { + return await request.download({ url: `/member/user-crypto/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/userExtension/index.ts b/grailed-ui-admin-vue3/src/api/member/userExtension/index.ts new file mode 100644 index 0000000..6ef475a --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/userExtension/index.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +export interface UserExtensionVO { + id: number + userId: number + firstName: string + lastName: string + email: string + country: string + streetAddress: string + state: string + postalCode: string + language: string + userZone: string +} + +// 查询用户信息扩展列表 +export const getUserExtensionPage = async (params) => { + return await request.get({ url: `/member/user-extension/page`, params }) +} + +// 查询用户信息扩展详情 +export const getUserExtension = async (id: number) => { + return await request.get({ url: `/member/user-extension/get?id=` + id }) +} + +// 新增用户信息扩展 +export const createUserExtension = async (data: UserExtensionVO) => { + return await request.post({ url: `/member/user-extension/create`, data }) +} + +// 修改用户信息扩展 +export const updateUserExtension = async (data: UserExtensionVO) => { + return await request.put({ url: `/member/user-extension/update`, data }) +} + +// 删除用户信息扩展 +export const deleteUserExtension = async (id: number) => { + return await request.delete({ url: `/member/user-extension/delete?id=` + id }) +} + +// 导出用户信息扩展 Excel +export const exportUserExtension = async (params) => { + return await request.download({ url: `/member/user-extension/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/member/withdrawal/index.ts b/grailed-ui-admin-vue3/src/api/member/withdrawal/index.ts new file mode 100644 index 0000000..4320965 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/member/withdrawal/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface WithdrawalVO { + id: number + userId: number + withdrawalType: number + amount: number + currency: string + status: string + requestDate: Date + processedDate: Date + remark: string + fee: number + netAmount: number +} + +// 查询提现记录列表 +export const getWithdrawalPage = async (params) => { + return await request.get({ url: `/member/withdrawal/page`, params }) +} + +// 查询提现记录详情 +export const getWithdrawal = async (id: number) => { + return await request.get({ url: `/member/withdrawal/get?id=` + id }) +} + +// 新增提现记录 +export const createWithdrawal = async (data: WithdrawalVO) => { + return await request.post({ url: `/member/withdrawal/create`, data }) +} + +// 修改提现记录 +export const updateWithdrawal = async (data: WithdrawalVO) => { + return await request.put({ url: `/member/withdrawal/update`, data }) +} + +// 修改提现记录 +export const approveWithdrawal = async (data: WithdrawalVO) => { + return await request.put({ url: `/member/withdrawal/approve`, data }) +} + +// 删除提现记录 +export const deleteWithdrawal = async (id: number) => { + return await request.delete({ url: `/member/withdrawal/delete?id=` + id }) +} + +// 导出提现记录 Excel +export const exportWithdrawal = async (params) => { + return await request.download({ url: `/member/withdrawal/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/message/blacklist/index.ts b/grailed-ui-admin-vue3/src/api/message/blacklist/index.ts new file mode 100644 index 0000000..f4810bc --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/message/blacklist/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface BlacklistVO { + id: number + memberId: number + remark: string +} + +// 查询黑名单列表 +export const getBlacklistPage = async (params) => { + return await request.get({ url: `/message/blacklist/page`, params }) +} + +// 查询黑名单详情 +export const getBlacklist = async (id: number) => { + return await request.get({ url: `/message/blacklist/get?id=` + id }) +} + +// 新增黑名单 +export const createBlacklist = async (data: BlacklistVO) => { + return await request.post({ url: `/message/blacklist/create`, data }) +} + +// 修改黑名单 +export const updateBlacklist = async (data: BlacklistVO) => { + return await request.put({ url: `/message/blacklist/update`, data }) +} + +// 删除黑名单 +export const deleteBlacklist = async (id: number) => { + return await request.delete({ url: `/message/blacklist/delete?id=` + id }) +} + +// 导出黑名单 Excel +export const exportBlacklist = async (params) => { + return await request.download({ url: `/message/blacklist/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/message/content/index.ts b/grailed-ui-admin-vue3/src/api/message/content/index.ts new file mode 100644 index 0000000..f194160 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/message/content/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface ContentVO { + id: number + senderId: number + receiverId: number + content: string + type: number + translatedContent: string + language: string + translationLanguage: string + isRead: boolean + isRetracted: boolean +} + +// 查询消息记录列表 +export const getContentPage = async (params) => { + return await request.get({ url: `/message/content/page`, params }) +} + +// 查询消息记录详情 +export const getContent = async (id: number) => { + return await request.get({ url: `/message/content/get?id=` + id }) +} + +// 新增消息记录 +export const createContent = async (data: ContentVO) => { + return await request.post({ url: `/message/content/create`, data }) +} + +// 修改消息记录 +export const updateContent = async (data: ContentVO) => { + return await request.put({ url: `/message/content/update`, data }) +} + +// 删除消息记录 +export const deleteContent = async (id: number) => { + return await request.delete({ url: `/message/content/delete?id=` + id }) +} + +// 导出消息记录 Excel +export const exportContent = async (params) => { + return await request.download({ url: `/message/content/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/message/memberRemark/index.ts b/grailed-ui-admin-vue3/src/api/message/memberRemark/index.ts new file mode 100644 index 0000000..47a807a --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/message/memberRemark/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface MemberRemarkVO { + id: number + memberId: number + nickName: string + remark: string +} + +// 查询会员标记列表 +export const getMemberRemarkPage = async (params) => { + return await request.get({ url: `/message/member-remark/page`, params }) +} + +// 查询会员标记详情 +export const getMemberRemark = async (id: number) => { + return await request.get({ url: `/message/member-remark/get?id=` + id }) +} + +// 新增会员标记 +export const createMemberRemark = async (data: MemberRemarkVO) => { + return await request.post({ url: `/message/member-remark/create`, data }) +} + +// 修改会员标记 +export const updateMemberRemark = async (data: MemberRemarkVO) => { + return await request.put({ url: `/message/member-remark/update`, data }) +} + +// 删除会员标记 +export const deleteMemberRemark = async (id: number) => { + return await request.delete({ url: `/message/member-remark/delete?id=` + id }) +} + +// 导出会员标记 Excel +export const exportMemberRemark = async (params) => { + return await request.download({ url: `/message/member-remark/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/message/quickGroup/index.ts b/grailed-ui-admin-vue3/src/api/message/quickGroup/index.ts new file mode 100644 index 0000000..974a886 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/message/quickGroup/index.ts @@ -0,0 +1,36 @@ +import request from '@/config/axios' + +export interface QuickGroupVO { + id: number + groupName: string +} + +// 查询回复分组列表 +export const getQuickGroupPage = async (params) => { + return await request.get({ url: `/message/quick-group/page`, params }) +} + +// 查询回复分组详情 +export const getQuickGroup = async (id: number) => { + return await request.get({ url: `/message/quick-group/get?id=` + id }) +} + +// 新增回复分组 +export const createQuickGroup = async (data: QuickGroupVO) => { + return await request.post({ url: `/message/quick-group/create`, data }) +} + +// 修改回复分组 +export const updateQuickGroup = async (data: QuickGroupVO) => { + return await request.put({ url: `/message/quick-group/update`, data }) +} + +// 删除回复分组 +export const deleteQuickGroup = async (id: number) => { + return await request.delete({ url: `/message/quick-group/delete?id=` + id }) +} + +// 导出回复分组 Excel +export const exportQuickGroup = async (params) => { + return await request.download({ url: `/message/quick-group/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/message/quickReplies/index.ts b/grailed-ui-admin-vue3/src/api/message/quickReplies/index.ts new file mode 100644 index 0000000..089b5ed --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/message/quickReplies/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface QuickRepliesVO { + id: number + groupId: number + content: string + needTranslation: boolean +} + +// 查询快捷回复列表 +export const getQuickRepliesPage = async (params) => { + return await request.get({ url: `/message/quick-replies/page`, params }) +} + +// 查询快捷回复详情 +export const getQuickReplies = async (id: number) => { + return await request.get({ url: `/message/quick-replies/get?id=` + id }) +} + +// 新增快捷回复 +export const createQuickReplies = async (data: QuickRepliesVO) => { + return await request.post({ url: `/message/quick-replies/create`, data }) +} + +// 修改快捷回复 +export const updateQuickReplies = async (data: QuickRepliesVO) => { + return await request.put({ url: `/message/quick-replies/update`, data }) +} + +// 删除快捷回复 +export const deleteQuickReplies = async (id: number) => { + return await request.delete({ url: `/message/quick-replies/delete?id=` + id }) +} + +// 导出快捷回复 Excel +export const exportQuickReplies = async (params) => { + return await request.download({ url: `/message/quick-replies/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/account/index.ts b/grailed-ui-admin-vue3/src/api/mp/account/index.ts new file mode 100644 index 0000000..e973cda --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/account/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface AccountVO { + id: number + name: string +} + +// 创建公众号账号 +export const createAccount = async (data) => { + return await request.post({ url: '/mp/account/create', data }) +} + +// 更新公众号账号 +export const updateAccount = async (data) => { + return request.put({ url: '/mp/account/update', data: data }) +} + +// 删除公众号账号 +export const deleteAccount = async (id) => { + return request.delete({ url: '/mp/account/delete?id=' + id, method: 'delete' }) +} + +// 获得公众号账号 +export const getAccount = async (id) => { + return request.get({ url: '/mp/account/get?id=' + id }) +} + +// 获得公众号账号分页 +export const getAccountPage = async (query) => { + return request.get({ url: '/mp/account/page', params: query }) +} + +// 获取公众号账号精简信息列表 +export const getSimpleAccountList = async () => { + return request.get({ url: '/mp/account/list-all-simple' }) +} + +// 生成公众号二维码 +export const generateAccountQrCode = async (id) => { + return request.put({ url: '/mp/account/generate-qr-code?id=' + id }) +} + +// 清空公众号 API 配额 +export const clearAccountQuota = async (id) => { + return request.put({ url: '/mp/account/clear-quota?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/autoReply/index.ts b/grailed-ui-admin-vue3/src/api/mp/autoReply/index.ts new file mode 100644 index 0000000..5045e6d --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/autoReply/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +// 创建公众号的自动回复 +export const createAutoReply = (data) => { + return request.post({ + url: '/mp/auto-reply/create', + data: data + }) +} + +// 更新公众号的自动回复 +export const updateAutoReply = (data) => { + return request.put({ + url: '/mp/auto-reply/update', + data: data + }) +} + +// 删除公众号的自动回复 +export const deleteAutoReply = (id) => { + return request.delete({ + url: '/mp/auto-reply/delete?id=' + id + }) +} + +// 获得公众号的自动回复 +export const getAutoReply = (id) => { + return request.get({ + url: '/mp/auto-reply/get?id=' + id + }) +} + +// 获得公众号的自动回复分页 +export const getAutoReplyPage = (query) => { + return request.get({ + url: '/mp/auto-reply/page', + params: query + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/draft/index.ts b/grailed-ui-admin-vue3/src/api/mp/draft/index.ts new file mode 100644 index 0000000..ce6a443 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/draft/index.ts @@ -0,0 +1,35 @@ +import request from '@/config/axios' + +// 获得公众号草稿分页 +export const getDraftPage = (query) => { + return request.get({ + url: '/mp/draft/page', + params: query + }) +} + +// 创建公众号草稿 +export const createDraft = (accountId, articles) => { + return request.post({ + url: '/mp/draft/create?accountId=' + accountId, + data: { + articles + } + }) +} + +// 更新公众号草稿 +export const updateDraft = (accountId, mediaId, articles) => { + return request.put({ + url: '/mp/draft/update?accountId=' + accountId + '&mediaId=' + mediaId, + method: 'put', + data: articles + }) +} + +// 删除公众号草稿 +export const deleteDraft = (accountId, mediaId) => { + return request.delete({ + url: '/mp/draft/delete?accountId=' + accountId + '&mediaId=' + mediaId + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/freePublish/index.ts b/grailed-ui-admin-vue3/src/api/mp/freePublish/index.ts new file mode 100644 index 0000000..beef026 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/freePublish/index.ts @@ -0,0 +1,23 @@ +import request from '@/config/axios' + +// 获得公众号素材分页 +export const getFreePublishPage = (query) => { + return request.get({ + url: '/mp/free-publish/page', + params: query + }) +} + +// 删除公众号素材 +export const deleteFreePublish = (accountId, articleId) => { + return request.delete({ + url: '/mp/free-publish/delete?accountId=' + accountId + '&articleId=' + articleId + }) +} + +// 发布公众号素材 +export const submitFreePublish = (accountId, mediaId) => { + return request.post({ + url: '/mp/free-publish/submit?accountId=' + accountId + '&mediaId=' + mediaId + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/material/index.ts b/grailed-ui-admin-vue3/src/api/mp/material/index.ts new file mode 100644 index 0000000..fcc37ab --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/material/index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios' + +// 获得公众号素材分页 +export const getMaterialPage = (query) => { + return request.get({ + url: '/mp/material/page', + params: query + }) +} + +// 删除公众号永久素材 +export const deletePermanentMaterial = (id) => { + return request.delete({ + url: '/mp/material/delete-permanent?id=' + id + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/menu/index.ts b/grailed-ui-admin-vue3/src/api/mp/menu/index.ts new file mode 100644 index 0000000..cc78647 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/menu/index.ts @@ -0,0 +1,26 @@ +import request from '@/config/axios' + +// 获得公众号菜单列表 +export const getMenuList = (accountId) => { + return request.get({ + url: '/mp/menu/list?accountId=' + accountId + }) +} + +// 保存公众号菜单 +export const saveMenu = (accountId, menus) => { + return request.post({ + url: '/mp/menu/save', + data: { + accountId, + menus + } + }) +} + +// 删除公众号菜单 +export const deleteMenu = (accountId) => { + return request.delete({ + url: '/mp/menu/delete?accountId=' + accountId + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/message/index.ts b/grailed-ui-admin-vue3/src/api/mp/message/index.ts new file mode 100644 index 0000000..ad9b95d --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/message/index.ts @@ -0,0 +1,17 @@ +import request from '@/config/axios' + +// 获得公众号消息分页 +export const getMessagePage = (query: PageParam) => { + return request.get({ + url: '/mp/message/page', + params: query + }) +} + +// 给粉丝发送消息 +export const sendMessage = (data) => { + return request.post({ + url: '/mp/message/send', + data: data + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/statistics/index.ts b/grailed-ui-admin-vue3/src/api/mp/statistics/index.ts new file mode 100644 index 0000000..72cae60 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/statistics/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +// 获取消息发送概况数据 +export const getUpstreamMessage = (query) => { + return request.get({ + url: '/mp/statistics/upstream-message', + params: query + }) +} + +// 用户增减数据 +export const getUserSummary = (query) => { + return request.get({ + url: '/mp/statistics/user-summary', + params: query + }) +} + +// 获得用户累计数据 +export const getUserCumulate = (query) => { + return request.get({ + url: '/mp/statistics/user-cumulate', + params: query + }) +} + +// 获得接口分析数据 +export const getInterfaceSummary = (query) => { + return request.get({ + url: '/mp/statistics/interface-summary', + params: query + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/tag/index.ts b/grailed-ui-admin-vue3/src/api/mp/tag/index.ts new file mode 100644 index 0000000..50183a5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/tag/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface TagVO { + id?: number + name: string + accountId: number + createTime: Date +} + +// 创建公众号标签 +export const createTag = (data: TagVO) => { + return request.post({ + url: '/mp/tag/create', + data: data + }) +} + +// 更新公众号标签 +export const updateTag = (data: TagVO) => { + return request.put({ + url: '/mp/tag/update', + data: data + }) +} + +// 删除公众号标签 +export const deleteTag = (id: number) => { + return request.delete({ + url: '/mp/tag/delete?id=' + id + }) +} + +// 获得公众号标签 +export const getTag = (id: number) => { + return request.get({ + url: '/mp/tag/get?id=' + id + }) +} + +// 获得公众号标签分页 +export const getTagPage = (query: PageParam) => { + return request.get({ + url: '/mp/tag/page', + params: query + }) +} + +// 获取公众号标签精简信息列表 +export const getSimpleTagList = () => { + return request.get({ + url: '/mp/tag/list-all-simple' + }) +} + +// 同步公众号标签 +export const syncTag = (accountId: number) => { + return request.post({ + url: '/mp/tag/sync?accountId=' + accountId + }) +} diff --git a/grailed-ui-admin-vue3/src/api/mp/user/index.ts b/grailed-ui-admin-vue3/src/api/mp/user/index.ts new file mode 100644 index 0000000..d954e9e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/mp/user/index.ts @@ -0,0 +1,31 @@ +import request from '@/config/axios' + +// 更新公众号粉丝 +export const updateUser = (data) => { + return request.put({ + url: '/mp/user/update', + data: data + }) +} + +// 获得公众号粉丝 +export const getUser = (id) => { + return request.get({ + url: '/mp/user/get?id=' + id + }) +} + +// 获得公众号粉丝分页 +export const getUserPage = (query) => { + return request.get({ + url: '/mp/user/page', + params: query + }) +} + +// 同步公众号粉丝 +export const syncUser = (accountId) => { + return request.post({ + url: '/mp/tag/sync?accountId=' + accountId + }) +} diff --git a/grailed-ui-admin-vue3/src/api/pay/app/index.ts b/grailed-ui-admin-vue3/src/api/pay/app/index.ts new file mode 100644 index 0000000..c19eb99 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/pay/app/index.ts @@ -0,0 +1,78 @@ +import request from '@/config/axios' + +export interface AppVO { + id: number + name: string + status: number + remark: string + payNotifyUrl: string + refundNotifyUrl: string + merchantId: number + merchantName: string + createTime: Date +} + +export interface AppPageReqVO extends PageParam { + name?: string + status?: number + remark?: string + payNotifyUrl?: string + refundNotifyUrl?: string + merchantName?: string + createTime?: Date[] +} + +export interface AppExportReqVO { + name?: string + status?: number + remark?: string + payNotifyUrl?: string + refundNotifyUrl?: string + merchantName?: string + createTime?: Date[] +} + +export interface AppUpdateStatusReqVO { + id: number + status: number +} + +// 查询列表支付应用 +export const getAppPage = (params: AppPageReqVO) => { + return request.get({ url: '/pay/app/page', params }) +} + +// 查询详情支付应用 +export const getApp = (id: number) => { + return request.get({ url: '/pay/app/get?id=' + id }) +} + +// 新增支付应用 +export const createApp = (data: AppVO) => { + return request.post({ url: '/pay/app/create', data }) +} + +// 修改支付应用 +export const updateApp = (data: AppVO) => { + return request.put({ url: '/pay/app/update', data }) +} + +// 支付应用信息状态修改 +export const changeAppStatus = (data: AppUpdateStatusReqVO) => { + return request.put({ url: '/pay/app/update-status', data: data }) +} + +// 删除支付应用 +export const deleteApp = (id: number) => { + return request.delete({ url: '/pay/app/delete?id=' + id }) +} + +// 导出支付应用 +export const exportApp = (params: AppExportReqVO) => { + return request.download({ url: '/pay/app/export-excel', params }) +} + +// 根据商ID称搜索应用列表 +export const getAppListByMerchantId = (merchantId: number) => { + return request.get({ url: '/pay/app/list-merchant-id', params: { merchantId: merchantId } }) +} diff --git a/grailed-ui-admin-vue3/src/api/pay/channel/index.ts b/grailed-ui-admin-vue3/src/api/pay/channel/index.ts new file mode 100644 index 0000000..0f4ff42 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/pay/channel/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface ChannelVO { + id: number + code: string + config: string + status: number + remark: string + feeRate: number + appId: number + createTime: Date +} + +// 查询列表支付渠道 +export const getChannelPage = (params: PageParam) => { + return request.get({ url: '/pay/channel/page', params }) +} + +// 查询详情支付渠道 +export const getChannel = (appId: string, code: string) => { + const params = { + appId: appId, + code: code + } + return request.get({ url: '/pay/channel/get', params: params }) +} + +// 新增支付渠道 +export const createChannel = (data: ChannelVO) => { + return request.post({ url: '/pay/channel/create', data }) +} + +// 修改支付渠道 +export const updateChannel = (data: ChannelVO) => { + return request.put({ url: '/pay/channel/update', data }) +} + +// 删除支付渠道 +export const deleteChannel = (id: number) => { + return request.delete({ url: '/pay/channel/delete?id=' + id }) +} + +// 导出支付渠道 +export const exportChannel = (params) => { + return request.download({ url: '/pay/channel/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/pay/merchant/index.ts b/grailed-ui-admin-vue3/src/api/pay/merchant/index.ts new file mode 100644 index 0000000..bb630c3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/pay/merchant/index.ts @@ -0,0 +1,78 @@ +import request from '@/config/axios' + +export interface MerchantVO { + id: number + no: string + name: string + shortName: string + status: number + remark: string + createTime: Date +} + +export interface MerchantPageReqVO extends PageParam { + no?: string + name?: string + shortName?: string + status?: number + remark?: string + createTime?: Date[] +} + +export interface MerchantExportReqVO { + no?: string + name?: string + shortName?: string + status?: number + remark?: string + createTime?: Date[] +} + +// 查询列表支付商户 +export const getMerchantPage = (params: MerchantPageReqVO) => { + return request.get({ url: '/pay/merchant/page', params }) +} + +// 查询详情支付商户 +export const getMerchant = (id: number) => { + return request.get({ url: '/pay/merchant/get?id=' + id }) +} + +// 根据商户名称搜索商户列表 +export const getMerchantListByName = (name?: string) => { + return request.get({ + url: '/pay/merchant/list-by-name', + params: { + name: name + } + }) +} + +// 新增支付商户 +export const createMerchant = (data: MerchantVO) => { + return request.post({ url: '/pay/merchant/create', data }) +} + +// 修改支付商户 +export const updateMerchant = (data: MerchantVO) => { + return request.put({ url: '/pay/merchant/update', data }) +} + +// 删除支付商户 +export const deleteMerchant = (id: number) => { + return request.delete({ url: '/pay/merchant/delete?id=' + id }) +} + +// 导出支付商户 +export const exportMerchant = (params: MerchantExportReqVO) => { + return request.download({ url: '/pay/merchant/export-excel', params }) +} + +// 支付商户状态修改 +export const updateMerchantStatus = (id: number, status: number) => { + const data = { + id, + status + } + return request.put({ url: '/pay/merchant/update-status', data: data }) +} diff --git a/grailed-ui-admin-vue3/src/api/pay/order/index.ts b/grailed-ui-admin-vue3/src/api/pay/order/index.ts new file mode 100644 index 0000000..6621381 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/pay/order/index.ts @@ -0,0 +1,114 @@ +import request from '@/config/axios' + +export interface OrderVO { + id: number + merchantId: number + appId: number + channelId: number + channelCode: string + merchantOrderId: string + subject: string + body: string + notifyUrl: string + notifyStatus: number + amount: number + channelFeeRate: number + channelFeeAmount: number + status: number + userIp: string + expireTime: Date + successTime: Date + notifyTime: Date + successExtensionId: number + refundStatus: number + refundTimes: number + refundAmount: number + channelUserId: string + channelOrderNo: string + createTime: Date +} + +export interface OrderPageReqVO extends PageParam { + merchantId?: number + appId?: number + channelId?: number + channelCode?: string + merchantOrderId?: string + subject?: string + body?: string + notifyUrl?: string + notifyStatus?: number + amount?: number + channelFeeRate?: number + channelFeeAmount?: number + status?: number + expireTime?: Date[] + successTime?: Date[] + notifyTime?: Date[] + successExtensionId?: number + refundStatus?: number + refundTimes?: number + channelUserId?: string + channelOrderNo?: string + createTime?: Date[] +} + +export interface OrderExportReqVO { + merchantId?: number + appId?: number + channelId?: number + channelCode?: string + merchantOrderId?: string + subject?: string + body?: string + notifyUrl?: string + notifyStatus?: number + amount?: number + channelFeeRate?: number + channelFeeAmount?: number + status?: number + expireTime?: Date[] + successTime?: Date[] + notifyTime?: Date[] + successExtensionId?: number + refundStatus?: number + refundTimes?: number + channelUserId?: string + channelOrderNo?: string + createTime?: Date[] +} + +// 查询列表支付订单 +export const getOrderPage = async (params: OrderPageReqVO) => { + return await request.get({ url: '/pay/order/page', params }) +} + +// 查询详情支付订单 +export const getOrder = async (id: number) => { + return await request.get({ url: '/pay/order/get?id=' + id }) +} + +// 获得支付订单的明细 +export const getOrderDetail = async (id: number) => { + return await request.get({ url: '/pay/order/get-detail?id=' + id }) +} + +// 新增支付订单 +export const createOrder = async (data: OrderVO) => { + return await request.post({ url: '/pay/order/create', data }) +} + +// 修改支付订单 +export const updateOrder = async (data: OrderVO) => { + return await request.put({ url: '/pay/order/update', data }) +} + +// 删除支付订单 +export const deleteOrder = async (id: number) => { + return await request.delete({ url: '/pay/order/delete?id=' + id }) +} + +// 导出支付订单 +export const exportOrder = async (params: OrderExportReqVO) => { + return await request.download({ url: '/pay/order/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/pay/refund/index.ts b/grailed-ui-admin-vue3/src/api/pay/refund/index.ts new file mode 100644 index 0000000..4b587f2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/pay/refund/index.ts @@ -0,0 +1,116 @@ +import request from '@/config/axios' + +export interface RefundVO { + id: number + merchantId: number + appId: number + channelId: number + channelCode: string + orderId: string + tradeNo: string + merchantOrderId: string + merchantRefundNo: string + notifyUrl: string + notifyStatus: number + status: number + type: number + payAmount: number + refundAmount: number + reason: string + userIp: string + channelOrderNo: string + channelRefundNo: string + channelErrorCode: string + channelErrorMsg: string + channelExtras: string + expireTime: Date + successTime: Date + notifyTime: Date + createTime: Date +} + +export interface RefundPageReqVO extends PageParam { + merchantId?: number + appId?: number + channelId?: number + channelCode?: string + orderId?: string + tradeNo?: string + merchantOrderId?: string + merchantRefundNo?: string + notifyUrl?: string + notifyStatus?: number + status?: number + type?: number + payAmount?: number + refundAmount?: number + reason?: string + userIp?: string + channelOrderNo?: string + channelRefundNo?: string + channelErrorCode?: string + channelErrorMsg?: string + channelExtras?: string + expireTime?: Date[] + successTime?: Date[] + notifyTime?: Date[] + createTime?: Date[] +} + +export interface PayRefundExportReqVO { + merchantId?: number + appId?: number + channelId?: number + channelCode?: string + orderId?: string + tradeNo?: string + merchantOrderId?: string + merchantRefundNo?: string + notifyUrl?: string + notifyStatus?: number + status?: number + type?: number + payAmount?: number + refundAmount?: number + reason?: string + userIp?: string + channelOrderNo?: string + channelRefundNo?: string + channelErrorCode?: string + channelErrorMsg?: string + channelExtras?: string + expireTime?: Date[] + successTime?: Date[] + notifyTime?: Date[] + createTime?: Date[] +} + +// 查询列表退款订单 +export const getRefundPage = (params: RefundPageReqVO) => { + return request.get({ url: '/pay/refund/page', params }) +} + +// 查询详情退款订单 +export const getRefund = (id: number) => { + return request.get({ url: '/pay/refund/get?id=' + id }) +} + +// 新增退款订单 +export const createRefund = (data: RefundVO) => { + return request.post({ url: '/pay/refund/create', data }) +} + +// 修改退款订单 +export const updateRefund = (data: RefundVO) => { + return request.put({ url: '/pay/refund/update', data }) +} + +// 删除退款订单 +export const deleteRefund = (id: number) => { + return request.delete({ url: '/pay/refund/delete?id=' + id }) +} + +// 导出退款订单 +export const exportRefund = (params: PayRefundExportReqVO) => { + return request.download({ url: '/pay/refund/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/point/config/index.ts b/grailed-ui-admin-vue3/src/api/point/config/index.ts new file mode 100644 index 0000000..00adc3f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/point/config/index.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +export interface ConfigVO { + id: number + tradeDeductEnable: number + tradeDeductUnitPrice: number + tradeDeductMaxPrice: number + tradeGivePoint: number +} + +// 查询积分设置详情 +export const getConfig = async () => { + return await request.get({ url: `/point/config/get` }) +} + +// 新增修改积分设置 +export const saveConfig = async (data: ConfigVO) => { + return await request.put({ url: `/point/config/save`, data }) +} diff --git a/grailed-ui-admin-vue3/src/api/point/record/index.ts b/grailed-ui-admin-vue3/src/api/point/record/index.ts new file mode 100644 index 0000000..15eaff3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/point/record/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface RecordVO { + id: number + bizId: string + bizType: string + type: string + title: string + description: string + point: number + totalPoint: number + status: number + userId: number + freezingTime: Date + thawingTime: Date + createDate: Date +} + +// 查询用户积分记录列表 +export const getRecordPage = async (params) => { + return await request.get({ url: `/point/record/page`, params }) +} + +// 查询用户积分记录详情 +export const getRecord = async (id: number) => { + return await request.get({ url: `/point/record/get?id=` + id }) +} + +// 新增用户积分记录 +export const createRecord = async (data: RecordVO) => { + return await request.post({ url: `/point/record/create`, data }) +} + +// 修改用户积分记录 +export const updateRecord = async (data: RecordVO) => { + return await request.put({ url: `/point/record/update`, data }) +} + +// 删除用户积分记录 +export const deleteRecord = async (id: number) => { + return await request.delete({ url: `/point/record/delete?id=` + id }) +} + +// 导出用户积分记录 Excel +export const exportRecord = async (params) => { + return await request.download({ url: `/point/record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/point/signInConfig/index.ts b/grailed-ui-admin-vue3/src/api/point/signInConfig/index.ts new file mode 100644 index 0000000..3786c06 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/point/signInConfig/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface SignInConfigVO { + id: number + day: number + point: number +} + +// 查询积分签到规则列表 +export const getSignInConfigPage = async (params) => { + return await request.get({ url: `/point/sign-in-config/page`, params }) +} + +// 查询积分签到规则详情 +export const getSignInConfig = async (id: number) => { + return await request.get({ url: `/point/sign-in-config/get?id=` + id }) +} + +// 新增积分签到规则 +export const createSignInConfig = async (data: SignInConfigVO) => { + return await request.post({ url: `/point/sign-in-config/create`, data }) +} + +// 修改积分签到规则 +export const updateSignInConfig = async (data: SignInConfigVO) => { + return await request.put({ url: `/point/sign-in-config/update`, data }) +} + +// 删除积分签到规则 +export const deleteSignInConfig = async (id: number) => { + return await request.delete({ url: `/point/sign-in-config/delete?id=` + id }) +} + +// 导出积分签到规则 Excel +export const exportSignInConfig = async (params) => { + return await request.download({ url: `/point/sign-in-config/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/point/signInRecord/index.ts b/grailed-ui-admin-vue3/src/api/point/signInRecord/index.ts new file mode 100644 index 0000000..0f9b9f6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/point/signInRecord/index.ts @@ -0,0 +1,38 @@ +import request from '@/config/axios' + +export interface SignInRecordVO { + id: number + userId: number + day: number + point: number +} + +// 查询用户签到积分列表 +export const getSignInRecordPage = async (params) => { + return await request.get({ url: `/point/sign-in-record/page`, params }) +} + +// 查询用户签到积分详情 +export const getSignInRecord = async (id: number) => { + return await request.get({ url: `/point/sign-in-record/get?id=` + id }) +} + +// 新增用户签到积分 +export const createSignInRecord = async (data: SignInRecordVO) => { + return await request.post({ url: `/point/sign-in-record/create`, data }) +} + +// 修改用户签到积分 +export const updateSignInRecord = async (data: SignInRecordVO) => { + return await request.put({ url: `/point/sign-in-record/update`, data }) +} + +// 删除用户签到积分 +export const deleteSignInRecord = async (id: number) => { + return await request.delete({ url: `/point/sign-in-record/delete?id=` + id }) +} + +// 导出用户签到积分 Excel +export const exportSignInRecord = async (params) => { + return await request.download({ url: `/point/sign-in-record/export-excel`, params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/area/index.ts b/grailed-ui-admin-vue3/src/api/system/area/index.ts new file mode 100644 index 0000000..b7da941 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/area/index.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +// 获得地区树 +export const getAreaTree = async () => { + return await request.get({ url: '/system/area/tree' }) +} + +export const getChildrenArea = async (id: number) => { + return await request.get({ url: '/system/area/get-children?id=' + id }) +} + +export const getAreaListByIds = async (ids) => { + return await request.get({ url: '/system/area/get-by-ids?ids=' + ids }) +} + +// 获得 IP 对应的地区名 +export const getAreaByIp = async (ip: string) => { + return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/dept/index.ts b/grailed-ui-admin-vue3/src/api/system/dept/index.ts new file mode 100644 index 0000000..d995f13 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/dept/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface DeptVO { + id?: number + name: string + parentId: number + status: number + sort: number + leaderUserId: number + phone: string + email: string + createTime: Date +} + +// 查询部门(精简)列表 +export const getSimpleDeptList = async (): Promise => { + return await request.get({ url: '/system/dept/list-all-simple' }) +} + +// 查询部门列表 +export const getDeptPage = async (params: PageParam) => { + return await request.get({ url: '/system/dept/list', params }) +} + +// 查询部门详情 +export const getDept = async (id: number) => { + return await request.get({ url: '/system/dept/get?id=' + id }) +} + +// 新增部门 +export const createDept = async (data: DeptVO) => { + return await request.post({ url: '/system/dept/create', data: data }) +} + +// 修改部门 +export const updateDept = async (params: DeptVO) => { + return await request.put({ url: '/system/dept/update', data: params }) +} + +// 删除部门 +export const deleteDept = async (id: number) => { + return await request.delete({ url: '/system/dept/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/dict/dict.data.ts b/grailed-ui-admin-vue3/src/api/system/dict/dict.data.ts new file mode 100644 index 0000000..87e7dce --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/dict/dict.data.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export type DictDataVO = { + id: number | undefined + sort: number | undefined + label: string + value: string + dictType: string + status: number + colorType: string + cssClass: string + remark: string + createTime: Date +} + +// 查询字典数据(精简)列表 +export const listSimpleDictData = () => { + return request.get({ url: '/system/dict-data/list-all-simple' }) +} + +// 查询字典数据列表 +export const getDictDataPage = (params: PageParam) => { + return request.get({ url: '/system/dict-data/page', params }) +} + +// 查询字典数据详情 +export const getDictData = (id: number) => { + return request.get({ url: '/system/dict-data/get?id=' + id }) +} + +// 新增字典数据 +export const createDictData = (data: DictDataVO) => { + return request.post({ url: '/system/dict-data/create', data }) +} + +// 修改字典数据 +export const updateDictData = (data: DictDataVO) => { + return request.put({ url: '/system/dict-data/update', data }) +} + +// 删除字典数据 +export const deleteDictData = (id: number) => { + return request.delete({ url: '/system/dict-data/delete?id=' + id }) +} + +// 导出字典类型数据 +export const exportDictData = (params) => { + return request.get({ url: '/system/dict-data/export', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/dict/dict.type.ts b/grailed-ui-admin-vue3/src/api/system/dict/dict.type.ts new file mode 100644 index 0000000..ed2969f --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/dict/dict.type.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export type DictTypeVO = { + id: number | undefined + name: string + type: string + status: number + remark: string + createTime: Date +} + +// 查询字典(精简)列表 +export const getSimpleDictTypeList = () => { + return request.get({ url: '/system/dict-type/list-all-simple' }) +} + +// 查询字典列表 +export const getDictTypePage = (params: PageParam) => { + return request.get({ url: '/system/dict-type/page', params }) +} + +// 查询字典详情 +export const getDictType = (id: number) => { + return request.get({ url: '/system/dict-type/get?id=' + id }) +} + +// 新增字典 +export const createDictType = (data: DictTypeVO) => { + return request.post({ url: '/system/dict-type/create', data }) +} + +// 修改字典 +export const updateDictType = (data: DictTypeVO) => { + return request.put({ url: '/system/dict-type/update', data }) +} + +// 删除字典 +export const deleteDictType = (id: number) => { + return request.delete({ url: '/system/dict-type/delete?id=' + id }) +} +// 导出字典类型 +export const exportDictType = (params) => { + return request.get({ url: '/system/dict-type/export', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/errorCode/index.ts b/grailed-ui-admin-vue3/src/api/system/errorCode/index.ts new file mode 100644 index 0000000..8a86a63 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/errorCode/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface ErrorCodeVO { + id: number | undefined + type: number + applicationName: string + code: number | undefined + message: string + memo: string + createTime: Date +} + +// 查询错误码列表 +export const getErrorCodePage = (params: PageParam) => { + return request.get({ url: '/system/error-code/page', params }) +} + +// 查询错误码详情 +export const getErrorCode = (id: number) => { + return request.get({ url: '/system/error-code/get?id=' + id }) +} + +// 新增错误码 +export const createErrorCode = (data: ErrorCodeVO) => { + return request.post({ url: '/system/error-code/create', data }) +} + +// 修改错误码 +export const updateErrorCode = (data: ErrorCodeVO) => { + return request.put({ url: '/system/error-code/update', data }) +} + +// 删除错误码 +export const deleteErrorCode = (id: number) => { + return request.delete({ url: '/system/error-code/delete?id=' + id }) +} +// 导出错误码 +export const excelErrorCode = (params) => { + return request.download({ url: '/system/error-code/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/loginLog/index.ts b/grailed-ui-admin-vue3/src/api/system/loginLog/index.ts new file mode 100644 index 0000000..f275c3e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/loginLog/index.ts @@ -0,0 +1,24 @@ +import request from '@/config/axios' + +export interface LoginLogVO { + id: number + logType: number + traceId: number + userId: number + userType: number + username: string + status: number + userIp: string + userAgent: string + createTime: Date +} + +// 查询登录日志列表 +export const getLoginLogPage = (params: PageParam) => { + return request.get({ url: '/system/login-log/page', params }) +} + +// 导出登录日志 +export const exportLoginLog = (params) => { + return request.download({ url: '/system/login-log/export', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/mail/account/index.ts b/grailed-ui-admin-vue3/src/api/system/mail/account/index.ts new file mode 100644 index 0000000..9e10c92 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/mail/account/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export interface MailAccountVO { + id: number + mail: string + username: string + password: string + host: string + port: number + sslEnable: boolean +} + +// 查询邮箱账号列表 +export const getMailAccountPage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-account/page', params }) +} + +// 查询邮箱账号详情 +export const getMailAccount = async (id: number) => { + return await request.get({ url: '/system/mail-account/get?id=' + id }) +} + +// 新增邮箱账号 +export const createMailAccount = async (data: MailAccountVO) => { + return await request.post({ url: '/system/mail-account/create', data }) +} + +// 修改邮箱账号 +export const updateMailAccount = async (data: MailAccountVO) => { + return await request.put({ url: '/system/mail-account/update', data }) +} + +// 删除邮箱账号 +export const deleteMailAccount = async (id: number) => { + return await request.delete({ url: '/system/mail-account/delete?id=' + id }) +} + +// 获得邮箱账号精简列表 +export const getSimpleMailAccountList = async () => { + return request.get({ url: '/system/mail-account/list-all-simple' }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/mail/log/index.ts b/grailed-ui-admin-vue3/src/api/system/mail/log/index.ts new file mode 100644 index 0000000..13172a7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/mail/log/index.ts @@ -0,0 +1,30 @@ +import request from '@/config/axios' + +export interface MailLogVO { + id: number + userId: number + userType: number + toMail: string + accountId: number + fromMail: string + templateId: number + templateCode: string + templateNickname: string + templateTitle: string + templateContent: string + templateParams: string + sendStatus: number + sendTime: Date + sendMessageId: string + sendException: string +} + +// 查询邮件日志列表 +export const getMailLogPage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-log/page', params }) +} + +// 查询邮件日志详情 +export const getMailLog = async (id: number) => { + return await request.get({ url: '/system/mail-log/get?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/mail/template/index.ts b/grailed-ui-admin-vue3/src/api/system/mail/template/index.ts new file mode 100644 index 0000000..fb7ce5e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/mail/template/index.ts @@ -0,0 +1,50 @@ +import request from '@/config/axios' + +export interface MailTemplateVO { + id: number + name: string + code: string + accountId: number + nickname: string + title: string + content: string + params: string + status: number + remark: string +} + +export interface MailSendReqVO { + mail: string + templateCode: string + templateParams: Map +} + +// 查询邮件模版列表 +export const getMailTemplatePage = async (params: PageParam) => { + return await request.get({ url: '/system/mail-template/page', params }) +} + +// 查询邮件模版详情 +export const getMailTemplate = async (id: number) => { + return await request.get({ url: '/system/mail-template/get?id=' + id }) +} + +// 新增邮件模版 +export const createMailTemplate = async (data: MailTemplateVO) => { + return await request.post({ url: '/system/mail-template/create', data }) +} + +// 修改邮件模版 +export const updateMailTemplate = async (data: MailTemplateVO) => { + return await request.put({ url: '/system/mail-template/update', data }) +} + +// 删除邮件模版 +export const deleteMailTemplate = async (id: number) => { + return await request.delete({ url: '/system/mail-template/delete?id=' + id }) +} + +// 发送邮件 +export const sendMail = (data: MailSendReqVO) => { + return request.post({ url: '/system/mail-template/send-mail', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/menu/index.ts b/grailed-ui-admin-vue3/src/api/system/menu/index.ts new file mode 100644 index 0000000..4bb9a87 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/menu/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface MenuVO { + id: number + name: string + permission: string + type: number + sort: number + parentId: number + path: string + icon: string + component: string + componentName?: string + status: number + visible: boolean + keepAlive: boolean + alwaysShow?: boolean + createTime: Date +} + +// 查询菜单(精简)列表 +export const getSimpleMenusList = () => { + return request.get({ url: '/system/menu/list-all-simple' }) +} + +// 查询菜单列表 +export const getMenuList = (params) => { + return request.get({ url: '/system/menu/list', params }) +} + +// 获取菜单详情 +export const getMenu = (id: number) => { + return request.get({ url: '/system/menu/get?id=' + id }) +} + +// 新增菜单 +export const createMenu = (data: MenuVO) => { + return request.post({ url: '/system/menu/create', data }) +} + +// 修改菜单 +export const updateMenu = (data: MenuVO) => { + return request.put({ url: '/system/menu/update', data }) +} + +// 删除菜单 +export const deleteMenu = (id: number) => { + return request.delete({ url: '/system/menu/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/notice/index.ts b/grailed-ui-admin-vue3/src/api/system/notice/index.ts new file mode 100644 index 0000000..62bf525 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/notice/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface NoticeVO { + id: number | undefined + title: string + type: number + content: string + status: number + remark: string + creator: string + createTime: Date +} + +// 查询公告列表 +export const getNoticePage = (params: PageParam) => { + return request.get({ url: '/system/notice/page', params }) +} + +// 查询公告详情 +export const getNotice = (id: number) => { + return request.get({ url: '/system/notice/get?id=' + id }) +} + +// 新增公告 +export const createNotice = (data: NoticeVO) => { + return request.post({ url: '/system/notice/create', data }) +} + +// 修改公告 +export const updateNotice = (data: NoticeVO) => { + return request.put({ url: '/system/notice/update', data }) +} + +// 删除公告 +export const deleteNotice = (id: number) => { + return request.delete({ url: '/system/notice/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/notify/message/index.ts b/grailed-ui-admin-vue3/src/api/system/notify/message/index.ts new file mode 100644 index 0000000..29036b9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/notify/message/index.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' +import qs from 'qs' + +export interface NotifyMessageVO { + id: number + userId: number + userType: number + templateId: number + templateCode: string + templateNickname: string + templateContent: string + templateType: number + templateParams: string + readStatus: boolean + readTime: Date +} + +// 查询站内信消息列表 +export const getNotifyMessagePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-message/page', params }) +} + +// 获得我的站内信分页 +export const getMyNotifyMessagePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-message/my-page', params }) +} + +// 批量标记已读 +export const updateNotifyMessageRead = async (ids) => { + return await request.put({ + url: '/system/notify-message/update-read?' + qs.stringify({ ids: ids }, { indices: false }) + }) +} + +// 标记所有站内信为已读 +export const updateAllNotifyMessageRead = async () => { + return await request.put({ url: '/system/notify-message/update-all-read' }) +} + +// 获取当前用户的最新站内信列表 +export const getUnreadNotifyMessageList = async () => { + return await request.get({ url: '/system/notify-message/get-unread-list' }) +} + +// 获得当前用户的未读站内信数量 +export const getUnreadNotifyMessageCount = async () => { + return await request.get({ url: '/system/notify-message/get-unread-count' }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/notify/template/index.ts b/grailed-ui-admin-vue3/src/api/system/notify/template/index.ts new file mode 100644 index 0000000..cd0e122 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/notify/template/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface NotifyTemplateVO { + id?: number + name: string + nickname: string + code: string + content: string + type: number + params: string + status: number + remark: string +} + +export interface NotifySendReqVO { + userId: number | null + templateCode: string + templateParams: Map +} + +// 查询站内信模板列表 +export const getNotifyTemplatePage = async (params: PageParam) => { + return await request.get({ url: '/system/notify-template/page', params }) +} + +// 查询站内信模板详情 +export const getNotifyTemplate = async (id: number) => { + return await request.get({ url: '/system/notify-template/get?id=' + id }) +} + +// 新增站内信模板 +export const createNotifyTemplate = async (data: NotifyTemplateVO) => { + return await request.post({ url: '/system/notify-template/create', data }) +} + +// 修改站内信模板 +export const updateNotifyTemplate = async (data: NotifyTemplateVO) => { + return await request.put({ url: '/system/notify-template/update', data }) +} + +// 删除站内信模板 +export const deleteNotifyTemplate = async (id: number) => { + return await request.delete({ url: '/system/notify-template/delete?id=' + id }) +} + +// 发送站内信 +export const sendNotify = (data: NotifySendReqVO) => { + return request.post({ url: '/system/notify-template/send-notify', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/oauth2/client.ts b/grailed-ui-admin-vue3/src/api/system/oauth2/client.ts new file mode 100644 index 0000000..6f71aca --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/oauth2/client.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface OAuth2ClientVO { + id: number + clientId: string + secret: string + name: string + logo: string + description: string + status: number + accessTokenValiditySeconds: number + refreshTokenValiditySeconds: number + redirectUris: string[] + autoApprove: boolean + authorizedGrantTypes: string[] + scopes: string[] + authorities: string[] + resourceIds: string[] + additionalInformation: string + isAdditionalInformationJson: boolean + createTime: Date +} + +// 查询 OAuth2 客户端的列表 +export const getOAuth2ClientPage = (params: PageParam) => { + return request.get({ url: '/system/oauth2-client/page', params }) +} + +// 查询 OAuth2 客户端的详情 +export const getOAuth2Client = (id: number) => { + return request.get({ url: '/system/oauth2-client/get?id=' + id }) +} + +// 新增 OAuth2 客户端 +export const createOAuth2Client = (data: OAuth2ClientVO) => { + return request.post({ url: '/system/oauth2-client/create', data }) +} + +// 修改 OAuth2 客户端 +export const updateOAuth2Client = (data: OAuth2ClientVO) => { + return request.put({ url: '/system/oauth2-client/update', data }) +} + +// 删除 OAuth2 +export const deleteOAuth2Client = (id: number) => { + return request.delete({ url: '/system/oauth2-client/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/oauth2/token.ts b/grailed-ui-admin-vue3/src/api/system/oauth2/token.ts new file mode 100644 index 0000000..ac89ae8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/oauth2/token.ts @@ -0,0 +1,22 @@ +import request from '@/config/axios' + +export interface OAuth2TokenVO { + id: number + accessToken: string + refreshToken: string + userId: number + userType: number + clientId: string + createTime: Date + expiresTime: Date +} + +// 查询 token列表 +export const getAccessTokenPage = (params: PageParam) => { + return request.get({ url: '/system/oauth2-token/page', params }) +} + +// 删除 token +export const deleteAccessToken = (accessToken: string) => { + return request.delete({ url: '/system/oauth2-token/delete?accessToken=' + accessToken }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/operatelog/index.ts b/grailed-ui-admin-vue3/src/api/system/operatelog/index.ts new file mode 100644 index 0000000..848a533 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/operatelog/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +export type OperateLogVO = { + id: number + userNickname: string + traceId: string + userId: number + module: string + name: string + type: number + content: string + exts: Map + requestMethod: string + requestUrl: string + userIp: string + userAgent: string + javaMethod: string + javaMethodArgs: string + startTime: Date + duration: number + resultCode: number + resultMsg: string + resultData: string +} + +// 查询操作日志列表 +export const getOperateLogPage = (params: PageParam) => { + return request.get({ url: '/system/operate-log/page', params }) +} +// 导出操作日志 +export const exportOperateLog = (params) => { + return request.download({ url: '/system/operate-log/export', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/permission/index.ts b/grailed-ui-admin-vue3/src/api/system/permission/index.ts new file mode 100644 index 0000000..b3c7696 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/permission/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface PermissionAssignUserRoleReqVO { + userId: number + roleIds: number[] +} + +export interface PermissionAssignRoleMenuReqVO { + roleId: number + menuIds: number[] +} + +export interface PermissionAssignRoleDataScopeReqVO { + roleId: number + dataScope: number + dataScopeDeptIds: number[] +} + +// 查询角色拥有的菜单权限 +export const getRoleMenuList = async (roleId: number) => { + return await request.get({ url: '/system/permission/list-role-menus?roleId=' + roleId }) +} + +// 赋予角色菜单权限 +export const assignRoleMenu = async (data: PermissionAssignRoleMenuReqVO) => { + return await request.post({ url: '/system/permission/assign-role-menu', data }) +} + +// 赋予角色数据权限 +export const assignRoleDataScope = async (data: PermissionAssignRoleDataScopeReqVO) => { + return await request.post({ url: '/system/permission/assign-role-data-scope', data }) +} + +// 查询用户拥有的角色数组 +export const getUserRoleList = async (userId: number) => { + return await request.get({ url: '/system/permission/list-user-roles?userId=' + userId }) +} + +// 赋予用户角色 +export const assignUserRole = async (data: PermissionAssignUserRoleReqVO) => { + return await request.post({ url: '/system/permission/assign-user-role', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/role/index.ts b/grailed-ui-admin-vue3/src/api/system/role/index.ts new file mode 100644 index 0000000..93636ff --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/role/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +export interface RoleVO { + id: number + name: string + code: string + sort: number + status: number + type: number + dataScope: number + dataScopeDeptIds: number[] + createTime: Date +} + +export interface UpdateStatusReqVO { + id: number + status: number +} + +// 查询角色列表 +export const getRolePage = async (params: PageParam) => { + return await request.get({ url: '/system/role/page', params }) +} + +// 查询角色(精简)列表 +export const getSimpleRoleList = async (): Promise => { + return await request.get({ url: '/system/role/list-all-simple' }) +} + +// 查询角色详情 +export const getRole = async (id: number) => { + return await request.get({ url: '/system/role/get?id=' + id }) +} + +// 新增角色 +export const createRole = async (data: RoleVO) => { + return await request.post({ url: '/system/role/create', data }) +} + +// 修改角色 +export const updateRole = async (data: RoleVO) => { + return await request.put({ url: '/system/role/update', data }) +} + +// 修改角色状态 +export const updateRoleStatus = async (data: UpdateStatusReqVO) => { + return await request.put({ url: '/system/role/update-status', data }) +} + +// 删除角色 +export const deleteRole = async (id: number) => { + return await request.delete({ url: '/system/role/delete?id=' + id }) +} + +// 导出角色 +export const exportRole = (params) => { + return request.download({ + url: '/system/role/export-excel', + params + }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/sensitiveWord/index.ts b/grailed-ui-admin-vue3/src/api/system/sensitiveWord/index.ts new file mode 100644 index 0000000..1116226 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/sensitiveWord/index.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' +import qs from 'qs' + +export interface SensitiveWordVO { + id: number + name: string + status: number + description: string + tags: string[] + createTime: Date +} + +export interface SensitiveWordTestReqVO { + text: string + tag: string[] +} + +// 查询敏感词列表 +export const getSensitiveWordPage = (params: PageParam) => { + return request.get({ url: '/system/sensitive-word/page', params }) +} + +// 查询敏感词详情 +export const getSensitiveWord = (id: number) => { + return request.get({ url: '/system/sensitive-word/get?id=' + id }) +} + +// 新增敏感词 +export const createSensitiveWord = (data: SensitiveWordVO) => { + return request.post({ url: '/system/sensitive-word/create', data }) +} + +// 修改敏感词 +export const updateSensitiveWord = (data: SensitiveWordVO) => { + return request.put({ url: '/system/sensitive-word/update', data }) +} + +// 删除敏感词 +export const deleteSensitiveWord = (id: number) => { + return request.delete({ url: '/system/sensitive-word/delete?id=' + id }) +} + +// 导出敏感词 +export const exportSensitiveWord = (params) => { + return request.download({ url: '/system/sensitive-word/export-excel', params }) +} + +// 获取所有敏感词的标签数组 +export const getSensitiveWordTagList = () => { + return request.get({ url: '/system/sensitive-word/get-tags' }) +} + +// 获得文本所包含的不合法的敏感词数组 +export const validateText = (query: SensitiveWordTestReqVO) => { + return request.get({ + url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' }) + }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts b/grailed-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts new file mode 100644 index 0000000..f335628 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/sms/smsChannel/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface SmsChannelVO { + id: number + code: string + status: number + signature: string + remark: string + apiKey: string + apiSecret: string + callbackUrl: string + createTime: Date +} + +// 查询短信渠道列表 +export const getSmsChannelPage = (params: PageParam) => { + return request.get({ url: '/system/sms-channel/page', params }) +} + +// 获得短信渠道精简列表 +export function getSimpleSmsChannelList() { + return request.get({ url: '/system/sms-channel/list-all-simple' }) +} + +// 查询短信渠道详情 +export const getSmsChannel = (id: number) => { + return request.get({ url: '/system/sms-channel/get?id=' + id }) +} + +// 新增短信渠道 +export const createSmsChannel = (data: SmsChannelVO) => { + return request.post({ url: '/system/sms-channel/create', data }) +} + +// 修改短信渠道 +export const updateSmsChannel = (data: SmsChannelVO) => { + return request.put({ url: '/system/sms-channel/update', data }) +} + +// 删除短信渠道 +export const deleteSmsChannel = (id: number) => { + return request.delete({ url: '/system/sms-channel/delete?id=' + id }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/sms/smsLog/index.ts b/grailed-ui-admin-vue3/src/api/system/sms/smsLog/index.ts new file mode 100644 index 0000000..3d54fac --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/sms/smsLog/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface SmsLogVO { + id: number | null + channelId: number | null + channelCode: string + templateId: number | null + templateCode: string + templateType: number | null + templateContent: string + templateParams: Map | null + apiTemplateId: string + mobile: string + userId: number | null + userType: number | null + sendStatus: number | null + sendTime: Date | null + sendCode: number | null + sendMsg: string + apiSendCode: string + apiSendMsg: string + apiRequestId: string + apiSerialNo: string + receiveStatus: number | null + receiveTime: Date | null + apiReceiveCode: string + apiReceiveMsg: string + createTime: Date | null +} + +// 查询短信日志列表 +export const getSmsLogPage = (params: PageParam) => { + return request.get({ url: '/system/sms-log/page', params }) +} + +// 导出短信日志 +export const exportSmsLog = (params) => { + return request.download({ url: '/system/sms-log/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts b/grailed-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts new file mode 100644 index 0000000..35cb489 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/sms/smsTemplate/index.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' + +export interface SmsTemplateVO { + id: number | null + type: number | null + status: number + code: string + name: string + content: string + remark: string + apiTemplateId: string + channelId: number | null + channelCode?: string + params?: string[] + createTime?: Date +} + +export interface SendSmsReqVO { + mobile: string + templateCode: string + templateParams: Map +} + +// 查询短信模板列表 +export const getSmsTemplatePage = (params: PageParam) => { + return request.get({ url: '/system/sms-template/page', params }) +} + +// 查询短信模板详情 +export const getSmsTemplate = (id: number) => { + return request.get({ url: '/system/sms-template/get?id=' + id }) +} + +// 新增短信模板 +export const createSmsTemplate = (data: SmsTemplateVO) => { + return request.post({ url: '/system/sms-template/create', data }) +} + +// 修改短信模板 +export const updateSmsTemplate = (data: SmsTemplateVO) => { + return request.put({ url: '/system/sms-template/update', data }) +} + +// 删除短信模板 +export const deleteSmsTemplate = (id: number) => { + return request.delete({ url: '/system/sms-template/delete?id=' + id }) +} + +// 导出短信模板 +export const exportSmsTemplate = (params) => { + return request.download({ + url: '/system/sms-template/export-excel', + params + }) +} + +// 发送短信 +export const sendSms = (data: SendSmsReqVO) => { + return request.post({ url: '/system/sms-template/send-sms', data }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/tenant/index.ts b/grailed-ui-admin-vue3/src/api/system/tenant/index.ts new file mode 100644 index 0000000..176c375 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/tenant/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +export interface TenantVO { + id: number + name: string + contactName: string + contactMobile: string + status: number + domain: string + packageId: number + username: string + password: string + expireTime: Date + accountCount: number + createTime: Date +} + +export interface TenantPageReqVO extends PageParam { + name?: string + contactName?: string + contactMobile?: string + status?: number + createTime?: Date[] +} + +export interface TenantExportReqVO { + name?: string + contactName?: string + contactMobile?: string + status?: number + createTime?: Date[] +} + +// 查询租户列表 +export const getTenantPage = (params: TenantPageReqVO) => { + return request.get({ url: '/system/tenant/page', params }) +} + +// 查询租户详情 +export const getTenant = (id: number) => { + return request.get({ url: '/system/tenant/get?id=' + id }) +} + +// 新增租户 +export const createTenant = (data: TenantVO) => { + return request.post({ url: '/system/tenant/create', data }) +} + +// 修改租户 +export const updateTenant = (data: TenantVO) => { + return request.put({ url: '/system/tenant/update', data }) +} + +// 删除租户 +export const deleteTenant = (id: number) => { + return request.delete({ url: '/system/tenant/delete?id=' + id }) +} + +// 导出租户 +export const exportTenant = (params: TenantExportReqVO) => { + return request.download({ url: '/system/tenant/export-excel', params }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/tenantPackage/index.ts b/grailed-ui-admin-vue3/src/api/system/tenantPackage/index.ts new file mode 100644 index 0000000..01d139e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/tenantPackage/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface TenantPackageVO { + id: number + name: string + status: number + remark: string + creator: string + updater: string + updateTime: string + menuIds: number[] + createTime: Date +} + +// 查询租户套餐列表 +export const getTenantPackagePage = (params: PageParam) => { + return request.get({ url: '/system/tenant-package/page', params }) +} + +// 获得租户 +export const getTenantPackage = (id: number) => { + return request.get({ url: '/system/tenant-package/get?id=' + id }) +} + +// 新增租户套餐 +export const createTenantPackage = (data: TenantPackageVO) => { + return request.post({ url: '/system/tenant-package/create', data }) +} + +// 修改租户套餐 +export const updateTenantPackage = (data: TenantPackageVO) => { + return request.put({ url: '/system/tenant-package/update', data }) +} + +// 删除租户套餐 +export const deleteTenantPackage = (id: number) => { + return request.delete({ url: '/system/tenant-package/delete?id=' + id }) +} +// 获取租户套餐精简信息列表 +export const getTenantPackageList = () => { + return request.get({ url: '/system/tenant-package/get-simple-list' }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/translatorDeepl/translatorDeepl.js b/grailed-ui-admin-vue3/src/api/system/translatorDeepl/translatorDeepl.js new file mode 100644 index 0000000..6b263be --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/translatorDeepl/translatorDeepl.js @@ -0,0 +1,73 @@ +import request from '@/config/axios' + + +// 创建语言转换 +export const createTranslatorDeepl = (params) => { + return request.get({ url: '/system/translator-deepl/create', params }) +} + + +// // 创建语言转换 +// export function createTranslatorDeepl(data) { +// return request({ +// url: '/system/translator-deepl/create', +// method: 'post', +// data: data +// }) +// } + +// 更新语言转换 +export function updateTranslatorDeepl(data) { + return request.put({ + url: '/system/translator-deepl/update', + method: 'put', + data: data + }) +} + +// 删除语言转换 +export function deleteTranslatorDeepl(id) { + return request.delete({ + url: '/system/translator-deepl/delete?id=' + id, + method: 'delete' + }) +} + +// 获得语言转换 +export function getTranslatorDeepl(id) { + return request.get({ + url: '/system/translator-deepl/get?id=' + id, + method: 'get' + }) +} + + +// // 创建语言转换 +// export const getTranslatorDeeplPage = (params) => { +// return request.get({ url: '/system/translator-deepl/page', params }) +// } + +// 获得语言转换分页 +export function getTranslatorDeeplPage(query) { + return request.get({ + url: '/system/translator-deepl/page', + method: 'get', + params: query + }) +} + +// 导出语言转换 Excel +export function exportTranslatorDeeplExcel(query) { + return request.get({ + url: '/system/translator-deepl/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} + + + + + + diff --git a/grailed-ui-admin-vue3/src/api/system/user/index.ts b/grailed-ui-admin-vue3/src/api/system/user/index.ts new file mode 100644 index 0000000..6224f0e --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/user/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +export interface UserVO { + id: number + username: string + nickname: string + deptId: number + postIds: string[] + email: string + mobile: string + sex: number + avatar: string + loginIp: string + status: number + remark: string + loginDate: Date + createTime: Date +} + +// 查询用户管理列表 +export const getUserPage = (params: PageParam) => { + return request.get({ url: '/system/user/page', params }) +} + +// 查询用户详情 +export const getUser = (id: number) => { + return request.get({ url: '/system/user/get?id=' + id }) +} + +// 新增用户 +export const createUser = (data: UserVO) => { + return request.post({ url: '/system/user/create', data }) +} + +// 修改用户 +export const updateUser = (data: UserVO) => { + return request.put({ url: '/system/user/update', data }) +} + +// 删除用户 +export const deleteUser = (id: number) => { + return request.delete({ url: '/system/user/delete?id=' + id }) +} + +// 导出用户 +export const exportUser = (params) => { + return request.download({ url: '/system/user/export', params }) +} + +// 下载用户导入模板 +export const importUserTemplate = () => { + return request.download({ url: '/system/user/get-import-template' }) +} + +// 用户密码重置 +export const resetUserPwd = (id: number, password: string) => { + const data = { + id, + password + } + return request.put({ url: '/system/user/update-password', data: data }) +} + +// 用户状态修改 +export const updateUserStatus = (id: number, status: number) => { + const data = { + id, + status + } + return request.put({ url: '/system/user/update-status', data: data }) +} + +// 获取用户精简信息列表 +export const getSimpleUserList = (): Promise => { + return request.get({ url: '/system/user/list-all-simple' }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/user/profile.ts b/grailed-ui-admin-vue3/src/api/system/user/profile.ts new file mode 100644 index 0000000..b2623c8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/user/profile.ts @@ -0,0 +1,77 @@ +import request from '@/config/axios' + +export interface ProfileDept { + id: number + name: string +} +export interface ProfileRole { + id: number + name: string +} +export interface ProfilePost { + id: number + name: string +} +export interface SocialUser { + id: number + type: number + openid: string + token: string + rawTokenInfo: string + nickname: string + avatar: string + rawUserInfo: string + code: string + state: string +} +export interface ProfileVO { + id: number + username: string + nickname: string + dept: ProfileDept + roles: ProfileRole[] + posts: ProfilePost[] + socialUsers: SocialUser[] + email: string + mobile: string + sex: number + avatar: string + status: number + remark: string + loginIp: string + loginDate: Date + createTime: Date +} + +export interface UserProfileUpdateReqVO { + nickname: string + email: string + mobile: string + sex: number +} + +// 查询用户个人信息 +export const getUserProfile = () => { + return request.get({ url: '/system/user/profile/get' }) +} + +// 修改用户个人信息 +export const updateUserProfile = (data: UserProfileUpdateReqVO) => { + return request.put({ url: '/system/user/profile/update', data }) +} + +// 用户密码重置 +export const updateUserPassword = (oldPassword: string, newPassword: string) => { + return request.put({ + url: '/system/user/profile/update-password', + data: { + oldPassword: oldPassword, + newPassword: newPassword + } + }) +} + +// 用户头像上传 +export const uploadAvatar = (data) => { + return request.upload({ url: '/system/user/profile/update-avatar', data: data }) +} diff --git a/grailed-ui-admin-vue3/src/api/system/user/socialUser.ts b/grailed-ui-admin-vue3/src/api/system/user/socialUser.ts new file mode 100644 index 0000000..79f4d40 --- /dev/null +++ b/grailed-ui-admin-vue3/src/api/system/user/socialUser.ts @@ -0,0 +1,31 @@ +import request from '@/config/axios' + +// 社交绑定,使用 code 授权码 +export const socialBind = (type, code, state) => { + return request.post({ + url: '/system/social-user/bind', + data: { + type, + code, + state + } + }) +} + +// 取消社交绑定 +export const socialUnbind = (type, openid) => { + return request.delete({ + url: '/system/social-user/unbind', + data: { + type, + openid + } + }) +} + +// 社交授权的跳转 +export const socialAuthRedirect = (type, redirectUri) => { + return request.get({ + url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri + }) +} diff --git a/grailed-ui-admin-vue3/src/assets/audio/Notify.mp3 b/grailed-ui-admin-vue3/src/assets/audio/Notify.mp3 new file mode 100644 index 0000000..32de194 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/audio/Notify.mp3 differ diff --git a/grailed-ui-admin-vue3/src/assets/audio/newMsgNotify.mp3 b/grailed-ui-admin-vue3/src/assets/audio/newMsgNotify.mp3 new file mode 100644 index 0000000..e2a1173 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/audio/newMsgNotify.mp3 differ diff --git a/grailed-ui-admin-vue3/src/assets/audio/recharte_notify.mp3 b/grailed-ui-admin-vue3/src/assets/audio/recharte_notify.mp3 new file mode 100644 index 0000000..1c221f6 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/audio/recharte_notify.mp3 differ diff --git a/grailed-ui-admin-vue3/src/assets/audio/withdrawal_notify.mp3 b/grailed-ui-admin-vue3/src/assets/audio/withdrawal_notify.mp3 new file mode 100644 index 0000000..1d809f0 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/audio/withdrawal_notify.mp3 differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/avatar.gif b/grailed-ui-admin-vue3/src/assets/imgs/avatar.gif new file mode 100644 index 0000000..fdbd32c Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/avatar.gif differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/avatar.jpg b/grailed-ui-admin-vue3/src/assets/imgs/avatar.jpg new file mode 100644 index 0000000..d46a70a Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/avatar.jpg differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/logo.png b/grailed-ui-admin-vue3/src/assets/imgs/logo.png new file mode 100644 index 0000000..386805f Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/logo.png differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/logo2.png b/grailed-ui-admin-vue3/src/assets/imgs/logo2.png new file mode 100644 index 0000000..f4de9ac Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/logo2.png differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/profile.jpg b/grailed-ui-admin-vue3/src/assets/imgs/profile.jpg new file mode 100644 index 0000000..e4bcf87 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/profile.jpg differ diff --git a/grailed-ui-admin-vue3/src/assets/imgs/wechat.png b/grailed-ui-admin-vue3/src/assets/imgs/wechat.png new file mode 100644 index 0000000..6afc5e4 Binary files /dev/null and b/grailed-ui-admin-vue3/src/assets/imgs/wechat.png differ diff --git a/grailed-ui-admin-vue3/src/assets/svgs/403.svg b/grailed-ui-admin-vue3/src/assets/svgs/403.svg new file mode 100644 index 0000000..4500596 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/403.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/assets/svgs/404.svg b/grailed-ui-admin-vue3/src/assets/svgs/404.svg new file mode 100644 index 0000000..5244d8d --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/assets/svgs/500.svg b/grailed-ui-admin-vue3/src/assets/svgs/500.svg new file mode 100644 index 0000000..9c02092 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/500.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/assets/svgs/icon.svg b/grailed-ui-admin-vue3/src/assets/svgs/icon.svg new file mode 100644 index 0000000..0866e24 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/icon.svg @@ -0,0 +1,3 @@ +; + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/login-bg.svg b/grailed-ui-admin-vue3/src/assets/svgs/login-bg.svg new file mode 100644 index 0000000..a999b43 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/login-bg.svg @@ -0,0 +1,7 @@ +; + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/login-box-bg.svg b/grailed-ui-admin-vue3/src/assets/svgs/login-box-bg.svg new file mode 100644 index 0000000..ab10040 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/login-box-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/assets/svgs/message.svg b/grailed-ui-admin-vue3/src/assets/svgs/message.svg new file mode 100644 index 0000000..37ac2a7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/message.svg @@ -0,0 +1,3 @@ +; + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/money.svg b/grailed-ui-admin-vue3/src/assets/svgs/money.svg new file mode 100644 index 0000000..5640193 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/money.svg @@ -0,0 +1,3 @@ +; + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/peoples.svg b/grailed-ui-admin-vue3/src/assets/svgs/peoples.svg new file mode 100644 index 0000000..eacaf94 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/peoples.svg @@ -0,0 +1,4 @@ +; + + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/shopping.svg b/grailed-ui-admin-vue3/src/assets/svgs/shopping.svg new file mode 100644 index 0000000..6dedcf0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/shopping.svg @@ -0,0 +1,3 @@ +; + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/speaker-wave.svg b/grailed-ui-admin-vue3/src/assets/svgs/speaker-wave.svg new file mode 100644 index 0000000..804f3f6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/speaker-wave.svg @@ -0,0 +1,3 @@ + + + diff --git a/grailed-ui-admin-vue3/src/assets/svgs/speaker-x-mark.svg b/grailed-ui-admin-vue3/src/assets/svgs/speaker-x-mark.svg new file mode 100644 index 0000000..e98295a --- /dev/null +++ b/grailed-ui-admin-vue3/src/assets/svgs/speaker-x-mark.svg @@ -0,0 +1,3 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Backtop/index.ts b/grailed-ui-admin-vue3/src/components/Backtop/index.ts new file mode 100644 index 0000000..96de88d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Backtop/index.ts @@ -0,0 +1,3 @@ +import Backtop from './src/Backtop.vue' + +export { Backtop } diff --git a/grailed-ui-admin-vue3/src/components/Backtop/src/Backtop.vue b/grailed-ui-admin-vue3/src/components/Backtop/src/Backtop.vue new file mode 100644 index 0000000..5d79f51 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Backtop/src/Backtop.vue @@ -0,0 +1,17 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/ConfigGlobal/index.ts b/grailed-ui-admin-vue3/src/components/ConfigGlobal/index.ts new file mode 100644 index 0000000..dda2462 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ConfigGlobal/index.ts @@ -0,0 +1,3 @@ +import ConfigGlobal from './src/ConfigGlobal.vue' + +export { ConfigGlobal } diff --git a/grailed-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue b/grailed-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue new file mode 100644 index 0000000..a087396 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ConfigGlobal/src/ConfigGlobal.vue @@ -0,0 +1,63 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/ContentDetailWrap/index.ts b/grailed-ui-admin-vue3/src/components/ContentDetailWrap/index.ts new file mode 100644 index 0000000..1871cac --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ContentDetailWrap/index.ts @@ -0,0 +1,3 @@ +import ContentDetailWrap from './src/ContentDetailWrap.vue' + +export { ContentDetailWrap } diff --git a/grailed-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue b/grailed-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue new file mode 100644 index 0000000..a9eacc0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ContentDetailWrap/src/ContentDetailWrap.vue @@ -0,0 +1,58 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/ContentWrap/index.ts b/grailed-ui-admin-vue3/src/components/ContentWrap/index.ts new file mode 100644 index 0000000..8c22cc8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ContentWrap/index.ts @@ -0,0 +1,3 @@ +import ContentWrap from './src/ContentWrap.vue' + +export { ContentWrap } diff --git a/grailed-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue b/grailed-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue new file mode 100644 index 0000000..e3bd597 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ContentWrap/src/ContentWrap.vue @@ -0,0 +1,34 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/CountTo/index.ts b/grailed-ui-admin-vue3/src/components/CountTo/index.ts new file mode 100644 index 0000000..2119f02 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/CountTo/index.ts @@ -0,0 +1,3 @@ +import CountTo from './src/CountTo.vue' + +export { CountTo } diff --git a/grailed-ui-admin-vue3/src/components/CountTo/src/CountTo.vue b/grailed-ui-admin-vue3/src/components/CountTo/src/CountTo.vue new file mode 100644 index 0000000..1b1131a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/CountTo/src/CountTo.vue @@ -0,0 +1,182 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Crontab/index.ts b/grailed-ui-admin-vue3/src/components/Crontab/index.ts new file mode 100644 index 0000000..6beeef8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Crontab/index.ts @@ -0,0 +1,2 @@ +import Crontab from './src/Crontab.vue' +export { Crontab } diff --git a/grailed-ui-admin-vue3/src/components/Crontab/src/Crontab.vue b/grailed-ui-admin-vue3/src/components/Crontab/src/Crontab.vue new file mode 100644 index 0000000..90b40b2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Crontab/src/Crontab.vue @@ -0,0 +1,1011 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/components/Cropper/index.ts b/grailed-ui-admin-vue3/src/components/Cropper/index.ts new file mode 100644 index 0000000..8fcc618 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Cropper/index.ts @@ -0,0 +1,4 @@ +import CropperImage from './src/Cropper.vue' +import CropperAvatar from './src/CropperAvatar.vue' + +export { CropperImage, CropperAvatar } diff --git a/grailed-ui-admin-vue3/src/components/Cropper/src/CopperModal.vue b/grailed-ui-admin-vue3/src/components/Cropper/src/CopperModal.vue new file mode 100644 index 0000000..27052b8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Cropper/src/CopperModal.vue @@ -0,0 +1,261 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Cropper/src/Cropper.vue b/grailed-ui-admin-vue3/src/components/Cropper/src/Cropper.vue new file mode 100644 index 0000000..871aed8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Cropper/src/Cropper.vue @@ -0,0 +1,183 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Cropper/src/CropperAvatar.vue b/grailed-ui-admin-vue3/src/components/Cropper/src/CropperAvatar.vue new file mode 100644 index 0000000..8886c4e --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Cropper/src/CropperAvatar.vue @@ -0,0 +1,140 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Cropper/src/types.ts b/grailed-ui-admin-vue3/src/components/Cropper/src/types.ts new file mode 100644 index 0000000..bcad3b4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Cropper/src/types.ts @@ -0,0 +1,8 @@ +import type Cropper from 'cropperjs' + +export interface CropendResult { + imgBase64: string + imgInfo: Cropper.Data +} + +export type { Cropper } diff --git a/grailed-ui-admin-vue3/src/components/Descriptions/index.ts b/grailed-ui-admin-vue3/src/components/Descriptions/index.ts new file mode 100644 index 0000000..91b0eb4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Descriptions/index.ts @@ -0,0 +1,3 @@ +import Descriptions from './src/Descriptions.vue' + +export { Descriptions } diff --git a/grailed-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue b/grailed-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue new file mode 100644 index 0000000..06e1096 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Descriptions/src/Descriptions.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/Dialog/index.ts b/grailed-ui-admin-vue3/src/components/Dialog/index.ts new file mode 100644 index 0000000..1655dad --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Dialog/index.ts @@ -0,0 +1,3 @@ +import Dialog from './src/Dialog.vue' + +export { Dialog } diff --git a/grailed-ui-admin-vue3/src/components/Dialog/src/Dialog.vue b/grailed-ui-admin-vue3/src/components/Dialog/src/Dialog.vue new file mode 100644 index 0000000..ea9caf9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Dialog/src/Dialog.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/DictTag/index.ts b/grailed-ui-admin-vue3/src/components/DictTag/index.ts new file mode 100644 index 0000000..4db2742 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/DictTag/index.ts @@ -0,0 +1,3 @@ +import DictTag from './src/DictTag.vue' + +export { DictTag } diff --git a/grailed-ui-admin-vue3/src/components/DictTag/src/DictTag.vue b/grailed-ui-admin-vue3/src/components/DictTag/src/DictTag.vue new file mode 100644 index 0000000..db37f71 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/DictTag/src/DictTag.vue @@ -0,0 +1,60 @@ + diff --git a/grailed-ui-admin-vue3/src/components/DocAlert/index.vue b/grailed-ui-admin-vue3/src/components/DocAlert/index.vue new file mode 100644 index 0000000..3a3feab --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/DocAlert/index.vue @@ -0,0 +1,34 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Echart/index.ts b/grailed-ui-admin-vue3/src/components/Echart/index.ts new file mode 100644 index 0000000..4822092 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Echart/index.ts @@ -0,0 +1,3 @@ +import Echart from './src/Echart.vue' + +export { Echart } diff --git a/grailed-ui-admin-vue3/src/components/Echart/src/Echart.vue b/grailed-ui-admin-vue3/src/components/Echart/src/Echart.vue new file mode 100644 index 0000000..fd3342d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Echart/src/Echart.vue @@ -0,0 +1,115 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Editor/index.ts b/grailed-ui-admin-vue3/src/components/Editor/index.ts new file mode 100644 index 0000000..3fbf0a9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Editor/index.ts @@ -0,0 +1,8 @@ +import Editor from './src/Editor.vue' +import { IDomEditor } from '@wangeditor/editor' + +export interface EditorExpose { + getEditorRef: () => Promise +} + +export { Editor } diff --git a/grailed-ui-admin-vue3/src/components/Editor/src/Editor.vue b/grailed-ui-admin-vue3/src/components/Editor/src/Editor.vue new file mode 100644 index 0000000..d972552 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Editor/src/Editor.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/Error/index.ts b/grailed-ui-admin-vue3/src/components/Error/index.ts new file mode 100644 index 0000000..a52c6f9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Error/index.ts @@ -0,0 +1,3 @@ +import Error from './src/Error.vue' + +export { Error } diff --git a/grailed-ui-admin-vue3/src/components/Error/src/Error.vue b/grailed-ui-admin-vue3/src/components/Error/src/Error.vue new file mode 100644 index 0000000..3fd7a17 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Error/src/Error.vue @@ -0,0 +1,58 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Form/index.ts b/grailed-ui-admin-vue3/src/components/Form/index.ts new file mode 100644 index 0000000..484c7a2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/index.ts @@ -0,0 +1,15 @@ +import Form from './src/Form.vue' +import { ElForm } from 'element-plus' +import { FormSchema, FormSetPropsType } from '@/types/form' + +export interface FormExpose { + setValues: (data: Recordable) => void + setProps: (props: Recordable) => void + delSchema: (field: string) => void + addSchema: (formSchema: FormSchema, index?: number) => void + setSchema: (schemaProps: FormSetPropsType[]) => void + formModel: Recordable + getElFormRef: () => ComponentRef +} + +export { Form } diff --git a/grailed-ui-admin-vue3/src/components/Form/src/Form.vue b/grailed-ui-admin-vue3/src/components/Form/src/Form.vue new file mode 100644 index 0000000..9742bab --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/Form.vue @@ -0,0 +1,307 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Form/src/componentMap.ts b/grailed-ui-admin-vue3/src/components/Form/src/componentMap.ts new file mode 100644 index 0000000..5af9b40 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/componentMap.ts @@ -0,0 +1,55 @@ +import type { Component } from 'vue' +import { + ElCascader, + ElCheckboxGroup, + ElColorPicker, + ElDatePicker, + ElInput, + ElInputNumber, + ElRadioGroup, + ElRate, + ElSelect, + ElSelectV2, + ElTreeSelect, + ElSlider, + ElSwitch, + ElTimePicker, + ElTimeSelect, + ElTransfer, + ElAutocomplete, + ElDivider +} from 'element-plus' +import { InputPassword } from '@/components/InputPassword' +import { Editor } from '@/components/Editor' +import { UploadImg, UploadImgs, UploadFile } from '@/components/UploadFile' +import { ComponentName } from '@/types/components' + +const componentMap: Recordable = { + Radio: ElRadioGroup, + Checkbox: ElCheckboxGroup, + CheckboxButton: ElCheckboxGroup, + Input: ElInput, + Autocomplete: ElAutocomplete, + InputNumber: ElInputNumber, + Select: ElSelect, + Cascader: ElCascader, + Switch: ElSwitch, + Slider: ElSlider, + TimePicker: ElTimePicker, + DatePicker: ElDatePicker, + Rate: ElRate, + ColorPicker: ElColorPicker, + Transfer: ElTransfer, + Divider: ElDivider, + TimeSelect: ElTimeSelect, + SelectV2: ElSelectV2, + TreeSelect: ElTreeSelect, + RadioButton: ElRadioGroup, + InputPassword: InputPassword, + Editor: Editor, + UploadImg: UploadImg, + UploadImgs: UploadImgs, + UploadFile: UploadFile +} + +export { componentMap } diff --git a/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx new file mode 100644 index 0000000..e151839 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderCheckbox.tsx @@ -0,0 +1,26 @@ +import { FormSchema } from '@/types/form' +import { ElCheckbox, ElCheckboxButton } from 'element-plus' +import { defineComponent } from 'vue' + +export const useRenderCheckbox = () => { + const renderCheckboxOptions = (item: FormSchema) => { + // 如果有别名,就取别名 + const labelAlias = item?.componentProps?.optionsAlias?.labelField + const valueAlias = item?.componentProps?.optionsAlias?.valueField + const Com = (item.component === 'Checkbox' ? ElCheckbox : ElCheckboxButton) as ReturnType< + typeof defineComponent + > + return item?.componentProps?.options?.map((option) => { + const { ...other } = option + return ( + + {option[labelAlias || 'label']} + + ) + }) + } + + return { + renderCheckboxOptions + } +} diff --git a/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx new file mode 100644 index 0000000..d1005ca --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderRadio.tsx @@ -0,0 +1,26 @@ +import { FormSchema } from '@/types/form' +import { ElRadio, ElRadioButton } from 'element-plus' +import { defineComponent } from 'vue' + +export const useRenderRadio = () => { + const renderRadioOptions = (item: FormSchema) => { + // 如果有别名,就取别名 + const labelAlias = item?.componentProps?.optionsAlias?.labelField + const valueAlias = item?.componentProps?.optionsAlias?.valueField + const Com = (item.component === 'Radio' ? ElRadio : ElRadioButton) as ReturnType< + typeof defineComponent + > + return item?.componentProps?.options?.map((option) => { + const { ...other } = option + return ( + + {option[labelAlias || 'label']} + + ) + }) + } + + return { + renderRadioOptions + } +} diff --git a/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx new file mode 100644 index 0000000..59b72e6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/components/useRenderSelect.tsx @@ -0,0 +1,57 @@ +import { FormSchema } from '@/types/form' +import { ComponentOptions } from '@/types/components' +import { ElOption, ElOptionGroup } from 'element-plus' +import { getSlot } from '@/utils/tsxHelper' +import { Slots } from 'vue' + +export const useRenderSelect = (slots: Slots) => { + // 渲染 select options + const renderSelectOptions = (item: FormSchema) => { + // 如果有别名,就取别名 + const labelAlias = item?.componentProps?.optionsAlias?.labelField + return item?.componentProps?.options?.map((option) => { + if (option?.options?.length) { + return ( + + {() => { + return option?.options?.map((v) => { + return renderSelectOptionItem(item, v) + }) + }} + + ) + } else { + return renderSelectOptionItem(item, option) + } + }) + } + + // 渲染 select option item + const renderSelectOptionItem = (item: FormSchema, option: ComponentOptions) => { + // 如果有别名,就取别名 + const labelAlias = item?.componentProps?.optionsAlias?.labelField + const valueAlias = item?.componentProps?.optionsAlias?.valueField + + const { label, value, ...other } = option + + return ( + + {{ + default: () => + // option 插槽名规则,{field}-option + item?.componentProps?.optionsSlot + ? getSlot(slots, `${item.field}-option`, { item: option }) + : undefined + }} + + ) + } + + return { + renderSelectOptions + } +} diff --git a/grailed-ui-admin-vue3/src/components/Form/src/helper.ts b/grailed-ui-admin-vue3/src/components/Form/src/helper.ts new file mode 100644 index 0000000..cdfc8ca --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/helper.ts @@ -0,0 +1,148 @@ +import type { Slots } from 'vue' +import { getSlot } from '@/utils/tsxHelper' +import { PlaceholderModel } from './types' +import { FormSchema } from '@/types/form' +import { ColProps } from '@/types/components' + +/** + * + * @param schema 对应组件数据 + * @returns 返回提示信息对象 + * @description 用于自动设置placeholder + */ +export const setTextPlaceholder = (schema: FormSchema): PlaceholderModel => { + const { t } = useI18n() + const textMap = ['Input', 'Autocomplete', 'InputNumber', 'InputPassword'] + const selectMap = ['Select', 'SelectV2', 'TimePicker', 'DatePicker', 'TimeSelect', 'TimeSelect'] + if (textMap.includes(schema?.component as string)) { + return { + placeholder: t('common.inputText') + schema.label + } + } + if (selectMap.includes(schema?.component as string)) { + // 一些范围选择器 + const twoTextMap = ['datetimerange', 'daterange', 'monthrange', 'datetimerange', 'daterange'] + if ( + twoTextMap.includes( + (schema?.componentProps?.type || schema?.componentProps?.isRange) as string + ) + ) { + return { + startPlaceholder: t('common.startTimeText'), + endPlaceholder: t('common.endTimeText'), + rangeSeparator: '-' + } + } else { + return { + placeholder: t('common.selectText') + schema.label + } + } + } + return {} +} + +/** + * + * @param col 内置栅格 + * @returns 返回栅格属性 + * @description 合并传入进来的栅格属性 + */ +export const setGridProp = (col: ColProps = {}): ColProps => { + const colProps: ColProps = { + // 如果有span,代表用户优先级更高,所以不需要默认栅格 + ...(col.span + ? {} + : { + xs: 24, + sm: 12, + md: 12, + lg: 12, + xl: 12 + }), + ...col + } + return colProps +} + +/** + * + * @param item 传入的组件属性 + * @returns 默认添加 clearable 属性 + */ +export const setComponentProps = (item: FormSchema): Recordable => { + const notNeedClearable = ['ColorPicker'] + const componentProps: Recordable = notNeedClearable.includes(item.component as string) + ? { ...item.componentProps } + : { + clearable: true, + ...item.componentProps + } + // 需要删除额外的属性 + delete componentProps?.slots + return componentProps +} + +/** + * + * @param slots 插槽 + * @param slotsProps 插槽属性 + * @param field 字段名 + */ +export const setItemComponentSlots = ( + slots: Slots, + slotsProps: Recordable = {}, + field: string +): Recordable => { + const slotObj: Recordable = {} + for (const key in slotsProps) { + if (slotsProps[key]) { + // 由于组件有可能重复,需要有一个唯一的前缀 + slotObj[key] = (data: Recordable) => { + return getSlot(slots, `${field}-${key}`, data) + } + } + } + return slotObj +} + +/** + * + * @param schema Form表单结构化数组 + * @param formModel FormModel + * @returns FormModel + * @description 生成对应的formModel + */ +export const initModel = (schema: FormSchema[], formModel: Recordable) => { + const model: Recordable = { ...formModel } + schema.map((v) => { + // 如果是hidden,就删除对应的值 + if (v.hidden) { + delete model[v.field] + } else if (v.component && v.component !== 'Divider') { + const hasField = Reflect.has(model, v.field) + // 如果先前已经有值存在,则不进行重新赋值,而是采用现有的值 + model[v.field] = hasField ? model[v.field] : v.value !== void 0 ? v.value : '' + } + }) + return model +} + +/** + * @param slots 插槽 + * @param field 字段名 + * @returns 返回FormIiem插槽 + */ +export const setFormItemSlots = (slots: Slots, field: string): Recordable => { + const slotObj: Recordable = {} + if (slots[`${field}-error`]) { + slotObj['error'] = (data: Recordable) => { + return getSlot(slots, `${field}-error`, data) + } + } + if (slots[`${field}-label`]) { + slotObj['label'] = (data: Recordable) => { + return getSlot(slots, `${field}-label`, data) + } + } + return slotObj +} diff --git a/grailed-ui-admin-vue3/src/components/Form/src/types.ts b/grailed-ui-admin-vue3/src/components/Form/src/types.ts new file mode 100644 index 0000000..dcd01e7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Form/src/types.ts @@ -0,0 +1,17 @@ +import { FormSchema } from '@/types/form' + +export interface PlaceholderModel { + placeholder?: string + startPlaceholder?: string + endPlaceholder?: string + rangeSeparator?: string +} + +export type FormProps = { + schema?: FormSchema[] + isCol?: boolean + model?: Recordable + autoSetPlaceholder?: boolean + isCustom?: boolean + labelWidth?: string | number +} & Recordable diff --git a/grailed-ui-admin-vue3/src/components/Highlight/index.ts b/grailed-ui-admin-vue3/src/components/Highlight/index.ts new file mode 100644 index 0000000..3e2d9ed --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Highlight/index.ts @@ -0,0 +1,3 @@ +import Highlight from './src/Highlight.vue' + +export { Highlight } diff --git a/grailed-ui-admin-vue3/src/components/Highlight/src/Highlight.vue b/grailed-ui-admin-vue3/src/components/Highlight/src/Highlight.vue new file mode 100644 index 0000000..ef923a9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Highlight/src/Highlight.vue @@ -0,0 +1,65 @@ + diff --git a/grailed-ui-admin-vue3/src/components/IFrame/index.ts b/grailed-ui-admin-vue3/src/components/IFrame/index.ts new file mode 100644 index 0000000..9f8cf24 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/IFrame/index.ts @@ -0,0 +1,3 @@ +import IFrame from './src/IFrame.vue' + +export { IFrame } diff --git a/grailed-ui-admin-vue3/src/components/IFrame/src/IFrame.vue b/grailed-ui-admin-vue3/src/components/IFrame/src/IFrame.vue new file mode 100644 index 0000000..19de51a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/IFrame/src/IFrame.vue @@ -0,0 +1,32 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/Icon/index.ts b/grailed-ui-admin-vue3/src/components/Icon/index.ts new file mode 100644 index 0000000..33d1de3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Icon/index.ts @@ -0,0 +1,4 @@ +import Icon from './src/Icon.vue' +import IconSelect from './src/IconSelect.vue' + +export { Icon, IconSelect } diff --git a/grailed-ui-admin-vue3/src/components/Icon/src/Icon.vue b/grailed-ui-admin-vue3/src/components/Icon/src/Icon.vue new file mode 100644 index 0000000..00dfa5d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Icon/src/Icon.vue @@ -0,0 +1,85 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Icon/src/IconSelect.vue b/grailed-ui-admin-vue3/src/components/Icon/src/IconSelect.vue new file mode 100644 index 0000000..d6ae6e6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Icon/src/IconSelect.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/Icon/src/data.ts b/grailed-ui-admin-vue3/src/components/Icon/src/data.ts new file mode 100644 index 0000000..2a4ed5a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Icon/src/data.ts @@ -0,0 +1,1961 @@ +export const IconJson = { + 'ep:': [ + 'add-location', + 'aim', + 'alarm-clock', + 'apple', + 'arrow-down', + 'arrow-down-bold', + 'arrow-left', + 'arrow-left-bold', + 'arrow-right', + 'arrow-right-bold', + 'arrow-up', + 'arrow-up-bold', + 'avatar', + 'back', + 'baseball', + 'basketball', + 'bell', + 'bell-filled', + 'bicycle', + 'bottom', + 'bottom-left', + 'bottom-right', + 'bowl', + 'box', + 'briefcase', + 'brush', + 'brush-filled', + 'burger', + 'calendar', + 'camera', + 'camera-filled', + 'caret-bottom', + 'caret-left', + 'caret-right', + 'caret-top', + 'cellphone', + 'chat-dot-round', + 'chat-dot-square', + 'chat-line-round', + 'chat-line-square', + 'chat-round', + 'chat-square', + 'check', + 'checked', + 'cherry', + 'chicken', + 'circle-check', + 'circle-check-filled', + 'circle-close', + 'circle-close-filled', + 'circle-plus', + 'circle-plus-filled', + 'clock', + 'close', + 'close-bold', + 'cloudy', + 'coffee', + 'coffee-cup', + 'coin', + 'cold-drink', + 'collection', + 'collection-tag', + 'comment', + 'compass', + 'connection', + 'coordinate', + 'copy-document', + 'cpu', + 'credit-card', + 'crop', + 'd-arrow-left', + 'd-arrow-right', + 'd-caret', + 'data-analysis', + 'data-board', + 'data-line', + 'delete', + 'delete-filled', + 'delete-location', + 'dessert', + 'discount', + 'dish', + 'dish-dot', + 'document', + 'document-add', + 'document-checked', + 'document-copy', + 'document-delete', + 'document-remove', + 'download', + 'drizzling', + 'edit', + 'edit-pen', + 'eleme', + 'eleme-filled', + 'expand', + 'failed', + 'female', + 'files', + 'film', + 'filter', + 'finished', + 'first-aid-kit', + 'flag', + 'fold', + 'folder', + 'folder-add', + 'folder-checked', + 'folder-delete', + 'folder-opened', + 'folder-remove', + 'food', + 'football', + 'fork-spoon', + 'fries', + 'full-screen', + 'goblet', + 'goblet-full', + 'goblet-square', + 'goblet-square-full', + 'goods', + 'goods-filled', + 'grape', + 'grid', + 'guide', + 'headset', + 'help', + 'help-filled', + 'histogram', + 'home-filled', + 'hot-water', + 'house', + 'ice-cream', + 'ice-cream-round', + 'ice-cream-square', + 'ice-drink', + 'ice-tea', + 'info-filled', + 'iphone', + 'key', + 'knife-fork', + 'lightning', + 'link', + 'list', + 'loading', + 'location', + 'location-filled', + 'location-information', + 'lock', + 'lollipop', + 'magic-stick', + 'magnet', + 'male', + 'management', + 'map-location', + 'medal', + 'menu', + 'message', + 'message-box', + 'mic', + 'microphone', + 'milk-tea', + 'minus', + 'money', + 'monitor', + 'moon', + 'moon-night', + 'more', + 'more-filled', + 'mostly-cloudy', + 'mouse', + 'mug', + 'mute', + 'mute-notification', + 'no-smoking', + 'notebook', + 'notification', + 'odometer', + 'office-building', + 'open', + 'operation', + 'opportunity', + 'orange', + 'paperclip', + 'partly-cloudy', + 'pear', + 'phone', + 'phone-filled', + 'picture', + 'picture-filled', + 'picture-rounded', + 'pie-chart', + 'place', + 'platform', + 'plus', + 'pointer', + 'position', + 'postcard', + 'pouring', + 'present', + 'price-tag', + 'printer', + 'promotion', + 'question-filled', + 'rank', + 'reading', + 'reading-lamp', + 'refresh', + 'refresh-left', + 'refresh-right', + 'refrigerator', + 'remove', + 'remove-filled', + 'right', + 'scale-to-original', + 'school', + 'scissor', + 'search', + 'select', + 'sell', + 'semi-select', + 'service', + 'set-up', + 'setting', + 'share', + 'ship', + 'shop', + 'shopping-bag', + 'shopping-cart', + 'shopping-cart-full', + 'smoking', + 'soccer', + 'sold-out', + 'sort', + 'sort-down', + 'sort-up', + 'stamp', + 'star', + 'star-filled', + 'stopwatch', + 'success-filled', + 'sugar', + 'suitcase', + 'sunny', + 'sunrise', + 'sunset', + 'switch', + 'switch-button', + 'takeaway-box', + 'ticket', + 'tickets', + 'timer', + 'toilet-paper', + 'tools', + 'top', + 'top-left', + 'top-right', + 'trend-charts', + 'trophy', + 'turn-off', + 'umbrella', + 'unlock', + 'upload', + 'upload-filled', + 'user', + 'user-filled', + 'van', + 'video-camera', + 'video-camera-filled', + 'video-pause', + 'video-play', + 'view', + 'wallet', + 'wallet-filled', + 'warning', + 'warning-filled', + 'watch', + 'watermelon', + 'wind-power', + 'zoom-in', + 'zoom-out' + ], + 'fa:': [ + '500px', + 'address-book', + 'address-book-o', + 'address-card', + 'address-card-o', + 'adjust', + 'adn', + 'align-center', + 'align-justify', + 'align-left', + 'amazon', + 'ambulance', + 'american-sign-language-interpreting', + 'anchor', + 'android', + 'angellist', + 'angle-double-left', + 'angle-double-up', + 'angle-down', + 'angle-left', + 'angle-up', + 'apple', + 'archive', + 'area-chart', + 'arrow-circle-left', + 'arrow-circle-o-left', + 'arrow-circle-o-up', + 'arrow-circle-up', + 'arrow-left', + 'arrow-up', + 'arrows', + 'arrows-alt', + 'arrows-h', + 'arrows-v', + 'assistive-listening-systems', + 'asterisk', + 'at', + 'audio-description', + 'automobile', + 'backward', + 'balance-scale', + 'ban', + 'bandcamp', + 'bank', + 'bar-chart', + 'barcode', + 'bars', + 'bath', + 'battery', + 'battery-0', + 'battery-1', + 'battery-2', + 'battery-3', + 'bed', + 'beer', + 'behance', + 'behance-square', + 'bell', + 'bell-o', + 'bell-slash', + 'bell-slash-o', + 'bicycle', + 'binoculars', + 'birthday-cake', + 'bitbucket', + 'bitbucket-square', + 'bitcoin', + 'black-tie', + 'blind', + 'bluetooth', + 'bluetooth-b', + 'bold', + 'bolt', + 'bomb', + 'book', + 'bookmark', + 'bookmark-o', + 'braille', + 'briefcase', + 'bug', + 'building', + 'building-o', + 'bullhorn', + 'bullseye', + 'bus', + 'buysellads', + 'cab', + 'calculator', + 'calendar', + 'calendar-check-o', + 'calendar-minus-o', + 'calendar-o', + 'calendar-plus-o', + 'calendar-times-o', + 'camera', + 'camera-retro', + 'caret-down', + 'caret-left', + 'caret-square-o-left', + 'caret-square-o-up', + 'caret-up', + 'cart-arrow-down', + 'cart-plus', + 'cc', + 'cc-amex', + 'cc-diners-club', + 'cc-discover', + 'cc-jcb', + 'cc-mastercard', + 'cc-paypal', + 'cc-stripe', + 'cc-visa', + 'certificate', + 'chain', + 'chain-broken', + 'check', + 'check-circle', + 'check-circle-o', + 'check-square', + 'check-square-o', + 'chevron-circle-left', + 'chevron-circle-up', + 'chevron-down', + 'chevron-left', + 'chevron-up', + 'child', + 'chrome', + 'circle', + 'circle-o', + 'circle-o-notch', + 'circle-thin', + 'clipboard', + 'clock-o', + 'clone', + 'close', + 'cloud', + 'cloud-download', + 'cloud-upload', + 'cny', + 'code', + 'code-fork', + 'codepen', + 'codiepie', + 'coffee', + 'cog', + 'cogs', + 'columns', + 'comment', + 'comment-o', + 'commenting', + 'commenting-o', + 'comments', + 'comments-o', + 'compass', + 'compress', + 'connectdevelop', + 'contao', + 'copy', + 'copyright', + 'creative-commons', + 'credit-card', + 'credit-card-alt', + 'crop', + 'crosshairs', + 'css3', + 'cube', + 'cubes', + 'cut', + 'cutlery', + 'dashboard', + 'dashcube', + 'database', + 'deaf', + 'dedent', + 'delicious', + 'desktop', + 'deviantart', + 'diamond', + 'digg', + 'dollar', + 'dot-circle-o', + 'download', + 'dribbble', + 'drivers-license', + 'drivers-license-o', + 'dropbox', + 'drupal', + 'edge', + 'edit', + 'eercast', + 'eject', + 'ellipsis-h', + 'ellipsis-v', + 'empire', + 'envelope', + 'envelope-o', + 'envelope-open', + 'envelope-open-o', + 'envelope-square', + 'envira', + 'eraser', + 'etsy', + 'eur', + 'exchange', + 'exclamation', + 'exclamation-circle', + 'exclamation-triangle', + 'expand', + 'expeditedssl', + 'external-link', + 'external-link-square', + 'eye', + 'eye-slash', + 'eyedropper', + 'fa', + 'facebook', + 'facebook-official', + 'facebook-square', + 'fast-backward', + 'fax', + 'feed', + 'female', + 'fighter-jet', + 'file', + 'file-archive-o', + 'file-audio-o', + 'file-code-o', + 'file-excel-o', + 'file-image-o', + 'file-movie-o', + 'file-o', + 'file-pdf-o', + 'file-powerpoint-o', + 'file-text', + 'file-text-o', + 'file-word-o', + 'film', + 'filter', + 'fire', + 'fire-extinguisher', + 'firefox', + 'first-order', + 'flag', + 'flag-checkered', + 'flag-o', + 'flask', + 'flickr', + 'floppy-o', + 'folder', + 'folder-o', + 'folder-open', + 'folder-open-o', + 'font', + 'fonticons', + 'fort-awesome', + 'forumbee', + 'foursquare', + 'free-code-camp', + 'frown-o', + 'futbol-o', + 'gamepad', + 'gavel', + 'gbp', + 'genderless', + 'get-pocket', + 'gg', + 'gg-circle', + 'gift', + 'git', + 'git-square', + 'github', + 'github-alt', + 'github-square', + 'gitlab', + 'gittip', + 'glass', + 'glide', + 'glide-g', + 'globe', + 'google', + 'google-plus', + 'google-plus-circle', + 'google-plus-square', + 'google-wallet', + 'graduation-cap', + 'grav', + 'group', + 'h-square', + 'hacker-news', + 'hand-grab-o', + 'hand-lizard-o', + 'hand-o-left', + 'hand-o-up', + 'hand-paper-o', + 'hand-peace-o', + 'hand-pointer-o', + 'hand-scissors-o', + 'hand-spock-o', + 'handshake-o', + 'hashtag', + 'hdd-o', + 'header', + 'headphones', + 'heart', + 'heart-o', + 'heartbeat', + 'history', + 'home', + 'hospital-o', + 'hourglass', + 'hourglass-1', + 'hourglass-2', + 'hourglass-3', + 'hourglass-o', + 'houzz', + 'html5', + 'i-cursor', + 'id-badge', + 'ils', + 'image', + 'imdb', + 'inbox', + 'indent', + 'industry', + 'info', + 'info-circle', + 'inr', + 'instagram', + 'internet-explorer', + 'intersex', + 'ioxhost', + 'italic', + 'joomla', + 'jsfiddle', + 'key', + 'keyboard-o', + 'krw', + 'language', + 'laptop', + 'lastfm', + 'lastfm-square', + 'leaf', + 'leanpub', + 'lemon-o', + 'level-up', + 'life-bouy', + 'lightbulb-o', + 'line-chart', + 'linkedin', + 'linkedin-square', + 'linode', + 'linux', + 'list', + 'list-alt', + 'list-ol', + 'list-ul', + 'location-arrow', + 'lock', + 'long-arrow-left', + 'long-arrow-up', + 'low-vision', + 'magic', + 'magnet', + 'mail-forward', + 'mail-reply', + 'mail-reply-all', + 'male', + 'map', + 'map-marker', + 'map-o', + 'map-pin', + 'map-signs', + 'mars', + 'mars-double', + 'mars-stroke', + 'mars-stroke-h', + 'mars-stroke-v', + 'maxcdn', + 'meanpath', + 'medium', + 'medkit', + 'meetup', + 'meh-o', + 'mercury', + 'microchip', + 'microphone', + 'microphone-slash', + 'minus', + 'minus-circle', + 'minus-square', + 'minus-square-o', + 'mixcloud', + 'mobile', + 'modx', + 'money', + 'moon-o', + 'motorcycle', + 'mouse-pointer', + 'music', + 'neuter', + 'newspaper-o', + 'object-group', + 'object-ungroup', + 'odnoklassniki', + 'odnoklassniki-square', + 'opencart', + 'openid', + 'opera', + 'optin-monster', + 'pagelines', + 'paint-brush', + 'paper-plane', + 'paper-plane-o', + 'paperclip', + 'paragraph', + 'pause', + 'pause-circle', + 'pause-circle-o', + 'paw', + 'paypal', + 'pencil', + 'pencil-square', + 'percent', + 'phone', + 'phone-square', + 'pie-chart', + 'pied-piper', + 'pied-piper-alt', + 'pied-piper-pp', + 'pinterest', + 'pinterest-p', + 'pinterest-square', + 'plane', + 'play', + 'play-circle', + 'play-circle-o', + 'plug', + 'plus', + 'plus-circle', + 'plus-square', + 'plus-square-o', + 'podcast', + 'power-off', + 'print', + 'product-hunt', + 'puzzle-piece', + 'qq', + 'qrcode', + 'question', + 'question-circle', + 'question-circle-o', + 'quora', + 'quote-left', + 'quote-right', + 'ra', + 'random', + 'ravelry', + 'recycle', + 'reddit', + 'reddit-alien', + 'reddit-square', + 'refresh', + 'registered', + 'renren', + 'repeat', + 'retweet', + 'road', + 'rocket', + 'rotate-left', + 'rouble', + 'rss-square', + 'safari', + 'scribd', + 'search', + 'search-minus', + 'search-plus', + 'sellsy', + 'server', + 'share-alt', + 'share-alt-square', + 'share-square', + 'share-square-o', + 'shield', + 'ship', + 'shirtsinbulk', + 'shopping-bag', + 'shopping-basket', + 'shopping-cart', + 'shower', + 'sign-in', + 'sign-language', + 'sign-out', + 'signal', + 'simplybuilt', + 'sitemap', + 'skyatlas', + 'skype', + 'slack', + 'sliders', + 'slideshare', + 'smile-o', + 'snapchat', + 'snapchat-ghost', + 'snapchat-square', + 'snowflake-o', + 'sort', + 'sort-alpha-asc', + 'sort-alpha-desc', + 'sort-amount-asc', + 'sort-amount-desc', + 'sort-asc', + 'sort-numeric-asc', + 'sort-numeric-desc', + 'soundcloud', + 'space-shuttle', + 'spinner', + 'spoon', + 'spotify', + 'square', + 'square-o', + 'stack-exchange', + 'stack-overflow', + 'star', + 'star-half', + 'star-half-empty', + 'star-o', + 'steam', + 'steam-square', + 'step-backward', + 'stethoscope', + 'sticky-note', + 'sticky-note-o', + 'stop', + 'stop-circle', + 'stop-circle-o', + 'street-view', + 'strikethrough', + 'stumbleupon', + 'stumbleupon-circle', + 'subscript', + 'subway', + 'suitcase', + 'sun-o', + 'superpowers', + 'superscript', + 'table', + 'tablet', + 'tag', + 'tags', + 'tasks', + 'telegram', + 'television', + 'tencent-weibo', + 'terminal', + 'text-height', + 'text-width', + 'th', + 'th-large', + 'th-list', + 'themeisle', + 'thermometer', + 'thermometer-0', + 'thermometer-1', + 'thermometer-2', + 'thermometer-3', + 'thumb-tack', + 'thumbs-down', + 'thumbs-o-up', + 'thumbs-up', + 'ticket', + 'times-circle', + 'times-circle-o', + 'times-rectangle', + 'times-rectangle-o', + 'tint', + 'toggle-off', + 'toggle-on', + 'trademark', + 'train', + 'transgender-alt', + 'trash', + 'trash-o', + 'tree', + 'trello', + 'tripadvisor', + 'trophy', + 'truck', + 'try', + 'tty', + 'tumblr', + 'tumblr-square', + 'twitch', + 'twitter', + 'twitter-square', + 'umbrella', + 'underline', + 'universal-access', + 'unlock', + 'unlock-alt', + 'upload', + 'usb', + 'user', + 'user-circle', + 'user-circle-o', + 'user-md', + 'user-o', + 'user-plus', + 'user-secret', + 'user-times', + 'venus', + 'venus-double', + 'venus-mars', + 'viacoin', + 'viadeo', + 'viadeo-square', + 'video-camera', + 'vimeo', + 'vimeo-square', + 'vine', + 'vk', + 'volume-control-phone', + 'volume-down', + 'volume-off', + 'volume-up', + 'wechat', + 'weibo', + 'whatsapp', + 'wheelchair', + 'wheelchair-alt', + 'wifi', + 'wikipedia-w', + 'window-maximize', + 'window-minimize', + 'window-restore', + 'windows', + 'wordpress', + 'wpbeginner', + 'wpexplorer', + 'wpforms', + 'wrench', + 'xing', + 'xing-square', + 'y-combinator', + 'yahoo', + 'yelp', + 'yoast', + 'youtube', + 'youtube-play', + 'youtube-square' + ], + 'fa-solid:': [ + 'abacus', + 'ad', + 'address-book', + 'address-card', + 'adjust', + 'air-freshener', + 'align-center', + 'align-justify', + 'align-left', + 'align-right', + 'allergies', + 'ambulance', + 'american-sign-language-interpreting', + 'anchor', + 'angle-double-down', + 'angle-double-left', + 'angle-double-right', + 'angle-double-up', + 'angle-down', + 'angle-left', + 'angle-right', + 'angle-up', + 'angry', + 'ankh', + 'apple-alt', + 'archive', + 'archway', + 'arrow-alt-circle-down', + 'arrow-alt-circle-left', + 'arrow-alt-circle-right', + 'arrow-alt-circle-up', + 'arrow-circle-down', + 'arrow-circle-left', + 'arrow-circle-right', + 'arrow-circle-up', + 'arrow-down', + 'arrow-left', + 'arrow-right', + 'arrow-up', + 'arrows-alt', + 'arrows-alt-h', + 'arrows-alt-v', + 'assistive-listening-systems', + 'asterisk', + 'at', + 'atlas', + 'atom', + 'audio-description', + 'award', + 'baby', + 'baby-carriage', + 'backspace', + 'backward', + 'bacon', + 'bacteria', + 'bacterium', + 'bahai', + 'balance-scale', + 'balance-scale-left', + 'balance-scale-right', + 'ban', + 'band-aid', + 'barcode', + 'bars', + 'baseball-ball', + 'basketball-ball', + 'bath', + 'battery-empty', + 'battery-full', + 'battery-half', + 'battery-quarter', + 'battery-three-quarters', + 'bed', + 'beer', + 'bell', + 'bell-slash', + 'bezier-curve', + 'bible', + 'bicycle', + 'biking', + 'binoculars', + 'biohazard', + 'birthday-cake', + 'blender', + 'blender-phone', + 'blind', + 'blog', + 'bold', + 'bolt', + 'bomb', + 'bone', + 'bong', + 'book', + 'book-dead', + 'book-medical', + 'book-open', + 'book-reader', + 'bookmark', + 'border-all', + 'border-none', + 'border-style', + 'bowling-ball', + 'box', + 'box-open', + 'box-tissue', + 'boxes', + 'braille', + 'brain', + 'bread-slice', + 'briefcase', + 'briefcase-medical', + 'broadcast-tower', + 'broom', + 'brush', + 'bug', + 'building', + 'bullhorn', + 'bullseye', + 'burn', + 'bus', + 'bus-alt', + 'business-time', + 'calculator', + 'calculator-alt', + 'calendar', + 'calendar-alt', + 'calendar-check', + 'calendar-day', + 'calendar-minus', + 'calendar-plus', + 'calendar-times', + 'calendar-week', + 'camera', + 'camera-retro', + 'campground', + 'candy-cane', + 'cannabis', + 'capsules', + 'car', + 'car-alt', + 'car-battery', + 'car-crash', + 'car-side', + 'caravan', + 'caret-down', + 'caret-left', + 'caret-right', + 'caret-square-down', + 'caret-square-left', + 'caret-square-right', + 'caret-square-up', + 'caret-up', + 'carrot', + 'cart-arrow-down', + 'cart-plus', + 'cash-register', + 'cat', + 'certificate', + 'chair', + 'chalkboard', + 'chalkboard-teacher', + 'charging-station', + 'chart-area', + 'chart-bar', + 'chart-line', + 'chart-pie', + 'check', + 'check-circle', + 'check-double', + 'check-square', + 'cheese', + 'chess', + 'chess-bishop', + 'chess-board', + 'chess-king', + 'chess-knight', + 'chess-pawn', + 'chess-queen', + 'chess-rook', + 'chevron-circle-down', + 'chevron-circle-left', + 'chevron-circle-right', + 'chevron-circle-up', + 'chevron-down', + 'chevron-left', + 'chevron-right', + 'chevron-up', + 'child', + 'church', + 'circle', + 'circle-notch', + 'city', + 'clinic-medical', + 'clipboard', + 'clipboard-check', + 'clipboard-list', + 'clock', + 'clone', + 'closed-captioning', + 'cloud', + 'cloud-download-alt', + 'cloud-meatball', + 'cloud-moon', + 'cloud-moon-rain', + 'cloud-rain', + 'cloud-showers-heavy', + 'cloud-sun', + 'cloud-sun-rain', + 'cloud-upload-alt', + 'cocktail', + 'code', + 'code-branch', + 'coffee', + 'cog', + 'cogs', + 'coins', + 'columns', + 'comment', + 'comment-alt', + 'comment-dollar', + 'comment-dots', + 'comment-medical', + 'comment-slash', + 'comments', + 'comments-dollar', + 'compact-disc', + 'compass', + 'compress', + 'compress-alt', + 'compress-arrows-alt', + 'concierge-bell', + 'cookie', + 'cookie-bite', + 'copy', + 'copyright', + 'couch', + 'credit-card', + 'crop', + 'crop-alt', + 'cross', + 'crosshairs', + 'crow', + 'crown', + 'crutch', + 'cube', + 'cubes', + 'cut', + 'database', + 'deaf', + 'democrat', + 'desktop', + 'dharmachakra', + 'diagnoses', + 'dice', + 'dice-d20', + 'dice-d6', + 'dice-five', + 'dice-four', + 'dice-one', + 'dice-six', + 'dice-three', + 'dice-two', + 'digital-tachograph', + 'directions', + 'disease', + 'divide', + 'dizzy', + 'dna', + 'dog', + 'dollar-sign', + 'dolly', + 'dolly-flatbed', + 'donate', + 'door-closed', + 'door-open', + 'dot-circle', + 'dove', + 'download', + 'drafting-compass', + 'dragon', + 'draw-polygon', + 'drum', + 'drum-steelpan', + 'drumstick-bite', + 'dumbbell', + 'dumpster', + 'dumpster-fire', + 'dungeon', + 'edit', + 'egg', + 'eject', + 'ellipsis-h', + 'ellipsis-v', + 'empty-set', + 'envelope', + 'envelope-open', + 'envelope-open-text', + 'envelope-square', + 'equals', + 'eraser', + 'ethernet', + 'euro-sign', + 'exchange-alt', + 'exclamation', + 'exclamation-circle', + 'exclamation-triangle', + 'expand', + 'expand-alt', + 'expand-arrows-alt', + 'external-link-alt', + 'external-link-square-alt', + 'eye', + 'eye-dropper', + 'eye-slash', + 'fan', + 'fast-backward', + 'fast-forward', + 'faucet', + 'fax', + 'feather', + 'feather-alt', + 'female', + 'fighter-jet', + 'file', + 'file-alt', + 'file-archive', + 'file-audio', + 'file-code', + 'file-contract', + 'file-csv', + 'file-download', + 'file-excel', + 'file-export', + 'file-image', + 'file-import', + 'file-invoice', + 'file-invoice-dollar', + 'file-medical', + 'file-medical-alt', + 'file-pdf', + 'file-powerpoint', + 'file-prescription', + 'file-signature', + 'file-upload', + 'file-video', + 'file-word', + 'fill', + 'fill-drip', + 'film', + 'filter', + 'fingerprint', + 'fire', + 'fire-alt', + 'fire-extinguisher', + 'first-aid', + 'fish', + 'fist-raised', + 'flag', + 'flag-checkered', + 'flag-usa', + 'flask', + 'flushed', + 'folder', + 'folder-minus', + 'folder-open', + 'folder-plus', + 'font', + 'football-ball', + 'forward', + 'frog', + 'frown', + 'frown-open', + 'function', + 'funnel-dollar', + 'futbol', + 'gamepad', + 'gas-pump', + 'gavel', + 'gem', + 'genderless', + 'ghost', + 'gift', + 'gifts', + 'glass-cheers', + 'glass-martini', + 'glass-martini-alt', + 'glass-whiskey', + 'glasses', + 'globe', + 'globe-africa', + 'globe-americas', + 'globe-asia', + 'globe-europe', + 'golf-ball', + 'gopuram', + 'graduation-cap', + 'greater-than', + 'greater-than-equal', + 'grimace', + 'grin', + 'grin-alt', + 'grin-beam', + 'grin-beam-sweat', + 'grin-hearts', + 'grin-squint', + 'grin-squint-tears', + 'grin-stars', + 'grin-tears', + 'grin-tongue', + 'grin-tongue-squint', + 'grin-tongue-wink', + 'grin-wink', + 'grip-horizontal', + 'grip-lines', + 'grip-lines-vertical', + 'grip-vertical', + 'guitar', + 'h-square', + 'hamburger', + 'hammer', + 'hamsa', + 'hand-holding', + 'hand-holding-heart', + 'hand-holding-medical', + 'hand-holding-usd', + 'hand-holding-water', + 'hand-lizard', + 'hand-middle-finger', + 'hand-paper', + 'hand-peace', + 'hand-point-down', + 'hand-point-left', + 'hand-point-right', + 'hand-point-up', + 'hand-pointer', + 'hand-rock', + 'hand-scissors', + 'hand-sparkles', + 'hand-spock', + 'hands', + 'hands-helping', + 'hands-wash', + 'handshake', + 'handshake-alt-slash', + 'handshake-slash', + 'hanukiah', + 'hard-hat', + 'hashtag', + 'hat-cowboy', + 'hat-cowboy-side', + 'hat-wizard', + 'hdd', + 'head-side-cough', + 'head-side-cough-slash', + 'head-side-mask', + 'head-side-virus', + 'heading', + 'headphones', + 'headphones-alt', + 'headset', + 'heart', + 'heart-broken', + 'heartbeat', + 'helicopter', + 'highlighter', + 'hiking', + 'hippo', + 'history', + 'hockey-puck', + 'holly-berry', + 'home', + 'horse', + 'horse-head', + 'hospital', + 'hospital-alt', + 'hospital-symbol', + 'hospital-user', + 'hot-tub', + 'hotdog', + 'hotel', + 'hourglass', + 'hourglass-end', + 'hourglass-half', + 'hourglass-start', + 'house-damage', + 'house-user', + 'hryvnia', + 'i-cursor', + 'ice-cream', + 'icicles', + 'icons', + 'id-badge', + 'id-card', + 'id-card-alt', + 'igloo', + 'image', + 'images', + 'inbox', + 'indent', + 'industry', + 'infinity', + 'info', + 'info-circle', + 'integral', + 'intersection', + 'italic', + 'jedi', + 'joint', + 'journal-whills', + 'kaaba', + 'key', + 'keyboard', + 'khanda', + 'kiss', + 'kiss-beam', + 'kiss-wink-heart', + 'kiwi-bird', + 'lambda', + 'landmark', + 'language', + 'laptop', + 'laptop-code', + 'laptop-house', + 'laptop-medical', + 'laugh', + 'laugh-beam', + 'laugh-squint', + 'laugh-wink', + 'layer-group', + 'leaf', + 'lemon', + 'less-than', + 'less-than-equal', + 'level-down-alt', + 'level-up-alt', + 'life-ring', + 'lightbulb', + 'link', + 'lira-sign', + 'list', + 'list-alt', + 'list-ol', + 'list-ul', + 'location-arrow', + 'lock', + 'lock-open', + 'long-arrow-alt-down', + 'long-arrow-alt-left', + 'long-arrow-alt-right', + 'long-arrow-alt-up', + 'low-vision', + 'luggage-cart', + 'lungs', + 'lungs-virus', + 'magic', + 'magnet', + 'mail-bulk', + 'male', + 'map', + 'map-marked', + 'map-marked-alt', + 'map-marker', + 'map-marker-alt', + 'map-pin', + 'map-signs', + 'marker', + 'mars', + 'mars-double', + 'mars-stroke', + 'mars-stroke-h', + 'mars-stroke-v', + 'mask', + 'medal', + 'medkit', + 'meh', + 'meh-blank', + 'meh-rolling-eyes', + 'memory', + 'menorah', + 'mercury', + 'meteor', + 'microchip', + 'microphone', + 'microphone-alt', + 'microphone-alt-slash', + 'microphone-slash', + 'microscope', + 'minus', + 'minus-circle', + 'minus-square', + 'mitten', + 'mobile', + 'mobile-alt', + 'money-bill', + 'money-bill-alt', + 'money-bill-wave', + 'money-bill-wave-alt', + 'money-check', + 'money-check-alt', + 'monument', + 'moon', + 'mortar-pestle', + 'mosque', + 'motorcycle', + 'mountain', + 'mouse', + 'mouse-pointer', + 'mug-hot', + 'music', + 'network-wired', + 'neuter', + 'newspaper', + 'not-equal', + 'notes-medical', + 'object-group', + 'object-ungroup', + 'oil-can', + 'om', + 'omega', + 'otter', + 'outdent', + 'pager', + 'paint-brush', + 'paint-roller', + 'palette', + 'pallet', + 'paper-plane', + 'paperclip', + 'parachute-box', + 'paragraph', + 'parking', + 'passport', + 'pastafarianism', + 'paste', + 'pause', + 'pause-circle', + 'paw', + 'peace', + 'pen', + 'pen-alt', + 'pen-fancy', + 'pen-nib', + 'pen-square', + 'pencil-alt', + 'pencil-ruler', + 'people-arrows', + 'people-carry', + 'pepper-hot', + 'percent', + 'percentage', + 'person-booth', + 'phone', + 'phone-alt', + 'phone-slash', + 'phone-square', + 'phone-square-alt', + 'phone-volume', + 'photo-video', + 'pi', + 'piggy-bank', + 'pills', + 'pizza-slice', + 'place-of-worship', + 'plane', + 'plane-arrival', + 'plane-departure', + 'plane-slash', + 'play', + 'play-circle', + 'plug', + 'plus', + 'plus-circle', + 'plus-square', + 'podcast', + 'poll', + 'poll-h', + 'poo', + 'poo-storm', + 'poop', + 'portrait', + 'pound-sign', + 'power-off', + 'pray', + 'praying-hands', + 'prescription', + 'prescription-bottle', + 'prescription-bottle-alt', + 'print', + 'procedures', + 'project-diagram', + 'pump-medical', + 'pump-soap', + 'puzzle-piece', + 'qrcode', + 'question', + 'question-circle', + 'quidditch', + 'quote-left', + 'quote-right', + 'quran', + 'radiation', + 'radiation-alt', + 'rainbow', + 'random', + 'receipt', + 'record-vinyl', + 'recycle', + 'redo', + 'redo-alt', + 'registered', + 'remove-format', + 'reply', + 'reply-all', + 'republican', + 'restroom', + 'retweet', + 'ribbon', + 'ring', + 'road', + 'robot', + 'rocket', + 'route', + 'rss', + 'rss-square', + 'ruble-sign', + 'ruler', + 'ruler-combined', + 'ruler-horizontal', + 'ruler-vertical', + 'running', + 'rupee-sign', + 'sad-cry', + 'sad-tear', + 'satellite', + 'satellite-dish', + 'save', + 'school', + 'screwdriver', + 'scroll', + 'sd-card', + 'search', + 'search-dollar', + 'search-location', + 'search-minus', + 'search-plus', + 'seedling', + 'server', + 'shapes', + 'share', + 'share-alt', + 'share-alt-square', + 'share-square', + 'shekel-sign', + 'shield-alt', + 'shield-virus', + 'ship', + 'shipping-fast', + 'shoe-prints', + 'shopping-bag', + 'shopping-basket', + 'shopping-cart', + 'shower', + 'shuttle-van', + 'sigma', + 'sign', + 'sign-in-alt', + 'sign-language', + 'sign-out-alt', + 'signal', + 'signal-alt', + 'signal-alt-slash', + 'signal-slash', + 'signature', + 'sim-card', + 'sink', + 'sitemap', + 'skating', + 'skiing', + 'skiing-nordic', + 'skull', + 'skull-crossbones', + 'slash', + 'sleigh', + 'sliders-h', + 'smile', + 'smile-beam', + 'smile-wink', + 'smog', + 'smoking', + 'smoking-ban', + 'sms', + 'snowboarding', + 'snowflake', + 'snowman', + 'snowplow', + 'soap', + 'socks', + 'solar-panel', + 'sort', + 'sort-alpha-down', + 'sort-alpha-down-alt', + 'sort-alpha-up', + 'sort-alpha-up-alt', + 'sort-amount-down', + 'sort-amount-down-alt', + 'sort-amount-up', + 'sort-amount-up-alt', + 'sort-down', + 'sort-numeric-down', + 'sort-numeric-down-alt', + 'sort-numeric-up', + 'sort-numeric-up-alt', + 'sort-up', + 'spa', + 'space-shuttle', + 'spell-check', + 'spider', + 'spinner', + 'splotch', + 'spray-can', + 'square', + 'square-full', + 'square-root', + 'square-root-alt', + 'stamp', + 'star', + 'star-and-crescent', + 'star-half', + 'star-half-alt', + 'star-of-david', + 'star-of-life', + 'step-backward', + 'step-forward', + 'stethoscope', + 'sticky-note', + 'stop', + 'stop-circle', + 'stopwatch', + 'stopwatch-20', + 'store', + 'store-alt', + 'store-alt-slash', + 'store-slash', + 'stream', + 'street-view', + 'strikethrough', + 'stroopwafel', + 'subscript', + 'subway', + 'suitcase', + 'suitcase-rolling', + 'sun', + 'superscript', + 'surprise', + 'swatchbook', + 'swimmer', + 'swimming-pool', + 'synagogue', + 'sync', + 'sync-alt', + 'syringe', + 'table', + 'table-tennis', + 'tablet', + 'tablet-alt', + 'tablets', + 'tachometer-alt', + 'tag', + 'tags', + 'tally', + 'tape', + 'tasks', + 'taxi', + 'teeth', + 'teeth-open', + 'temperature-high', + 'temperature-low', + 'tenge', + 'terminal', + 'text-height', + 'text-width', + 'th', + 'th-large', + 'th-list', + 'theater-masks', + 'thermometer', + 'thermometer-empty', + 'thermometer-full', + 'thermometer-half', + 'thermometer-quarter', + 'thermometer-three-quarters', + 'theta', + 'thumbs-down', + 'thumbs-up', + 'thumbtack', + 'ticket-alt', + 'tilde', + 'times', + 'times-circle', + 'tint', + 'tint-slash', + 'tired', + 'toggle-off', + 'toggle-on', + 'toilet', + 'toilet-paper', + 'toilet-paper-slash', + 'toolbox', + 'tools', + 'tooth', + 'torah', + 'torii-gate', + 'tractor', + 'trademark', + 'traffic-light', + 'trailer', + 'train', + 'tram', + 'transgender', + 'transgender-alt', + 'trash', + 'trash-alt', + 'trash-restore', + 'trash-restore-alt', + 'tree', + 'trophy', + 'truck', + 'truck-loading', + 'truck-monster', + 'truck-moving', + 'truck-pickup', + 'tshirt', + 'tty', + 'tv', + 'umbrella', + 'umbrella-beach', + 'underline', + 'undo', + 'undo-alt', + 'union', + 'universal-access', + 'university', + 'unlink', + 'unlock', + 'unlock-alt', + 'upload', + 'user', + 'user-alt', + 'user-alt-slash', + 'user-astronaut', + 'user-check', + 'user-circle', + 'user-clock', + 'user-cog', + 'user-edit', + 'user-friends', + 'user-graduate', + 'user-injured', + 'user-lock', + 'user-md', + 'user-minus', + 'user-ninja', + 'user-nurse', + 'user-plus', + 'user-secret', + 'user-shield', + 'user-slash', + 'user-tag', + 'user-tie', + 'user-times', + 'users', + 'users-cog', + 'users-slash', + 'utensil-spoon', + 'utensils', + 'value-absolute', + 'vector-square', + 'venus', + 'venus-double', + 'venus-mars', + 'vest', + 'vest-patches', + 'vial', + 'vials', + 'video', + 'video-slash', + 'vihara', + 'virus', + 'virus-slash', + 'viruses', + 'voicemail', + 'volleyball-ball', + 'volume', + 'volume-down', + 'volume-mute', + 'volume-off', + 'volume-slash', + 'volume-up', + 'vote-yea', + 'vr-cardboard', + 'walking', + 'wallet', + 'warehouse', + 'water', + 'wave-square', + 'weight', + 'weight-hanging', + 'wheelchair', + 'wifi', + 'wifi-slash', + 'wind', + 'window-close', + 'window-maximize', + 'window-minimize', + 'window-restore', + 'wine-bottle', + 'wine-glass', + 'wine-glass-alt', + 'won-sign', + 'wrench', + 'x-ray', + 'yen-sign', + 'yin-yang' + ] +} diff --git a/grailed-ui-admin-vue3/src/components/ImageViewer/index.ts b/grailed-ui-admin-vue3/src/components/ImageViewer/index.ts new file mode 100644 index 0000000..3868135 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ImageViewer/index.ts @@ -0,0 +1,33 @@ +import ImageViewer from './src/ImageViewer.vue' +import { isClient } from '@/utils/is' +import { createVNode, render, VNode } from 'vue' +import { ImageViewerProps } from './src/types' + +let instance: Nullable = null + +export function createImageViewer(options: ImageViewerProps) { + if (!isClient) return + const { + urlList, + initialIndex = 0, + infinite = true, + hideOnClickModal = false, + appendToBody = false, + zIndex = 2000, + show = true + } = options + + const propsData: Partial = {} + const container = document.createElement('div') + propsData.urlList = urlList + propsData.initialIndex = initialIndex + propsData.infinite = infinite + propsData.hideOnClickModal = hideOnClickModal + propsData.appendToBody = appendToBody + propsData.zIndex = zIndex + propsData.show = show + + document.body.appendChild(container) + instance = createVNode(ImageViewer, propsData) + render(instance, container) +} diff --git a/grailed-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue b/grailed-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue new file mode 100644 index 0000000..5c4921e --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ImageViewer/src/ImageViewer.vue @@ -0,0 +1,35 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/ImageViewer/src/types.ts b/grailed-ui-admin-vue3/src/components/ImageViewer/src/types.ts new file mode 100644 index 0000000..1932d74 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/ImageViewer/src/types.ts @@ -0,0 +1,9 @@ +export interface ImageViewerProps { + urlList?: string[] + zIndex?: number + initialIndex?: number + infinite?: boolean + hideOnClickModal?: boolean + appendToBody?: boolean + show?: boolean +} diff --git a/grailed-ui-admin-vue3/src/components/Infotip/index.ts b/grailed-ui-admin-vue3/src/components/Infotip/index.ts new file mode 100644 index 0000000..413fa5f --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Infotip/index.ts @@ -0,0 +1,3 @@ +import Infotip from './src/Infotip.vue' + +export { Infotip } diff --git a/grailed-ui-admin-vue3/src/components/Infotip/src/Infotip.vue b/grailed-ui-admin-vue3/src/components/Infotip/src/Infotip.vue new file mode 100644 index 0000000..60887d3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Infotip/src/Infotip.vue @@ -0,0 +1,54 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/InputPassword/index.ts b/grailed-ui-admin-vue3/src/components/InputPassword/index.ts new file mode 100644 index 0000000..1dcc38e --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/InputPassword/index.ts @@ -0,0 +1,3 @@ +import InputPassword from './src/InputPassword.vue' + +export { InputPassword } diff --git a/grailed-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue b/grailed-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue new file mode 100644 index 0000000..f970369 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/InputPassword/src/InputPassword.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/Pagination/index.vue b/grailed-ui-admin-vue3/src/components/Pagination/index.vue new file mode 100644 index 0000000..41cde9d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Pagination/index.vue @@ -0,0 +1,77 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/PhoneNumberInput/index.ts b/grailed-ui-admin-vue3/src/components/PhoneNumberInput/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/PhoneNumberInput.vue b/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/PhoneNumberInput.vue new file mode 100644 index 0000000..796438c --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/PhoneNumberInput.vue @@ -0,0 +1,49 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/countryList.json b/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/countryList.json new file mode 100644 index 0000000..a550831 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/PhoneNumberInput/src/countryList.json @@ -0,0 +1,492 @@ +[ + { + "c_name": "阿联酋", + "e_name": "United Arab Emirates", + "iso": "AE", + "iconName": "country/ae", + "phoneCode": "+971" + }, + { + "c_name": "阿根廷", + "e_name": "Argentina", + "iso": "AR", + "iconName": "country/ar", + "phoneCode": "+54" + }, + { + "c_name": "奥地利", + "e_name": "Austria", + "iso": "AT", + "iconName": "country/at", + "phoneCode": "+43" + }, + { + "c_name": "澳大利亚", + "e_name": "Australia", + "iso": "AU", + "iconName": "country/au", + "phoneCode": "+61" + }, + { + "c_name": "比利时", + "e_name": "Belgium", + "iso": "BE", + "iconName": "country/be", + "phoneCode": "+32" + }, + { + "c_name": "巴西", + "e_name": "Brazil", + "iso": "BR", + "iconName": "country/br", + "phoneCode": "+55" + }, + { + "c_name": "巴哈马", + "e_name": "Bahamas", + "iso": "BS", + "iconName": "country/bs", + "phoneCode": "+1" + }, + { + "c_name": "加拿大", + "e_name": "Canada", + "iso": "CA", + "iconName": "country/ca", + "phoneCode": "+1" + }, + { + "c_name": "瑞士", + "e_name": "Switzerland", + "iso": "CH", + "iconName": "country/ch", + "phoneCode": "+41" + }, + { + "c_name": "智利", + "e_name": "Chile", + "iso": "CL", + "iconName": "country/cl", + "phoneCode": "+56" + }, + { + "c_name": "中国", + "e_name": "China", + "iso": "CN", + "iconName": "country/cn", + "phoneCode": "+86" + }, + { + "c_name": "哥伦比亚", + "e_name": "Colombia", + "iso": "CO", + "iconName": "country/co", + "phoneCode": "+57" + }, + { + "c_name": "塞浦路斯", + "e_name": "Cyprus", + "iso": "CY", + "iconName": "country/cy", + "phoneCode": "+357" + }, + { + "c_name": "柬埔寨", + "e_name": "Cambodia", + "iso": "KH", + "iconName": "country/kh", + "phoneCode": "+855" +}, + { + "c_name": "捷克", + "e_name": "Czech Republic", + "iso": "CZ", + "iconName": "country/cz", + "phoneCode": "+420" + }, + { + "c_name": "德国", + "e_name": "Germany", + "iso": "DE", + "iconName": "country/de", + "phoneCode": "+49" + }, + { + "c_name": "丹麦", + "e_name": "Denmark", + "iso": "DK", + "iconName": "country/dk", + "phoneCode": "+45" + }, + { + "c_name": "厄瓜多尔", + "e_name": "Ecuador", + "iso": "EC", + "iconName": "country/ec", + "phoneCode": "+593" + }, + { + "c_name": "爱沙尼亚", + "e_name": "Estonia", + "iso": "EE", + "iconName": "country/ee", + "phoneCode": "+372" + }, + { + "c_name": "埃及", + "e_name": "Egypt", + "iso": "EG", + "iconName": "country/eg", + "phoneCode": "+20" + }, + { + "c_name": "西班牙", + "e_name": "Spain", + "iso": "ES", + "iconName": "country/es", + "phoneCode": "+34" + }, + { + "c_name": "芬兰", + "e_name": "Finland", + "iso": "FI", + "iconName": "country/fi", + "phoneCode": "+358" + }, + { + "c_name": "法国", + "e_name": "France", + "iso": "FR", + "iconName": "country/fr", + "phoneCode": "+33" + }, + { + "c_name": "希腊", + "e_name": "Greece", + "iso": "GR", + "iconName": "country/gr", + "phoneCode": "+30" + }, + { + "c_name": "克罗地亚", + "e_name": "Croatia", + "iso": "HR", + "iconName": "country/hr", + "phoneCode": "+385" + }, + { + "c_name": "匈牙利", + "e_name": "Hungary", + "iso": "HU", + "iconName": "country/hu", + "phoneCode": "+36" + }, + { + "c_name": "香港", + "e_name": "Hong Kong", + "iso": "hk", + "iconName": "country/hk", + "phoneCode": "+852" +}, + { + "c_name": "印度尼西亚", + "e_name": "Indonesia", + "iso": "ID", + "iconName": "country/id", + "phoneCode": "+62" + }, + { + "c_name": "爱尔兰", + "e_name": "Ireland", + "iso": "IE", + "iconName": "country/ie", + "phoneCode": "+353" + }, + { + "c_name": "以色列", + "e_name": "Israel", + "iso": "IL", + "iconName": "country/il", + "phoneCode": "+972" + }, + { + "c_name": "印度", + "e_name": "India", + "iso": "IN", + "iconName": "country/in", + "phoneCode": "+91" + }, + { + "c_name": "冰岛", + "e_name": "Iceland", + "iso": "IS", + "iconName": "country/is", + "phoneCode": "+354" + }, + { + "c_name": "意大利", + "e_name": "Italy", + "iso": "IT", + "iconName": "country/it", + "phoneCode": "+39" + }, + { + "c_name": "牙买加", + "e_name": "Jamaica", + "iso": "JM", + "iconName": "country/jm", + "phoneCode": "+1" + }, + { + "c_name": "日本", + "e_name": "Japan", + "iso": "JP", + "iconName": "country/jp", + "phoneCode": "+81" + }, + { + "c_name": "肯尼亚", + "e_name": "Kenya", + "iso": "KE", + "iconName": "country/ke", + "phoneCode": "+254" + }, + { + "c_name": "韩国", + "e_name": "South Korea", + "iso": "KR", + "iconName": "country/kr", + "phoneCode": "+82" + }, + { + "c_name": "立陶宛", + "e_name": "Lithuania", + "iso": "LT", + "iconName": "country/lt", + "phoneCode": "+370" + }, + { + "c_name": "卢森堡", + "e_name": "Luxembourg", + "iso": "LU", + "iconName": "country/lu", + "phoneCode": "+352" + }, + { + "c_name": "拉脱维亚", + "e_name": "Latvia", + "iso": "LV", + "iconName": "country/lv", + "phoneCode": "+371" + }, + { + "c_name": "摩洛哥", + "e_name": "Morocco", + "iso": "MA", + "iconName": "country/ma", + "phoneCode": "+212" + }, + { + "c_name": "蒙古", + "e_name": "Mongolia", + "iso": "MN", + "iconName": "country/mn", + "phoneCode": "+976" + }, + { + "c_name": "毛里求斯", + "e_name": "Mauritius", + "iso": "MU", + "iconName": "country/mu", + "phoneCode": "+230" + }, + { + "c_name": "马尔代夫", + "e_name": "Maldives", + "iso": "MV", + "iconName": "country/mv", + "phoneCode": "+960" + }, + { + "c_name": "墨西哥", + "e_name": "Mexico", + "iso": "MX", + "iconName": "country/mx", + "phoneCode": "+52" + }, + { + "c_name": "马来西亚", + "e_name": "Malaysia", + "iso": "MY", + "iconName": "country/my", + "phoneCode": "+60" + }, + { + "c_name": "荷兰", + "e_name": "Netherlands", + "iso": "NL", + "iconName": "country/nl", + "phoneCode": "+31" + }, + { + "c_name": "挪威", + "e_name": "Norway", + "iso": "NO", + "iconName": "country/no", + "phoneCode": "+47" + }, + { + "c_name": "新西兰", + "e_name": "New Zealand", + "iso": "NZ", + "iconName": "country/nz", + "phoneCode": "+64" + }, + { + "c_name": "巴拿马", + "e_name": "Panama", + "iso": "PA", + "iconName": "country/pa", + "phoneCode": "+507" + }, + { + "c_name": "秘鲁", + "e_name": "Peru", + "iso": "PE", + "iconName": "country/pe", + "phoneCode": "+51" + }, + { + "c_name": "菲律宾", + "e_name": "Philippines", + "iso": "PH", + "iconName": "country/ph", + "phoneCode": "+63" + }, + { + "c_name": "波多黎各", + "e_name": "Puerto Rico", + "iso": "PR", + "iconName": "country/pr", + "phoneCode": "+1" + }, + { + "c_name": "葡萄牙", + "e_name": "Portugal", + "iso": "PT", + "iconName": "country/pt", + "phoneCode": "+351" + }, + { + "c_name": "卡塔尔", + "e_name": "Qatar", + "iso": "QA", + "iconName": "country/qa", + "phoneCode": "+974" + }, + { + "c_name": "罗马尼亚", + "e_name": "Romania", + "iso": "RO", + "iconName": "country/ro", + "phoneCode": "+40" + }, + { + "c_name": "俄罗斯", + "e_name": "Russia", + "iso": "RU", + "iconName": "country/ru", + "phoneCode": "+7" + }, + { + "c_name": "沙特阿拉伯", + "e_name": "Saudi Arabia", + "iso": "SA", + "iconName": "country/sa", + "phoneCode": "+966" + }, + { + "c_name": "塞舌尔", + "e_name": "Seychelles", + "iso": "SC", + "iconName": "country/sc", + "phoneCode": "+248" + }, + { + "c_name": "瑞典", + "e_name": "Sweden", + "iso": "SE", + "iconName": "country/se", + "phoneCode": "+46" + }, + { + "c_name": "斯洛文尼亚", + "e_name": "Slovenia", + "iso": "SI", + "iconName": "country/si", + "phoneCode": "+386" + }, + { + "c_name": "斯洛伐克", + "e_name": "Slovakia", + "iso": "SK", + "iconName": "country/sk", + "phoneCode": "+421" + }, + { + "c_name": "泰国", + "e_name": "Thailand", + "iso": "TH", + "iconName": "country/th", + "phoneCode": "+66" + }, + { + "c_name": "突尼斯", + "e_name": "Tunisia", + "iso": "TN", + "iconName": "country/tn", + "phoneCode": "+216" + }, + { + "c_name": "土耳其", + "e_name": "Turkey", + "iso": "TR", + "iconName": "country/tr", + "phoneCode": "+90" + }, + { + "c_name": "台湾", + "e_name": "Taiwan", + "iso": "TW", + "iconName": "country/tw", + "phoneCode": "+886" +}, + { + "c_name": "英国", + "e_name": "United Kingdom", + "iso": "GB", + "iconName": "country/uk", + "phoneCode": "+44" + }, + { + "c_name": "美国", + "e_name": "United States", + "iso": "US", + "iconName": "country/us", + "phoneCode": "+1" + }, + { + "c_name": "越南", + "e_name": "Vietnam", + "iso": "VN", + "iconName": "country/vn", + "phoneCode": "+84" + }, + { + "c_name": "南非", + "e_name": "South Africa", + "iso": "ZA", + "iconName": "country/za", + "phoneCode": "+27" + } +] \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/components/Qrcode/index.ts b/grailed-ui-admin-vue3/src/components/Qrcode/index.ts new file mode 100644 index 0000000..ce46161 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Qrcode/index.ts @@ -0,0 +1,3 @@ +import Qrcode from './src/Qrcode.vue' + +export { Qrcode } diff --git a/grailed-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue b/grailed-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue new file mode 100644 index 0000000..337bc78 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Qrcode/src/Qrcode.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/RouterSearch/index.vue b/grailed-ui-admin-vue3/src/components/RouterSearch/index.vue new file mode 100644 index 0000000..c12385a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/RouterSearch/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Search/index.ts b/grailed-ui-admin-vue3/src/components/Search/index.ts new file mode 100644 index 0000000..fcc6f16 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Search/index.ts @@ -0,0 +1,3 @@ +import Search from './src/Search.vue' + +export { Search } diff --git a/grailed-ui-admin-vue3/src/components/Search/src/Search.vue b/grailed-ui-admin-vue3/src/components/Search/src/Search.vue new file mode 100644 index 0000000..3218a63 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Search/src/Search.vue @@ -0,0 +1,157 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Sticky/index.ts b/grailed-ui-admin-vue3/src/components/Sticky/index.ts new file mode 100644 index 0000000..5e1de45 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Sticky/index.ts @@ -0,0 +1,3 @@ +import Sticky from './src/Sticky.vue' + +export { Sticky } diff --git a/grailed-ui-admin-vue3/src/components/Sticky/src/Sticky.vue b/grailed-ui-admin-vue3/src/components/Sticky/src/Sticky.vue new file mode 100644 index 0000000..b958544 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Sticky/src/Sticky.vue @@ -0,0 +1,143 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/Table/index.ts b/grailed-ui-admin-vue3/src/components/Table/index.ts new file mode 100644 index 0000000..689f64a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Table/index.ts @@ -0,0 +1,12 @@ +import Table from './src/Table.vue' +import { ElTable } from 'element-plus' +import { TableSetPropsType } from '@/types/table' + +export interface TableExpose { + setProps: (props: Recordable) => void + setColumn: (columnProps: TableSetPropsType[]) => void + selections: Recordable[] + elTableRef: ComponentRef +} + +export { Table } diff --git a/grailed-ui-admin-vue3/src/components/Table/src/Table.vue b/grailed-ui-admin-vue3/src/components/Table/src/Table.vue new file mode 100644 index 0000000..a13e2b9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Table/src/Table.vue @@ -0,0 +1,311 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/Table/src/helper.ts b/grailed-ui-admin-vue3/src/components/Table/src/helper.ts new file mode 100644 index 0000000..d8b34a8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Table/src/helper.ts @@ -0,0 +1,8 @@ +export const setIndex = (reserveIndex: boolean, index: number, size: number, current: number) => { + const newIndex = index + 1 + if (reserveIndex) { + return size * (current - 1) + newIndex + } else { + return newIndex + } +} diff --git a/grailed-ui-admin-vue3/src/components/Table/src/types.ts b/grailed-ui-admin-vue3/src/components/Table/src/types.ts new file mode 100644 index 0000000..1c7ff76 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Table/src/types.ts @@ -0,0 +1,26 @@ +import { Pagination, TableColumn } from '@/types/table' + +export type TableProps = { + pageSize?: number + currentPage?: number + // 是否多选 + selection?: boolean + // 是否所有的超出隐藏,优先级低于schema中的showOverflowTooltip, + showOverflowTooltip?: boolean + // 表头 + columns?: TableColumn[] + // 是否展示分页 + pagination?: Pagination | undefined + // 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key) + reserveSelection?: boolean + // 加载状态 + loading?: boolean + // 是否叠加索引 + reserveIndex?: boolean + // 对齐方式 + align?: 'left' | 'center' | 'right' + // 表头对齐方式 + headerAlign?: 'left' | 'center' | 'right' + data?: Recordable + expand?: boolean +} & Recordable diff --git a/grailed-ui-admin-vue3/src/components/Tooltip/index.ts b/grailed-ui-admin-vue3/src/components/Tooltip/index.ts new file mode 100644 index 0000000..ab66ddf --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Tooltip/index.ts @@ -0,0 +1,3 @@ +import Tooltip from './src/Tooltip.vue' + +export { Tooltip } diff --git a/grailed-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue b/grailed-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue new file mode 100644 index 0000000..b8d252b --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Tooltip/src/Tooltip.vue @@ -0,0 +1,17 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/UploadFile/index.ts b/grailed-ui-admin-vue3/src/components/UploadFile/index.ts new file mode 100644 index 0000000..97c1d66 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/UploadFile/index.ts @@ -0,0 +1,5 @@ +import UploadImg from './src/UploadImg.vue' +import UploadImgs from './src/UploadImgs.vue' +import UploadFile from './src/UploadFile.vue' + +export { UploadImg, UploadImgs, UploadFile } diff --git a/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadFile.vue b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadFile.vue new file mode 100644 index 0000000..c8a3b97 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadFile.vue @@ -0,0 +1,170 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImg.vue b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImg.vue new file mode 100644 index 0000000..3cfc0a7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImg.vue @@ -0,0 +1,271 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue new file mode 100644 index 0000000..91bb5e3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/UploadFile/src/UploadImgs.vue @@ -0,0 +1,309 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/components/Verifition/index.ts b/grailed-ui-admin-vue3/src/components/Verifition/index.ts new file mode 100644 index 0000000..bcfe6d9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/index.ts @@ -0,0 +1,3 @@ +import Verify from './src/Verify.vue' + +export { Verify } diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/Verify.vue b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify.vue new file mode 100644 index 0000000..b7b5048 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify.vue @@ -0,0 +1,441 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifyPoints.vue b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifyPoints.vue new file mode 100644 index 0000000..9d04f29 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifyPoints.vue @@ -0,0 +1,250 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifySlide.vue b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifySlide.vue new file mode 100644 index 0000000..573a822 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/VerifySlide.vue @@ -0,0 +1,380 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/index.ts b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/index.ts new file mode 100644 index 0000000..0daa63a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/Verify/index.ts @@ -0,0 +1,4 @@ +import VerifySlide from './VerifySlide.vue' +import VerifyPoints from './VerifyPoints.vue' + +export { VerifySlide, VerifyPoints } diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/utils/ase.ts b/grailed-ui-admin-vue3/src/components/Verifition/src/utils/ase.ts new file mode 100644 index 0000000..d2e6b98 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/utils/ase.ts @@ -0,0 +1,14 @@ +import CryptoJS from 'crypto-js' +/** + * @word 要加密的内容 + * @keyWord String 服务器随机返回的关键字 + * */ +export function aesEncrypt(word, keyWord = 'XwKsGlMcdPMEhR1B') { + const key = CryptoJS.enc.Utf8.parse(keyWord) + const srcs = CryptoJS.enc.Utf8.parse(word) + const encrypted = CryptoJS.AES.encrypt(srcs, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return encrypted.toString() +} diff --git a/grailed-ui-admin-vue3/src/components/Verifition/src/utils/util.ts b/grailed-ui-admin-vue3/src/components/Verifition/src/utils/util.ts new file mode 100644 index 0000000..50bfbed --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/Verifition/src/utils/util.ts @@ -0,0 +1,102 @@ +export function resetSize(vm) { + let img_width, img_height, bar_width, bar_height //图片的宽度、高度,移动条的宽度、高度 + const EmployeeWindow = window as any + const parentWidth = vm.$el.parentNode.offsetWidth || EmployeeWindow.offsetWidth + const parentHeight = vm.$el.parentNode.offsetHeight || EmployeeWindow.offsetHeight + if (vm.imgSize.width.indexOf('%') != -1) { + img_width = (parseInt(vm.imgSize.width) / 100) * parentWidth + 'px' + } else { + img_width = vm.imgSize.width + } + + if (vm.imgSize.height.indexOf('%') != -1) { + img_height = (parseInt(vm.imgSize.height) / 100) * parentHeight + 'px' + } else { + img_height = vm.imgSize.height + } + + if (vm.barSize.width.indexOf('%') != -1) { + bar_width = (parseInt(vm.barSize.width) / 100) * parentWidth + 'px' + } else { + bar_width = vm.barSize.width + } + + if (vm.barSize.height.indexOf('%') != -1) { + bar_height = (parseInt(vm.barSize.height) / 100) * parentHeight + 'px' + } else { + bar_height = vm.barSize.height + } + + return { + imgWidth: img_width, + imgHeight: img_height, + barWidth: bar_width, + barHeight: bar_height + } +} + +export const _code_chars = [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z' +] +export const _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0'] +export const _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC'] diff --git a/grailed-ui-admin-vue3/src/components/XButton/index.ts b/grailed-ui-admin-vue3/src/components/XButton/index.ts new file mode 100644 index 0000000..be0f0d4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/XButton/index.ts @@ -0,0 +1,4 @@ +import XButton from './src/XButton.vue' +import XTextButton from './src/XTextButton.vue' + +export { XButton, XTextButton } diff --git a/grailed-ui-admin-vue3/src/components/XButton/src/XButton.vue b/grailed-ui-admin-vue3/src/components/XButton/src/XButton.vue new file mode 100644 index 0000000..40cba1a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/XButton/src/XButton.vue @@ -0,0 +1,50 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/components/XButton/src/XTextButton.vue b/grailed-ui-admin-vue3/src/components/XButton/src/XTextButton.vue new file mode 100644 index 0000000..b1a922b --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/XButton/src/XTextButton.vue @@ -0,0 +1,49 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue new file mode 100644 index 0000000..3fe2194 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue @@ -0,0 +1,704 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue new file mode 100644 index 0000000..856fb2d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue @@ -0,0 +1,575 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index.ts new file mode 100644 index 0000000..8522846 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index.ts @@ -0,0 +1,8 @@ +import MyProcessDesigner from './ProcessDesigner.vue' + +MyProcessDesigner.install = function (Vue) { + Vue.component(MyProcessDesigner.name, MyProcessDesigner) +} + +// 流程图的设计器,可编辑 +export default MyProcessDesigner diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index2.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index2.ts new file mode 100644 index 0000000..ebe8ca7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/index2.ts @@ -0,0 +1,8 @@ +import MyProcessViewer from './ProcessViewer.vue' + +MyProcessViewer.install = function (Vue) { + Vue.component(MyProcessViewer.name, MyProcessViewer) +} + +// 流程图的查看器,不可编辑 +export default MyProcessViewer diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/contentPadProvider.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/contentPadProvider.js new file mode 100644 index 0000000..8783493 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/contentPadProvider.js @@ -0,0 +1,423 @@ +import { assign, forEach, isArray } from 'min-dash' + +import { is } from 'bpmn-js/lib/util/ModelUtil' + +import { isExpanded, isEventSubProcess } from 'bpmn-js/lib/util/DiUtil' + +import { isAny } from 'bpmn-js/lib/features/modeling/util/ModelingUtil' + +import { getChildLanes } from 'bpmn-js/lib/features/modeling/util/LaneUtil' + +import { hasPrimaryModifier } from 'diagram-js/lib/util/Mouse' + +/** + * A provider for BPMN 2.0 elements context pad + */ +export default function ContextPadProvider( + config, + injector, + eventBus, + contextPad, + modeling, + elementFactory, + connect, + create, + popupMenu, + canvas, + rules, + translate +) { + config = config || {} + + contextPad.registerProvider(this) + + this._contextPad = contextPad + + this._modeling = modeling + + this._elementFactory = elementFactory + this._connect = connect + this._create = create + this._popupMenu = popupMenu + this._canvas = canvas + this._rules = rules + this._translate = translate + + if (config.autoPlace !== false) { + this._autoPlace = injector.get('autoPlace', false) + } + + eventBus.on('create.end', 250, function (event) { + const context = event.context, + shape = context.shape + + if (!hasPrimaryModifier(event) || !contextPad.isOpen(shape)) { + return + } + + const entries = contextPad.getEntries(shape) + + if (entries.replace) { + entries.replace.action.click(event, shape) + } + }) +} + +ContextPadProvider.$inject = [ + 'config.contextPad', + 'injector', + 'eventBus', + 'contextPad', + 'modeling', + 'elementFactory', + 'connect', + 'create', + 'popupMenu', + 'canvas', + 'rules', + 'translate', + 'elementRegistry' +] + +ContextPadProvider.prototype.getContextPadEntries = function (element) { + const contextPad = this._contextPad, + modeling = this._modeling, + elementFactory = this._elementFactory, + connect = this._connect, + create = this._create, + popupMenu = this._popupMenu, + canvas = this._canvas, + rules = this._rules, + autoPlace = this._autoPlace, + translate = this._translate + + const actions = {} + + if (element.type === 'label') { + return actions + } + + const businessObject = element.businessObject + + function startConnect(event, element) { + connect.start(event, element) + } + + function removeElement() { + modeling.removeElements([element]) + } + + function getReplaceMenuPosition(element) { + const Y_OFFSET = 5 + + const diagramContainer = canvas.getContainer(), + pad = contextPad.getPad(element).html + + const diagramRect = diagramContainer.getBoundingClientRect(), + padRect = pad.getBoundingClientRect() + + const top = padRect.top - diagramRect.top + const left = padRect.left - diagramRect.left + + const pos = { + x: left, + y: top + padRect.height + Y_OFFSET + } + + return pos + } + + /** + * Create an append action + * + * @param {string} type + * @param {string} className + * @param {string} [title] + * @param {Object} [options] + * + * @return {Object} descriptor + */ + function appendAction(type, className, title, options) { + if (typeof title !== 'string') { + options = title + title = translate('Append {type}', { type: type.replace(/^bpmn:/, '') }) + } + + function appendStart(event, element) { + const shape = elementFactory.createShape(assign({ type: type }, options)) + create.start(event, shape, { + source: element + }) + } + + const append = autoPlace + ? function (event, element) { + const shape = elementFactory.createShape(assign({ type: type }, options)) + + autoPlace.append(element, shape) + } + : appendStart + + return { + group: 'model', + className: className, + title: title, + action: { + dragstart: appendStart, + click: append + } + } + } + + function splitLaneHandler(count) { + return function (event, element) { + // actual split + modeling.splitLane(element, count) + + // refresh context pad after split to + // get rid of split icons + contextPad.open(element, true) + } + } + + if (isAny(businessObject, ['bpmn:Lane', 'bpmn:Participant']) && isExpanded(businessObject)) { + const childLanes = getChildLanes(element) + + assign(actions, { + 'lane-insert-above': { + group: 'lane-insert-above', + className: 'bpmn-icon-lane-insert-above', + title: translate('Add Lane above'), + action: { + click: function (event, element) { + modeling.addLane(element, 'top') + } + } + } + }) + + if (childLanes.length < 2) { + if (element.height >= 120) { + assign(actions, { + 'lane-divide-two': { + group: 'lane-divide', + className: 'bpmn-icon-lane-divide-two', + title: translate('Divide into two Lanes'), + action: { + click: splitLaneHandler(2) + } + } + }) + } + + if (element.height >= 180) { + assign(actions, { + 'lane-divide-three': { + group: 'lane-divide', + className: 'bpmn-icon-lane-divide-three', + title: translate('Divide into three Lanes'), + action: { + click: splitLaneHandler(3) + } + } + }) + } + } + + assign(actions, { + 'lane-insert-below': { + group: 'lane-insert-below', + className: 'bpmn-icon-lane-insert-below', + title: translate('Add Lane below'), + action: { + click: function (event, element) { + modeling.addLane(element, 'bottom') + } + } + } + }) + } + + if (is(businessObject, 'bpmn:FlowNode')) { + if (is(businessObject, 'bpmn:EventBasedGateway')) { + assign(actions, { + 'append.receive-task': appendAction( + 'bpmn:ReceiveTask', + 'bpmn-icon-receive-task', + translate('Append ReceiveTask') + ), + 'append.message-intermediate-event': appendAction( + 'bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-message', + translate('Append MessageIntermediateCatchEvent'), + { eventDefinitionType: 'bpmn:MessageEventDefinition' } + ), + 'append.timer-intermediate-event': appendAction( + 'bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-timer', + translate('Append TimerIntermediateCatchEvent'), + { eventDefinitionType: 'bpmn:TimerEventDefinition' } + ), + 'append.condition-intermediate-event': appendAction( + 'bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-condition', + translate('Append ConditionIntermediateCatchEvent'), + { eventDefinitionType: 'bpmn:ConditionalEventDefinition' } + ), + 'append.signal-intermediate-event': appendAction( + 'bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-signal', + translate('Append SignalIntermediateCatchEvent'), + { eventDefinitionType: 'bpmn:SignalEventDefinition' } + ) + }) + } else if ( + isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition') + ) { + assign(actions, { + 'append.compensation-activity': appendAction( + 'bpmn:Task', + 'bpmn-icon-task', + translate('Append compensation activity'), + { + isForCompensation: true + } + ) + }) + } else if ( + !is(businessObject, 'bpmn:EndEvent') && + !businessObject.isForCompensation && + !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') && + !isEventSubProcess(businessObject) + ) { + assign(actions, { + 'append.end-event': appendAction( + 'bpmn:EndEvent', + 'bpmn-icon-end-event-none', + translate('Append EndEvent') + ), + 'append.gateway': appendAction( + 'bpmn:ExclusiveGateway', + 'bpmn-icon-gateway-none', + translate('Append Gateway') + ), + 'append.append-task': appendAction( + 'bpmn:UserTask', + 'bpmn-icon-user-task', + translate('Append Task') + ), + 'append.intermediate-event': appendAction( + 'bpmn:IntermediateThrowEvent', + 'bpmn-icon-intermediate-event-none', + translate('Append Intermediate/Boundary Event') + ) + }) + } + } + + if (!popupMenu.isEmpty(element, 'bpmn-replace')) { + // Replace menu entry + assign(actions, { + replace: { + group: 'edit', + className: 'bpmn-icon-screw-wrench', + title: '修改类型', + action: { + click: function (event, element) { + const position = assign(getReplaceMenuPosition(element), { + cursor: { x: event.x, y: event.y } + }) + + popupMenu.open(element, 'bpmn-replace', position) + } + } + } + }) + } + + if ( + isAny(businessObject, [ + 'bpmn:FlowNode', + 'bpmn:InteractionNode', + 'bpmn:DataObjectReference', + 'bpmn:DataStoreReference' + ]) + ) { + assign(actions, { + 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation'), + + connect: { + group: 'connect', + className: 'bpmn-icon-connection-multi', + title: translate( + 'Connect using ' + + (businessObject.isForCompensation ? '' : 'Sequence/MessageFlow or ') + + 'Association' + ), + action: { + click: startConnect, + dragstart: startConnect + } + } + }) + } + + if (isAny(businessObject, ['bpmn:DataObjectReference', 'bpmn:DataStoreReference'])) { + assign(actions, { + connect: { + group: 'connect', + className: 'bpmn-icon-connection-multi', + title: translate('Connect using DataInputAssociation'), + action: { + click: startConnect, + dragstart: startConnect + } + } + }) + } + + if (is(businessObject, 'bpmn:Group')) { + assign(actions, { + 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation') + }) + } + + // delete element entry, only show if allowed by rules + let deleteAllowed = rules.allowed('elements.delete', { elements: [element] }) + + if (isArray(deleteAllowed)) { + // was the element returned as a deletion candidate? + deleteAllowed = deleteAllowed[0] === element + } + + if (deleteAllowed) { + assign(actions, { + delete: { + group: 'edit', + className: 'bpmn-icon-trash', + title: translate('Remove'), + action: { + click: removeElement + } + } + }) + } + + return actions +} + +// helpers ///////// + +function isEventType(eventBo, type, definition) { + const isType = eventBo.$instanceOf(type) + let isDefinition = false + + const definitions = eventBo.eventDefinitions || [] + forEach(definitions, function (def) { + if (def.$type === definition) { + isDefinition = true + } + }) + + return isType && isDefinition +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js new file mode 100644 index 0000000..80009ef --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/content-pad/index.js @@ -0,0 +1,6 @@ +import CustomContextPadProvider from './contentPadProvider' + +export default { + __init__: ['contextPadProvider'], + contextPadProvider: ['type', CustomContextPadProvider] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/defaultEmpty.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/defaultEmpty.js new file mode 100644 index 0000000..f3bc894 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/defaultEmpty.js @@ -0,0 +1,24 @@ +export default (key, name, type) => { + if (!type) type = 'camunda' + const TYPE_TARGET = { + activiti: 'http://activiti.org/bpmn', + camunda: 'http://bpmn.io/schema/bpmn', + flowable: 'http://flowable.org/bpmn' + } + return ` + + + + + + + +` +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json new file mode 100644 index 0000000..db5e490 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json @@ -0,0 +1,994 @@ +{ + "name": "Activiti", + "uri": "http://activiti.org/bpmn", + "prefix": "activiti", + "xml": { + "tagAlias": "lowerCase" + }, + "associations": [], + "types": [ + { + "name": "Definitions", + "isAbstract": true, + "extends": ["bpmn:Definitions"], + "properties": [ + { + "name": "diagramRelationId", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "InOutBinding", + "superClass": ["Element"], + "isAbstract": true, + "properties": [ + { + "name": "source", + "isAttr": true, + "type": "String" + }, + { + "name": "sourceExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "target", + "isAttr": true, + "type": "String" + }, + { + "name": "businessKey", + "isAttr": true, + "type": "String" + }, + { + "name": "local", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "variables", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "In", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity"] + } + }, + { + "name": "Out", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity"] + } + }, + { + "name": "AsyncCapable", + "isAbstract": true, + "extends": ["bpmn:Activity", "bpmn:Gateway", "bpmn:Event"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncBefore", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncAfter", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "exclusive", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "JobPriorized", + "isAbstract": true, + "extends": ["bpmn:Process", "activiti:AsyncCapable"], + "properties": [ + { + "name": "jobPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "SignalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:SignalEventDefinition"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + } + ] + }, + { + "name": "ErrorEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ErrorEventDefinition"], + "properties": [ + { + "name": "errorCodeVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "errorMessageVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Error", + "isAbstract": true, + "extends": ["bpmn:Error"], + "properties": [ + { + "name": "activiti:errorMessage", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "PotentialStarter", + "superClass": ["Element"], + "properties": [ + { + "name": "resourceAssignmentExpression", + "type": "bpmn:ResourceAssignmentExpression" + } + ] + }, + { + "name": "FormSupported", + "isAbstract": true, + "extends": ["bpmn:StartEvent", "bpmn:UserTask"], + "properties": [ + { + "name": "formHandlerClass", + "isAttr": true, + "type": "String" + }, + { + "name": "formKey", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "TemplateSupported", + "isAbstract": true, + "extends": ["bpmn:Process", "bpmn:FlowElement"], + "properties": [ + { + "name": "modelerTemplate", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Initiator", + "isAbstract": true, + "extends": ["bpmn:StartEvent"], + "properties": [ + { + "name": "initiator", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ScriptTask", + "isAbstract": true, + "extends": ["bpmn:ScriptTask"], + "properties": [ + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Process", + "isAbstract": true, + "extends": ["bpmn:Process"], + "properties": [ + { + "name": "candidateStarterGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateStarterUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "versionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "historyTimeToLive", + "isAttr": true, + "type": "String" + }, + { + "name": "isStartableInTasklist", + "isAttr": true, + "type": "Boolean", + "default": true + }, + { + "name": "executionListener", + "isAbstract": true, + "type": "Expression" + } + ] + }, + { + "name": "EscalationEventDefinition", + "isAbstract": true, + "extends": ["bpmn:EscalationEventDefinition"], + "properties": [ + { + "name": "escalationCodeVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FormalExpression", + "isAbstract": true, + "extends": ["bpmn:FormalExpression"], + "properties": [ + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "multiinstance_type", + "superClass": ["Element"] + }, + { + "name": "multiinstance_condition", + "superClass": ["Element"] + }, + { + "name": "Assignable", + "extends": ["bpmn:UserTask"], + "properties": [ + { + "name": "assignee", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "dueDate", + "isAttr": true, + "type": "String" + }, + { + "name": "followUpDate", + "isAttr": true, + "type": "String" + }, + { + "name": "priority", + "isAttr": true, + "type": "String" + }, + { + "name": "multiinstance_condition", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "CallActivity", + "extends": ["bpmn:CallActivity"], + "properties": [ + { + "name": "calledElementBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "calledElementVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementVersionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "caseRef", + "isAttr": true, + "type": "String" + }, + { + "name": "caseBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "caseVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "caseTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingClass", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingDelegateExpression", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ServiceTaskLike", + "extends": [ + "bpmn:ServiceTask", + "bpmn:BusinessRuleTask", + "bpmn:SendTask", + "bpmn:MessageEventDefinition" + ], + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "DmnCapable", + "extends": ["bpmn:BusinessRuleTask"], + "properties": [ + { + "name": "decisionRef", + "isAttr": true, + "type": "String" + }, + { + "name": "decisionRefBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "decisionRefVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "mapDecisionResult", + "isAttr": true, + "type": "String", + "default": "resultList" + }, + { + "name": "decisionRefTenantId", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ExternalCapable", + "extends": ["activiti:ServiceTaskLike"], + "properties": [ + { + "name": "type", + "isAttr": true, + "type": "String" + }, + { + "name": "topic", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "TaskPriorized", + "extends": ["bpmn:Process", "activiti:ExternalCapable"], + "properties": [ + { + "name": "taskPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Properties", + "superClass": ["Element"], + "meta": { + "allowedIn": ["*"] + }, + "properties": [ + { + "name": "values", + "type": "Property", + "isMany": true + } + ] + }, + { + "name": "Property", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "value", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "Connector", + "superClass": ["Element"], + "meta": { + "allowedIn": ["activiti:ServiceTaskLike"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + } + ] + }, + { + "name": "InputOutput", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:FlowNode", "activiti:Connector"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + }, + { + "name": "inputParameters", + "isMany": true, + "type": "InputParameter" + }, + { + "name": "outputParameters", + "isMany": true, + "type": "OutputParameter" + } + ] + }, + { + "name": "InputOutputParameter", + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "InputOutputParameterDefinition", + "isAbstract": true + }, + { + "name": "List", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "items", + "isMany": true, + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Map", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "entries", + "isMany": true, + "type": "Entry" + } + ] + }, + { + "name": "Entry", + "properties": [ + { + "name": "key", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Value", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "id", + "isAttr": true, + "type": "String" + }, + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Script", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "scriptFormat", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Field", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "activiti:ServiceTaskLike", + "activiti:ExecutionListener", + "activiti:TaskListener" + ] + }, + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "expression", + "type": "String" + }, + { + "name": "stringValue", + "isAttr": true, + "type": "String" + }, + { + "name": "string", + "type": "String" + } + ] + }, + { + "name": "InputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "OutputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "Collectable", + "isAbstract": true, + "extends": ["bpmn:MultiInstanceLoopCharacteristics"], + "superClass": ["activiti:AsyncCapable"], + "properties": [ + { + "name": "collection", + "isAttr": true, + "type": "String" + }, + { + "name": "elementVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FailedJobRetryTimeCycle", + "superClass": ["Element"], + "meta": { + "allowedIn": ["activiti:AsyncCapable", "bpmn:MultiInstanceLoopCharacteristics"] + }, + "properties": [ + { + "name": "body", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "ExecutionListener", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "bpmn:Task", + "bpmn:ServiceTask", + "bpmn:UserTask", + "bpmn:BusinessRuleTask", + "bpmn:ScriptTask", + "bpmn:ReceiveTask", + "bpmn:ManualTask", + "bpmn:ExclusiveGateway", + "bpmn:SequenceFlow", + "bpmn:ParallelGateway", + "bpmn:InclusiveGateway", + "bpmn:EventBasedGateway", + "bpmn:StartEvent", + "bpmn:IntermediateCatchEvent", + "bpmn:IntermediateThrowEvent", + "bpmn:EndEvent", + "bpmn:BoundaryEvent", + "bpmn:CallActivity", + "bpmn:SubProcess", + "bpmn:Process" + ] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + } + ] + }, + { + "name": "TaskListener", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:UserTask"] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + } + ] + }, + { + "name": "FormProperty", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "required", + "type": "String", + "isAttr": true + }, + { + "name": "readable", + "type": "String", + "isAttr": true + }, + { + "name": "writable", + "type": "String", + "isAttr": true + }, + { + "name": "variable", + "type": "String", + "isAttr": true + }, + { + "name": "expression", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "default", + "type": "String", + "isAttr": true + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "FormProperty", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "label", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "defaultValue", + "type": "String", + "isAttr": true + }, + { + "name": "properties", + "type": "Properties" + }, + { + "name": "validation", + "type": "Validation" + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "Validation", + "superClass": ["Element"], + "properties": [ + { + "name": "constraints", + "type": "Constraint", + "isMany": true + } + ] + }, + { + "name": "Constraint", + "superClass": ["Element"], + "properties": [ + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "config", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "ConditionalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ConditionalEventDefinition"], + "properties": [ + { + "name": "variableName", + "isAttr": true, + "type": "String" + }, + { + "name": "variableEvent", + "isAttr": true, + "type": "String" + } + ] + } + ], + "emumerations": [] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json new file mode 100644 index 0000000..79b86bc --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json @@ -0,0 +1,1010 @@ +{ + "name": "Camunda", + "uri": "http://camunda.org/schema/1.0/bpmn", + "prefix": "camunda", + "xml": { + "tagAlias": "lowerCase" + }, + "associations": [], + "types": [ + { + "name": "Definitions", + "isAbstract": true, + "extends": ["bpmn:Definitions"], + "properties": [ + { + "name": "diagramRelationId", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "InOutBinding", + "superClass": ["Element"], + "isAbstract": true, + "properties": [ + { + "name": "source", + "isAttr": true, + "type": "String" + }, + { + "name": "sourceExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "target", + "isAttr": true, + "type": "String" + }, + { + "name": "businessKey", + "isAttr": true, + "type": "String" + }, + { + "name": "local", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "variables", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "In", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity", "bpmn:SignalEventDefinition"] + } + }, + { + "name": "Out", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity"] + } + }, + { + "name": "AsyncCapable", + "isAbstract": true, + "extends": ["bpmn:Activity", "bpmn:Gateway", "bpmn:Event"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncBefore", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncAfter", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "exclusive", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "JobPriorized", + "isAbstract": true, + "extends": ["bpmn:Process", "camunda:AsyncCapable"], + "properties": [ + { + "name": "jobPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "SignalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:SignalEventDefinition"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + } + ] + }, + { + "name": "ErrorEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ErrorEventDefinition"], + "properties": [ + { + "name": "errorCodeVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "errorMessageVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Error", + "isAbstract": true, + "extends": ["bpmn:Error"], + "properties": [ + { + "name": "camunda:errorMessage", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "PotentialStarter", + "superClass": ["Element"], + "properties": [ + { + "name": "resourceAssignmentExpression", + "type": "bpmn:ResourceAssignmentExpression" + } + ] + }, + { + "name": "FormSupported", + "isAbstract": true, + "extends": ["bpmn:StartEvent", "bpmn:UserTask"], + "properties": [ + { + "name": "formHandlerClass", + "isAttr": true, + "type": "String" + }, + { + "name": "formKey", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "TemplateSupported", + "isAbstract": true, + "extends": ["bpmn:Process", "bpmn:FlowElement"], + "properties": [ + { + "name": "modelerTemplate", + "isAttr": true, + "type": "String" + }, + { + "name": "modelerTemplateVersion", + "isAttr": true, + "type": "Integer" + } + ] + }, + { + "name": "Initiator", + "isAbstract": true, + "extends": ["bpmn:StartEvent"], + "properties": [ + { + "name": "initiator", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ScriptTask", + "isAbstract": true, + "extends": ["bpmn:ScriptTask"], + "properties": [ + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Process", + "isAbstract": true, + "extends": ["bpmn:Process"], + "properties": [ + { + "name": "candidateStarterGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateStarterUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "versionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "historyTimeToLive", + "isAttr": true, + "type": "String" + }, + { + "name": "isStartableInTasklist", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "EscalationEventDefinition", + "isAbstract": true, + "extends": ["bpmn:EscalationEventDefinition"], + "properties": [ + { + "name": "escalationCodeVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FormalExpression", + "isAbstract": true, + "extends": ["bpmn:FormalExpression"], + "properties": [ + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Assignable", + "extends": ["bpmn:UserTask"], + "properties": [ + { + "name": "assignee", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "dueDate", + "isAttr": true, + "type": "String" + }, + { + "name": "followUpDate", + "isAttr": true, + "type": "String" + }, + { + "name": "priority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "CallActivity", + "extends": ["bpmn:CallActivity"], + "properties": [ + { + "name": "calledElementBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "calledElementVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementVersionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "caseRef", + "isAttr": true, + "type": "String" + }, + { + "name": "caseBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "caseVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "caseTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingClass", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingDelegateExpression", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ServiceTaskLike", + "extends": [ + "bpmn:ServiceTask", + "bpmn:BusinessRuleTask", + "bpmn:SendTask", + "bpmn:MessageEventDefinition" + ], + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "DmnCapable", + "extends": ["bpmn:BusinessRuleTask"], + "properties": [ + { + "name": "decisionRef", + "isAttr": true, + "type": "String" + }, + { + "name": "decisionRefBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "decisionRefVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "mapDecisionResult", + "isAttr": true, + "type": "String", + "default": "resultList" + }, + { + "name": "decisionRefTenantId", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ExternalCapable", + "extends": ["camunda:ServiceTaskLike"], + "properties": [ + { + "name": "type", + "isAttr": true, + "type": "String" + }, + { + "name": "topic", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "TaskPriorized", + "extends": ["bpmn:Process", "camunda:ExternalCapable"], + "properties": [ + { + "name": "taskPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Properties", + "superClass": ["Element"], + "meta": { + "allowedIn": ["*"] + }, + "properties": [ + { + "name": "values", + "type": "Property", + "isMany": true + } + ] + }, + { + "name": "Property", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "value", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "Connector", + "superClass": ["Element"], + "meta": { + "allowedIn": ["camunda:ServiceTaskLike"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + } + ] + }, + { + "name": "InputOutput", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:FlowNode", "camunda:Connector"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + }, + { + "name": "inputParameters", + "isMany": true, + "type": "InputParameter" + }, + { + "name": "outputParameters", + "isMany": true, + "type": "OutputParameter" + } + ] + }, + { + "name": "InputOutputParameter", + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "InputOutputParameterDefinition", + "isAbstract": true + }, + { + "name": "List", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "items", + "isMany": true, + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Map", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "entries", + "isMany": true, + "type": "Entry" + } + ] + }, + { + "name": "Entry", + "properties": [ + { + "name": "key", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Value", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "id", + "isAttr": true, + "type": "String" + }, + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Script", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "scriptFormat", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Field", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "camunda:ServiceTaskLike", + "camunda:ExecutionListener", + "camunda:TaskListener" + ] + }, + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "expression", + "type": "String" + }, + { + "name": "stringValue", + "isAttr": true, + "type": "String" + }, + { + "name": "string", + "type": "String" + } + ] + }, + { + "name": "InputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "OutputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "Collectable", + "isAbstract": true, + "extends": ["bpmn:MultiInstanceLoopCharacteristics"], + "superClass": ["camunda:AsyncCapable"], + "properties": [ + { + "name": "collection", + "isAttr": true, + "type": "String" + }, + { + "name": "elementVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FailedJobRetryTimeCycle", + "superClass": ["Element"], + "meta": { + "allowedIn": ["camunda:AsyncCapable", "bpmn:MultiInstanceLoopCharacteristics"] + }, + "properties": [ + { + "name": "body", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "ExecutionListener", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "bpmn:Task", + "bpmn:ServiceTask", + "bpmn:UserTask", + "bpmn:BusinessRuleTask", + "bpmn:ScriptTask", + "bpmn:ReceiveTask", + "bpmn:ManualTask", + "bpmn:ExclusiveGateway", + "bpmn:SequenceFlow", + "bpmn:ParallelGateway", + "bpmn:InclusiveGateway", + "bpmn:EventBasedGateway", + "bpmn:StartEvent", + "bpmn:IntermediateCatchEvent", + "bpmn:IntermediateThrowEvent", + "bpmn:EndEvent", + "bpmn:BoundaryEvent", + "bpmn:CallActivity", + "bpmn:SubProcess", + "bpmn:Process" + ] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + } + ] + }, + { + "name": "TaskListener", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:UserTask"] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + }, + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "eventDefinitions", + "type": "bpmn:TimerEventDefinition", + "isMany": true + } + ] + }, + { + "name": "FormProperty", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "required", + "type": "String", + "isAttr": true + }, + { + "name": "readable", + "type": "String", + "isAttr": true + }, + { + "name": "writable", + "type": "String", + "isAttr": true + }, + { + "name": "variable", + "type": "String", + "isAttr": true + }, + { + "name": "expression", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "default", + "type": "String", + "isAttr": true + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "FormData", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "fields", + "type": "FormField", + "isMany": true + }, + { + "name": "businessKey", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "FormField", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "label", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "defaultValue", + "type": "String", + "isAttr": true + }, + { + "name": "properties", + "type": "Properties" + }, + { + "name": "validation", + "type": "Validation" + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "Validation", + "superClass": ["Element"], + "properties": [ + { + "name": "constraints", + "type": "Constraint", + "isMany": true + } + ] + }, + { + "name": "Constraint", + "superClass": ["Element"], + "properties": [ + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "config", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "ConditionalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ConditionalEventDefinition"], + "properties": [ + { + "name": "variableName", + "isAttr": true, + "type": "String" + }, + { + "name": "variableEvents", + "isAttr": true, + "type": "String" + } + ] + } + ], + "emumerations": [] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json new file mode 100644 index 0000000..7fe7ad1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json @@ -0,0 +1,1207 @@ +{ + "name": "Flowable", + "uri": "http://flowable.org/bpmn", + "prefix": "flowable", + "xml": { + "tagAlias": "lowerCase" + }, + "associations": [], + "types": [ + { + "name": "InOutBinding", + "superClass": ["Element"], + "isAbstract": true, + "properties": [ + { + "name": "source", + "isAttr": true, + "type": "String" + }, + { + "name": "sourceExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "target", + "isAttr": true, + "type": "String" + }, + { + "name": "businessKey", + "isAttr": true, + "type": "String" + }, + { + "name": "local", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "variables", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "In", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity"] + } + }, + { + "name": "Out", + "superClass": ["InOutBinding"], + "meta": { + "allowedIn": ["bpmn:CallActivity"] + } + }, + { + "name": "AsyncCapable", + "isAbstract": true, + "extends": ["bpmn:Activity", "bpmn:Gateway", "bpmn:Event"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncBefore", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "asyncAfter", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "exclusive", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "JobPriorized", + "isAbstract": true, + "extends": ["bpmn:Process", "flowable:AsyncCapable"], + "properties": [ + { + "name": "jobPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "SignalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:SignalEventDefinition"], + "properties": [ + { + "name": "async", + "isAttr": true, + "type": "Boolean", + "default": false + } + ] + }, + { + "name": "ErrorEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ErrorEventDefinition"], + "properties": [ + { + "name": "errorCodeVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "errorMessageVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Error", + "isAbstract": true, + "extends": ["bpmn:Error"], + "properties": [ + { + "name": "flowable:errorMessage", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "PotentialStarter", + "superClass": ["Element"], + "properties": [ + { + "name": "resourceAssignmentExpression", + "type": "bpmn:ResourceAssignmentExpression" + } + ] + }, + { + "name": "FormSupported", + "isAbstract": true, + "extends": ["bpmn:StartEvent", "bpmn:UserTask"], + "properties": [ + { + "name": "formHandlerClass", + "isAttr": true, + "type": "String" + }, + { + "name": "formKey", + "isAttr": true, + "type": "String" + }, + { + "name": "formType", + "isAttr": true, + "type": "String" + }, + { + "name": "formReadOnly", + "isAttr": true, + "type": "Boolean", + "default": false + }, + { + "name": "formInit", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "TemplateSupported", + "isAbstract": true, + "extends": ["bpmn:Process", "bpmn:FlowElement"], + "properties": [ + { + "name": "modelerTemplate", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Initiator", + "isAbstract": true, + "extends": ["bpmn:StartEvent"], + "properties": [ + { + "name": "initiator", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ScriptTask", + "isAbstract": true, + "extends": ["bpmn:ScriptTask"], + "properties": [ + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Process", + "isAbstract": true, + "extends": ["bpmn:Process"], + "properties": [ + { + "name": "candidateStarterGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateStarterUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "versionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "historyTimeToLive", + "isAttr": true, + "type": "String" + }, + { + "name": "isStartableInTasklist", + "isAttr": true, + "type": "Boolean", + "default": true + } + ] + }, + { + "name": "EscalationEventDefinition", + "isAbstract": true, + "extends": ["bpmn:EscalationEventDefinition"], + "properties": [ + { + "name": "escalationCodeVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FormalExpression", + "isAbstract": true, + "extends": ["bpmn:FormalExpression"], + "properties": [ + { + "name": "resource", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Assignable", + "extends": ["bpmn:UserTask"], + "properties": [ + { + "name": "assignee", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateUsers", + "isAttr": true, + "type": "String" + }, + { + "name": "candidateGroups", + "isAttr": true, + "type": "String" + }, + { + "name": "dueDate", + "isAttr": true, + "type": "String" + }, + { + "name": "followUpDate", + "isAttr": true, + "type": "String" + }, + { + "name": "priority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Assignee", + "supperClass": "Element", + "meta": { + "allowedIn": ["*"] + }, + "properties": [ + { + "name": "label", + "type": "String", + "isAttr": true + }, + { + "name": "viewId", + "type": "Number", + "isAttr": true + } + ] + }, + { + "name": "CallActivity", + "extends": ["bpmn:CallActivity"], + "properties": [ + { + "name": "calledElementBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "calledElementVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementVersionTag", + "isAttr": true, + "type": "String" + }, + { + "name": "calledElementTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "caseRef", + "isAttr": true, + "type": "String" + }, + { + "name": "caseBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "caseVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "caseTenantId", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingClass", + "isAttr": true, + "type": "String" + }, + { + "name": "variableMappingDelegateExpression", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ServiceTaskLike", + "extends": [ + "bpmn:ServiceTask", + "bpmn:BusinessRuleTask", + "bpmn:SendTask", + "bpmn:MessageEventDefinition" + ], + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "resultVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "DmnCapable", + "extends": ["bpmn:BusinessRuleTask"], + "properties": [ + { + "name": "decisionRef", + "isAttr": true, + "type": "String" + }, + { + "name": "decisionRefBinding", + "isAttr": true, + "type": "String", + "default": "latest" + }, + { + "name": "decisionRefVersion", + "isAttr": true, + "type": "String" + }, + { + "name": "mapDecisionResult", + "isAttr": true, + "type": "String", + "default": "resultList" + }, + { + "name": "decisionRefTenantId", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "ExternalCapable", + "extends": ["flowable:ServiceTaskLike"], + "properties": [ + { + "name": "type", + "isAttr": true, + "type": "String" + }, + { + "name": "topic", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "TaskPriorized", + "extends": ["bpmn:Process", "flowable:ExternalCapable"], + "properties": [ + { + "name": "taskPriority", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Properties", + "superClass": ["Element"], + "meta": { + "allowedIn": ["*"] + }, + "properties": [ + { + "name": "values", + "type": "Property", + "isMany": true + } + ] + }, + { + "name": "Property", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "value", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "Button", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:UserTask"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "code", + "type": "String", + "isAttr": true + }, + { + "name": "isHide", + "type": "String", + "isAttr": true + }, + { + "name": "next", + "type": "String", + "isAttr": true + }, + { + "name": "sort", + "type": "Integer", + "isAttr": true + } + ] + }, + { + "name": "Assignee", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:UserTask"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "value", + "type": "String", + "isAttr": true + }, + { + "name": "condition", + "type": "String", + "isAttr": true + }, + { + "name": "operationType", + "type": "String", + "isAttr": true + }, + { + "name": "sort", + "type": "Integer", + "isAttr": true + } + ] + }, + { + "name": "Connector", + "superClass": ["Element"], + "meta": { + "allowedIn": ["flowable:ServiceTaskLike"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + } + ] + }, + { + "name": "InputOutput", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:FlowNode", "flowable:Connector"] + }, + "properties": [ + { + "name": "inputOutput", + "type": "InputOutput" + }, + { + "name": "connectorId", + "type": "String" + }, + { + "name": "inputParameters", + "isMany": true, + "type": "InputParameter" + }, + { + "name": "outputParameters", + "isMany": true, + "type": "OutputParameter" + } + ] + }, + { + "name": "InputOutputParameter", + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "InputOutputParameterDefinition", + "isAbstract": true + }, + { + "name": "List", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "items", + "isMany": true, + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Map", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "entries", + "isMany": true, + "type": "Entry" + } + ] + }, + { + "name": "Entry", + "properties": [ + { + "name": "key", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + }, + { + "name": "definition", + "type": "InputOutputParameterDefinition" + } + ] + }, + { + "name": "Value", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "id", + "isAttr": true, + "type": "String" + }, + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Script", + "superClass": ["InputOutputParameterDefinition"], + "properties": [ + { + "name": "scriptFormat", + "isAttr": true, + "type": "String" + }, + { + "name": "resource", + "isAttr": true, + "type": "String" + }, + { + "name": "value", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "Field", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "flowable:ServiceTaskLike", + "flowable:ExecutionListener", + "flowable:TaskListener" + ] + }, + "properties": [ + { + "name": "name", + "isAttr": true, + "type": "String" + }, + { + "name": "expression", + "type": "String" + }, + { + "name": "stringValue", + "isAttr": true, + "type": "String" + }, + { + "name": "string", + "type": "String" + } + ] + }, + { + "name": "ChildField", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "required", + "type": "String", + "isAttr": true + }, + { + "name": "readable", + "type": "String", + "isAttr": true + }, + { + "name": "writable", + "type": "String", + "isAttr": true + }, + { + "name": "variable", + "type": "String", + "isAttr": true + }, + { + "name": "expression", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "default", + "type": "String", + "isAttr": true + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "InputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "OutputParameter", + "superClass": ["InputOutputParameter"] + }, + { + "name": "Collectable", + "isAbstract": true, + "extends": ["bpmn:MultiInstanceLoopCharacteristics"], + "superClass": ["flowable:AsyncCapable"], + "properties": [ + { + "name": "collection", + "isAttr": true, + "type": "String" + }, + { + "name": "elementVariable", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "FailedJobRetryTimeCycle", + "superClass": ["Element"], + "meta": { + "allowedIn": ["flowable:AsyncCapable", "bpmn:MultiInstanceLoopCharacteristics"] + }, + "properties": [ + { + "name": "body", + "isBody": true, + "type": "String" + } + ] + }, + { + "name": "ExecutionListener", + "superClass": ["Element"], + "meta": { + "allowedIn": [ + "bpmn:Task", + "bpmn:ServiceTask", + "bpmn:UserTask", + "bpmn:BusinessRuleTask", + "bpmn:ScriptTask", + "bpmn:ReceiveTask", + "bpmn:ManualTask", + "bpmn:ExclusiveGateway", + "bpmn:SequenceFlow", + "bpmn:ParallelGateway", + "bpmn:InclusiveGateway", + "bpmn:EventBasedGateway", + "bpmn:StartEvent", + "bpmn:IntermediateCatchEvent", + "bpmn:IntermediateThrowEvent", + "bpmn:EndEvent", + "bpmn:BoundaryEvent", + "bpmn:CallActivity", + "bpmn:SubProcess", + "bpmn:Process" + ] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + } + ] + }, + { + "name": "TaskListener", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:UserTask"] + }, + "properties": [ + { + "name": "expression", + "isAttr": true, + "type": "String" + }, + { + "name": "class", + "isAttr": true, + "type": "String" + }, + { + "name": "delegateExpression", + "isAttr": true, + "type": "String" + }, + { + "name": "event", + "isAttr": true, + "type": "String" + }, + { + "name": "script", + "type": "Script" + }, + { + "name": "fields", + "type": "Field", + "isMany": true + } + ] + }, + { + "name": "FormProperty", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "required", + "type": "String", + "isAttr": true + }, + { + "name": "readable", + "type": "String", + "isAttr": true + }, + { + "name": "writable", + "type": "String", + "isAttr": true + }, + { + "name": "variable", + "type": "String", + "isAttr": true + }, + { + "name": "expression", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "default", + "type": "String", + "isAttr": true + }, + { + "name": "values", + "type": "Value", + "isMany": true + }, + { + "name": "children", + "type": "ChildField", + "isMany": true + }, + { + "name": "extensionElements", + "type": "bpmn:ExtensionElements", + "isMany": true + } + ] + }, + { + "name": "FormData", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"] + }, + "properties": [ + { + "name": "fields", + "type": "FormField", + "isMany": true + }, + { + "name": "businessKey", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "FormField", + "superClass": ["Element"], + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "label", + "type": "String", + "isAttr": true + }, + { + "name": "type", + "type": "String", + "isAttr": true + }, + { + "name": "datePattern", + "type": "String", + "isAttr": true + }, + { + "name": "defaultValue", + "type": "String", + "isAttr": true + }, + { + "name": "properties", + "type": "Properties" + }, + { + "name": "validation", + "type": "Validation" + }, + { + "name": "values", + "type": "Value", + "isMany": true + } + ] + }, + { + "name": "Validation", + "superClass": ["Element"], + "properties": [ + { + "name": "constraints", + "type": "Constraint", + "isMany": true + } + ] + }, + { + "name": "Constraint", + "superClass": ["Element"], + "properties": [ + { + "name": "name", + "type": "String", + "isAttr": true + }, + { + "name": "config", + "type": "String", + "isAttr": true + } + ] + }, + { + "name": "ConditionalEventDefinition", + "isAbstract": true, + "extends": ["bpmn:ConditionalEventDefinition"], + "properties": [ + { + "name": "variableName", + "isAttr": true, + "type": "String" + }, + { + "name": "variableEvent", + "isAttr": true, + "type": "String" + } + ] + }, + { + "name": "Condition", + "superClass": ["Element"], + "meta": { + "allowedIn": ["bpmn:SequenceFlow"] + }, + "properties": [ + { + "name": "id", + "type": "String", + "isAttr": true + }, + { + "name": "field", + "type": "String", + "isAttr": true + }, + { + "name": "compare", + "type": "String", + "isAttr": true + }, + { + "name": "value", + "type": "String", + "isAttr": true + }, + { + "name": "logic", + "type": "String", + "isAttr": true + }, + { + "name": "sort", + "type": "Integer", + "isAttr": true + } + ] + } + ], + "emumerations": [] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/activitiExtension.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/activitiExtension.js new file mode 100644 index 0000000..56ef38a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/activitiExtension.js @@ -0,0 +1,83 @@ +'use strict' + +import { some } from 'min-dash' + +// const some = require('min-dash').some +// const some = some + +const ALLOWED_TYPES = { + FailedJobRetryTimeCycle: [ + 'bpmn:StartEvent', + 'bpmn:BoundaryEvent', + 'bpmn:IntermediateCatchEvent', + 'bpmn:Activity' + ], + Connector: ['bpmn:EndEvent', 'bpmn:IntermediateThrowEvent'], + Field: ['bpmn:EndEvent', 'bpmn:IntermediateThrowEvent'] +} + +function is(element, type) { + return element && typeof element.$instanceOf === 'function' && element.$instanceOf(type) +} + +function exists(element) { + return element && element.length +} + +function includesType(collection, type) { + return ( + exists(collection) && + some(collection, function (element) { + return is(element, type) + }) + ) +} + +function anyType(element, types) { + return some(types, function (type) { + return is(element, type) + }) +} + +function isAllowed(propName, propDescriptor, newElement) { + const name = propDescriptor.name, + types = ALLOWED_TYPES[name.replace(/activiti:/, '')] + + return name === propName && anyType(newElement, types) +} + +function ActivitiModdleExtension(eventBus) { + eventBus.on( + 'property.clone', + function (context) { + const newElement = context.newElement, + propDescriptor = context.propertyDescriptor + + this.canCloneProperty(newElement, propDescriptor) + }, + this + ) +} + +ActivitiModdleExtension.$inject = ['eventBus'] + +ActivitiModdleExtension.prototype.canCloneProperty = function (newElement, propDescriptor) { + if (isAllowed('activiti:FailedJobRetryTimeCycle', propDescriptor, newElement)) { + return ( + includesType(newElement.eventDefinitions, 'bpmn:TimerEventDefinition') || + includesType(newElement.eventDefinitions, 'bpmn:SignalEventDefinition') || + is(newElement.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics') + ) + } + + if (isAllowed('activiti:Connector', propDescriptor, newElement)) { + return includesType(newElement.eventDefinitions, 'bpmn:MessageEventDefinition') + } + + if (isAllowed('activiti:Field', propDescriptor, newElement)) { + return includesType(newElement.eventDefinitions, 'bpmn:MessageEventDefinition') + } +} + +// module.exports = ActivitiModdleExtension; +export default ActivitiModdleExtension diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js new file mode 100644 index 0000000..c22ca34 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/activiti/index.js @@ -0,0 +1,11 @@ +/* + * @author igdianov + * address https://github.com/igdianov/activiti-bpmn-moddle + * */ + +import activitiExtension from './activitiExtension' + +export default { + __init__: ['ActivitiModdleExtension'], + ActivitiModdleExtension: ['type', activitiExtension] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/extension.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/extension.js new file mode 100644 index 0000000..b8c37a5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/extension.js @@ -0,0 +1,151 @@ +'use strict' + +import { isFunction, isObject, some } from 'min-dash' + +// const isFunction = isFunction, +// isObject = isObject, +// some = some +// const isFunction = require('min-dash').isFunction, +// isObject = require('min-dash').isObject, +// some = require('min-dash').some + +const WILDCARD = '*' + +function CamundaModdleExtension(eventBus) { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this + + eventBus.on('moddleCopy.canCopyProperty', function (context) { + const property = context.property, + parent = context.parent + + return self.canCopyProperty(property, parent) + }) +} + +CamundaModdleExtension.$inject = ['eventBus'] + +/** + * Check wether to disallow copying property. + */ +CamundaModdleExtension.prototype.canCopyProperty = function (property, parent) { + // (1) check wether property is allowed in parent + if (isObject(property) && !isAllowedInParent(property, parent)) { + return false + } + + // (2) check more complex scenarios + + if (is(property, 'camunda:InputOutput') && !this.canHostInputOutput(parent)) { + return false + } + + if (isAny(property, ['camunda:Connector', 'camunda:Field']) && !this.canHostConnector(parent)) { + return false + } + + if (is(property, 'camunda:In') && !this.canHostIn(parent)) { + return false + } +} + +CamundaModdleExtension.prototype.canHostInputOutput = function (parent) { + // allowed in camunda:Connector + const connector = getParent(parent, 'camunda:Connector') + + if (connector) { + return true + } + + // special rules inside bpmn:FlowNode + const flowNode = getParent(parent, 'bpmn:FlowNode') + + if (!flowNode) { + return false + } + + if (isAny(flowNode, ['bpmn:StartEvent', 'bpmn:Gateway', 'bpmn:BoundaryEvent'])) { + return false + } + + return !(is(flowNode, 'bpmn:SubProcess') && flowNode.get('triggeredByEvent')) +} + +CamundaModdleExtension.prototype.canHostConnector = function (parent) { + const serviceTaskLike = getParent(parent, 'camunda:ServiceTaskLike') + + if (is(serviceTaskLike, 'bpmn:MessageEventDefinition')) { + // only allow on throw and end events + return getParent(parent, 'bpmn:IntermediateThrowEvent') || getParent(parent, 'bpmn:EndEvent') + } + + return true +} + +CamundaModdleExtension.prototype.canHostIn = function (parent) { + const callActivity = getParent(parent, 'bpmn:CallActivity') + + if (callActivity) { + return true + } + + const signalEventDefinition = getParent(parent, 'bpmn:SignalEventDefinition') + + if (signalEventDefinition) { + // only allow on throw and end events + return getParent(parent, 'bpmn:IntermediateThrowEvent') || getParent(parent, 'bpmn:EndEvent') + } + + return true +} + +// module.exports = CamundaModdleExtension; +export default CamundaModdleExtension + +// helpers ////////// + +function is(element, type) { + return element && isFunction(element.$instanceOf) && element.$instanceOf(type) +} + +function isAny(element, types) { + return some(types, function (t) { + return is(element, t) + }) +} + +function getParent(element, type) { + if (!type) { + return element.$parent + } + + if (is(element, type)) { + return element + } + + if (!element.$parent) { + return + } + + return getParent(element.$parent, type) +} + +function isAllowedInParent(property, parent) { + // (1) find property descriptor + const descriptor = property.$type && property.$model.getTypeDescriptor(property.$type) + + const allowedIn = descriptor && descriptor.meta && descriptor.meta.allowedIn + + if (!allowedIn || isWildcard(allowedIn)) { + return true + } + + // (2) check wether property has parent of allowed type + return some(allowedIn, function (type) { + return getParent(parent, type) + }) +} + +function isWildcard(allowedIn) { + return allowedIn.indexOf(WILDCARD) !== -1 +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js new file mode 100644 index 0000000..1da1bc7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/camunda/index.js @@ -0,0 +1,8 @@ +'use strict' + +import extension from './extension' + +export default { + __init__: ['camundaModdleExtension'], + camundaModdleExtension: ['type', extension] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/flowableExtension.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/flowableExtension.js new file mode 100644 index 0000000..3dcea67 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/flowableExtension.js @@ -0,0 +1,83 @@ +'use strict' + +import { some } from 'min-dash' + +// const some = some +// const some = require('min-dash').some + +const ALLOWED_TYPES = { + FailedJobRetryTimeCycle: [ + 'bpmn:StartEvent', + 'bpmn:BoundaryEvent', + 'bpmn:IntermediateCatchEvent', + 'bpmn:Activity' + ], + Connector: ['bpmn:EndEvent', 'bpmn:IntermediateThrowEvent'], + Field: ['bpmn:EndEvent', 'bpmn:IntermediateThrowEvent'] +} + +function is(element, type) { + return element && typeof element.$instanceOf === 'function' && element.$instanceOf(type) +} + +function exists(element) { + return element && element.length +} + +function includesType(collection, type) { + return ( + exists(collection) && + some(collection, function (element) { + return is(element, type) + }) + ) +} + +function anyType(element, types) { + return some(types, function (type) { + return is(element, type) + }) +} + +function isAllowed(propName, propDescriptor, newElement) { + const name = propDescriptor.name, + types = ALLOWED_TYPES[name.replace(/flowable:/, '')] + + return name === propName && anyType(newElement, types) +} + +function FlowableModdleExtension(eventBus) { + eventBus.on( + 'property.clone', + function (context) { + const newElement = context.newElement, + propDescriptor = context.propertyDescriptor + + this.canCloneProperty(newElement, propDescriptor) + }, + this + ) +} + +FlowableModdleExtension.$inject = ['eventBus'] + +FlowableModdleExtension.prototype.canCloneProperty = function (newElement, propDescriptor) { + if (isAllowed('flowable:FailedJobRetryTimeCycle', propDescriptor, newElement)) { + return ( + includesType(newElement.eventDefinitions, 'bpmn:TimerEventDefinition') || + includesType(newElement.eventDefinitions, 'bpmn:SignalEventDefinition') || + is(newElement.loopCharacteristics, 'bpmn:MultiInstanceLoopCharacteristics') + ) + } + + if (isAllowed('flowable:Connector', propDescriptor, newElement)) { + return includesType(newElement.eventDefinitions, 'bpmn:MessageEventDefinition') + } + + if (isAllowed('flowable:Field', propDescriptor, newElement)) { + return includesType(newElement.eventDefinitions, 'bpmn:MessageEventDefinition') + } +} + +// module.exports = FlowableModdleExtension; +export default FlowableModdleExtension diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js new file mode 100644 index 0000000..6d59b67 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/extension-moddle/flowable/index.js @@ -0,0 +1,10 @@ +/* + * @author igdianov + * address https://github.com/igdianov/activiti-bpmn-moddle + * */ +import flowableExtension from './flowableExtension' + +export default { + __init__: ['FlowableModdleExtension'], + FlowableModdleExtension: ['type', flowableExtension] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js new file mode 100644 index 0000000..5e2803b --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/CustomPalette.js @@ -0,0 +1,221 @@ +import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider' +import { assign } from 'min-dash' + +export default function CustomPalette( + palette, + create, + elementFactory, + spaceTool, + lassoTool, + handTool, + globalConnect, + translate +) { + PaletteProvider.call( + this, + palette, + create, + elementFactory, + spaceTool, + lassoTool, + handTool, + globalConnect, + translate, + 2000 + ) +} + +const F = function () {} // 核心,利用空对象作为中介; +F.prototype = PaletteProvider.prototype // 核心,将父类的原型赋值给空对象F; + +// 利用中介函数重写原型链方法 +F.prototype.getPaletteEntries = function () { + const actions = {}, + create = this._create, + elementFactory = this._elementFactory, + spaceTool = this._spaceTool, + lassoTool = this._lassoTool, + handTool = this._handTool, + globalConnect = this._globalConnect, + translate = this._translate + + function createAction(type, group, className, title, options) { + function createListener(event) { + const shape = elementFactory.createShape(assign({ type: type }, options)) + + if (options) { + shape.businessObject.di.isExpanded = options.isExpanded + } + + create.start(event, shape) + } + + const shortType = type.replace(/^bpmn:/, '') + + return { + group: group, + className: className, + title: title || translate('Create {type}', { type: shortType }), + action: { + dragstart: createListener, + click: createListener + } + } + } + + function createSubprocess(event) { + const subProcess = elementFactory.createShape({ + type: 'bpmn:SubProcess', + x: 0, + y: 0, + isExpanded: true + }) + + const startEvent = elementFactory.createShape({ + type: 'bpmn:StartEvent', + x: 40, + y: 82, + parent: subProcess + }) + + create.start(event, [subProcess, startEvent], { + hints: { + autoSelect: [startEvent] + } + }) + } + + function createParticipant(event) { + create.start(event, elementFactory.createParticipantShape()) + } + + assign(actions, { + 'hand-tool': { + group: 'tools', + className: 'bpmn-icon-hand-tool', + title: '激活抓手工具', + // title: translate("Activate the hand tool"), + action: { + click: function (event) { + handTool.activateHand(event) + } + } + }, + 'lasso-tool': { + group: 'tools', + className: 'bpmn-icon-lasso-tool', + title: translate('Activate the lasso tool'), + action: { + click: function (event) { + lassoTool.activateSelection(event) + } + } + }, + 'space-tool': { + group: 'tools', + className: 'bpmn-icon-space-tool', + title: translate('Activate the create/remove space tool'), + action: { + click: function (event) { + spaceTool.activateSelection(event) + } + } + }, + 'global-connect-tool': { + group: 'tools', + className: 'bpmn-icon-connection-multi', + title: translate('Activate the global connect tool'), + action: { + click: function (event) { + globalConnect.toggle(event) + } + } + }, + 'tool-separator': { + group: 'tools', + separator: true + }, + 'create.start-event': createAction( + 'bpmn:StartEvent', + 'event', + 'bpmn-icon-start-event-none', + translate('Create StartEvent') + ), + 'create.intermediate-event': createAction( + 'bpmn:IntermediateThrowEvent', + 'event', + 'bpmn-icon-intermediate-event-none', + translate('Create Intermediate/Boundary Event') + ), + 'create.end-event': createAction( + 'bpmn:EndEvent', + 'event', + 'bpmn-icon-end-event-none', + translate('Create EndEvent') + ), + 'create.exclusive-gateway': createAction( + 'bpmn:ExclusiveGateway', + 'gateway', + 'bpmn-icon-gateway-none', + translate('Create Gateway') + ), + 'create.user-task': createAction( + 'bpmn:UserTask', + 'activity', + 'bpmn-icon-user-task', + translate('Create User Task') + ), + 'create.data-object': createAction( + 'bpmn:DataObjectReference', + 'data-object', + 'bpmn-icon-data-object', + translate('Create DataObjectReference') + ), + 'create.data-store': createAction( + 'bpmn:DataStoreReference', + 'data-store', + 'bpmn-icon-data-store', + translate('Create DataStoreReference') + ), + 'create.subprocess-expanded': { + group: 'activity', + className: 'bpmn-icon-subprocess-expanded', + title: translate('Create expanded SubProcess'), + action: { + dragstart: createSubprocess, + click: createSubprocess + } + }, + 'create.participant-expanded': { + group: 'collaboration', + className: 'bpmn-icon-participant', + title: translate('Create Pool/Participant'), + action: { + dragstart: createParticipant, + click: createParticipant + } + }, + 'create.group': createAction( + 'bpmn:Group', + 'artifact', + 'bpmn-icon-group', + translate('Create Group') + ) + }) + + return actions +} + +CustomPalette.$inject = [ + 'palette', + 'create', + 'elementFactory', + 'spaceTool', + 'lassoTool', + 'handTool', + 'globalConnect', + 'translate' +] + +CustomPalette.prototype = new F() // 核心,将 F的实例赋值给子类; +CustomPalette.prototype.constructor = CustomPalette // 修复子类CustomPalette的构造器指向,防止原型链的混乱; diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/index.js new file mode 100644 index 0000000..8e4f3ac --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/index.js @@ -0,0 +1,22 @@ +// import PaletteModule from "diagram-js/lib/features/palette"; +// import CreateModule from "diagram-js/lib/features/create"; +// import SpaceToolModule from "diagram-js/lib/features/space-tool"; +// import LassoToolModule from "diagram-js/lib/features/lasso-tool"; +// import HandToolModule from "diagram-js/lib/features/hand-tool"; +// import GlobalConnectModule from "diagram-js/lib/features/global-connect"; +// import translate from "diagram-js/lib/i18n/translate"; +// +// import PaletteProvider from "./paletteProvider"; +// +// export default { +// __depends__: [PaletteModule, CreateModule, SpaceToolModule, LassoToolModule, HandToolModule, GlobalConnectModule, translate], +// __init__: ["paletteProvider"], +// paletteProvider: ["type", PaletteProvider] +// }; + +import CustomPalette from './CustomPalette' + +export default { + __init__: ['paletteProvider'], + paletteProvider: ['type', CustomPalette] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js new file mode 100644 index 0000000..7098981 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/palette/paletteProvider.js @@ -0,0 +1,213 @@ +import { assign } from 'min-dash' + +/** + * A palette provider for BPMN 2.0 elements. + */ +export default function PaletteProvider( + palette, + create, + elementFactory, + spaceTool, + lassoTool, + handTool, + globalConnect, + translate +) { + this._palette = palette + this._create = create + this._elementFactory = elementFactory + this._spaceTool = spaceTool + this._lassoTool = lassoTool + this._handTool = handTool + this._globalConnect = globalConnect + this._translate = translate + + palette.registerProvider(this) +} + +PaletteProvider.$inject = [ + 'palette', + 'create', + 'elementFactory', + 'spaceTool', + 'lassoTool', + 'handTool', + 'globalConnect', + 'translate' +] + +PaletteProvider.prototype.getPaletteEntries = function () { + const actions = {}, + create = this._create, + elementFactory = this._elementFactory, + spaceTool = this._spaceTool, + lassoTool = this._lassoTool, + handTool = this._handTool, + globalConnect = this._globalConnect, + translate = this._translate + + function createAction(type, group, className, title, options) { + function createListener(event) { + const shape = elementFactory.createShape(assign({ type: type }, options)) + + if (options) { + shape.businessObject.di.isExpanded = options.isExpanded + } + + create.start(event, shape) + } + + const shortType = type.replace(/^bpmn:/, '') + + return { + group: group, + className: className, + title: title || translate('Create {type}', { type: shortType }), + action: { + dragstart: createListener, + click: createListener + } + } + } + + function createSubprocess(event) { + const subProcess = elementFactory.createShape({ + type: 'bpmn:SubProcess', + x: 0, + y: 0, + isExpanded: true + }) + + const startEvent = elementFactory.createShape({ + type: 'bpmn:StartEvent', + x: 40, + y: 82, + parent: subProcess + }) + + create.start(event, [subProcess, startEvent], { + hints: { + autoSelect: [startEvent] + } + }) + } + + function createParticipant(event) { + create.start(event, elementFactory.createParticipantShape()) + } + + assign(actions, { + 'hand-tool': { + group: 'tools', + className: 'bpmn-icon-hand-tool', + title: translate('Activate the hand tool'), + action: { + click: function (event) { + handTool.activateHand(event) + } + } + }, + 'lasso-tool': { + group: 'tools', + className: 'bpmn-icon-lasso-tool', + title: translate('Activate the lasso tool'), + action: { + click: function (event) { + lassoTool.activateSelection(event) + } + } + }, + 'space-tool': { + group: 'tools', + className: 'bpmn-icon-space-tool', + title: translate('Activate the create/remove space tool'), + action: { + click: function (event) { + spaceTool.activateSelection(event) + } + } + }, + 'global-connect-tool': { + group: 'tools', + className: 'bpmn-icon-connection-multi', + title: translate('Activate the global connect tool'), + action: { + click: function (event) { + globalConnect.toggle(event) + } + } + }, + 'tool-separator': { + group: 'tools', + separator: true + }, + 'create.start-event': createAction( + 'bpmn:StartEvent', + 'event', + 'bpmn-icon-start-event-none', + translate('Create StartEvent') + ), + 'create.intermediate-event': createAction( + 'bpmn:IntermediateThrowEvent', + 'event', + 'bpmn-icon-intermediate-event-none', + translate('Create Intermediate/Boundary Event') + ), + 'create.end-event': createAction( + 'bpmn:EndEvent', + 'event', + 'bpmn-icon-end-event-none', + translate('Create EndEvent') + ), + 'create.exclusive-gateway': createAction( + 'bpmn:ExclusiveGateway', + 'gateway', + 'bpmn-icon-gateway-none', + translate('Create Gateway') + ), + 'create.user-task': createAction( + 'bpmn:UserTask', + 'activity', + 'bpmn-icon-user-task', + translate('Create User Task') + ), + 'create.data-object': createAction( + 'bpmn:DataObjectReference', + 'data-object', + 'bpmn-icon-data-object', + translate('Create DataObjectReference') + ), + 'create.data-store': createAction( + 'bpmn:DataStoreReference', + 'data-store', + 'bpmn-icon-data-store', + translate('Create DataStoreReference') + ), + 'create.subprocess-expanded': { + group: 'activity', + className: 'bpmn-icon-subprocess-expanded', + title: translate('Create expanded SubProcess'), + action: { + dragstart: createSubprocess, + click: createSubprocess + } + }, + 'create.participant-expanded': { + group: 'collaboration', + className: 'bpmn-icon-participant', + title: translate('Create Pool/Participant'), + action: { + dragstart: createParticipant, + click: createParticipant + } + }, + 'create.group': createAction( + 'bpmn:Group', + 'artifact', + 'bpmn-icon-group', + translate('Create Group') + ) + }) + + return actions +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/customTranslate.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/customTranslate.js new file mode 100644 index 0000000..c1b99e1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/customTranslate.js @@ -0,0 +1,44 @@ +// import translations from "./zh"; +// +// export default function customTranslate(template, replacements) { +// replacements = replacements || {}; +// +// // Translate +// template = translations[template] || template; +// +// // Replace +// return template.replace(/{([^}]+)}/g, function(_, key) { +// let str = replacements[key]; +// if ( +// translations[replacements[key]] !== null && +// translations[replacements[key]] !== "undefined" +// ) { +// // eslint-disable-next-line no-mixed-spaces-and-tabs +// str = translations[replacements[key]]; +// // eslint-disable-next-line no-mixed-spaces-and-tabs +// } +// return str || "{" + key + "}"; +// }); +// } + +export default function customTranslate(translations) { + return function (template, replacements) { + replacements = replacements || {} + // Translate + template = translations[template] || template + + // Replace + return template.replace(/{([^}]+)}/g, function (_, key) { + let str = replacements[key] + if ( + translations[replacements[key]] !== null && + translations[replacements[key]] !== undefined + ) { + // eslint-disable-next-line no-mixed-spaces-and-tabs + str = translations[replacements[key]] + // eslint-disable-next-line no-mixed-spaces-and-tabs + } + return str || '{' + key + '}' + }) + } +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/zh.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/zh.js new file mode 100644 index 0000000..777db3e --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/designer/plugins/translate/zh.js @@ -0,0 +1,240 @@ +/** + * This is a sample file that should be replaced with the actual translation. + * + * Checkout https://github.com/bpmn-io/bpmn-js-i18n for a list of available + * translations and labels to translate. + */ +export default { + // 添加部分 + 'Append EndEvent': '追加结束事件', + 'Append Gateway': '追加网关', + 'Append Task': '追加任务', + 'Append Intermediate/Boundary Event': '追加中间抛出事件/边界事件', + + 'Activate the global connect tool': '激活全局连接工具', + 'Append {type}': '添加 {type}', + 'Add Lane above': '在上面添加道', + 'Divide into two Lanes': '分割成两个道', + 'Divide into three Lanes': '分割成三个道', + 'Add Lane below': '在下面添加道', + 'Append compensation activity': '追加补偿活动', + 'Change type': '修改类型', + 'Connect using Association': '使用关联连接', + 'Connect using Sequence/MessageFlow or Association': '使用顺序/消息流或者关联连接', + 'Connect using DataInputAssociation': '使用数据输入关联连接', + Remove: '移除', + 'Activate the hand tool': '激活抓手工具', + 'Activate the lasso tool': '激活套索工具', + 'Activate the create/remove space tool': '激活创建/删除空间工具', + 'Create expanded SubProcess': '创建扩展子过程', + 'Create IntermediateThrowEvent/BoundaryEvent': '创建中间抛出事件/边界事件', + 'Create Pool/Participant': '创建池/参与者', + 'Parallel Multi Instance': '并行多重事件', + 'Sequential Multi Instance': '时序多重事件', + DataObjectReference: '数据对象参考', + DataStoreReference: '数据存储参考', + Loop: '循环', + 'Ad-hoc': '即席', + 'Create {type}': '创建 {type}', + Task: '任务', + 'Send Task': '发送任务', + 'Receive Task': '接收任务', + 'User Task': '用户任务', + 'Manual Task': '手工任务', + 'Business Rule Task': '业务规则任务', + 'Service Task': '服务任务', + 'Script Task': '脚本任务', + 'Call Activity': '调用活动', + 'Sub Process (collapsed)': '子流程(折叠的)', + 'Sub Process (expanded)': '子流程(展开的)', + 'Start Event': '开始事件', + StartEvent: '开始事件', + 'Intermediate Throw Event': '中间事件', + 'End Event': '结束事件', + EndEvent: '结束事件', + 'Create StartEvent': '创建开始事件', + 'Create EndEvent': '创建结束事件', + 'Create Task': '创建任务', + 'Create User Task': '创建用户任务', + 'Create Gateway': '创建网关', + 'Create DataObjectReference': '创建数据对象', + 'Create DataStoreReference': '创建数据存储', + 'Create Group': '创建分组', + 'Create Intermediate/Boundary Event': '创建中间/边界事件', + 'Message Start Event': '消息开始事件', + 'Timer Start Event': '定时开始事件', + 'Conditional Start Event': '条件开始事件', + 'Signal Start Event': '信号开始事件', + 'Error Start Event': '错误开始事件', + 'Escalation Start Event': '升级开始事件', + 'Compensation Start Event': '补偿开始事件', + 'Message Start Event (non-interrupting)': '消息开始事件(非中断)', + 'Timer Start Event (non-interrupting)': '定时开始事件(非中断)', + 'Conditional Start Event (non-interrupting)': '条件开始事件(非中断)', + 'Signal Start Event (non-interrupting)': '信号开始事件(非中断)', + 'Escalation Start Event (non-interrupting)': '升级开始事件(非中断)', + 'Message Intermediate Catch Event': '消息中间捕获事件', + 'Message Intermediate Throw Event': '消息中间抛出事件', + 'Timer Intermediate Catch Event': '定时中间捕获事件', + 'Escalation Intermediate Throw Event': '升级中间抛出事件', + 'Conditional Intermediate Catch Event': '条件中间捕获事件', + 'Link Intermediate Catch Event': '链接中间捕获事件', + 'Link Intermediate Throw Event': '链接中间抛出事件', + 'Compensation Intermediate Throw Event': '补偿中间抛出事件', + 'Signal Intermediate Catch Event': '信号中间捕获事件', + 'Signal Intermediate Throw Event': '信号中间抛出事件', + 'Message End Event': '消息结束事件', + 'Escalation End Event': '定时结束事件', + 'Error End Event': '错误结束事件', + 'Cancel End Event': '取消结束事件', + 'Compensation End Event': '补偿结束事件', + 'Signal End Event': '信号结束事件', + 'Terminate End Event': '终止结束事件', + 'Message Boundary Event': '消息边界事件', + 'Message Boundary Event (non-interrupting)': '消息边界事件(非中断)', + 'Timer Boundary Event': '定时边界事件', + 'Timer Boundary Event (non-interrupting)': '定时边界事件(非中断)', + 'Escalation Boundary Event': '升级边界事件', + 'Escalation Boundary Event (non-interrupting)': '升级边界事件(非中断)', + 'Conditional Boundary Event': '条件边界事件', + 'Conditional Boundary Event (non-interrupting)': '条件边界事件(非中断)', + 'Error Boundary Event': '错误边界事件', + 'Cancel Boundary Event': '取消边界事件', + 'Signal Boundary Event': '信号边界事件', + 'Signal Boundary Event (non-interrupting)': '信号边界事件(非中断)', + 'Compensation Boundary Event': '补偿边界事件', + 'Exclusive Gateway': '互斥网关', + 'Parallel Gateway': '并行网关', + 'Inclusive Gateway': '相容网关', + 'Complex Gateway': '复杂网关', + 'Event based Gateway': '事件网关', + Transaction: '转运', + 'Sub Process': '子流程', + 'Event Sub Process': '事件子流程', + 'Collapsed Pool': '折叠池', + 'Expanded Pool': '展开池', + + // Errors + 'no parent for {element} in {parent}': '在{parent}里,{element}没有父类', + 'no shape type specified': '没有指定的形状类型', + 'flow elements must be children of pools/participants': '流元素必须是池/参与者的子类', + 'out of bounds release': 'out of bounds release', + 'more than {count} child lanes': '子道大于{count} ', + 'element required': '元素不能为空', + 'diagram not part of bpmn:Definitions': '流程图不符合bpmn规范', + 'no diagram to display': '没有可展示的流程图', + 'no process or collaboration to display': '没有可展示的流程/协作', + 'element {element} referenced by {referenced}#{property} not yet drawn': + '由{referenced}#{property}引用的{element}元素仍未绘制', + 'already rendered {element}': '{element} 已被渲染', + 'failed to import {element}': '导入{element}失败', + //属性面板的参数 + Id: '编号', + Name: '名称', + General: '常规', + Details: '详情', + 'Message Name': '消息名称', + Message: '消息', + Initiator: '创建者', + 'Asynchronous Continuations': '持续异步', + 'Asynchronous Before': '异步前', + 'Asynchronous After': '异步后', + 'Job Configuration': '工作配置', + Exclusive: '排除', + 'Job Priority': '工作优先级', + 'Retry Time Cycle': '重试时间周期', + Documentation: '文档', + 'Element Documentation': '元素文档', + 'History Configuration': '历史配置', + 'History Time To Live': '历史的生存时间', + Forms: '表单', + 'Form Key': '表单key', + 'Form Fields': '表单字段', + 'Business Key': '业务key', + 'Form Field': '表单字段', + ID: '编号', + Type: '类型', + Label: '名称', + 'Default Value': '默认值', + 'Default Flow': '默认流转路径', + 'Conditional Flow': '条件流转路径', + 'Sequence Flow': '普通流转路径', + Validation: '校验', + 'Add Constraint': '添加约束', + Config: '配置', + Properties: '属性', + 'Add Property': '添加属性', + Value: '值', + Listeners: '监听器', + 'Execution Listener': '执行监听', + 'Event Type': '事件类型', + 'Listener Type': '监听器类型', + 'Java Class': 'Java类', + Expression: '表达式', + 'Must provide a value': '必须提供一个值', + 'Delegate Expression': '代理表达式', + Script: '脚本', + 'Script Format': '脚本格式', + 'Script Type': '脚本类型', + 'Inline Script': '内联脚本', + 'External Script': '外部脚本', + Resource: '资源', + 'Field Injection': '字段注入', + Extensions: '扩展', + 'Input/Output': '输入/输出', + 'Input Parameters': '输入参数', + 'Output Parameters': '输出参数', + Parameters: '参数', + 'Output Parameter': '输出参数', + 'Timer Definition Type': '定时器定义类型', + 'Timer Definition': '定时器定义', + Date: '日期', + Duration: '持续', + Cycle: '循环', + Signal: '信号', + 'Signal Name': '信号名称', + Escalation: '升级', + Error: '错误', + 'Link Name': '链接名称', + Condition: '条件名称', + 'Variable Name': '变量名称', + 'Variable Event': '变量事件', + 'Specify more than one variable change event as a comma separated list.': + '多个变量事件以逗号隔开', + 'Wait for Completion': '等待完成', + 'Activity Ref': '活动参考', + 'Version Tag': '版本标签', + Executable: '可执行文件', + 'External Task Configuration': '扩展任务配置', + 'Task Priority': '任务优先级', + External: '外部', + Connector: '连接器', + 'Must configure Connector': '必须配置连接器', + 'Connector Id': '连接器编号', + Implementation: '实现方式', + 'Field Injections': '字段注入', + Fields: '字段', + 'Result Variable': '结果变量', + Topic: '主题', + 'Configure Connector': '配置连接器', + 'Input Parameter': '输入参数', + Assignee: '代理人', + 'Candidate Users': '候选用户', + 'Candidate Groups': '候选组', + 'Due Date': '到期时间', + 'Follow Up Date': '跟踪日期', + Priority: '优先级', + 'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': + '跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00', + 'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': + '跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00', + Variables: '变量', + 'Candidate Starter Configuration': '候选人起动器配置', + 'Candidate Starter Groups': '候选人起动器组', + 'This maps to the process definition key.': '这映射到流程定义键。', + 'Candidate Starter Users': '候选人起动器的用户', + 'Specify more than one user as a comma separated list.': '指定多个用户作为逗号分隔的列表。', + 'Tasklist Configuration': 'Tasklist配置', + Startable: '启动', + 'Specify more than one group as a comma separated list.': '指定多个组作为逗号分隔的列表。' +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/index.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/index.ts new file mode 100644 index 0000000..ce44a3c --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/index.ts @@ -0,0 +1,11 @@ +import MyProcessDesigner from './designer' +import MyProcessPenal from './penal' +import MyProcessViewer from './designer/index2' + +import './theme/index.scss' +import 'bpmn-js/dist/assets/diagram-js.css' +import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css' +import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css' +import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css' + +export { MyProcessDesigner, MyProcessPenal, MyProcessViewer } diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue new file mode 100644 index 0000000..ba97d96 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/palette/ProcessPalette.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue new file mode 100644 index 0000000..377592f --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue @@ -0,0 +1,211 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue new file mode 100644 index 0000000..639c1cb --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue @@ -0,0 +1,184 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue new file mode 100644 index 0000000..7d87cf2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue @@ -0,0 +1,194 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue new file mode 100644 index 0000000..2636606 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/form/ElementForm.vue @@ -0,0 +1,472 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/index.js new file mode 100644 index 0000000..7fa5617 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/index.js @@ -0,0 +1,7 @@ +import MyPropertiesPanel from './PropertiesPanel.vue' + +MyPropertiesPanel.install = function (Vue) { + Vue.component(MyPropertiesPanel.name, MyPropertiesPanel) +} + +export default MyPropertiesPanel diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue new file mode 100644 index 0000000..9930159 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue @@ -0,0 +1,419 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue new file mode 100644 index 0000000..463c5ab --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue @@ -0,0 +1,471 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/template.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/template.js new file mode 100644 index 0000000..430dc64 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/template.js @@ -0,0 +1,178 @@ +export const template = (isTaskListener) => { + return ` +
+ + + + + + + + +
+ 添加监听器 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + ${ + isTaskListener + ? "" + + "" + + "" + + "" + + "" + + "" + + '' + + '' + + "" + + "" + + '' + : '' + } + + +

+ 注入字段: + 添加字段 +

+ + + + + + + + + + +
+ 取 消 + 保 存 +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ ` +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/utilSelf.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/utilSelf.ts new file mode 100644 index 0000000..5f46abd --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/listeners/utilSelf.ts @@ -0,0 +1,62 @@ +// 初始化表单数据 +export function initListenerForm(listener) { + let self = { + ...listener + } + if (listener.script) { + self = { + ...listener, + ...listener.script, + scriptType: listener.script.resource ? 'externalScript' : 'inlineScript' + } + } + if (listener.event === 'timeout' && listener.eventDefinitions) { + if (listener.eventDefinitions.length) { + let k = '' + for (const key in listener.eventDefinitions[0]) { + console.log(listener.eventDefinitions, key) + if (key.indexOf('time') !== -1) { + k = key + self.eventDefinitionType = key.replace('time', '').toLowerCase() + } + } + console.log(k) + self.eventTimeDefinitions = listener.eventDefinitions[0][k].body + } + } + return self +} + +export function initListenerType(listener) { + let listenerType + if (listener.class) listenerType = 'classListener' + if (listener.expression) listenerType = 'expressionListener' + if (listener.delegateExpression) listenerType = 'delegateExpressionListener' + if (listener.script) listenerType = 'scriptListener' + return { + ...JSON.parse(JSON.stringify(listener)), + ...(listener.script ?? {}), + listenerType: listenerType + } +} + +export const listenerType = { + classListener: 'Java 类', + expressionListener: '表达式', + delegateExpressionListener: '代理表达式', + scriptListener: '脚本' +} + +export const eventType = { + create: '创建', + assignment: '指派', + complete: '完成', + delete: '删除', + update: '更新', + timeout: '超时' +} + +export const fieldType = { + string: '字符串', + expression: '表达式' +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue new file mode 100644 index 0000000..6f3e7e7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/multi-instance/ElementMultiInstance.vue @@ -0,0 +1,259 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/other/ElementOtherConfig.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/other/ElementOtherConfig.vue new file mode 100644 index 0000000..05532c6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/other/ElementOtherConfig.vue @@ -0,0 +1,55 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue new file mode 100644 index 0000000..7e9e858 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/properties/ElementProperties.vue @@ -0,0 +1,169 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue new file mode 100644 index 0000000..f38f31c --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue @@ -0,0 +1,113 @@ + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue new file mode 100644 index 0000000..33a12a7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue @@ -0,0 +1,86 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ReceiveTask.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ReceiveTask.vue new file mode 100644 index 0000000..83ed24e --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ReceiveTask.vue @@ -0,0 +1,125 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue new file mode 100644 index 0000000..683fef3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/ScriptTask.vue @@ -0,0 +1,99 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue new file mode 100644 index 0000000..7b793db --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue @@ -0,0 +1,98 @@ + + + diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/element-variables.scss b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/element-variables.scss new file mode 100644 index 0000000..49bd326 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/element-variables.scss @@ -0,0 +1,70 @@ +/* 改变主题色变量 */ +$--color-primary: #1890ff; +$--color-danger: #ff4d4f; + +/* 改变 icon 字体路径变量,必需 */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import '~element-ui/packages/theme-chalk/src/index'; + +.el-table td, +.el-table th { + color: #333; +} +.el-drawer__header { + padding: 16px 16px 8px 16px; + margin: 0; + line-height: 24px; + font-size: 18px; + color: #303133; + box-sizing: border-box; + border-bottom: 1px solid #e8e8e8; +} +div[class^='el-drawer']:focus, +span:focus { + outline: none; +} +.el-drawer__body { + box-sizing: border-box; + padding: 16px; + width: 100%; + overflow-y: auto; +} + +.el-dialog { + margin-top: 50vh !important; + transform: translateY(-50%); + overflow: hidden; +} +.el-dialog__wrapper { + overflow: hidden; + max-height: 100vh; +} +.el-dialog__header { + padding: 16px 16px 8px 16px; + box-sizing: border-box; + border-bottom: 1px solid #e8e8e8; +} +.el-dialog__body { + padding: 16px; + max-height: 80vh; + box-sizing: border-box; + overflow-y: auto; +} +.el-dialog__footer { + padding: 16px; + box-sizing: border-box; + border-top: 1px solid #e8e8e8; +} +.el-dialog__close { + font-weight: 600; +} +.el-select { + width: 100%; +} +.el-divider:not(.el-divider--horizontal) { + margin: 0 8px; +} +.el-divider.el-divider--horizontal { + margin: 16px 0; +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/index.scss b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/index.scss new file mode 100644 index 0000000..2e60fad --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/index.scss @@ -0,0 +1,2 @@ +@import './process-designer.scss'; +@import './process-panel.scss'; diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-designer.scss b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-designer.scss new file mode 100644 index 0000000..6af945d --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-designer.scss @@ -0,0 +1,161 @@ +@import 'bpmn-js-token-simulation/assets/css/bpmn-js-token-simulation.css'; +@import 'bpmn-js-token-simulation/assets/css/font-awesome.min.css'; +@import 'bpmn-js-token-simulation/assets/css/normalize.css'; + +// 边框被 token-simulation 样式覆盖了 +.djs-palette { + background: var(--palette-background-color); + border: solid 1px var(--palette-border-color) !important; + border-radius: 2px; +} + +.my-process-designer { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + box-sizing: border-box; + .my-process-designer__header { + width: 100%; + min-height: 36px; + .el-button { + text-align: center; + } + .el-button-group { + margin: 4px; + } + .el-tooltip__popper { + .el-button { + width: 100%; + text-align: left; + padding-left: 8px; + padding-right: 8px; + } + .el-button:hover { + background: rgba(64, 158, 255, 0.8); + color: #ffffff; + } + } + .align { + position: relative; + i { + &:after { + content: '|'; + position: absolute; + // transform: rotate(90deg) translate(200%, 60%); + transform: rotate(180deg) translate(271%, -10%); + } + } + } + .align.align-left i { + transform: rotate(90deg); + } + .align.align-right i { + transform: rotate(-90deg); + } + .align.align-top i { + transform: rotate(180deg); + } + .align.align-bottom i { + transform: rotate(0deg); + } + .align.align-center i { + transform: rotate(0deg); + &:after { + // transform: rotate(90deg) translate(0, 60%); + transform: rotate(0deg) translate(-0%, -5%); + } + } + .align.align-middle i { + transform: rotate(-90deg); + &:after { + // transform: rotate(90deg) translate(0, 60%); + transform: rotate(0deg) translate(0, -10%); + } + } + } + .my-process-designer__container { + display: inline-flex; + width: 100%; + flex: 1; + .my-process-designer__canvas { + flex: 1; + height: 100%; + position: relative; + background: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImEiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTTAgMTBoNDBNMTAgMHY0ME0wIDIwaDQwTTIwIDB2NDBNMCAzMGg0ME0zMCAwdjQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlMGUwZTAiIG9wYWNpdHk9Ii4yIi8+PHBhdGggZD0iTTQwIDBIMHY0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIi8+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2EpIi8+PC9zdmc+') + repeat !important; + div.toggle-mode { + display: none; + } + } + .my-process-designer__property-panel { + height: 100%; + overflow: scroll; + overflow-y: auto; + z-index: 10; + * { + box-sizing: border-box; + } + } + svg { + width: 100%; + height: 100%; + min-height: 100%; + overflow: hidden; + } + } +} + +//侧边栏配置 +// .djs-palette .two-column .open { +.open { + // .djs-palette.open { + .djs-palette-entries { + div[class^='bpmn-icon-']:before, + div[class*='bpmn-icon-']:before { + line-height: unset; + } + div.entry { + position: relative; + } + div.entry:hover { + &::after { + width: max-content; + content: attr(title); + vertical-align: text-bottom; + position: absolute; + right: -10px; + top: 0; + bottom: 0; + overflow: hidden; + transform: translateX(100%); + font-size: 0.5em; + display: inline-block; + text-decoration: inherit; + font-variant: normal; + text-transform: none; + background: #fafafa; + box-shadow: 0 0 6px #eeeeee; + border: 1px solid #cccccc; + box-sizing: border-box; + padding: 0 16px; + border-radius: 4px; + z-index: 100; + } + } + } +} +pre { + margin: 0; + height: 100%; + overflow: hidden; + max-height: calc(80vh - 32px); + overflow-y: auto; +} +.hljs { + word-break: break-word; + white-space: pre-wrap; +} +.hljs * { + font-family: Consolas, Monaco, monospace; +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-panel.scss b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-panel.scss new file mode 100644 index 0000000..f840cdd --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/theme/process-panel.scss @@ -0,0 +1,107 @@ +.process-panel__container { + box-sizing: border-box; + padding: 0 8px; + border-left: 1px solid #eeeeee; + box-shadow: 0 0 8px #cccccc; + max-height: 100%; + overflow-y: scroll; +} +.panel-tab__title { + font-weight: 600; + padding: 0 8px; + font-size: 1.1em; + line-height: 1.2em; + i { + margin-right: 8px; + font-size: 1.2em; + } +} +.panel-tab__content { + width: 100%; + box-sizing: border-box; + border-top: 1px solid #eeeeee; + padding: 8px 16px; + .panel-tab__content--title { + display: flex; + justify-content: space-between; + padding-bottom: 8px; + span { + flex: 1; + text-align: left; + } + } +} +.element-property { + width: 100%; + display: flex; + align-items: flex-start; + margin: 8px 0; + .element-property__label { + display: block; + width: 90px; + text-align: right; + overflow: hidden; + padding-right: 12px; + line-height: 32px; + font-size: 14px; + box-sizing: border-box; + } + .element-property__value { + flex: 1; + line-height: 32px; + } + .el-form-item { + width: 100%; + margin-bottom: 0; + padding-bottom: 18px; + } +} +.list-property { + flex-direction: column; + .element-listener-item { + width: 100%; + display: inline-grid; + grid-template-columns: 16px auto 32px 32px; + grid-column-gap: 8px; + } + .element-listener-item + .element-listener-item { + margin-top: 8px; + } +} +.listener-filed__title { + display: inline-flex; + width: 100%; + justify-content: space-between; + align-items: center; + margin-top: 0; + span { + width: 200px; + text-align: left; + font-size: 14px; + } + i { + margin-right: 8px; + } +} +.element-drawer__button { + margin-top: 8px; + width: 100%; + display: inline-flex; + justify-content: space-around; +} +.element-drawer__button > .el-button { + width: 100%; +} + +.el-collapse-item__content { + padding-bottom: 0; +} +.el-input.is-disabled .el-input__inner { + color: #999999; +} +.el-form-item.el-form-item--mini { + margin-bottom: 0; + & + .el-form-item { + margin-top: 16px; + } +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/utils.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/utils.ts new file mode 100644 index 0000000..bb6c5d5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/package/utils.ts @@ -0,0 +1,77 @@ +import { toRaw } from 'vue' +const bpmnInstances = () => (window as any)?.bpmnInstances +// 创建监听器实例 +export function createListenerObject(options, isTask, prefix) { + const listenerObj = Object.create(null) + listenerObj.event = options.event + isTask && (listenerObj.id = options.id) // 任务监听器特有的 id 字段 + switch (options.listenerType) { + case 'scriptListener': + listenerObj.script = createScriptObject(options, prefix) + break + case 'expressionListener': + listenerObj.expression = options.expression + break + case 'delegateExpressionListener': + listenerObj.delegateExpression = options.delegateExpression + break + default: + listenerObj.class = options.class + } + // 注入字段 + if (options.fields) { + listenerObj.fields = options.fields.map((field) => { + return createFieldObject(field, prefix) + }) + } + // 任务监听器的 定时器 设置 + if (isTask && options.event === 'timeout' && !!options.eventDefinitionType) { + const timeDefinition = bpmnInstances().moddle.create('bpmn:FormalExpression', { + body: options.eventTimeDefinitions + }) + const TimerEventDefinition = bpmnInstances().moddle.create('bpmn:TimerEventDefinition', { + id: `TimerEventDefinition_${uuid(8)}`, + [`time${options.eventDefinitionType.replace(/^\S/, (s) => s.toUpperCase())}`]: timeDefinition + }) + listenerObj.eventDefinitions = [TimerEventDefinition] + } + return bpmnInstances().moddle.create( + `${prefix}:${isTask ? 'TaskListener' : 'ExecutionListener'}`, + listenerObj + ) +} + +// 创建 监听器的注入字段 实例 +export function createFieldObject(option, prefix) { + const { name, fieldType, string, expression } = option + const fieldConfig = fieldType === 'string' ? { name, string } : { name, expression } + return bpmnInstances().moddle.create(`${prefix}:Field`, fieldConfig) +} + +// 创建脚本实例 +export function createScriptObject(options, prefix) { + const { scriptType, scriptFormat, value, resource } = options + const scriptConfig = + scriptType === 'inlineScript' ? { scriptFormat, value } : { scriptFormat, resource } + return bpmnInstances().moddle.create(`${prefix}:Script`, scriptConfig) +} + +// 更新元素扩展属性 +export function updateElementExtensions(element, extensionList) { + const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', { + values: extensionList + }) + bpmnInstances().modeling.updateProperties(toRaw(element), { + extensionElements: extensions + }) +} + +// 创建一个id +export function uuid(length = 8, chars?) { + let result = '' + const charsString = chars || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + for (let i = length; i > 0; --i) { + result += charsString[Math.floor(Math.random() * charsString.length)] + } + return result +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/highlight/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/highlight/index.js new file mode 100644 index 0000000..5df38c9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/highlight/index.js @@ -0,0 +1,5 @@ +const hljs = require('highlight.js/lib/core') +hljs.registerLanguage('xml', require('highlight.js/lib/languages/xml')) +hljs.registerLanguage('json', require('highlight.js/lib/languages/json')) + +module.exports = hljs diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js new file mode 100644 index 0000000..e876031 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/CustomRenderer.js @@ -0,0 +1,14 @@ +import BpmnRenderer from 'bpmn-js/lib/draw/BpmnRenderer' + +export default function CustomRenderer(config, eventBus, styles, pathMap, canvas, textRenderer) { + BpmnRenderer.call(this, config, eventBus, styles, pathMap, canvas, textRenderer, 2000) + + this.handlers['label'] = function () { + return null + } +} + +const F = function () {} // 核心,利用空对象作为中介; +F.prototype = BpmnRenderer.prototype // 核心,将父类的原型赋值给空对象F; +CustomRenderer.prototype = new F() // 核心,将 F的实例赋值给子类; +CustomRenderer.prototype.constructor = CustomRenderer // 修复子类CustomRenderer的构造器指向,防止原型链的混乱; diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js new file mode 100644 index 0000000..79d8bd0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/custom-renderer/index.js @@ -0,0 +1,6 @@ +import CustomRenderer from './CustomRenderer' + +export default { + __init__: ['customRenderer'], + customRenderer: ['type', CustomRenderer] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js new file mode 100644 index 0000000..9fa1d14 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/CustomRules.js @@ -0,0 +1,16 @@ +import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules' +import inherits from 'inherits' + +export default function CustomRules(eventBus) { + BpmnRules.call(this, eventBus) +} + +inherits(CustomRules, BpmnRules) + +CustomRules.prototype.canDrop = function () { + return false +} + +CustomRules.prototype.canMove = function () { + return false +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/index.js new file mode 100644 index 0000000..12cf05a --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/modules/rules/index.js @@ -0,0 +1,6 @@ +import CustomRules from './CustomRules' + +export default { + __init__: ['customRules'], + customRules: ['type', CustomRules] +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/translations.ts b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/translations.ts new file mode 100644 index 0000000..5f9b9a5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/translations.ts @@ -0,0 +1,25 @@ +/** + * This is a sample file that should be replaced with the actual translation. + * + * Checkout https://github.com/bpmn-io/bpmn-js-i18n for a list of available + * translations and labels to translate. + */ +export default { + 'Exclusive Gateway': 'Exklusives Gateway', + 'Parallel Gateway': 'Paralleles Gateway', + 'Inclusive Gateway': 'Inklusives Gateway', + 'Complex Gateway': 'Komplexes Gateway', + 'Event based Gateway': 'Ereignis-basiertes Gateway', + 'Message Start Event': '消息启动事件', + 'Timer Start Event': '定时启动事件', + 'Conditional Start Event': '条件启动事件', + 'Signal Start Event': '信号启动事件', + 'Error Start Event': '错误启动事件', + 'Escalation Start Event': '升级启动事件', + 'Compensation Start Event': '补偿启动事件', + 'Message Start Event (non-interrupting)': '消息启动事件 (非中断)', + 'Timer Start Event (non-interrupting)': '定时启动事件 (非中断)', + 'Conditional Start Event (non-interrupting)': '条件启动事件 (非中断)', + 'Signal Start Event (non-interrupting)': '信号启动事件 (非中断)', + 'Escalation Start Event (non-interrupting)': '升级启动事件 (非中断)' +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/directive/clickOutSide.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/directive/clickOutSide.js new file mode 100644 index 0000000..bb71d44 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/directive/clickOutSide.js @@ -0,0 +1,39 @@ +//outside.js + +const ctx = '@@clickoutsideContext' + +export default { + bind(el, binding, vnode) { + const ele = el + const documentHandler = (e) => { + if (!vnode.context || ele.contains(e.target)) { + return false + } + // 调用指令回调 + if (binding.expression) { + vnode.context[el[ctx].methodName](e) + } else { + el[ctx].bindingFn(e) + } + } + // 将方法添加到ele + ele[ctx] = { + documentHandler, + methodName: binding.expression, + bindingFn: binding.value + } + + setTimeout(() => { + document.addEventListener('touchstart', documentHandler) // 为document绑定事件 + }) + }, + update(el, binding) { + const ele = el + ele[ctx].methodName = binding.expression + ele[ctx].bindingFn = binding.value + }, + unbind(el) { + document.removeEventListener('touchstart', el[ctx].documentHandler) // 解绑 + delete el[ctx] + } +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/index.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/index.js new file mode 100644 index 0000000..7d970ec --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/index.js @@ -0,0 +1,10 @@ +export function debounce(fn, delay = 500) { + let timer + return function (...args) { + if (timer) { + clearTimeout(timer) + timer = null + } + timer = setTimeout(fn.bind(this, ...args), delay) + } +} diff --git a/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/xml2json.js b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/xml2json.js new file mode 100644 index 0000000..fe1a52f --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/bpmnProcessDesigner/src/utils/xml2json.js @@ -0,0 +1,50 @@ +function xmlStr2XmlObj(xmlStr) { + let xmlObj = {} + if (document.all) { + const xmlDom = new window.ActiveXObject('Microsoft.XMLDOM') + xmlDom.loadXML(xmlStr) + xmlObj = xmlDom + } else { + xmlObj = new DOMParser().parseFromString(xmlStr, 'text/xml') + } + return xmlObj +} + +function xml2json(xml) { + try { + let obj = {} + if (xml.children.length > 0) { + for (let i = 0; i < xml.children.length; i++) { + const item = xml.children.item(i) + const nodeName = item.nodeName + if (typeof obj[nodeName] == 'undefined') { + obj[nodeName] = xml2json(item) + } else { + if (typeof obj[nodeName].push == 'undefined') { + const old = obj[nodeName] + obj[nodeName] = [] + obj[nodeName].push(old) + } + obj[nodeName].push(xml2json(item)) + } + } + } else { + obj = xml.textContent + } + return obj + } catch (e) { + console.log(e.message) + } +} + +function xmlObj2json(xml) { + const xmlObj = xmlStr2XmlObj(xml) + console.log(xmlObj) + let jsonObj = {} + if (xmlObj.childNodes.length > 0) { + jsonObj = xml2json(xmlObj) + } + return jsonObj +} + +export default xmlObj2json diff --git a/grailed-ui-admin-vue3/src/components/index.ts b/grailed-ui-admin-vue3/src/components/index.ts new file mode 100644 index 0000000..4d030c3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/components/index.ts @@ -0,0 +1,6 @@ +import type { App } from 'vue' +import { Icon } from './Icon' + +export const setupGlobCom = (app: App): void => { + app.component('Icon', Icon) +} diff --git a/grailed-ui-admin-vue3/src/config/axios/config.ts b/grailed-ui-admin-vue3/src/config/axios/config.ts new file mode 100644 index 0000000..8116508 --- /dev/null +++ b/grailed-ui-admin-vue3/src/config/axios/config.ts @@ -0,0 +1,28 @@ +const config: { + base_url: string + result_code: number | string + default_headers: AxiosHeaders + request_timeout: number +} = { + /** + * api请求基础路径 + */ + base_url: import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL, + /** + * 接口成功返回状态码 + */ + result_code: 200, + + /** + * 接口请求超时时间 + */ + request_timeout: 30000, + + /** + * 默认接口请求类型 + * 可选值:application/x-www-form-urlencoded multipart/form-data + */ + default_headers: 'application/json' +} + +export { config } diff --git a/grailed-ui-admin-vue3/src/config/axios/errorCode.ts b/grailed-ui-admin-vue3/src/config/axios/errorCode.ts new file mode 100644 index 0000000..94d719f --- /dev/null +++ b/grailed-ui-admin-vue3/src/config/axios/errorCode.ts @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + default: '系统未知错误,请反馈给管理员' +} diff --git a/grailed-ui-admin-vue3/src/config/axios/index.ts b/grailed-ui-admin-vue3/src/config/axios/index.ts new file mode 100644 index 0000000..24d58c2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/config/axios/index.ts @@ -0,0 +1,54 @@ +import { service } from './service' + +import { config } from './config' + +const { default_headers } = config + +const request = (option: any) => { + const { url, method, params, data, headersType, responseType } = option + return service({ + url: url, + method, + params, + data, + responseType: responseType, + headers: { + 'Content-Type': headersType || default_headers + } + }) +} +export default { + get: async (option: any) => { + const res = await request({ method: 'GET', ...option }) + return res.data as unknown as T + }, + post: async (option: any) => { + const res = await request({ method: 'POST', ...option }) + return res.data as unknown as T + }, + postOriginal: async (option: any) => { + const res = await request({ method: 'POST', ...option }) + return res + }, + delete: async (option: any) => { + const res = await request({ method: 'DELETE', ...option }) + return res.data as unknown as T + }, + put: async (option: any) => { + const res = await request({ method: 'PUT', ...option }) + return res.data as unknown as T + }, + download: async (option: any) => { + const res = await request({ + method: 'GET', + responseType: 'blob', + ...option + }) + return res as unknown as Promise + }, + upload: async (option: any) => { + option.headersType = 'multipart/form-data' + const res = await request({ method: 'POST', ...option }) + return res as unknown as Promise + } +} diff --git a/grailed-ui-admin-vue3/src/config/axios/service.ts b/grailed-ui-admin-vue3/src/config/axios/service.ts new file mode 100644 index 0000000..69a68d6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/config/axios/service.ts @@ -0,0 +1,225 @@ +import axios, { + AxiosError, + AxiosInstance, + AxiosRequestHeaders, + AxiosResponse, + InternalAxiosRequestConfig +} from 'axios' + +import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' +import qs from 'qs' +import { config } from '@/config/axios/config' +import { getAccessToken, getRefreshToken, getTenantId, removeToken, setToken } from '@/utils/auth' +import errorCode from './errorCode' + +import { resetRouter } from '@/router' +import { useCache } from '@/hooks/web/useCache' + +const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE +const { result_code, base_url, request_timeout } = config + +// 需要忽略的提示。忽略后,自动 Promise.reject('error') +const ignoreMsgs = [ + '无效的刷新令牌', // 刷新令牌被删除时,不用提示 + '刷新令牌已过期' // 使用刷新令牌,刷新获取新的访问令牌时,结果因为过期失败,此时需要忽略。否则,会导致继续 401,无法跳转到登出界面 +] +// 是否显示重新登录 +export const isRelogin = { show: false } +// Axios 无感知刷新令牌,参考 https://www.dashingdog.cn/article/11 与 https://segmentfault.com/a/1190000020210980 实现 +// 请求队列 +let requestList: any[] = [] +// 是否正在刷新中 +let isRefreshToken = false +// 请求白名单,无须token的接口 +const whiteList: string[] = ['/login', '/refresh-token'] + +// 创建axios实例 +const service: AxiosInstance = axios.create({ + baseURL: base_url, // api 的 base_url + timeout: request_timeout, // 请求超时时间 + withCredentials: false // 禁用 Cookie 等信息 +}) + +// request拦截器 +service.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + // 是否需要设置 token + let isToken = (config!.headers || {}).isToken === false + whiteList.some((v) => { + if (config.url) { + config.url.indexOf(v) > -1 + return (isToken = false) + } + }) + if (getAccessToken() && !isToken) { + ;(config as Recordable).headers.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token + } + // 设置租户 + if (tenantEnable && tenantEnable === 'true') { + const tenantId = getTenantId() + if (tenantId) (config as Recordable).headers['tenant-id'] = tenantId + } + const params = config.params || {} + const data = config.data || false + if ( + config.method?.toUpperCase() === 'POST' && + (config.headers as AxiosRequestHeaders)['Content-Type'] === + 'application/x-www-form-urlencoded' + ) { + config.data = qs.stringify(data) + } + // get参数编码 + if (config.method?.toUpperCase() === 'GET' && params) { + let url = config.url + '?' + for (const propName of Object.keys(params)) { + const value = params[propName] + if (value !== void 0 && value !== null && typeof value !== 'undefined') { + if (typeof value === 'object') { + for (const val of Object.keys(value)) { + const params = propName + '[' + val + ']' + const subPart = encodeURIComponent(params) + '=' + url += subPart + encodeURIComponent(value[val]) + '&' + } + } else { + url += `${propName}=${encodeURIComponent(value)}&` + } + } + } + // 给 get 请求加上时间戳参数,避免从缓存中拿数据 + // const now = new Date().getTime() + // params = params.substring(0, url.length - 1) + `?_t=${now}` + url = url.slice(0, -1) + config.params = {} + config.url = url + } + return config + }, + (error: AxiosError) => { + // Do something with request error + console.log(error) // for debug + Promise.reject(error) + } +) + +// response 拦截器 +service.interceptors.response.use( + async (response: AxiosResponse) => { + const { data } = response + const config = response.config + if (!data) { + // 返回“[HTTP]请求没有返回值”; + throw new Error() + } + const { t } = useI18n() + // 未设置状态码则默认成功状态 + const code = data.code || result_code + // 二进制数据则直接返回 + if ( + response.request.responseType === 'blob' || + response.request.responseType === 'arraybuffer' + ) { + return response.data + } + // 获取错误信息 + const msg = data.msg || errorCode[code] || errorCode['default'] + if (ignoreMsgs.indexOf(msg) !== -1) { + // 如果是忽略的错误码,直接返回 msg 异常 + return Promise.reject(msg) + } else if (code === 401) { + // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 + if (!isRefreshToken) { + isRefreshToken = true + // 1. 如果获取不到刷新令牌,则只能执行登出操作 + if (!getRefreshToken()) { + return handleAuthorized() + } + // 2. 进行刷新访问令牌 + try { + const refreshTokenRes = await refreshToken() + // 2.1 刷新成功,则回放队列的请求 + 当前请求 + setToken((await refreshTokenRes).data.data) + config.headers!.Authorization = 'Bearer ' + getAccessToken() + requestList.forEach((cb: any) => { + cb() + }) + requestList = [] + return service(config) + } catch (e) { + // 为什么需要 catch 异常呢?刷新失败时,请求因为 Promise.reject 触发异常。 + // 2.2 刷新失败,只回放队列的请求 + requestList.forEach((cb: any) => { + cb() + }) + // 提示是否要登出。即不回放当前请求!不然会形成递归 + return handleAuthorized() + } finally { + requestList = [] + isRefreshToken = false + } + } else { + // 添加到队列,等待刷新获取到新的令牌 + return new Promise((resolve) => { + requestList.push(() => { + config.headers!.Authorization = 'Bearer ' + getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + resolve(service(config)) + }) + }) + } + } else if (code === 500) { + ElMessage.error(t('sys.api.errMsg500')) + return Promise.reject(new Error(msg)) + } else if (code !== 200) { + if (msg === '无效的刷新令牌') { + // hard coding:忽略这个提示,直接登出 + console.log(msg) + } else { + ElNotification.error({ title: msg }) + } + return Promise.reject('error') + } else { + return data + } + }, + (error: AxiosError) => { + console.log('err' + error) // for debug + let { message } = error + const { t } = useI18n() + if (message === 'Network Error') { + message = t('sys.api.errorMessage') + } else if (message.includes('timeout')) { + message = t('sys.api.apiTimeoutMessage') + } else if (message.includes('Request failed with status code')) { + message = t('sys.api.apiRequestFailed') + message.substr(message.length - 3) + } + ElMessage.error(message) + return Promise.reject(error) + } +) + +const refreshToken = async () => { + axios.defaults.headers.common['tenant-id'] = getTenantId() + return await axios.post(base_url + '/system/auth/refresh-token?refreshToken=' + getRefreshToken()) +} +const handleAuthorized = () => { + const { t } = useI18n() + if (!isRelogin.show) { + isRelogin.show = true + ElMessageBox.confirm(t('sys.api.timeoutMessage'), t('common.confirmTitle'), { + showCancelButton: false, + closeOnClickModal: false, + showClose: false, + confirmButtonText: t('login.relogin'), + type: 'warning' + }).then(() => { + const { wsCache } = useCache() + resetRouter() // 重置静态路由表 + wsCache.clear() + removeToken() + isRelogin.show = false + // 干掉token后再走一次路由让它过router.beforeEach的校验 + window.location.href = window.location.href + }) + } + return Promise.reject(t('sys.api.timeoutMessage')) +} +export { service } diff --git a/grailed-ui-admin-vue3/src/directives/index.ts b/grailed-ui-admin-vue3/src/directives/index.ts new file mode 100644 index 0000000..89cc8ba --- /dev/null +++ b/grailed-ui-admin-vue3/src/directives/index.ts @@ -0,0 +1,13 @@ +import type { App } from 'vue' +import { hasRole } from './permission/hasRole' +import { hasPermi } from './permission/hasPermi' + +/** + * 导出指令:v-xxx + * @methods hasRole 用户权限,用法: v-hasRole + * @methods hasPermi 按钮权限,用法: v-hasPermi + */ +export const setupAuth = (app: App) => { + hasRole(app) + hasPermi(app) +} diff --git a/grailed-ui-admin-vue3/src/directives/permission/hasPermi.ts b/grailed-ui-admin-vue3/src/directives/permission/hasPermi.ts new file mode 100644 index 0000000..d86d2f5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/directives/permission/hasPermi.ts @@ -0,0 +1,27 @@ +import type { App } from 'vue' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' + +const { t } = useI18n() // 国际化 + +export function hasPermi(app: App) { + app.directive('hasPermi', (el, binding) => { + const { wsCache } = useCache() + const { value } = binding + const all_permission = '*:*:*' + const permissions = wsCache.get(CACHE_KEY.USER).permissions + + if (value && value instanceof Array && value.length > 0) { + const permissionFlag = value + + const hasPermissions = permissions.some((permission: string) => { + return all_permission === permission || permissionFlag.includes(permission) + }) + + if (!hasPermissions) { + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(t('permission.hasPermission')) + } + }) +} diff --git a/grailed-ui-admin-vue3/src/directives/permission/hasRole.ts b/grailed-ui-admin-vue3/src/directives/permission/hasRole.ts new file mode 100644 index 0000000..31a352a --- /dev/null +++ b/grailed-ui-admin-vue3/src/directives/permission/hasRole.ts @@ -0,0 +1,27 @@ +import type { App } from 'vue' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' + +const { t } = useI18n() // 国际化 + +export function hasRole(app: App) { + app.directive('hasRole', (el, binding) => { + const { wsCache } = useCache() + const { value } = binding + const super_admin = 'admin' + const roles = wsCache.get(CACHE_KEY.USER).roles + + if (value && value instanceof Array && value.length > 0) { + const roleFlag = value + + const hasRole = roles.some((role: string) => { + return super_admin === role || roleFlag.includes(role) + }) + + if (!hasRole) { + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(t('permission.hasRole')) + } + }) +} diff --git a/grailed-ui-admin-vue3/src/hooks/event/useScrollTo.ts b/grailed-ui-admin-vue3/src/hooks/event/useScrollTo.ts new file mode 100644 index 0000000..92aec87 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/event/useScrollTo.ts @@ -0,0 +1,60 @@ +export interface ScrollToParams { + el: HTMLElement + to: number + position: string + duration?: number + callback?: () => void +} + +const easeInOutQuad = (t: number, b: number, c: number, d: number) => { + t /= d / 2 + if (t < 1) { + return (c / 2) * t * t + b + } + t-- + return (-c / 2) * (t * (t - 2) - 1) + b +} +const move = (el: HTMLElement, position: string, amount: number) => { + el[position] = amount +} + +export function useScrollTo({ + el, + position = 'scrollLeft', + to, + duration = 500, + callback +}: ScrollToParams) { + const isActiveRef = ref(false) + const start = el[position] + const change = to - start + const increment = 20 + let currentTime = 0 + + function animateScroll() { + if (!unref(isActiveRef)) { + return + } + currentTime += increment + const val = easeInOutQuad(currentTime, start, change, duration) + move(el, position, val) + if (currentTime < duration && unref(isActiveRef)) { + requestAnimationFrame(animateScroll) + } else { + if (callback) { + callback() + } + } + } + + function run() { + isActiveRef.value = true + animateScroll() + } + + function stop() { + isActiveRef.value = false + } + + return { start: run, stop } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useCache.ts b/grailed-ui-admin-vue3/src/hooks/web/useCache.ts new file mode 100644 index 0000000..6d2a931 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useCache.ts @@ -0,0 +1,27 @@ +/** + * 配置浏览器本地存储的方式,可直接存储对象数组。 + */ + +import WebStorageCache from 'web-storage-cache' + +type CacheType = 'localStorage' | 'sessionStorage' + +export const CACHE_KEY = { + IS_DARK: 'isDark', + USER: 'user', + LANG: 'lang', + THEME: 'theme', + LAYOUT: 'layout', + ROLE_ROUTERS: 'roleRouters', + DICT_CACHE: 'dictCache' +} + +export const useCache = (type: CacheType = 'localStorage') => { + const wsCache: WebStorageCache = new WebStorageCache({ + storage: type + }) + + return { + wsCache + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts b/grailed-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts new file mode 100644 index 0000000..afb3db3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useConfigGlobal.ts @@ -0,0 +1,9 @@ +import { ConfigGlobalTypes } from '@/types/configGlobal' + +export const useConfigGlobal = () => { + const configGlobal = inject('configGlobal', {}) as ConfigGlobalTypes + + return { + configGlobal + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts b/grailed-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts new file mode 100644 index 0000000..984e57c --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useCrudSchemas.ts @@ -0,0 +1,308 @@ +import { reactive } from 'vue' +import { AxiosPromise } from 'axios' +import { findIndex } from '@/utils' +import { eachTree, filter, treeMap } from '@/utils/tree' +import { getBoolDictOptions, getDictOptions, getIntDictOptions } from '@/utils/dict' + +import { FormSchema } from '@/types/form' +import { TableColumn } from '@/types/table' +import { DescriptionsSchema } from '@/types/descriptions' +import { ComponentOptions, ComponentProps } from '@/types/components' +import { DictTag } from '@/components/DictTag' + +export type CrudSchema = Omit & { + isSearch?: boolean // 是否在查询显示 + search?: CrudSearchParams // 查询的详细配置 + isTable?: boolean // 是否在列表显示 + table?: CrudTableParams // 列表的详细配置 + isForm?: boolean // 是否在表单显示 + form?: CrudFormParams // 表单的详细配置 + isDetail?: boolean // 是否在详情显示 + detail?: CrudDescriptionsParams // 详情的详细配置 + children?: CrudSchema[] + dictType?: string // 字典类型 + dictClass?: 'string' | 'number' | 'boolean' // 字典数据类型 string | number | boolean +} + +type CrudSearchParams = { + // 是否显示在查询项 + show?: boolean + // 接口 + api?: () => Promise + // 搜索字段 + field?: string +} & Omit + +type CrudTableParams = { + // 是否显示表头 + show?: boolean + // 列宽配置 + width?: number | string + // 列是否固定在左侧或者右侧 + fixed?: 'left' | 'right' +} & Omit +type CrudFormParams = { + // 是否显示表单项 + show?: boolean + // 接口 + api?: () => Promise +} & Omit + +type CrudDescriptionsParams = { + // 是否显示表单项 + show?: boolean +} & Omit + +interface AllSchemas { + searchSchema: FormSchema[] + tableColumns: TableColumn[] + formSchema: FormSchema[] + detailSchema: DescriptionsSchema[] +} + +const { t } = useI18n() + +// 过滤所有结构 +export const useCrudSchemas = ( + crudSchema: CrudSchema[] +): { + allSchemas: AllSchemas +} => { + // 所有结构数据 + const allSchemas = reactive({ + searchSchema: [], + tableColumns: [], + formSchema: [], + detailSchema: [] + }) + + const searchSchema = filterSearchSchema(crudSchema, allSchemas) + allSchemas.searchSchema = searchSchema || [] + + const tableColumns = filterTableSchema(crudSchema) + allSchemas.tableColumns = tableColumns || [] + + const formSchema = filterFormSchema(crudSchema, allSchemas) + allSchemas.formSchema = formSchema + + const detailSchema = filterDescriptionsSchema(crudSchema) + allSchemas.detailSchema = detailSchema + + return { + allSchemas + } +} + +// 过滤 Search 结构 +const filterSearchSchema = (crudSchema: CrudSchema[], allSchemas: AllSchemas): FormSchema[] => { + const searchSchema: FormSchema[] = [] + + // 获取字典列表队列 + const searchRequestTask: Array<() => Promise> = [] + eachTree(crudSchema, (schemaItem: CrudSchema) => { + // 判断是否显示 + if (schemaItem?.isSearch || schemaItem.search?.show) { + let component = schemaItem?.search?.component || 'Input' + const options: ComponentOptions[] = [] + let comonentProps: ComponentProps = {} + if (schemaItem.dictType) { + const allOptions: ComponentOptions = { label: '全部', value: '' } + options.push(allOptions) + getDictOptions(schemaItem.dictType).forEach((dict) => { + options.push(dict) + }) + comonentProps = { + options: options + } + if (!schemaItem.search?.component) component = 'Select' + } + const searchSchemaItem = { + // 默认为 input + component: component, + componentProps: comonentProps, + ...schemaItem.search, + field: schemaItem.field, + label: schemaItem.search?.label || schemaItem.label + } + if (searchSchemaItem.api) { + searchRequestTask.push(async () => { + const res = await (searchSchemaItem.api as () => AxiosPromise)() + if (res) { + const index = findIndex(allSchemas.searchSchema, (v: FormSchema) => { + return v.field === searchSchemaItem.field + }) + if (index !== -1) { + allSchemas.searchSchema[index]!.componentProps!.options = filterOptions( + res, + searchSchemaItem.componentProps.optionsAlias?.labelField + ) + } + } + }) + } + // 删除不必要的字段 + delete searchSchemaItem.show + + searchSchema.push(searchSchemaItem) + } + }) + for (const task of searchRequestTask) { + task() + } + return searchSchema +} + +// 过滤 table 结构 +const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => { + const tableColumns = treeMap(crudSchema, { + conversion: (schema: CrudSchema) => { + if (schema?.isTable !== false && schema?.table?.show !== false) { + // add by 芋艿:增加对 dict 字典数据的支持 + if (!schema.formatter && schema.dictType) { + schema.formatter = (_: Recordable, __: TableColumn, cellValue: any) => { + return h(DictTag, { + type: schema.dictType!, // ! 表示一定不为空 + value: cellValue + }) + } + } + return { + ...schema.table, + ...schema + } + } + } + }) + + // 第一次过滤会有 undefined 所以需要二次过滤 + return filter(tableColumns as TableColumn[], (data) => { + if (data.children === void 0) { + delete data.children + } + return !!data.field + }) +} + +// 过滤 form 结构 +const filterFormSchema = (crudSchema: CrudSchema[], allSchemas: AllSchemas): FormSchema[] => { + const formSchema: FormSchema[] = [] + + // 获取字典列表队列 + const formRequestTask: Array<() => Promise> = [] + + eachTree(crudSchema, (schemaItem: CrudSchema) => { + // 判断是否显示 + if (schemaItem?.isForm !== false && schemaItem?.form?.show !== false) { + let component = schemaItem?.form?.component || 'Input' + let defaultValue: any = '' + if (schemaItem.form?.value) { + defaultValue = schemaItem.form?.value + } else { + if (component === 'InputNumber') { + defaultValue = 0 + } + } + let comonentProps: ComponentProps = {} + if (schemaItem.dictType) { + const options: ComponentOptions[] = [] + if (schemaItem.dictClass && schemaItem.dictClass === 'number') { + getIntDictOptions(schemaItem.dictType).forEach((dict) => { + options.push(dict) + }) + } else if (schemaItem.dictClass && schemaItem.dictClass === 'boolean') { + getBoolDictOptions(schemaItem.dictType).forEach((dict) => { + options.push(dict) + }) + } else { + getDictOptions(schemaItem.dictType).forEach((dict) => { + options.push(dict) + }) + } + comonentProps = { + options: options + } + if (!(schemaItem.form && schemaItem.form.component)) component = 'Select' + } + const formSchemaItem = { + // 默认为 input + component: component, + componentProps: comonentProps, + value: defaultValue, + ...schemaItem.form, + field: schemaItem.field, + label: schemaItem.form?.label || schemaItem.label + } + + if (formSchemaItem.api) { + formRequestTask.push(async () => { + const res = await (formSchemaItem.api as () => AxiosPromise)() + if (res) { + const index = findIndex(allSchemas.formSchema, (v: FormSchema) => { + return v.field === formSchemaItem.field + }) + if (index !== -1) { + allSchemas.formSchema[index]!.componentProps!.options = filterOptions( + res, + formSchemaItem.componentProps.optionsAlias?.labelField + ) + } + } + }) + } + + // 删除不必要的字段 + delete formSchemaItem.show + + formSchema.push(formSchemaItem) + } + }) + + for (const task of formRequestTask) { + task() + } + return formSchema +} + +// 过滤 descriptions 结构 +const filterDescriptionsSchema = (crudSchema: CrudSchema[]): DescriptionsSchema[] => { + const descriptionsSchema: FormSchema[] = [] + + eachTree(crudSchema, (schemaItem: CrudSchema) => { + // 判断是否显示 + if (schemaItem?.isDetail !== false && schemaItem.detail?.show !== false) { + const descriptionsSchemaItem = { + ...schemaItem.detail, + field: schemaItem.field, + label: schemaItem.detail?.label || schemaItem.label + } + if (schemaItem.dictType) { + descriptionsSchemaItem.dictType = schemaItem.dictType + } + if (schemaItem.detail?.dateFormat || schemaItem.formatter == 'formatDate') { + // 优先使用 detail 下的配置,如果没有默认为 YYYY-MM-DD HH:mm:ss + descriptionsSchemaItem.dateFormat = schemaItem?.detail?.dateFormat + ? schemaItem?.detail?.dateFormat + : 'YYYY-MM-DD HH:mm:ss' + } + + // 删除不必要的字段 + delete descriptionsSchemaItem.show + + descriptionsSchema.push(descriptionsSchemaItem) + } + }) + + return descriptionsSchema +} + +// 给options添加国际化 +const filterOptions = (options: Recordable, labelField?: string) => { + return options?.map((v: Recordable) => { + if (labelField) { + v['labelField'] = t(v.labelField) + } else { + v['label'] = t(v.label) + } + return v + }) +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useDesign.ts b/grailed-ui-admin-vue3/src/hooks/web/useDesign.ts new file mode 100644 index 0000000..8ee3b38 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useDesign.ts @@ -0,0 +1,18 @@ +import variables from '@/styles/global.module.scss' + +export const useDesign = () => { + const scssVariables = variables + + /** + * @param scope 类名 + * @returns 返回空间名-类名 + */ + const getPrefixCls = (scope: string) => { + return `${scssVariables.namespace}-${scope}` + } + + return { + variables: scssVariables, + getPrefixCls + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useEmitt.ts b/grailed-ui-admin-vue3/src/hooks/web/useEmitt.ts new file mode 100644 index 0000000..d4efea7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useEmitt.ts @@ -0,0 +1,22 @@ +import mitt from 'mitt' + +interface Option { + name: string // 事件名称 + callback: Fn // 回调 +} + +const emitter = mitt() + +export const useEmitt = (option?: Option) => { + if (option) { + emitter.on(option.name, option.callback) + + onBeforeUnmount(() => { + emitter.off(option.name) + }) + } + + return { + emitter + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useForm.ts b/grailed-ui-admin-vue3/src/hooks/web/useForm.ts new file mode 100644 index 0000000..53a8a94 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useForm.ts @@ -0,0 +1,94 @@ +import type { Form, FormExpose } from '@/components/Form' +import type { ElForm } from 'element-plus' +import type { FormProps } from '@/components/Form/src/types' +import { FormSchema, FormSetPropsType } from '@/types/form' + +export const useForm = (props?: FormProps) => { + // From实例 + const formRef = ref() + + // ElForm实例 + const elFormRef = ref>() + + /** + * @param ref Form实例 + * @param elRef ElForm实例 + */ + const register = (ref: typeof Form & FormExpose, elRef: ComponentRef) => { + formRef.value = ref + elFormRef.value = elRef + } + + const getForm = async () => { + await nextTick() + const form = unref(formRef) + if (!form) { + console.error('The form is not registered. Please use the register method to register') + } + return form + } + + // 一些内置的方法 + const methods: { + setProps: (props: Recordable) => void + setValues: (data: Recordable) => void + getFormData: () => Promise + setSchema: (schemaProps: FormSetPropsType[]) => void + addSchema: (formSchema: FormSchema, index?: number) => void + delSchema: (field: string) => void + } = { + setProps: async (props: FormProps = {}) => { + const form = await getForm() + form?.setProps(props) + if (props.model) { + form?.setValues(props.model) + } + }, + + setValues: async (data: Recordable) => { + const form = await getForm() + form?.setValues(data) + }, + + /** + * @param schemaProps 需要设置的schemaProps + */ + setSchema: async (schemaProps: FormSetPropsType[]) => { + const form = await getForm() + form?.setSchema(schemaProps) + }, + + /** + * @param formSchema 需要新增数据 + * @param index 在哪里新增 + */ + addSchema: async (formSchema: FormSchema, index?: number) => { + const form = await getForm() + form?.addSchema(formSchema, index) + }, + + /** + * @param field 删除哪个数据 + */ + delSchema: async (field: string) => { + const form = await getForm() + form?.delSchema(field) + }, + + /** + * @returns form data + */ + getFormData: async (): Promise => { + const form = await getForm() + return form?.formModel as T + } + } + + props && methods.setProps(props) + + return { + register, + elFormRef, + methods + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useI18n.ts b/grailed-ui-admin-vue3/src/hooks/web/useI18n.ts new file mode 100644 index 0000000..d1ab70f --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useI18n.ts @@ -0,0 +1,53 @@ +import { i18n } from '@/plugins/vueI18n' + +type I18nGlobalTranslation = { + (key: string): string + (key: string, locale: string): string + (key: string, locale: string, list: unknown[]): string + (key: string, locale: string, named: Record): string + (key: string, list: unknown[]): string + (key: string, named: Record): string +} + +type I18nTranslationRestParameters = [string, any] + +const getKey = (namespace: string | undefined, key: string) => { + if (!namespace) { + return key + } + if (key.startsWith(namespace)) { + return key + } + return `${namespace}.${key}` +} + +export const useI18n = ( + namespace?: string +): { + t: I18nGlobalTranslation +} => { + const normalFn = { + t: (key: string) => { + return getKey(namespace, key) + } + } + + if (!i18n) { + return normalFn + } + + const { t, ...methods } = i18n.global + + const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => { + if (!key) return '' + if (!key.includes('.') && !namespace) return key + //@ts-ignore + return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters)) + } + return { + ...methods, + t: tFn + } +} + +export const t = (key: string) => key diff --git a/grailed-ui-admin-vue3/src/hooks/web/useIcon.ts b/grailed-ui-admin-vue3/src/hooks/web/useIcon.ts new file mode 100644 index 0000000..3500204 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useIcon.ts @@ -0,0 +1,8 @@ +import { h } from 'vue' +import type { VNode } from 'vue' +import { Icon } from '@/components/Icon' +import { IconTypes } from '@/types/icon' + +export const useIcon = (props: IconTypes): VNode => { + return h(Icon, props) +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useIntro.ts b/grailed-ui-admin-vue3/src/hooks/web/useIntro.ts new file mode 100644 index 0000000..7fe0084 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useIntro.ts @@ -0,0 +1,47 @@ +import introJs from 'intro.js' +import { IntroJs, Step, Options } from 'intro.js' +import 'intro.js/introjs.css' + +import { useDesign } from '@/hooks/web/useDesign' + +export const useIntro = (setps?: Step[], options?: Options) => { + const { t } = useI18n() + + const { variables } = useDesign() + + const defaultSetps: Step[] = setps || [ + { + element: `#${variables.namespace}-menu`, + title: t('common.menu'), + intro: t('common.menuDes'), + position: 'right' + }, + { + element: `#${variables.namespace}-tool-header`, + title: t('common.tool'), + intro: t('common.toolDes'), + position: 'left' + }, + { + element: `#${variables.namespace}-tags-view`, + title: t('common.tagsView'), + intro: t('common.tagsViewDes'), + position: 'bottom' + } + ] + + const defaultOptions: Options = options || { + prevLabel: t('common.prevLabel'), + nextLabel: t('common.nextLabel'), + skipLabel: t('common.skipLabel'), + doneLabel: t('common.doneLabel') + } + + const introRef: IntroJs = introJs() + + introRef.addSteps(defaultSetps).setOptions(defaultOptions) + + return { + introRef + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useLocale.ts b/grailed-ui-admin-vue3/src/hooks/web/useLocale.ts new file mode 100644 index 0000000..c65070e --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useLocale.ts @@ -0,0 +1,35 @@ +import { i18n } from '@/plugins/vueI18n' +import { useLocaleStoreWithOut } from '@/store/modules/locale' +import { setHtmlPageLang } from '@/plugins/vueI18n/helper' + +const setI18nLanguage = (locale: LocaleType) => { + const localeStore = useLocaleStoreWithOut() + + if (i18n.mode === 'legacy') { + i18n.global.locale = locale + } else { + ;(i18n.global.locale as any).value = locale + } + localeStore.setCurrentLocale({ + lang: locale + }) + setHtmlPageLang(locale) +} + +export const useLocale = () => { + // Switching the language will change the locale of useI18n + // And submit to configuration modification + const changeLocale = async (locale: LocaleType) => { + const globalI18n = i18n.global + + const langModule = await import(`../../locales/${locale}.ts`) + + globalI18n.setLocaleMessage(locale, langModule.default) + + setI18nLanguage(locale) + } + + return { + changeLocale + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useMessage.ts b/grailed-ui-admin-vue3/src/hooks/web/useMessage.ts new file mode 100644 index 0000000..ac2b552 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useMessage.ts @@ -0,0 +1,95 @@ +import { ElMessage, ElMessageBox, ElNotification } from 'element-plus' +import { useI18n } from './useI18n' +export const useMessage = () => { + const { t } = useI18n() + return { + // 消息提示 + info(content: string) { + ElMessage.info(content) + }, + // 错误消息 + error(content: string) { + ElMessage.error(content) + }, + // 成功消息 + success(content: string) { + ElMessage.success(content) + }, + // 警告消息 + warning(content: string) { + ElMessage.warning(content) + }, + // 弹出提示 + alert(content: string) { + ElMessageBox.alert(content, t('common.confirmTitle')) + }, + // 错误提示 + alertError(content: string) { + ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'error' }) + }, + // 成功提示 + alertSuccess(content: string) { + ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'success' }) + }, + // 警告提示 + alertWarning(content: string) { + ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'warning' }) + }, + // 通知提示 + notify(content: string) { + ElNotification.info(content) + }, + // 错误通知 + notifyError(content: string) { + ElNotification.error(content) + }, + // 成功通知 + notifySuccess(content: string) { + ElNotification.success(content) + }, + // 警告通知 + notifyWarning(content: string) { + ElNotification.warning(content) + }, + // 确认窗体 + confirm(content: string, tip?: string) { + return ElMessageBox.confirm(content, tip ? tip : t('common.confirmTitle'), { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + }) + }, + // 删除窗体 + delConfirm(content?: string, tip?: string) { + return ElMessageBox.confirm( + content ? content : t('common.delMessage'), + tip ? tip : t('common.confirmTitle'), + { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + } + ) + }, + // 导出窗体 + exportConfirm(content?: string, tip?: string) { + return ElMessageBox.confirm( + content ? content : t('common.exportMessage'), + tip ? tip : t('common.confirmTitle'), + { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + } + ) + }, + // 提交内容 + prompt(content: string, tip: string) { + return ElMessageBox.prompt(content, tip, { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + }) + } + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useNProgress.ts b/grailed-ui-admin-vue3/src/hooks/web/useNProgress.ts new file mode 100644 index 0000000..6d8c0b9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useNProgress.ts @@ -0,0 +1,33 @@ +import { useCssVar } from '@vueuse/core' +import type { NProgressOptions } from 'nprogress' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' + +const primaryColor = useCssVar('--el-color-primary', document.documentElement) + +export const useNProgress = () => { + NProgress.configure({ showSpinner: false } as NProgressOptions) + + const initColor = async () => { + await nextTick() + const bar = document.getElementById('nprogress')?.getElementsByClassName('bar')[0] as ElRef + if (bar) { + bar.style.background = unref(primaryColor.value) + } + } + + initColor() + + const start = () => { + NProgress.start() + } + + const done = () => { + NProgress.done() + } + + return { + start, + done + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/usePageLoading.ts b/grailed-ui-admin-vue3/src/hooks/web/usePageLoading.ts new file mode 100644 index 0000000..bb89457 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/usePageLoading.ts @@ -0,0 +1,18 @@ +import { useAppStoreWithOut } from '@/store/modules/app' + +const appStore = useAppStoreWithOut() + +export const usePageLoading = () => { + const loadStart = () => { + appStore.setPageLoading(true) + } + + const loadDone = () => { + appStore.setPageLoading(false) + } + + return { + loadStart, + loadDone + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useTable.ts b/grailed-ui-admin-vue3/src/hooks/web/useTable.ts new file mode 100644 index 0000000..361dd67 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useTable.ts @@ -0,0 +1,223 @@ +import download from '@/utils/download' +import { Table, TableExpose } from '@/components/Table' +import { ElMessage, ElMessageBox, ElTable } from 'element-plus' +import { computed, nextTick, reactive, ref, unref, watch } from 'vue' +import type { TableProps } from '@/components/Table/src/types' + +import { TableSetPropsType } from '@/types/table' + +const { t } = useI18n() +interface ResponseType { + list: T[] + total?: number +} + +interface UseTableConfig { + getListApi: (option: any) => Promise + delListApi?: (option: any) => Promise + exportListApi?: (option: any) => Promise + // 返回数据格式配置 + response?: ResponseType + // 默认传递的参数 + defaultParams?: Recordable + props?: TableProps +} + +interface TableObject { + pageSize: number + currentPage: number + total: number + tableList: T[] + params: any + loading: boolean + exportLoading: boolean + currentRow: Nullable +} + +export const useTable = (config?: UseTableConfig) => { + const tableObject = reactive>({ + // 页数 + pageSize: 10, + // 当前页 + currentPage: 1, + // 总条数 + total: 10, + // 表格数据 + tableList: [], + // AxiosConfig 配置 + params: { + ...(config?.defaultParams || {}) + }, + // 加载中 + loading: true, + // 导出加载中 + exportLoading: false, + // 当前行的数据 + currentRow: null + }) + + const paramsObj = computed(() => { + return { + ...tableObject.params, + pageSize: tableObject.pageSize, + pageNo: tableObject.currentPage + } + }) + + watch( + () => tableObject.currentPage, + () => { + methods.getList() + } + ) + + watch( + () => tableObject.pageSize, + () => { + // 当前页不为1时,修改页数后会导致多次调用getList方法 + if (tableObject.currentPage === 1) { + methods.getList() + } else { + tableObject.currentPage = 1 + methods.getList() + } + } + ) + + // Table实例 + const tableRef = ref() + + // ElTable实例 + const elTableRef = ref>() + + const register = (ref: typeof Table & TableExpose, elRef: ComponentRef) => { + tableRef.value = ref + elTableRef.value = elRef + } + + const getTable = async () => { + await nextTick() + const table = unref(tableRef) + if (!table) { + console.error('The table is not registered. Please use the register method to register') + } + return table + } + + const delData = async (ids: string | number | string[] | number[]) => { + let idsLength = 1 + if (ids instanceof Array) { + idsLength = ids.length + await Promise.all( + ids.map(async (id: string | number) => { + await (config?.delListApi && config?.delListApi(id)) + }) + ) + } else { + await (config?.delListApi && config?.delListApi(ids)) + } + ElMessage.success(t('common.delSuccess')) + + // 计算出临界点 + tableObject.currentPage = + tableObject.total % tableObject.pageSize === idsLength || tableObject.pageSize === 1 + ? tableObject.currentPage > 1 + ? tableObject.currentPage - 1 + : tableObject.currentPage + : tableObject.currentPage + await methods.getList() + } + + const methods = { + getList: async () => { + tableObject.loading = true + const res = await config?.getListApi(unref(paramsObj)).finally(() => { + tableObject.loading = false + }) + if (res) { + tableObject.tableList = (res as unknown as ResponseType).list + tableObject.total = (res as unknown as ResponseType).total ?? 0 + } + }, + setProps: async (props: TableProps = {}) => { + const table = await getTable() + table?.setProps(props) + }, + setColumn: async (columnProps: TableSetPropsType[]) => { + const table = await getTable() + table?.setColumn(columnProps) + }, + getSelections: async () => { + const table = await getTable() + return (table?.selections || []) as T[] + }, + // 与Search组件结合 + setSearchParams: (data: Recordable) => { + tableObject.params = Object.assign(tableObject.params, { + pageSize: tableObject.pageSize, + pageNo: 1, + ...data + }) + // 页码不等于1时更新页码重新获取数据,页码等于1时重新获取数据 + if (tableObject.currentPage !== 1) { + tableObject.currentPage = 1 + } else { + methods.getList() + } + }, + // 删除数据 + delList: async ( + ids: string | number | string[] | number[], + multiple: boolean, + message = true + ) => { + const tableRef = await getTable() + if (multiple) { + if (!tableRef?.selections.length) { + ElMessage.warning(t('common.delNoData')) + return + } + } + if (message) { + ElMessageBox.confirm(t('common.delMessage'), t('common.confirmTitle'), { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + }).then(async () => { + await delData(ids) + }) + } else { + await delData(ids) + } + }, + // 导出列表 + exportList: async (fileName: string) => { + tableObject.exportLoading = true + ElMessageBox.confirm(t('common.exportMessage'), t('common.confirmTitle'), { + confirmButtonText: t('common.ok'), + cancelButtonText: t('common.cancel'), + type: 'warning' + }) + .then(async () => { + const res = await config?.exportListApi?.(unref(paramsObj) as unknown as T) + if (res) { + download.excel(res as unknown as Blob, fileName) + } + }) + .finally(() => { + tableObject.exportLoading = false + }) + } + } + + config?.props && methods.setProps(config.props) + + return { + register, + elTableRef, + tableObject, + methods, + // add by 芋艿:返回 tableMethods 属性,和 tableObject 更统一 + tableMethods: methods + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useTimeAgo.ts b/grailed-ui-admin-vue3/src/hooks/web/useTimeAgo.ts new file mode 100644 index 0000000..a6da281 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useTimeAgo.ts @@ -0,0 +1,49 @@ +import { useTimeAgo as useTimeAgoCore, UseTimeAgoMessages } from '@vueuse/core' +import { useLocaleStoreWithOut } from '@/store/modules/locale' + +const TIME_AGO_MESSAGE_MAP: { + 'zh-CN': UseTimeAgoMessages + en: UseTimeAgoMessages +} = { + // @ts-ignore + 'zh-CN': { + justNow: '刚刚', + past: (n) => (n.match(/\d/) ? `${n}前` : n), + future: (n) => (n.match(/\d/) ? `${n}后` : n), + month: (n, past) => (n === 1 ? (past ? '上个月' : '下个月') : `${n} 个月`), + year: (n, past) => (n === 1 ? (past ? '去年' : '明年') : `${n} 年`), + day: (n, past) => (n === 1 ? (past ? '昨天' : '明天') : `${n} 天`), + week: (n, past) => (n === 1 ? (past ? '上周' : '下周') : `${n} 周`), + hour: (n) => `${n} 小时`, + minute: (n) => `${n} 分钟`, + second: (n) => `${n} 秒` + }, + // @ts-ignore + en: { + justNow: 'just now', + past: (n) => (n.match(/\d/) ? `${n} ago` : n), + future: (n) => (n.match(/\d/) ? `in ${n}` : n), + month: (n, past) => + n === 1 ? (past ? 'last month' : 'next month') : `${n} month${n > 1 ? 's' : ''}`, + year: (n, past) => + n === 1 ? (past ? 'last year' : 'next year') : `${n} year${n > 1 ? 's' : ''}`, + day: (n, past) => (n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`), + week: (n, past) => + n === 1 ? (past ? 'last week' : 'next week') : `${n} week${n > 1 ? 's' : ''}`, + hour: (n) => `${n} hour${n > 1 ? 's' : ''}`, + minute: (n) => `${n} minute${n > 1 ? 's' : ''}`, + second: (n) => `${n} second${n > 1 ? 's' : ''}` + } +} + +export const useTimeAgo = (time: Date | number | string) => { + const localeStore = useLocaleStoreWithOut() + + const currentLocale = computed(() => localeStore.getCurrentLocale) + + const timeAgo = useTimeAgoCore(time, { + messages: TIME_AGO_MESSAGE_MAP[unref(currentLocale).lang] + }) + + return timeAgo +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useTitle.ts b/grailed-ui-admin-vue3/src/hooks/web/useTitle.ts new file mode 100644 index 0000000..965a9fd --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useTitle.ts @@ -0,0 +1,24 @@ +import { watch, ref } from 'vue' +import { isString } from '@/utils/is' +import { useAppStoreWithOut } from '@/store/modules/app' + +const appStore = useAppStoreWithOut() + +export const useTitle = (newTitle?: string) => { + const { t } = useI18n() + const title = ref( + newTitle ? `红狐管理系统 - ${t(newTitle as string)}` : `红狐管理系统` + ) + + watch( + title, + (n, o) => { + if (isString(n) && n !== o && document) { + document.title = n + } + }, + { immediate: true } + ) + + return title +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useValidator.ts b/grailed-ui-admin-vue3/src/hooks/web/useValidator.ts new file mode 100644 index 0000000..0c16fa3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useValidator.ts @@ -0,0 +1,62 @@ +const { t } = useI18n() + +type Callback = (error?: string | Error | undefined) => void + +interface LengthRange { + min: number + max: number + message: string +} + +export const useValidator = () => { + const required = (message?: string) => { + return { + required: true, + message: message || t('common.required') + } + } + + const lengthRange = (val: any, callback: Callback, options: LengthRange) => { + const { min, max, message } = options + if (val.length < min || val.length > max) { + callback(new Error(message)) + } else { + callback() + } + } + + const notSpace = (val: any, callback: Callback, message: string) => { + // 用户名不能有空格 + if (val.indexOf(' ') !== -1) { + callback(new Error(message)) + } else { + callback() + } + } + + const notSpecialCharacters = (val: any, callback: Callback, message: string) => { + // 密码不能是特殊字符 + if (/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/gi.test(val)) { + callback(new Error(message)) + } else { + callback() + } + } + + // 两个字符串是否想等 + const isEqual = (val1: string, val2: string, callback: Callback, message: string) => { + if (val1 === val2) { + callback() + } else { + callback(new Error(message)) + } + } + + return { + required, + lengthRange, + notSpace, + notSpecialCharacters, + isEqual + } +} diff --git a/grailed-ui-admin-vue3/src/hooks/web/useWatermark.ts b/grailed-ui-admin-vue3/src/hooks/web/useWatermark.ts new file mode 100644 index 0000000..4a31359 --- /dev/null +++ b/grailed-ui-admin-vue3/src/hooks/web/useWatermark.ts @@ -0,0 +1,55 @@ +const domSymbol = Symbol('watermark-dom') + +export function useWatermark(appendEl: HTMLElement | null = document.body) { + let func: Fn = () => {} + const id = domSymbol.toString() + const clear = () => { + const domId = document.getElementById(id) + if (domId) { + const el = appendEl + el && el.removeChild(domId) + } + window.removeEventListener('resize', func) + } + const createWatermark = (str: string) => { + clear() + + const can = document.createElement('canvas') + can.width = 300 + can.height = 240 + + const cans = can.getContext('2d') + if (cans) { + cans.rotate((-20 * Math.PI) / 120) + cans.font = '15px Vedana' + cans.fillStyle = 'rgba(0, 0, 0, 0.15)' + cans.textAlign = 'left' + cans.textBaseline = 'middle' + cans.fillText(str, can.width / 20, can.height) + } + + const div = document.createElement('div') + div.id = id + div.style.pointerEvents = 'none' + div.style.top = '0px' + div.style.left = '0px' + div.style.position = 'absolute' + div.style.zIndex = '100000000' + div.style.width = document.documentElement.clientWidth + 'px' + div.style.height = document.documentElement.clientHeight + 'px' + div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat' + const el = appendEl + el && el.appendChild(div) + return id + } + + function setWatermark(str: string) { + createWatermark(str) + func = () => { + createWatermark(str) + } + window.addEventListener('resize', func) + } + + return { setWatermark, clear } +} diff --git a/grailed-ui-admin-vue3/src/layout/Layout.vue b/grailed-ui-admin-vue3/src/layout/Layout.vue new file mode 100644 index 0000000..5c43e52 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/Layout.vue @@ -0,0 +1,78 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/AppView.vue b/grailed-ui-admin-vue3/src/layout/components/AppView.vue new file mode 100644 index 0000000..ffdf11f --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/AppView.vue @@ -0,0 +1,61 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/index.ts b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/index.ts new file mode 100644 index 0000000..93ffe70 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/index.ts @@ -0,0 +1,3 @@ +import Breadcrumb from './src/Breadcrumb.vue' + +export { Breadcrumb } diff --git a/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/Breadcrumb.vue b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/Breadcrumb.vue new file mode 100644 index 0000000..de03665 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/Breadcrumb.vue @@ -0,0 +1,128 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/helper.ts b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/helper.ts new file mode 100644 index 0000000..be3d96b --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Breadcrumb/src/helper.ts @@ -0,0 +1,34 @@ +import { pathResolve } from '@/utils/routerHelper' +import type { RouteMeta } from 'vue-router' + +export const filterBreadcrumb = ( + routes: AppRouteRecordRaw[], + parentPath = '' +): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + + for (const route of routes) { + const meta = route?.meta as RouteMeta + if (meta.hidden && !meta.canTo) { + continue + } + + const data: AppRouteRecordRaw = + !meta.alwaysShow && route.children?.length === 1 + ? { + ...route.children[0], + path: pathResolve(route.path, route.children[0].path) + } + : { ...route } + + data.path = pathResolve(parentPath, data.path) + + if (data.children) { + data.children = filterBreadcrumb(data.children, data.path) + } + if (data) { + res.push(data) + } + } + return res +} diff --git a/grailed-ui-admin-vue3/src/layout/components/Collapse/index.ts b/grailed-ui-admin-vue3/src/layout/components/Collapse/index.ts new file mode 100644 index 0000000..73f65a3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Collapse/index.ts @@ -0,0 +1,3 @@ +import Collapse from './src/Collapse.vue' + +export { Collapse } diff --git a/grailed-ui-admin-vue3/src/layout/components/Collapse/src/Collapse.vue b/grailed-ui-admin-vue3/src/layout/components/Collapse/src/Collapse.vue new file mode 100644 index 0000000..ecb6890 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Collapse/src/Collapse.vue @@ -0,0 +1,36 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/ContextMenu/index.ts b/grailed-ui-admin-vue3/src/layout/components/ContextMenu/index.ts new file mode 100644 index 0000000..2a7c1f0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/ContextMenu/index.ts @@ -0,0 +1,10 @@ +import ContextMenu from './src/ContextMenu.vue' +import { ElDropdown } from 'element-plus' +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +export interface ContextMenuExpose { + elDropdownMenuRef: ComponentRef + tagItem: RouteLocationNormalizedLoaded +} + +export { ContextMenu } diff --git a/grailed-ui-admin-vue3/src/layout/components/ContextMenu/src/ContextMenu.vue b/grailed-ui-admin-vue3/src/layout/components/ContextMenu/src/ContextMenu.vue new file mode 100644 index 0000000..90eea4c --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/ContextMenu/src/ContextMenu.vue @@ -0,0 +1,76 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Footer/index.ts b/grailed-ui-admin-vue3/src/layout/components/Footer/index.ts new file mode 100644 index 0000000..bd052e0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Footer/index.ts @@ -0,0 +1,3 @@ +import Footer from './src/Footer.vue' + +export { Footer } diff --git a/grailed-ui-admin-vue3/src/layout/components/Footer/src/Footer.vue b/grailed-ui-admin-vue3/src/layout/components/Footer/src/Footer.vue new file mode 100644 index 0000000..2e1b03a --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Footer/src/Footer.vue @@ -0,0 +1,27 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/index.ts b/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/index.ts new file mode 100644 index 0000000..d02e640 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/index.ts @@ -0,0 +1,3 @@ +import LocaleDropdown from './src/LocaleDropdown.vue' + +export { LocaleDropdown } diff --git a/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/src/LocaleDropdown.vue b/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/src/LocaleDropdown.vue new file mode 100644 index 0000000..95132db --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/LocaleDropdown/src/LocaleDropdown.vue @@ -0,0 +1,52 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Logo/index.ts b/grailed-ui-admin-vue3/src/layout/components/Logo/index.ts new file mode 100644 index 0000000..1c4224c --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Logo/index.ts @@ -0,0 +1,3 @@ +import Logo from './src/Logo.vue' + +export { Logo } diff --git a/grailed-ui-admin-vue3/src/layout/components/Logo/src/Logo.vue b/grailed-ui-admin-vue3/src/layout/components/Logo/src/Logo.vue new file mode 100644 index 0000000..b0a5517 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Logo/src/Logo.vue @@ -0,0 +1,90 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Menu/index.ts b/grailed-ui-admin-vue3/src/layout/components/Menu/index.ts new file mode 100644 index 0000000..a6ec696 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Menu/index.ts @@ -0,0 +1,3 @@ +import Menu from './src/Menu.vue' + +export { Menu } diff --git a/grailed-ui-admin-vue3/src/layout/components/Menu/src/Menu.vue b/grailed-ui-admin-vue3/src/layout/components/Menu/src/Menu.vue new file mode 100644 index 0000000..51d0c61 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Menu/src/Menu.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuItem.tsx b/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuItem.tsx new file mode 100644 index 0000000..17a520a --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuItem.tsx @@ -0,0 +1,59 @@ +import { ElSubMenu, ElMenuItem } from 'element-plus' +import type { RouteMeta } from 'vue-router' +import { hasOneShowingChild } from '../helper' +import { isUrl } from '@/utils/is' +import { useRenderMenuTitle } from './useRenderMenuTitle' +import { useDesign } from '@/hooks/web/useDesign' +import { pathResolve } from '@/utils/routerHelper' + +export const useRenderMenuItem = ( + // allRouters: AppRouteRecordRaw[] = [], + menuMode: 'vertical' | 'horizontal' +) => { + const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => { + return routers.map((v) => { + const meta = (v.meta ?? {}) as RouteMeta + if (!meta.hidden) { + const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v) + const fullPath = isUrl(v.path) ? v.path : pathResolve(parentPath, v.path) // getAllParentPath(allRouters, v.path).join('/') + + const { renderMenuTitle } = useRenderMenuTitle() + + if ( + oneShowingChild && + (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && + !meta?.alwaysShow + ) { + return ( + + {{ + default: () => renderMenuTitle(onlyOneChild ? onlyOneChild?.meta : meta) + }} + + ) + } else { + const { getPrefixCls } = useDesign() + + const preFixCls = getPrefixCls('menu-popper') + return ( + + {{ + title: () => renderMenuTitle(meta), + default: () => renderMenuItem(v.children!, fullPath) + }} + + ) + } + } + }) + } + + return { + renderMenuItem + } +} diff --git a/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx b/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx new file mode 100644 index 0000000..fc30b90 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Menu/src/components/useRenderMenuTitle.tsx @@ -0,0 +1,22 @@ +import type { RouteMeta } from 'vue-router' +import { Icon } from '@/components/Icon' + +export const useRenderMenuTitle = () => { + const renderMenuTitle = (meta: RouteMeta) => { + const { t } = useI18n() + const { title = 'Please set title', icon } = meta + + return icon ? ( + <> + + {t(title as string)} + + ) : ( + {t(title as string)} + ) + } + + return { + renderMenuTitle + } +} diff --git a/grailed-ui-admin-vue3/src/layout/components/Menu/src/helper.ts b/grailed-ui-admin-vue3/src/layout/components/Menu/src/helper.ts new file mode 100644 index 0000000..c26f5f4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Menu/src/helper.ts @@ -0,0 +1,54 @@ +import type { RouteMeta } from 'vue-router' +import { findPath } from '@/utils/tree' + +type OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean } + +interface HasOneShowingChild { + oneShowingChild?: boolean + onlyOneChild?: OnlyOneChildType +} + +export const getAllParentPath = (treeData: T[], path: string) => { + const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[] + return (menuList || []).map((item) => item.path) +} + +export const hasOneShowingChild = ( + children: AppRouteRecordRaw[] = [], + parent: AppRouteRecordRaw +): HasOneShowingChild => { + const onlyOneChild = ref() + + const showingChildren = children.filter((v) => { + const meta = (v.meta ?? {}) as RouteMeta + if (meta.hidden) { + return false + } else { + // Temp set(will be used if only has one showing child) + onlyOneChild.value = v + return true + } + }) + + // When there is only one child router, the child router is displayed by default + if (showingChildren.length === 1) { + return { + oneShowingChild: true, + onlyOneChild: unref(onlyOneChild) + } + } + + // Show parent if there are no child router to display + if (!showingChildren.length) { + onlyOneChild.value = { ...parent, path: '', noShowingChildren: true } + return { + oneShowingChild: true, + onlyOneChild: unref(onlyOneChild) + } + } + + return { + oneShowingChild: false, + onlyOneChild: unref(onlyOneChild) + } +} diff --git a/grailed-ui-admin-vue3/src/layout/components/Message/index.ts b/grailed-ui-admin-vue3/src/layout/components/Message/index.ts new file mode 100644 index 0000000..dfe0207 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Message/index.ts @@ -0,0 +1,3 @@ +import Message from './src/Message.vue' + +export { Message } diff --git a/grailed-ui-admin-vue3/src/layout/components/Message/src/Message.vue b/grailed-ui-admin-vue3/src/layout/components/Message/src/Message.vue new file mode 100644 index 0000000..28f796b --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Message/src/Message.vue @@ -0,0 +1,125 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/index.ts b/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/index.ts new file mode 100644 index 0000000..9f06d00 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/index.ts @@ -0,0 +1,3 @@ +import NotifyAudio from "./src/NotifyAudio.vue"; + +export { NotifyAudio } diff --git a/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/src/NotifyAudio.vue b/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/src/NotifyAudio.vue new file mode 100644 index 0000000..6d8d2dc --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/NotifyAudio/src/NotifyAudio.vue @@ -0,0 +1,117 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Screenfull/index.ts b/grailed-ui-admin-vue3/src/layout/components/Screenfull/index.ts new file mode 100644 index 0000000..faec2d8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Screenfull/index.ts @@ -0,0 +1,3 @@ +import Screenfull from './src/Screenfull.vue' + +export { Screenfull } diff --git a/grailed-ui-admin-vue3/src/layout/components/Screenfull/src/Screenfull.vue b/grailed-ui-admin-vue3/src/layout/components/Screenfull/src/Screenfull.vue new file mode 100644 index 0000000..4c045f2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Screenfull/src/Screenfull.vue @@ -0,0 +1,32 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Setting/index.ts b/grailed-ui-admin-vue3/src/layout/components/Setting/index.ts new file mode 100644 index 0000000..b64c9ad --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Setting/index.ts @@ -0,0 +1,3 @@ +import Setting from './src/Setting.vue' + +export { Setting } diff --git a/grailed-ui-admin-vue3/src/layout/components/Setting/src/Setting.vue b/grailed-ui-admin-vue3/src/layout/components/Setting/src/Setting.vue new file mode 100644 index 0000000..00d0a8f --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Setting/src/Setting.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/ColorRadioPicker.vue b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/ColorRadioPicker.vue new file mode 100644 index 0000000..662ac2e --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/ColorRadioPicker.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/InterfaceDisplay.vue b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/InterfaceDisplay.vue new file mode 100644 index 0000000..edfd661 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/InterfaceDisplay.vue @@ -0,0 +1,224 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/LayoutRadioPicker.vue b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/LayoutRadioPicker.vue new file mode 100644 index 0000000..fed4ced --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/Setting/src/components/LayoutRadioPicker.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/index.ts b/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/index.ts new file mode 100644 index 0000000..516488d --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/index.ts @@ -0,0 +1,3 @@ +import SizeDropdown from './src/SizeDropdown.vue' + +export { SizeDropdown } diff --git a/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/src/SizeDropdown.vue b/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/src/SizeDropdown.vue new file mode 100644 index 0000000..3e15224 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/SizeDropdown/src/SizeDropdown.vue @@ -0,0 +1,40 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/TabMenu/index.ts b/grailed-ui-admin-vue3/src/layout/components/TabMenu/index.ts new file mode 100644 index 0000000..b5fd71c --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TabMenu/index.ts @@ -0,0 +1,3 @@ +import TabMenu from './src/TabMenu.vue' + +export { TabMenu } diff --git a/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/TabMenu.vue b/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/TabMenu.vue new file mode 100644 index 0000000..061c5a3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/TabMenu.vue @@ -0,0 +1,240 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/helper.ts b/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/helper.ts new file mode 100644 index 0000000..cce3932 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TabMenu/src/helper.ts @@ -0,0 +1,51 @@ +import { getAllParentPath } from '@/layout/components/Menu/src/helper' +import type { RouteMeta } from 'vue-router' +import { isUrl } from '@/utils/is' +import { cloneDeep } from 'lodash-es' + +export type TabMapTypes = { + [key: string]: string[] +} + +export const tabPathMap = reactive({}) + +export const initTabMap = (routes: AppRouteRecordRaw[]) => { + for (const v of routes) { + const meta = (v.meta ?? {}) as RouteMeta + if (!meta?.hidden) { + tabPathMap[v.path] = [] + } + } +} + +export const filterMenusPath = ( + routes: AppRouteRecordRaw[], + allRoutes: AppRouteRecordRaw[] +): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + for (const v of routes) { + let data: Nullable = null + const meta = (v.meta ?? {}) as RouteMeta + if (!meta.hidden || meta.canTo) { + const allParentPath = getAllParentPath(allRoutes, v.path) + + const fullPath = isUrl(v.path) ? v.path : allParentPath.join('/') + + data = cloneDeep(v) + data.path = fullPath + if (v.children && data) { + data.children = filterMenusPath(v.children, allRoutes) + } + + if (data) { + res.push(data) + } + + if (allParentPath.length && Reflect.has(tabPathMap, allParentPath[0])) { + tabPathMap[allParentPath[0]].push(fullPath) + } + } + } + + return res +} diff --git a/grailed-ui-admin-vue3/src/layout/components/TagsView/index.ts b/grailed-ui-admin-vue3/src/layout/components/TagsView/index.ts new file mode 100644 index 0000000..30e604a --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TagsView/index.ts @@ -0,0 +1,3 @@ +import TagsView from './src/TagsView.vue' + +export { TagsView } diff --git a/grailed-ui-admin-vue3/src/layout/components/TagsView/src/TagsView.vue b/grailed-ui-admin-vue3/src/layout/components/TagsView/src/TagsView.vue new file mode 100644 index 0000000..4770989 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TagsView/src/TagsView.vue @@ -0,0 +1,585 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/TagsView/src/helper.ts b/grailed-ui-admin-vue3/src/layout/components/TagsView/src/helper.ts new file mode 100644 index 0000000..8c3922f --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/TagsView/src/helper.ts @@ -0,0 +1,25 @@ +import type { RouteMeta, RouteLocationNormalizedLoaded } from 'vue-router' +import { pathResolve } from '@/utils/routerHelper' + +export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => { + let tags: RouteLocationNormalizedLoaded[] = [] + routes.forEach((route) => { + const meta = route.meta as RouteMeta + const tagPath = pathResolve(parentPath, route.path) + if (meta?.affix) { + tags.push({ + ...route, + path: tagPath, + fullPath: tagPath + } as RouteLocationNormalizedLoaded) + } + if (route.children) { + const tempTags: RouteLocationNormalizedLoaded[] = filterAffixTags(route.children, tagPath) + if (tempTags.length >= 1) { + tags = [...tags, ...tempTags] + } + } + }) + + return tags +} diff --git a/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/index.ts b/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/index.ts new file mode 100644 index 0000000..823a276 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/index.ts @@ -0,0 +1,3 @@ +import ThemeSwitch from './src/ThemeSwitch.vue' + +export { ThemeSwitch } diff --git a/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/src/ThemeSwitch.vue b/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/src/ThemeSwitch.vue new file mode 100644 index 0000000..8ea26ed --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/ThemeSwitch/src/ThemeSwitch.vue @@ -0,0 +1,49 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/ToolHeader.vue b/grailed-ui-admin-vue3/src/layout/components/ToolHeader.vue new file mode 100644 index 0000000..fe84006 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/ToolHeader.vue @@ -0,0 +1,93 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/UserInfo/index.ts b/grailed-ui-admin-vue3/src/layout/components/UserInfo/index.ts new file mode 100644 index 0000000..c3a34ab --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/UserInfo/index.ts @@ -0,0 +1,3 @@ +import UserInfo from './src/UserInfo.vue' + +export { UserInfo } diff --git a/grailed-ui-admin-vue3/src/layout/components/UserInfo/src/UserInfo.vue b/grailed-ui-admin-vue3/src/layout/components/UserInfo/src/UserInfo.vue new file mode 100644 index 0000000..c5fc9a4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/UserInfo/src/UserInfo.vue @@ -0,0 +1,78 @@ + + + diff --git a/grailed-ui-admin-vue3/src/layout/components/useRenderLayout.tsx b/grailed-ui-admin-vue3/src/layout/components/useRenderLayout.tsx new file mode 100644 index 0000000..46a1e60 --- /dev/null +++ b/grailed-ui-admin-vue3/src/layout/components/useRenderLayout.tsx @@ -0,0 +1,306 @@ +import { computed } from 'vue' +import { useAppStore } from '@/store/modules/app' +import { Menu } from '@/layout/components/Menu' +import { TabMenu } from '@/layout/components/TabMenu' +import { TagsView } from '@/layout/components/TagsView' +import { Logo } from '@/layout/components/Logo' +import AppView from './AppView.vue' +import ToolHeader from './ToolHeader.vue' +import { ElScrollbar } from 'element-plus' +import { useDesign } from '@/hooks/web/useDesign' + +const { getPrefixCls } = useDesign() + +const prefixCls = getPrefixCls('layout') + +const appStore = useAppStore() + +const pageLoading = computed(() => appStore.getPageLoading) + +// 标签页 +const tagsView = computed(() => appStore.getTagsView) + +// 菜单折叠 +const collapse = computed(() => appStore.getCollapse) + +// logo +const logo = computed(() => appStore.logo) + +// 固定头部 +const fixedHeader = computed(() => appStore.getFixedHeader) + +// 是否是移动端 +const mobile = computed(() => appStore.getMobile) + +// 固定菜单 +const fixedMenu = computed(() => appStore.getFixedMenu) + +export const useRenderLayout = () => { + const renderClassic = () => { + return ( + <> +
+ {logo.value ? ( + + ) : undefined} + +
+
+ +
+ + + {tagsView.value ? ( + + ) : undefined} +
+ + +
+
+ + ) + } + + const renderTopLeft = () => { + return ( + <> +
+ {logo.value ? : undefined} + + +
+
+ +
+ + {tagsView.value ? ( + + ) : undefined} + + + +
+
+ + ) + } + + const renderTop = () => { + return ( + <> +
+ {logo.value ? : undefined} + + +
+
+ + {tagsView.value ? ( + + ) : undefined} + + + +
+ + ) + } + + const renderCutMenu = () => { + return ( + <> +
+ {logo.value ? : undefined} + + +
+
+ +
+ + {tagsView.value ? ( + + ) : undefined} + + + +
+
+ + ) + } + + return { + renderClassic, + renderTopLeft, + renderTop, + renderCutMenu + } +} diff --git a/grailed-ui-admin-vue3/src/locales/en.ts b/grailed-ui-admin-vue3/src/locales/en.ts new file mode 100644 index 0000000..0eebbde --- /dev/null +++ b/grailed-ui-admin-vue3/src/locales/en.ts @@ -0,0 +1,447 @@ +export default { + common: { + inputText: 'Please input', + selectText: 'Please select', + startTimeText: 'Start time', + endTimeText: 'End time', + login: 'Login', + required: 'This is required', + loginOut: 'Login out', + document: 'Document', + profile: 'User Center', + reminder: 'Reminder', + loginOutMessage: 'Exit the system?', + back: 'Back', + ok: 'OK', + save: 'Save', + cancel: 'Cancel', + close: 'Close', + reload: 'Reload current', + success: 'Success', + closeTab: 'Close current', + closeTheLeftTab: 'Close left', + closeTheRightTab: 'Close right', + closeOther: 'Close other', + closeAll: 'Close all', + prevLabel: 'Prev', + nextLabel: 'Next', + skipLabel: 'Jump', + doneLabel: 'End', + menu: 'Menu', + menuDes: 'Menu bar rendered in routed structure', + collapse: 'Collapse', + collapseDes: 'Expand and zoom the menu bar', + tagsView: 'Tags view', + tagsViewDes: 'Used to record routing history', + tool: 'Tool', + toolDes: 'Used to set up custom systems', + query: 'Query', + reset: 'Reset', + shrink: 'Put away', + expand: 'Expand', + confirmTitle: 'System Hint', + exportMessage: 'Whether to confirm export data item?', + importMessage: 'Whether to confirm import data item?', + createSuccess: 'Create Success', + updateSuccess: 'Update Success', + delMessage: 'Delete the selected data?', + delDataMessage: 'Delete the data?', + delNoData: 'Please select the data to delete', + delSuccess: 'Deleted successfully', + index: 'Index', + status: 'Status', + createTime: 'Create Time', + updateTime: 'Update Time', + copy: 'Copy', + copySuccess: 'Copy Success', + copyError: 'Copy Error' + }, + error: { + noPermission: `Sorry, you don't have permission to access this page.`, + pageError: 'Sorry, the page you visited does not exist.', + networkError: 'Sorry, the server reported an error.', + returnToHome: 'Return to home' + }, + permission: { + hasPermission: `Please set the operation permission label value`, + hasRole: `Please set the role permission tag value` + }, + setting: { + projectSetting: 'Project setting', + theme: 'Theme', + layout: 'Layout', + systemTheme: 'System theme', + menuTheme: 'Menu theme', + interfaceDisplay: 'Interface display', + breadcrumb: 'Breadcrumb', + breadcrumbIcon: 'Breadcrumb icon', + collapseMenu: 'Collapse menu', + hamburgerIcon: 'Hamburger icon', + screenfullIcon: 'Screenfull icon', + sizeIcon: 'Size icon', + localeIcon: 'Locale icon', + messageIcon: 'Message icon', + tagsView: 'Tags view', + logo: 'Logo', + greyMode: 'Grey mode', + fixedHeader: 'Fixed header', + headerTheme: 'Header theme', + cutMenu: 'Cut Menu', + copy: 'Copy', + clearAndReset: 'Clear cache and reset', + copySuccess: 'Copy success', + copyFailed: 'Copy failed', + footer: 'Footer', + uniqueOpened: 'Unique opened', + tagsViewIcon: 'Tags view icon', + reExperienced: 'Please exit the login experience again', + fixedMenu: 'Fixed menu' + }, + size: { + default: 'Default', + large: 'Large', + small: 'Small' + }, + login: { + welcome: 'Welcome to the system', + message: '', + tenantname: 'TenantName', + username: 'Username', + password: 'Password', + code: 'verification code', + login: 'Sign in', + relogin: 'Sign in again', + otherLogin: 'Sign in with', + register: 'Register', + checkPassword: 'Confirm password', + remember: 'Remember me', + hasUser: 'Existing account? Go to login', + forgetPassword: 'Forget password?', + tenantNamePlaceholder: 'Please Enter Tenant Name', + usernamePlaceholder: 'Please Enter Username', + passwordPlaceholder: 'Please Enter Password', + codePlaceholder: 'Please Enter Verification Code', + mobileTitle: 'Mobile sign in', + mobileNumber: 'Mobile Number', + mobileNumberPlaceholder: 'Plaease Enter Mobile Number', + backLogin: 'back', + getSmsCode: 'Get SMS Code', + btnMobile: 'Mobile sign in', + btnQRCode: 'QR code sign in', + qrcode: 'Scan the QR code to log in', + btnRegister: 'Sign up', + SmsSendMsg: 'code has been sent' + }, + captcha: { + verification: 'Please complete security verification', + slide: 'Swipe right to complete verification', + point: 'Please click', + success: 'Verification succeeded', + fail: 'verification failed' + }, + router: { + login: 'Login', + home: 'Home', + analysis: 'Analysis', + workplace: 'Workplace' + }, + analysis: { + newUser: 'New user', + unreadInformation: 'Unread information', + transactionAmount: 'Transaction amount', + totalShopping: 'Total Shopping', + monthlySales: 'Monthly sales', + userAccessSource: 'User access source', + january: 'January', + february: 'February', + march: 'March', + april: 'April', + may: 'May', + june: 'June', + july: 'July', + august: 'August', + september: 'September', + october: 'October', + november: 'November', + december: 'December', + estimate: 'Estimate', + actual: 'Actual', + directAccess: 'Airect access', + mailMarketing: 'Mail marketing', + allianceAdvertising: 'Alliance advertising', + videoAdvertising: 'Video advertising', + searchEngines: 'Search engines', + weeklyUserActivity: 'Weekly user activity', + activeQuantity: 'Active quantity', + monday: 'Monday', + tuesday: 'Tuesday', + wednesday: 'Wednesday', + thursday: 'Thursday', + friday: 'Friday', + saturday: 'Saturday', + sunday: 'Sunday' + }, + workplace: { + welcome: 'Hello', + happyDay: 'Wish you happy every day!', + toady: `It's sunny today`, + notice: 'Announcement', + project: 'Project', + access: 'Project access', + toDo: 'To do', + introduction: 'A serious introduction', + shortcutOperation: 'Quick entry', + operation: 'Operation', + index: 'Index', + personal: 'Personal', + team: 'Team', + quote: 'Quote', + contribution: 'Contribution', + hot: 'Hot', + yield: 'Yield', + dynamic: 'Dynamic', + push: 'push', + follow: 'Follow' + }, + form: { + input: 'Input', + inputNumber: 'InputNumber', + default: 'Default', + icon: 'Icon', + mixed: 'Mixed', + textarea: 'Textarea', + slot: 'Slot', + position: 'Position', + autocomplete: 'Autocomplete', + select: 'Select', + selectGroup: 'Select Group', + selectV2: 'SelectV2', + cascader: 'Cascader', + switch: 'Switch', + rate: 'Rate', + colorPicker: 'Color Picker', + transfer: 'Transfer', + render: 'Render', + radio: 'Radio', + button: 'Button', + checkbox: 'Checkbox', + slider: 'Slider', + datePicker: 'Date Picker', + shortcuts: 'Shortcuts', + today: 'Today', + yesterday: 'Yesterday', + aWeekAgo: 'A week ago', + week: 'Week', + year: 'Year', + month: 'Month', + dates: 'Dates', + daterange: 'Date Range', + monthrange: 'Month Range', + dateTimePicker: 'DateTimePicker', + dateTimerange: 'Datetime Range', + timePicker: 'Time Picker', + timeSelect: 'Time Select', + inputPassword: 'input Password', + passwordStrength: 'Password Strength', + operate: 'operate', + change: 'Change', + restore: 'Restore', + disabled: 'Disabled', + disablement: 'Disablement', + delete: 'Delete', + add: 'Add', + setValue: 'Set value', + resetValue: 'Reset value', + set: 'Set', + subitem: 'Subitem', + formValidation: 'Form validation', + verifyReset: 'Verify reset', + remark: 'Remark' + }, + watermark: { + watermark: 'Watermark' + }, + table: { + table: 'Table', + index: 'Index', + title: 'Title', + author: 'Author', + createTime: 'Create time', + action: 'Action', + pagination: 'pagination', + reserveIndex: 'Reserve index', + restoreIndex: 'Restore index', + showSelections: 'Show selections', + hiddenSelections: 'Restore selections', + showExpandedRows: 'Show expanded rows', + hiddenExpandedRows: 'Hidden expanded rows', + header: 'Header' + }, + action: { + create: 'Create', + add: 'Add', + del: 'Delete', + delete: 'Delete', + edit: 'Edit', + update: 'Update', + preview: 'Preview', + more: 'More', + sync: 'Sync', + save: 'Save', + detail: 'Detail', + export: 'Export', + import: 'Import', + generate: 'Generate', + logout: 'Login Out', + test: 'Test', + typeCreate: 'Dict Type Create', + typeUpdate: 'Dict Type Eidt', + dataCreate: 'Dict Data Create', + dataUpdate: 'Dict Data Eidt', + fileUpload: 'File Upload' + }, + dialog: { + dialog: 'Dialog', + open: 'Open', + close: 'Close' + }, + sys: { + api: { + operationFailed: 'Operation failed', + errorTip: 'Error Tip', + errorMessage: 'The operation failed, the system is abnormal!', + timeoutMessage: 'Login timed out, please log in again!', + apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!', + apiRequestFailed: 'The interface request failed, please try again later!', + networkException: 'network anomaly', + networkExceptionMsg: + 'Please check if your network connection is normal! The network is abnormal', + + errMsg401: 'The user does not have permission (token, user name, password error)!', + errMsg403: 'The user is authorized, but access is forbidden!', + errMsg404: 'Network request error, the resource was not found!', + errMsg405: 'Network request error, request method not allowed!', + errMsg408: 'Network request timed out!', + errMsg500: 'Server error, please contact the administrator!', + errMsg501: 'The network is not implemented!', + errMsg502: 'Network Error!', + errMsg503: 'The service is unavailable, the server is temporarily overloaded or maintained!', + errMsg504: 'Network timeout!', + errMsg505: 'The http version does not support the request!', + errMsg901: 'Demo mode, no write operations are possible!' + }, + app: { + logoutTip: 'Reminder', + logoutMessage: 'Confirm to exit the system?', + menuLoading: 'Menu loading...' + }, + exception: { + backLogin: 'Back Login', + backHome: 'Back Home', + subTitle403: "Sorry, you don't have access to this page.", + subTitle404: 'Sorry, the page you visited does not exist.', + subTitle500: 'Sorry, the server is reporting an error.', + noDataTitle: 'No data on the current page.', + networkErrorTitle: 'Network Error', + networkErrorSubTitle: + 'Sorry, Your network connection has been disconnected, please check your network!' + }, + lock: { + unlock: 'Click to unlock', + alert: 'Lock screen password error', + backToLogin: 'Back to login', + entry: 'Enter the system', + placeholder: 'Please enter the lock screen password or user password' + }, + login: { + backSignIn: 'Back sign in', + mobileSignInFormTitle: 'Mobile sign in', + qrSignInFormTitle: 'Qr code sign in', + signInFormTitle: 'Sign in', + signUpFormTitle: 'Sign up', + forgetFormTitle: 'Reset password', + + signInTitle: 'Backstage management system', + signInDesc: 'Enter your personal details and get started!', + policy: 'I agree to the xxx Privacy Policy', + scanSign: `scanning the code to complete the login`, + + loginButton: 'Sign in', + registerButton: 'Sign up', + rememberMe: 'Remember me', + forgetPassword: 'Forget Password?', + otherSignIn: 'Sign in with', + + // notify + loginSuccessTitle: 'Login successful', + loginSuccessDesc: 'Welcome back', + + // placeholder + accountPlaceholder: 'Please input username', + passwordPlaceholder: 'Please input password', + smsPlaceholder: 'Please input sms code', + mobilePlaceholder: 'Please input mobile', + policyPlaceholder: 'Register after checking', + diffPwd: 'The two passwords are inconsistent', + + userName: 'Username', + password: 'Password', + confirmPassword: 'Confirm Password', + email: 'Email', + smsCode: 'SMS code', + mobile: 'Mobile' + } + }, + profile: { + user: { + title: 'Personal Information', + username: 'User Name', + nickname: 'Nick Name', + mobile: 'Phone Number', + email: 'User Mail', + dept: 'Department', + posts: 'Position', + roles: 'Own Role', + sex: 'Sex', + man: 'Man', + woman: 'Woman', + createTime: 'Created Date' + }, + info: { + title: 'Basic Information', + basicInfo: 'Basic Information', + resetPwd: 'Reset Password', + userSocial: 'Social Information' + }, + rules: { + nickname: 'Please Enter User Nickname', + mail: 'Please Input The Email Address', + truemail: 'Please Input The Correct Email Address', + phone: 'Please Enter The Phone Number', + truephone: 'Please Enter The Correct Phone Number' + }, + password: { + oldPassword: 'Old PassWord', + newPassword: 'New Password', + confirmPassword: 'Confirm Password', + oldPwdMsg: 'Please Enter Old Password', + newPwdMsg: 'Please Enter New Password', + cfPwdMsg: 'Please Enter Confirm Password', + diffPwd: 'The Passwords Entered Twice No Match' + } + }, + cropper: { + selectImage: 'Select Image', + uploadSuccess: 'Uploaded success!', + modalTitle: 'Avatar upload', + okText: 'Confirm and upload', + btn_reset: 'Reset', + btn_rotate_left: 'Counterclockwise rotation', + btn_rotate_right: 'Clockwise rotation', + btn_scale_x: 'Flip horizontal', + btn_scale_y: 'Flip vertical', + btn_zoom_in: 'Zoom in', + btn_zoom_out: 'Zoom out', + preview: 'Preivew' + } +} diff --git a/grailed-ui-admin-vue3/src/locales/zh-CN.ts b/grailed-ui-admin-vue3/src/locales/zh-CN.ts new file mode 100644 index 0000000..ac6cc37 --- /dev/null +++ b/grailed-ui-admin-vue3/src/locales/zh-CN.ts @@ -0,0 +1,455 @@ +export default { + common: { + inputText: '请输入', + selectText: '请选择', + startTimeText: '开始时间', + endTimeText: '结束时间', + login: '登录', + required: '该项为必填项', + loginOut: '退出系统', + document: '项目文档', + profile: '个人中心', + reminder: '温馨提示', + loginOutMessage: '是否退出本系统?', + back: '返回', + ok: '确定', + save: '保存', + cancel: '取消', + close: '关闭', + reload: '重新加载', + success: '成功', + closeTab: '关闭标签页', + closeTheLeftTab: '关闭左侧标签页', + closeTheRightTab: '关闭右侧标签页', + closeOther: '关闭其他标签页', + closeAll: '关闭全部标签页', + prevLabel: '上一步', + nextLabel: '下一步', + skipLabel: '跳过', + doneLabel: '结束', + menu: '菜单', + menuDes: '以路由的结构渲染的菜单栏', + collapse: '展开缩收', + collapseDes: '展开和缩放菜单栏', + tagsView: '标签页', + tagsViewDes: '用于记录路由历史记录', + tool: '工具', + toolDes: '用于设置定制系统', + query: '查询', + reset: '重置', + shrink: '收起', + expand: '展开', + confirmTitle: '系统提示', + exportMessage: '是否确认导出数据项?', + importMessage: '是否确认导入数据项?', + createSuccess: '新增成功', + updateSuccess: '修改成功', + delMessage: '是否删除所选中数据?', + delDataMessage: '是否删除数据?', + delNoData: '请选择需要删除的数据', + delSuccess: '删除成功', + index: '序号', + status: '状态', + createTime: '创建时间', + updateTime: '更新时间', + copy: '复制', + copySuccess: '复制成功', + copyError: '复制失败' + }, + error: { + noPermission: `抱歉,您无权访问此页面。`, + pageError: '抱歉,您访问的页面不存在。', + networkError: '抱歉,服务器报告错误。', + returnToHome: '返回首页' + }, + permission: { + hasPermission: `请设置操作权限标签值`, + hasRole: `请设置角色权限标签值` + }, + setting: { + projectSetting: '项目配置', + theme: '主题', + layout: '布局', + systemTheme: '系统主题', + menuTheme: '菜单主题', + interfaceDisplay: '界面显示', + breadcrumb: '面包屑', + breadcrumbIcon: '面包屑图标', + collapseMenu: '折叠菜单', + hamburgerIcon: '折叠图标', + screenfullIcon: '全屏图标', + sizeIcon: '尺寸图标', + localeIcon: '多语言图标', + messageIcon: '消息图标', + tagsView: '标签页', + logo: '标志', + greyMode: '灰色模式', + fixedHeader: '固定头部', + headerTheme: '头部主题', + cutMenu: '切割菜单', + copy: '拷贝', + clearAndReset: '清除缓存并且重置', + copySuccess: '拷贝成功', + copyFailed: '拷贝失败', + footer: '页脚', + uniqueOpened: '菜单手风琴', + tagsViewIcon: '标签页图标', + reExperienced: '请重新退出登录体验', + fixedMenu: '固定菜单' + }, + size: { + default: '默认', + large: '大', + small: '小' + }, + login: { + welcome: '欢迎使用本系统', + message: '', + tenantname: '租户名称', + username: '用户名', + password: '密码', + code: '验证码', + login: '登录', + relogin: '重新登录', + otherLogin: '其他登录方式', + register: '注册', + checkPassword: '确认密码', + remember: '记住我', + hasUser: '已有账号?去登录', + forgetPassword: '忘记密码?', + tenantNamePlaceholder: '请输入租户名称', + usernamePlaceholder: '请输入用户名', + passwordPlaceholder: '请输入密码', + codePlaceholder: '请输入验证码', + mobileTitle: '手机登录', + mobileNumber: '手机号码', + mobileNumberPlaceholder: '请输入手机号码', + backLogin: '返回', + getSmsCode: '获取验证码', + btnMobile: '手机登录', + btnQRCode: '二维码登录', + qrcode: '扫描二维码登录', + btnRegister: '注册', + SmsSendMsg: '验证码已发送' + }, + captcha: { + verification: '请完成安全验证', + slide: '向右滑动完成验证', + point: '请依次点击', + success: '验证成功', + fail: '验证失败' + }, + router: { + login: '登录', + home: '首页', + analysis: '分析页', + workplace: '工作台' + }, + analysis: { + newUser: '新增用户', + unreadInformation: '未读消息', + transactionAmount: '成交金额', + totalShopping: '购物总量', + monthlySales: '每月销售额', + userAccessSource: '用户访问来源', + january: '一月', + february: '二月', + march: '三月', + april: '四月', + may: '五月', + june: '六月', + july: '七月', + august: '八月', + september: '九月', + october: '十月', + november: '十一月', + december: '十二月', + estimate: '预计', + actual: '实际', + directAccess: '直接访问', + mailMarketing: '邮件营销', + allianceAdvertising: '联盟广告', + videoAdvertising: '视频广告', + searchEngines: '搜索引擎', + weeklyUserActivity: '每周用户活跃量', + activeQuantity: '活跃量', + monday: '周一', + tuesday: '周二', + wednesday: '周三', + thursday: '周四', + friday: '周五', + saturday: '周六', + sunday: '周日' + }, + workplace: { + welcome: '你好', + happyDay: '祝你开心每一天!', + toady: '今日晴', + notice: '通知公告', + project: '项目数', + access: '项目访问', + toDo: '待办', + introduction: '一个正经的简介', + shortcutOperation: '快捷入口', + operation: '操作', + index: '指数', + personal: '个人', + team: '团队', + quote: '引用', + contribution: '贡献', + hot: '热度', + yield: '产量', + dynamic: '动态', + push: '推送', + follow: '关注' + }, + form: { + input: '输入框', + inputNumber: '数字输入框', + default: '默认', + icon: '图标', + mixed: '复合型', + textarea: '多行文本', + slot: '插槽', + position: '位置', + autocomplete: '自动补全', + select: '选择器', + selectGroup: '选项分组', + selectV2: '虚拟列表选择器', + cascader: '级联选择器', + switch: '开关', + rate: '评分', + colorPicker: '颜色选择器', + transfer: '穿梭框', + render: '渲染器', + radio: '单选框', + button: '按钮', + checkbox: '多选框', + slider: '滑块', + datePicker: '日期选择器', + shortcuts: '快捷选项', + today: '今天', + yesterday: '昨天', + aWeekAgo: '一周前', + week: '周', + year: '年', + month: '月', + dates: '日期', + daterange: '日期范围', + monthrange: '月份范围', + dateTimePicker: '日期时间选择器', + dateTimerange: '日期时间范围', + timePicker: '时间选择器', + timeSelect: '时间选择', + inputPassword: '密码输入框', + passwordStrength: '密码强度', + operate: '操作', + change: '更改', + restore: '还原', + disabled: '禁用', + disablement: '解除禁用', + delete: '删除', + add: '添加', + setValue: '设置值', + resetValue: '重置值', + set: '设置', + subitem: '子项', + formValidation: '表单验证', + verifyReset: '验证重置', + remark: '备注' + }, + watermark: { + watermark: '水印' + }, + table: { + table: '表格', + index: '序号', + title: '标题', + author: '作者', + createTime: '创建时间', + action: '操作', + pagination: '分页', + reserveIndex: '叠加序号', + restoreIndex: '还原序号', + showSelections: '显示多选', + hiddenSelections: '隐藏多选', + showExpandedRows: '显示展开行', + hiddenExpandedRows: '隐藏展开行', + header: '头部' + }, + action: { + create: '新增', + add: '新增', + del: '删除', + delete: '删除', + edit: '编辑', + record: '编辑', + update: '编辑', + preview: '预览', + more: '更多', + sync: '同步', + save: '保存', + detail: '详情', + export: '导出', + import: '导入', + generate: '生成', + logout: '强制退出', + test: '测试', + typeCreate: '字典类型新增', + typeUpdate: '字典类型编辑', + dataCreate: '字典数据新增', + dataUpdate: '字典数据编辑' + }, + dialog: { + dialog: '弹窗', + open: '打开', + close: '关闭' + }, + sys: { + api: { + operationFailed: '操作失败', + errorTip: '错误提示', + errorMessage: '操作失败,系统异常!', + timeoutMessage: '登录超时,请重新登录!', + apiTimeoutMessage: '接口请求超时,请刷新页面重试!', + apiRequestFailed: '请求出错,请稍候重试', + networkException: '网络异常', + networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!', + errMsg401: '用户没有权限(令牌、用户名、密码错误)!', + errMsg403: '用户得到授权,但是访问是被禁止的。!', + errMsg404: '网络请求错误,未找到该资源!', + errMsg405: '网络请求错误,请求方法未允许!', + errMsg408: '网络请求超时!', + errMsg500: '服务器错误,请联系管理员!', + errMsg501: '网络未实现!', + errMsg502: '网络错误!', + errMsg503: '服务不可用,服务器暂时过载或维护!', + errMsg504: '网络超时!', + errMsg505: 'http版本不支持该请求!', + errMsg901: '演示模式,无法进行写操作!' + }, + app: { + logoutTip: '温馨提醒', + logoutMessage: '是否确认退出系统?', + menuLoading: '菜单加载中...' + }, + exception: { + backLogin: '返回登录', + backHome: '返回首页', + subTitle403: '抱歉,您无权访问此页面。', + subTitle404: '抱歉,您访问的页面不存在。', + subTitle500: '抱歉,服务器报告错误。', + noDataTitle: '当前页无数据', + networkErrorTitle: '网络错误', + networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!' + }, + lock: { + unlock: '点击解锁', + alert: '锁屏密码错误', + backToLogin: '返回登录', + entry: '进入系统', + placeholder: '请输入锁屏密码或者用户密码' + }, + login: { + backSignIn: '返回', + signInFormTitle: '登录', + ssoFormTitle: '三方授权', + mobileSignInFormTitle: '手机登录', + qrSignInFormTitle: '二维码登录', + signUpFormTitle: '注册', + forgetFormTitle: '重置密码', + signInTitle: '开箱即用的中后台管理系统', + signInDesc: '输入您的个人详细信息开始使用!', + policy: '我同意xxx隐私政策', + scanSign: `扫码后点击"确认",即可完成登录`, + loginButton: '登录', + registerButton: '注册', + rememberMe: '记住我', + forgetPassword: '忘记密码?', + otherSignIn: '其他登录方式', + // notify + loginSuccessTitle: '登录成功', + loginSuccessDesc: '欢迎回来', + // placeholder + accountPlaceholder: '请输入账号', + passwordPlaceholder: '请输入密码', + smsPlaceholder: '请输入验证码', + mobilePlaceholder: '请输入手机号码', + policyPlaceholder: '勾选后才能注册', + diffPwd: '两次输入密码不一致', + userName: '账号', + password: '密码', + confirmPassword: '确认密码', + email: '邮箱', + smsCode: '短信验证码', + mobile: '手机号码' + } + }, + profile: { + user: { + title: '个人信息', + username: '用户名称', + nickname: '用户昵称', + mobile: '手机号码', + email: '用户邮箱', + dept: '所属部门', + posts: '所属岗位', + roles: '所属角色', + sex: '性别', + man: '男', + woman: '女', + createTime: '创建日期' + }, + info: { + title: '基本信息', + basicInfo: '基本资料', + resetPwd: '修改密码', + userSocial: '社交信息' + }, + rules: { + nickname: '请输入用户昵称', + mail: '请输入邮箱地址', + truemail: '请输入正确的邮箱地址', + phone: '请输入正确的手机号码', + truephone: '请输入正确的手机号码' + }, + password: { + oldPassword: '旧密码', + newPassword: '新密码', + confirmPassword: '确认密码', + oldPwdMsg: '请输入旧密码', + newPwdMsg: '请输入新密码', + cfPwdMsg: '请输入确认密码', + pwdRules: '长度在 6 到 20 个字符', + diffPwd: '两次输入密码不一致' + } + }, + cropper: { + selectImage: '选择图片', + uploadSuccess: '上传成功', + modalTitle: '头像上传', + okText: '确认并上传', + btn_reset: '重置', + btn_rotate_left: '逆时针旋转', + btn_rotate_right: '顺时针旋转', + btn_scale_x: '水平翻转', + btn_scale_y: '垂直翻转', + btn_zoom_in: '放大', + btn_zoom_out: '缩小', + preview: '预览' + }, + member: { + taskRecord : { + table : '任务记录', + }, + balanceRecord : { + table: '余额记录' + }, + combinationConfig : { + table: '连单设置' + }, + customTask: { + table: '修改当日单数' + } + } +} diff --git a/grailed-ui-admin-vue3/src/main.ts b/grailed-ui-admin-vue3/src/main.ts new file mode 100644 index 0000000..d45d5cb --- /dev/null +++ b/grailed-ui-admin-vue3/src/main.ts @@ -0,0 +1,71 @@ +// 引入unocss css +import '@/plugins/unocss' + +// 导入全局的svg图标 +import '@/plugins/svgIcon' + +// 初始化多语言 +import { setupI18n } from '@/plugins/vueI18n' + +// 引入状态管理 +import { setupStore } from '@/store' + +// 全局组件 +import { setupGlobCom } from '@/components' + +// 引入 element-plus +import { setupElementPlus } from '@/plugins/elementPlus' + +// 引入 form-create +import { setupFormCreate } from '@/plugins/formCreate' + +// 引入全局样式 +import '@/styles/index.scss' + +// 引入动画 +import '@/plugins/animate.css' + +// 路由 +import router, { setupRouter } from '@/router' + +// 权限 +import { setupAuth } from '@/directives' + +import { createApp } from 'vue' + +import App from './App.vue' + +import './permission' + +import Logger from '@/utils/Logger' + +import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患 + +// 创建实例 +const setupAll = async () => { + const app = createApp(App) + + await setupI18n(app) + + setupStore(app) + + setupGlobCom(app) + + setupElementPlus(app) + + setupFormCreate(app) + + setupRouter(app) + + setupAuth(app) + + await router.isReady() + + app.use(VueDOMPurifyHTML) + + app.mount('#app') +} + +setupAll() + +Logger.prettyPrimary(`欢迎使用`, import.meta.env.VITE_APP_TITLE) diff --git a/grailed-ui-admin-vue3/src/permission.ts b/grailed-ui-admin-vue3/src/permission.ts new file mode 100644 index 0000000..0698dc8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/permission.ts @@ -0,0 +1,70 @@ +import router from './router' +import type { RouteRecordRaw } from 'vue-router' +import { isRelogin } from '@/config/axios/service' +import { getAccessToken } from '@/utils/auth' +import { useTitle } from '@/hooks/web/useTitle' +import { useNProgress } from '@/hooks/web/useNProgress' +import { usePageLoading } from '@/hooks/web/usePageLoading' +import { useDictStoreWithOut } from '@/store/modules/dict' +import { useUserStoreWithOut } from '@/store/modules/user' +import { usePermissionStoreWithOut } from '@/store/modules/permission' + +const { start, done } = useNProgress() + +const { loadStart, loadDone } = usePageLoading() +// 路由不重定向白名单 +const whiteList = [ + '/login', + '/social-login', + '/auth-redirect', + '/bind', + '/register', + '/oauthLogin/gitee' +] + +// 路由加载前 +router.beforeEach(async (to, from, next) => { + start() + loadStart() + if (getAccessToken()) { + if (to.path === '/login') { + next({ path: '/' }) + } else { + // 获取所有字典 + const dictStore = useDictStoreWithOut() + const userStore = useUserStoreWithOut() + const permissionStore = usePermissionStoreWithOut() + if (!dictStore.getIsSetDict) { + await dictStore.setDictMap() + } + if (!userStore.getIsSetUser) { + isRelogin.show = true + await userStore.setUserInfoAction() + isRelogin.show = false + // 后端过滤菜单 + await permissionStore.generateRoutes() + permissionStore.getAddRouters.forEach((route) => { + router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表 + }) + const redirectPath = from.query.redirect || to.path + const redirect = decodeURIComponent(redirectPath as string) + const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect } + next(nextData) + } else { + next() + } + } + } else { + if (whiteList.indexOf(to.path) !== -1) { + next() + } else { + next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 + } + } +}) + +router.afterEach((to) => { + useTitle(to?.meta?.title as string) + done() // 结束Progress + loadDone() +}) diff --git a/grailed-ui-admin-vue3/src/plugins/animate.css/index.ts b/grailed-ui-admin-vue3/src/plugins/animate.css/index.ts new file mode 100644 index 0000000..3e93451 --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/animate.css/index.ts @@ -0,0 +1 @@ +import 'animate.css' diff --git a/grailed-ui-admin-vue3/src/plugins/echarts/index.ts b/grailed-ui-admin-vue3/src/plugins/echarts/index.ts new file mode 100644 index 0000000..bfccbb4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/echarts/index.ts @@ -0,0 +1,45 @@ +import * as echarts from 'echarts/core' + +import { + BarChart, + LineChart, + PieChart, + MapChart, + PictorialBarChart, + RadarChart, + GaugeChart +} from 'echarts/charts' + +import { + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + LegendComponent, + ToolboxComponent +} from 'echarts/components' + +import { CanvasRenderer } from 'echarts/renderers' + +echarts.use([ + LegendComponent, + TitleComponent, + TooltipComponent, + ToolboxComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + BarChart, + LineChart, + PieChart, + MapChart, + CanvasRenderer, + PictorialBarChart, + RadarChart, + GaugeChart +]) + +export default echarts diff --git a/grailed-ui-admin-vue3/src/plugins/elementPlus/index.ts b/grailed-ui-admin-vue3/src/plugins/elementPlus/index.ts new file mode 100644 index 0000000..0ae2a8b --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/elementPlus/index.ts @@ -0,0 +1,17 @@ +import type { App } from 'vue' +// 需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题 +import { ElLoading, ElScrollbar, ElButton } from 'element-plus' + +const plugins = [ElLoading] + +const components = [ElScrollbar, ElButton] + +export const setupElementPlus = (app: App) => { + plugins.forEach((plugin) => { + app.use(plugin) + }) + + components.forEach((component) => { + app.component(component.name, component) + }) +} diff --git a/grailed-ui-admin-vue3/src/plugins/formCreate/index.ts b/grailed-ui-admin-vue3/src/plugins/formCreate/index.ts new file mode 100644 index 0000000..a6cb821 --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/formCreate/index.ts @@ -0,0 +1,43 @@ +import type { App } from 'vue' +// 👇使用 form-create 需额外全局引入 element plus 组件 +import { + ElAside, + ElPopconfirm, + ElHeader, + ElMain, + ElContainer, + ElDivider, + ElTransfer, + ElAlert, + ElTabs, + ElTable, + ElTableColumn, + ElTabPane +} from 'element-plus' + +import formCreate from '@form-create/element-ui' +import install from '@form-create/element-ui/auto-import' + +const components = [ + ElAside, + ElPopconfirm, + ElHeader, + ElMain, + ElContainer, + ElDivider, + ElTransfer, + ElAlert, + ElTabs, + ElTable, + ElTableColumn, + ElTabPane +] + +// 参考 http://www.form-create.com/v3/element-ui/auto-import.html 文档 +export const setupFormCreate = (app: App) => { + components.forEach((component) => { + app.component(component.name, component) + }) + formCreate.use(install) + app.use(formCreate) +} diff --git a/grailed-ui-admin-vue3/src/plugins/svgIcon/index.ts b/grailed-ui-admin-vue3/src/plugins/svgIcon/index.ts new file mode 100644 index 0000000..b5b7f70 --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/svgIcon/index.ts @@ -0,0 +1,3 @@ +import 'virtual:svg-icons-register' + +import '@purge-icons/generated' diff --git a/grailed-ui-admin-vue3/src/plugins/unocss/index.ts b/grailed-ui-admin-vue3/src/plugins/unocss/index.ts new file mode 100644 index 0000000..d366b5a --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/unocss/index.ts @@ -0,0 +1 @@ +import 'virtual:uno.css' diff --git a/grailed-ui-admin-vue3/src/plugins/vueI18n/helper.ts b/grailed-ui-admin-vue3/src/plugins/vueI18n/helper.ts new file mode 100644 index 0000000..da6bc8c --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/vueI18n/helper.ts @@ -0,0 +1,3 @@ +export const setHtmlPageLang = (locale: LocaleType) => { + document.querySelector('html')?.setAttribute('lang', locale) +} diff --git a/grailed-ui-admin-vue3/src/plugins/vueI18n/index.ts b/grailed-ui-admin-vue3/src/plugins/vueI18n/index.ts new file mode 100644 index 0000000..f845b13 --- /dev/null +++ b/grailed-ui-admin-vue3/src/plugins/vueI18n/index.ts @@ -0,0 +1,42 @@ +import type { App } from 'vue' +import { createI18n } from 'vue-i18n' +import { useLocaleStoreWithOut } from '@/store/modules/locale' +import type { I18n, I18nOptions } from 'vue-i18n' +import { setHtmlPageLang } from './helper' + +export let i18n: ReturnType + +const createI18nOptions = async (): Promise => { + const localeStore = useLocaleStoreWithOut() + const locale = localeStore.getCurrentLocale + const localeMap = localeStore.getLocaleMap + const defaultLocal = await import(`../../locales/${locale.lang}.ts`) + const message = defaultLocal.default ?? {} + + setHtmlPageLang(locale.lang) + + localeStore.setCurrentLocale({ + lang: locale.lang + // elLocale: elLocal + }) + + return { + legacy: false, + locale: locale.lang, + fallbackLocale: locale.lang, + messages: { + [locale.lang]: message + }, + availableLocales: localeMap.map((v) => v.lang), + sync: true, + silentTranslationWarn: true, + missingWarn: false, + silentFallbackWarn: true + } +} + +export const setupI18n = async (app: App) => { + const options = await createI18nOptions() + i18n = createI18n(options) as I18n + app.use(i18n) +} diff --git a/grailed-ui-admin-vue3/src/router/index.ts b/grailed-ui-admin-vue3/src/router/index.ts new file mode 100644 index 0000000..8f66ca3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/router/index.ts @@ -0,0 +1,28 @@ +import type { App } from 'vue' +import type { RouteRecordRaw } from 'vue-router' +import { createRouter, createWebHistory } from 'vue-router' +import remainingRouter from './modules/remaining' + +// 创建路由实例 +const router = createRouter({ + history: createWebHistory(), // createWebHashHistory URL带#,createWebHistory URL不带# + strict: true, + routes: remainingRouter as RouteRecordRaw[], + scrollBehavior: () => ({ left: 0, top: 0 }) +}) + +export const resetRouter = (): void => { + const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'] + router.getRoutes().forEach((route) => { + const { name } = route + if (name && !resetWhiteNameList.includes(name as string)) { + router.hasRoute(name) && router.removeRoute(name) + } + }) +} + +export const setupRouter = (app: App) => { + app.use(router) +} + +export default router diff --git a/grailed-ui-admin-vue3/src/router/modules/remaining.ts b/grailed-ui-admin-vue3/src/router/modules/remaining.ts new file mode 100644 index 0000000..c05fde2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/router/modules/remaining.ts @@ -0,0 +1,311 @@ +import { Layout } from '@/utils/routerHelper' + +const { t } = useI18n() +/** + * redirect: noredirect 当设置 noredirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' 设定路由的名字,一定要填写不然使用时会出现各种问题 + * meta : { + hidden: true 当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false) + + alwaysShow: true 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式, + 只有一个时,会将那个子路由当做根路由显示在侧边栏, + 若你想不管路由下面的 children 声明的个数都显示你的根路由, + 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则, + 一直显示根路由(默认 false) + + title: 'title' 设置该路由在侧边栏和面包屑中展示的名字 + + icon: 'svg-name' 设置该路由的图标 + + noCache: true 如果设置为true,则不会被 缓存(默认 false) + + breadcrumb: false 如果设置为false,则不会在breadcrumb面包屑中显示(默认 true) + + affix: true 如果设置为true,则会一直固定在tag项中(默认 false) + + noTagsView: true 如果设置为true,则不会出现在tag中(默认 false) + + activeMenu: '/dashboard' 显示高亮的路由路径 + + followAuth: '/dashboard' 跟随哪个路由进行权限过滤 + + canTo: true 设置为true即使hidden为true,也依然可以进行路由跳转(默认 false) + } + **/ +const remainingRouter: AppRouteRecordRaw[] = [ + { + path: '/redirect', + component: Layout, + name: 'Redirect', + children: [ + { + path: '/redirect/:path(.*)', + name: 'Redirect', + component: () => import('@/views/Redirect/Redirect.vue'), + meta: {} + } + ], + meta: { + hidden: true, + noTagsView: true + } + }, + { + path: '/', + component: Layout, + redirect: '/index', + name: 'Home', + meta: {}, + children: [ + { + path: 'index', + component: () => import('@/views/Home/Index.vue'), + name: 'Index', + meta: { + title: t('router.home'), + icon: 'ep:home-filled', + noCache: false, + affix: true + } + } + ] + }, + { + path: '/user', + component: Layout, + name: 'UserInfo', + meta: { + hidden: true + }, + children: [ + { + path: 'profile', + component: () => import('@/views/Profile/Index.vue'), + name: 'Profile', + meta: { + canTo: true, + hidden: true, + noTagsView: false, + icon: 'ep:user', + title: t('common.profile') + } + }, + { + path: 'notify-message', + component: () => import('@/views/system/notify/my/index.vue'), + name: 'MyNotifyMessage', + meta: { + canTo: true, + hidden: true, + noTagsView: false, + icon: 'ep:message', + title: '我的站内信' + } + } + ] + }, + + { + path: '/dict', + component: Layout, + name: 'dict', + meta: { + hidden: true + }, + children: [ + { + path: 'type/data/:dictType', + component: () => import('@/views/system/dict/data/index.vue'), + name: 'SystemDictData', + meta: { + title: '字典数据', + noCache: true, + hidden: true, + canTo: true, + icon: '', + activeMenu: '/system/dict' + } + } + ] + }, + + { + path: '/codegen', + component: Layout, + name: 'CodegenEdit', + meta: { + hidden: true + }, + children: [ + { + path: 'edit', + component: () => import('@/views/infra/codegen/EditTable.vue'), + name: 'InfraCodegenEditTable', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '修改生成配置', + activeMenu: 'infra/codegen/index' + } + } + ] + }, + { + path: '/job', + component: Layout, + name: 'JobL', + meta: { + hidden: true + }, + children: [ + { + path: 'job-log', + component: () => import('@/views/infra/job/logger/index.vue'), + name: 'InfraJobLog', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '调度日志', + activeMenu: 'infra/job/index' + } + } + ] + }, + { + path: '/login', + component: () => import('@/views/Login/Login.vue'), + name: 'Login', + meta: { + hidden: true, + title: t('router.login'), + noTagsView: true + } + }, + { + path: '/sso', + component: () => import('@/views/Login/Login.vue'), + name: 'SSOLogin', + meta: { + hidden: true, + title: t('router.login'), + noTagsView: true + } + }, + { + path: '/trade/order', + component: Layout, + name: 'order', + meta: { + hidden: true + }, + children: [ + { + path: 'detail', + name: 'TradeOrderDetail', + component: () => import('@/views/mall/trade/order/tradeOrderDetail.vue'), + meta: { title: '订单详情', hidden: true } + } + ] + }, + { + path: '/403', + component: () => import('@/views/Error/403.vue'), + name: 'NoAccess', + meta: { + hidden: true, + title: '403', + noTagsView: true + } + }, + { + path: '/404', + component: () => import('@/views/Error/404.vue'), + name: 'NoFound', + meta: { + hidden: true, + title: '404', + noTagsView: true + } + }, + { + path: '/500', + component: () => import('@/views/Error/500.vue'), + name: 'Error', + meta: { + hidden: true, + title: '500', + noTagsView: true + } + }, + { + path: '/property', + component: Layout, + name: 'property', + meta: { + hidden: true + }, + children: [ + { + path: 'value/:propertyId(\\d+)', + component: () => import('@/views/mall/product/property/value/index.vue'), + name: 'ProductPropertyValue', + meta: { title: '商品属性值', icon: '', activeMenu: '/product/property' } + } + ] + }, + { + path: '/product', + component: Layout, + name: 'Product', + meta: { + hidden: true + }, + children: [ + { + path: 'spu/add', + component: () => import('@/views/mall/product/spu/addForm.vue'), + name: 'ProductSpuAdd', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '添加商品', + activeMenu: '/product/product-spu' + } + }, + { + path: 'spu/edit/:spuId(\\d+)', + component: () => import('@/views/mall/product/spu/addForm.vue'), + name: 'ProductSpuEdit', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:edit', + title: '编辑商品', + activeMenu: '/product/product-spu' + } + }, + { + path: 'spu/detail/:spuId(\\d+)', + component: () => import('@/views/mall/product/spu/addForm.vue'), + name: 'ProductSpuDetail', + meta: { + noCache: true, + hidden: true, + canTo: true, + icon: 'ep:view', + title: '商品详情', + activeMenu: '/product/product-spu' + } + } + ] + } +] + +export default remainingRouter diff --git a/grailed-ui-admin-vue3/src/store/index.ts b/grailed-ui-admin-vue3/src/store/index.ts new file mode 100644 index 0000000..65964ea --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/index.ts @@ -0,0 +1,10 @@ +import type { App } from 'vue' +import { createPinia } from 'pinia' + +const store = createPinia() + +export const setupStore = (app: App) => { + app.use(store) +} + +export { store } diff --git a/grailed-ui-admin-vue3/src/store/modules/app.ts b/grailed-ui-admin-vue3/src/store/modules/app.ts new file mode 100644 index 0000000..2489f87 --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/app.ts @@ -0,0 +1,274 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import { setCssVar, humpToUnderline } from '@/utils' +import { ElMessage } from 'element-plus' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' +import { ElementPlusSize } from '@/types/elementPlus' +import { LayoutType } from '@/types/layout' +import { ThemeTypes } from '@/types/theme' + +const { wsCache } = useCache() + +interface AppState { + breadcrumb: boolean + breadcrumbIcon: boolean + collapse: boolean + uniqueOpened: boolean + hamburger: boolean + screenfull: boolean + size: boolean + locale: boolean + message: boolean + tagsView: boolean + tagsViewIcon: boolean + logo: boolean + fixedHeader: boolean + greyMode: boolean + pageLoading: boolean + layout: LayoutType + title: string + userInfo: string + isDark: boolean + currentSize: ElementPlusSize + sizeMap: ElementPlusSize[] + mobile: boolean + footer: boolean + theme: ThemeTypes + fixedMenu: boolean +} + +export const useAppStore = defineStore('app', { + state: (): AppState => { + return { + userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突 + sizeMap: ['default', 'large', 'small'], + mobile: false, // 是否是移动端 + title: import.meta.env.VITE_APP_TITLE, // 标题 + pageLoading: false, // 路由跳转loading + + breadcrumb: true, // 面包屑 + breadcrumbIcon: true, // 面包屑图标 + collapse: false, // 折叠菜单 + uniqueOpened: true, // 是否只保持一个子菜单的展开 + hamburger: true, // 折叠图标 + screenfull: true, // 全屏图标 + size: true, // 尺寸图标 + locale: true, // 多语言图标 + message: true, // 消息图标 + tagsView: true, // 标签页 + tagsViewIcon: true, // 是否显示标签图标 + logo: true, // logo + fixedHeader: true, // 固定toolheader + footer: true, // 显示页脚 + greyMode: false, // 是否开始灰色模式,用于特殊悼念日 + fixedMenu: wsCache.get('fixedMenu') || false, // 是否固定菜单 + + layout: wsCache.get(CACHE_KEY.LAYOUT) || 'classic', // layout布局 + isDark: wsCache.get(CACHE_KEY.IS_DARK) || false, // 是否是暗黑模式 + currentSize: wsCache.get('default') || 'default', // 组件尺寸 + theme: wsCache.get(CACHE_KEY.THEME) || { + // 主题色 + elColorPrimary: '#409eff', + // 左侧菜单边框颜色 + leftMenuBorderColor: 'inherit', + // 左侧菜单背景颜色 + leftMenuBgColor: '#001529', + // 左侧菜单浅色背景颜色 + leftMenuBgLightColor: '#0f2438', + // 左侧菜单选中背景颜色 + leftMenuBgActiveColor: 'var(--el-color-primary)', + // 左侧菜单收起选中背景颜色 + leftMenuCollapseBgActiveColor: 'var(--el-color-primary)', + // 左侧菜单字体颜色 + leftMenuTextColor: '#bfcbd9', + // 左侧菜单选中字体颜色 + leftMenuTextActiveColor: '#fff', + // logo字体颜色 + logoTitleTextColor: '#fff', + // logo边框颜色 + logoBorderColor: 'inherit', + // 头部背景颜色 + topHeaderBgColor: '#fff', + // 头部字体颜色 + topHeaderTextColor: 'inherit', + // 头部悬停颜色 + topHeaderHoverColor: '#f6f6f6', + // 头部边框颜色 + topToolBorderColor: '#eee' + } + } + }, + getters: { + getBreadcrumb(): boolean { + return this.breadcrumb + }, + getBreadcrumbIcon(): boolean { + return this.breadcrumbIcon + }, + getCollapse(): boolean { + return this.collapse + }, + getUniqueOpened(): boolean { + return this.uniqueOpened + }, + getHamburger(): boolean { + return this.hamburger + }, + getScreenfull(): boolean { + return this.screenfull + }, + getSize(): boolean { + return this.size + }, + getLocale(): boolean { + return this.locale + }, + getMessage(): boolean { + return this.message + }, + getTagsView(): boolean { + return this.tagsView + }, + getTagsViewIcon(): boolean { + return this.tagsViewIcon + }, + getLogo(): boolean { + return this.logo + }, + getFixedHeader(): boolean { + return this.fixedHeader + }, + getGreyMode(): boolean { + return this.greyMode + }, + getFixedMenu(): boolean { + return this.fixedMenu + }, + getPageLoading(): boolean { + return this.pageLoading + }, + getLayout(): LayoutType { + return this.layout + }, + getTitle(): string { + return this.title + }, + getUserInfo(): string { + return this.userInfo + }, + getIsDark(): boolean { + return this.isDark + }, + getCurrentSize(): ElementPlusSize { + return this.currentSize + }, + getSizeMap(): ElementPlusSize[] { + return this.sizeMap + }, + getMobile(): boolean { + return this.mobile + }, + getTheme(): ThemeTypes { + return this.theme + }, + getFooter(): boolean { + return this.footer + } + }, + actions: { + setBreadcrumb(breadcrumb: boolean) { + this.breadcrumb = breadcrumb + }, + setBreadcrumbIcon(breadcrumbIcon: boolean) { + this.breadcrumbIcon = breadcrumbIcon + }, + setCollapse(collapse: boolean) { + this.collapse = collapse + }, + setUniqueOpened(uniqueOpened: boolean) { + this.uniqueOpened = uniqueOpened + }, + setHamburger(hamburger: boolean) { + this.hamburger = hamburger + }, + setScreenfull(screenfull: boolean) { + this.screenfull = screenfull + }, + setSize(size: boolean) { + this.size = size + }, + setLocale(locale: boolean) { + this.locale = locale + }, + setMessage(message: boolean) { + this.message = message + }, + setTagsView(tagsView: boolean) { + this.tagsView = tagsView + }, + setTagsViewIcon(tagsViewIcon: boolean) { + this.tagsViewIcon = tagsViewIcon + }, + setLogo(logo: boolean) { + this.logo = logo + }, + setFixedHeader(fixedHeader: boolean) { + this.fixedHeader = fixedHeader + }, + setGreyMode(greyMode: boolean) { + this.greyMode = greyMode + }, + setFixedMenu(fixedMenu: boolean) { + wsCache.set('fixedMenu', fixedMenu) + this.fixedMenu = fixedMenu + }, + setPageLoading(pageLoading: boolean) { + this.pageLoading = pageLoading + }, + setLayout(layout: LayoutType) { + if (this.mobile && layout !== 'classic') { + ElMessage.warning('移动端模式下不支持切换其他布局') + return + } + this.layout = layout + wsCache.set(CACHE_KEY.LAYOUT, this.layout) + }, + setTitle(title: string) { + this.title = title + }, + setIsDark(isDark: boolean) { + this.isDark = isDark + if (this.isDark) { + document.documentElement.classList.add('dark') + document.documentElement.classList.remove('light') + } else { + document.documentElement.classList.add('light') + document.documentElement.classList.remove('dark') + } + wsCache.set(CACHE_KEY.IS_DARK, this.isDark) + }, + setCurrentSize(currentSize: ElementPlusSize) { + this.currentSize = currentSize + wsCache.set('currentSize', this.currentSize) + }, + setMobile(mobile: boolean) { + this.mobile = mobile + }, + setTheme(theme: ThemeTypes) { + this.theme = Object.assign(this.theme, theme) + wsCache.set(CACHE_KEY.THEME, this.theme) + }, + setCssVarTheme() { + for (const key in this.theme) { + setCssVar(`--${humpToUnderline(key)}`, this.theme[key]) + } + }, + setFooter(footer: boolean) { + this.footer = footer + } + } +}) + +export const useAppStoreWithOut = () => { + return useAppStore(store) +} diff --git a/grailed-ui-admin-vue3/src/store/modules/audio.ts b/grailed-ui-admin-vue3/src/store/modules/audio.ts new file mode 100644 index 0000000..28031b3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/audio.ts @@ -0,0 +1,15 @@ +import { ref } from 'vue' +import { defineStore } from 'pinia' + +export const useAlterToneStore = defineStore('alterTone', () => { + const alterTone = ref(false) + + const getAlterTone = () => { + return alterTone.value + } + const setAlterTone = (value: boolean) => { + alterTone.value = value + } + + return { getAlterTone, setAlterTone } +}) diff --git a/grailed-ui-admin-vue3/src/store/modules/dict.ts b/grailed-ui-admin-vue3/src/store/modules/dict.ts new file mode 100644 index 0000000..822547b --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/dict.ts @@ -0,0 +1,104 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +// @ts-ignore +import { DictDataVO } from '@/api/system/dict/types' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' +const { wsCache } = useCache('sessionStorage') +import { listSimpleDictData } from '@/api/system/dict/dict.data' + +export interface DictValueType { + value: any + label: string + clorType?: string + cssClass?: string +} +export interface DictTypeType { + dictType: string + dictValue: DictValueType[] +} +export interface DictState { + dictMap: Map + isSetDict: boolean +} + +export const useDictStore = defineStore('dict', { + state: (): DictState => ({ + dictMap: new Map(), + isSetDict: false + }), + getters: { + getDictMap(): Recordable { + const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) + if (dictMap) { + this.dictMap = dictMap + } + return this.dictMap + }, + getIsSetDict(): boolean { + return this.isSetDict + } + }, + actions: { + async setDictMap() { + const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) + if (dictMap) { + this.dictMap = dictMap + this.isSetDict = true + } else { + const res = await listSimpleDictData() + // 设置数据 + const dictDataMap = new Map() + res.forEach((dictData: DictDataVO) => { + // 获得 dictType 层级 + const enumValueObj = dictDataMap[dictData.dictType] + if (!enumValueObj) { + dictDataMap[dictData.dictType] = [] + } + // 处理 dictValue 层级 + dictDataMap[dictData.dictType].push({ + value: dictData.value, + label: dictData.label, + colorType: dictData.colorType, + cssClass: dictData.cssClass + }) + }) + this.dictMap = dictDataMap + this.isSetDict = true + wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期 + } + }, + getDictByType(type: string) { + if (!this.isSetDict) { + this.setDictMap() + } + return this.dictMap[type] + }, + async resetDict() { + wsCache.delete(CACHE_KEY.DICT_CACHE) + const res = await listSimpleDictData() + // 设置数据 + const dictDataMap = new Map() + res.forEach((dictData: DictDataVO) => { + // 获得 dictType 层级 + const enumValueObj = dictDataMap[dictData.dictType] + if (!enumValueObj) { + dictDataMap[dictData.dictType] = [] + } + // 处理 dictValue 层级 + dictDataMap[dictData.dictType].push({ + value: dictData.value, + label: dictData.label, + colorType: dictData.colorType, + cssClass: dictData.cssClass + }) + }) + this.dictMap = dictDataMap + this.isSetDict = true + wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期 + } + } +}) + +export const useDictStoreWithOut = () => { + return useDictStore(store) +} diff --git a/grailed-ui-admin-vue3/src/store/modules/locale.ts b/grailed-ui-admin-vue3/src/store/modules/locale.ts new file mode 100644 index 0000000..82d91cf --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/locale.ts @@ -0,0 +1,60 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import zhCn from 'element-plus/es/locale/lang/zh-cn' +import en from 'element-plus/es/locale/lang/en' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' +import { LocaleDropdownType } from '@/types/localeDropdown' + +const { wsCache } = useCache() + +const elLocaleMap = { + 'zh-CN': zhCn, + en: en +} + +interface LocaleState { + currentLocale: LocaleDropdownType + localeMap: LocaleDropdownType[] +} + +export const useLocaleStore = defineStore('locales', { + state: (): LocaleState => { + return { + currentLocale: { + lang: wsCache.get(CACHE_KEY.LANG) || 'zh-CN', + elLocale: elLocaleMap[wsCache.get(CACHE_KEY.LANG) || 'zh-CN'] + }, + // 多语言 + localeMap: [ + { + lang: 'zh-CN', + name: '简体中文' + }, + { + lang: 'en', + name: 'English' + } + ] + } + }, + getters: { + getCurrentLocale(): LocaleDropdownType { + return this.currentLocale + }, + getLocaleMap(): LocaleDropdownType[] { + return this.localeMap + } + }, + actions: { + setCurrentLocale(localeMap: LocaleDropdownType) { + // this.locale = Object.assign(this.locale, localeMap) + this.currentLocale.lang = localeMap?.lang + this.currentLocale.elLocale = elLocaleMap[localeMap?.lang] + wsCache.set(CACHE_KEY.LANG, localeMap?.lang) + } + } +}) + +export const useLocaleStoreWithOut = () => { + return useLocaleStore(store) +} diff --git a/grailed-ui-admin-vue3/src/store/modules/permission.ts b/grailed-ui-admin-vue3/src/store/modules/permission.ts new file mode 100644 index 0000000..c729cea --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/permission.ts @@ -0,0 +1,67 @@ +import { defineStore } from 'pinia' +import { store } from '../index' +import { cloneDeep } from 'lodash-es' +import remainingRouter from '@/router/modules/remaining' +import { flatMultiLevelRoutes, generateRoute } from '@/utils/routerHelper' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' + +const { wsCache } = useCache() + +export interface PermissionState { + routers: AppRouteRecordRaw[] + addRouters: AppRouteRecordRaw[] + menuTabRouters: AppRouteRecordRaw[] +} + +export const usePermissionStore = defineStore('permission', { + state: (): PermissionState => ({ + routers: [], + addRouters: [], + menuTabRouters: [] + }), + getters: { + getRouters(): AppRouteRecordRaw[] { + return this.routers + }, + getAddRouters(): AppRouteRecordRaw[] { + return flatMultiLevelRoutes(cloneDeep(this.addRouters)) + }, + getMenuTabRouters(): AppRouteRecordRaw[] { + return this.menuTabRouters + } + }, + actions: { + async generateRoutes(): Promise { + return new Promise(async (resolve) => { + // 获得菜单列表,它在登录的时候,setUserInfoAction 方法中已经进行获取 + let res: AppCustomRouteRecordRaw[] = [] + if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) { + res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[] + } + const routerMap: AppRouteRecordRaw[] = generateRoute(res) + // 动态路由,404一定要放到最后面 + this.addRouters = routerMap.concat([ + { + path: '/:path(.*)*', + redirect: '/404', + name: '404Page', + meta: { + hidden: true, + breadcrumb: false + } + } + ]) + // 渲染菜单的所有路由 + this.routers = cloneDeep(remainingRouter).concat(routerMap) + resolve() + }) + }, + setMenuTabRouters(routers: AppRouteRecordRaw[]): void { + this.menuTabRouters = routers + } + } +}) + +export const usePermissionStoreWithOut = () => { + return usePermissionStore(store) +} diff --git a/grailed-ui-admin-vue3/src/store/modules/tagsView.ts b/grailed-ui-admin-vue3/src/store/modules/tagsView.ts new file mode 100644 index 0000000..a60d0e4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/tagsView.ts @@ -0,0 +1,140 @@ +import router from '@/router' +import type { RouteLocationNormalizedLoaded } from 'vue-router' +import { getRawRoute } from '@/utils/routerHelper' +import { defineStore } from 'pinia' +import { store } from '../index' +import { findIndex } from '@/utils' + +export interface TagsViewState { + visitedViews: RouteLocationNormalizedLoaded[] + cachedViews: Set +} + +export const useTagsViewStore = defineStore('tagsView', { + state: (): TagsViewState => ({ + visitedViews: [], + cachedViews: new Set() + }), + getters: { + getVisitedViews(): RouteLocationNormalizedLoaded[] { + return this.visitedViews + }, + getCachedViews(): string[] { + return Array.from(this.cachedViews) + } + }, + actions: { + // 新增缓存和tag + addView(view: RouteLocationNormalizedLoaded): void { + this.addVisitedView(view) + this.addCachedView() + }, + // 新增tag + addVisitedView(view: RouteLocationNormalizedLoaded) { + if (this.visitedViews.some((v) => v.path === view.path)) return + if (view.meta?.noTagsView) return + this.visitedViews.push( + Object.assign({}, view, { + title: view.meta?.title || 'no-name' + }) + ) + }, + // 新增缓存 + addCachedView() { + const cacheMap: Set = new Set() + for (const v of this.visitedViews) { + const item = getRawRoute(v) + const needCache = !item.meta?.noCache + if (!needCache) { + continue + } + const name = item.name as string + cacheMap.add(name) + } + if (Array.from(this.cachedViews).sort().toString() === Array.from(cacheMap).sort().toString()) + return + this.cachedViews = cacheMap + }, + // 删除某个 + delView(view: RouteLocationNormalizedLoaded) { + this.delVisitedView(view) + this.delCachedView() + }, + // 删除tag + delVisitedView(view: RouteLocationNormalizedLoaded) { + for (const [i, v] of this.visitedViews.entries()) { + if (v.path === view.path) { + this.visitedViews.splice(i, 1) + break + } + } + }, + // 删除缓存 + delCachedView() { + const route = router.currentRoute.value + const index = findIndex(this.getCachedViews, (v) => v === route.name) + if (index > -1) { + this.cachedViews.delete(this.getCachedViews[index]) + } + }, + // 删除所有缓存和tag + delAllViews() { + this.delAllVisitedViews() + this.delCachedView() + }, + // 删除所有tag + delAllVisitedViews() { + // const affixTags = this.visitedViews.filter((tag) => tag.meta.affix) + this.visitedViews = [] + }, + // 删除其他 + delOthersViews(view: RouteLocationNormalizedLoaded) { + this.delOthersVisitedViews(view) + this.addCachedView() + }, + // 删除其他tag + delOthersVisitedViews(view: RouteLocationNormalizedLoaded) { + this.visitedViews = this.visitedViews.filter((v) => { + return v?.meta?.affix || v.path === view.path + }) + }, + // 删除左侧 + delLeftViews(view: RouteLocationNormalizedLoaded) { + const index = findIndex( + this.visitedViews, + (v) => v.path === view.path + ) + if (index > -1) { + this.visitedViews = this.visitedViews.filter((v, i) => { + return v?.meta?.affix || v.path === view.path || i > index + }) + this.addCachedView() + } + }, + // 删除右侧 + delRightViews(view: RouteLocationNormalizedLoaded) { + const index = findIndex( + this.visitedViews, + (v) => v.path === view.path + ) + if (index > -1) { + this.visitedViews = this.visitedViews.filter((v, i) => { + return v?.meta?.affix || v.path === view.path || i < index + }) + this.addCachedView() + } + }, + updateVisitedView(view: RouteLocationNormalizedLoaded) { + for (let v of this.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + } + } +}) + +export const useTagsViewStoreWithOut = () => { + return useTagsViewStore(store) +} diff --git a/grailed-ui-admin-vue3/src/store/modules/user.ts b/grailed-ui-admin-vue3/src/store/modules/user.ts new file mode 100644 index 0000000..1f801fe --- /dev/null +++ b/grailed-ui-admin-vue3/src/store/modules/user.ts @@ -0,0 +1,84 @@ +import { store } from '../index' +import { defineStore } from 'pinia' +import { getAccessToken, removeToken } from '@/utils/auth' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' +import { getInfo, loginOut } from '@/api/login' + +const { wsCache } = useCache() + +interface UserVO { + id: number + avatar: string + nickname: string +} +interface UserInfoVO { + permissions: string[] + roles: string[] + isSetUser: boolean + user: UserVO +} + +export const useUserStore = defineStore('admin-user', { + state: (): UserInfoVO => ({ + permissions: [], + roles: [], + isSetUser: false, + user: { + id: 0, + avatar: '', + nickname: '' + } + }), + getters: { + getPermissions(): string[] { + return this.permissions + }, + getRoles(): string[] { + return this.roles + }, + getIsSetUser(): boolean { + return this.isSetUser + }, + getUser(): UserVO { + return this.user + } + }, + actions: { + async setUserInfoAction() { + if (!getAccessToken()) { + this.resetState() + return null + } + let userInfo = wsCache.get(CACHE_KEY.USER) + if (!userInfo) { + userInfo = await getInfo() + } + this.permissions = userInfo.permissions + this.roles = userInfo.roles + this.user = userInfo.user + this.isSetUser = true + wsCache.set(CACHE_KEY.USER, userInfo) + wsCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus) + }, + async loginOut() { + await loginOut() + removeToken() + wsCache.clear() + this.resetState() + }, + resetState() { + this.permissions = [] + this.roles = [] + this.isSetUser = false + this.user = { + id: 0, + avatar: '', + nickname: '' + } + } + } +}) + +export const useUserStoreWithOut = () => { + return useUserStore(store) +} diff --git a/grailed-ui-admin-vue3/src/styles/global.module.scss b/grailed-ui-admin-vue3/src/styles/global.module.scss new file mode 100644 index 0000000..8448a92 --- /dev/null +++ b/grailed-ui-admin-vue3/src/styles/global.module.scss @@ -0,0 +1,6 @@ +@import './variables.scss'; +// 导出变量 +:export { + namespace: $namespace; + elNamespace: $elNamespace; +} diff --git a/grailed-ui-admin-vue3/src/styles/index.scss b/grailed-ui-admin-vue3/src/styles/index.scss new file mode 100644 index 0000000..0952bd0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/styles/index.scss @@ -0,0 +1,35 @@ +@import './var.css'; +@import 'element-plus/theme-chalk/dark/css-vars.css'; + +.reset-margin [class*='el-icon'] + span { + margin-left: 2px !important; +} + +// 解决抽屉弹出时,body宽度变化的问题 +.el-popup-parent--hidden { + width: 100% !important; +} + +// 解决表格内容超过表格总宽度后,横向滚动条前端顶不到表格边缘的问题 +.el-scrollbar__bar { + display: flex; + justify-content: flex-start; +} + +/* nprogress 适配 element-plus 的主题色 */ +#nprogress { + & .bar { + background-color: var(--el-color-primary) !important; + } + + & .peg { + box-shadow: + 0 0 10px var(--el-color-primary), + 0 0 5px var(--el-color-primary) !important; + } + + & .spinner-icon { + border-top-color: var(--el-color-primary); + border-left-color: var(--el-color-primary); + } +} diff --git a/grailed-ui-admin-vue3/src/styles/theme.scss b/grailed-ui-admin-vue3/src/styles/theme.scss new file mode 100644 index 0000000..39b03b3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/styles/theme.scss @@ -0,0 +1,6 @@ +// .text-color { +// color: var(--el-text-color-regular); +// } +// .dark .dark\:text-color { +// color: rgba(255, 255, 255, var(--dark-text-color)); +// } diff --git a/grailed-ui-admin-vue3/src/styles/var.css b/grailed-ui-admin-vue3/src/styles/var.css new file mode 100644 index 0000000..a44f804 --- /dev/null +++ b/grailed-ui-admin-vue3/src/styles/var.css @@ -0,0 +1,66 @@ +:root { + --login-bg-color: #293146; + + --left-menu-max-width: 200px; + + --left-menu-min-width: 64px; + + --left-menu-bg-color: #001529; + + --left-menu-bg-light-color: #0f2438; + + --left-menu-bg-active-color: var(--el-color-primary); + + --left-menu-text-color: #bfcbd9; + + --left-menu-text-active-color: #fff; + + --left-menu-collapse-bg-active-color: var(--el-color-primary); + /* left menu end */ + + /* logo start */ + --logo-height: 50px; + + --logo-title-text-color: #fff; + /* logo end */ + + /* header start */ + --top-header-bg-color: '#fff'; + + --top-header-text-color: 'inherit'; + + --top-header-hover-color: #f6f6f6; + + --top-tool-height: var(--logo-height); + + --top-tool-p-x: 0; + + --tags-view-height: 35px; + /* header start */ + + /* tab menu start */ + --tab-menu-max-width: 80px; + + --tab-menu-min-width: 30px; + + --tab-menu-collapse-height: 36px; + /* tab menu end */ + + --app-content-padding: 20px; + + --app-contnet-bg-color: #f5f7f9; + + --app-footer-height: 50px; + + --transition-time-02: 0.2s; +} + +.dark { + --app-content-bg-color: var(--el-bg-color); +} + +html, +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/grailed-ui-admin-vue3/src/styles/variables.scss b/grailed-ui-admin-vue3/src/styles/variables.scss new file mode 100644 index 0000000..00b66f1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/styles/variables.scss @@ -0,0 +1,4 @@ +// 命名空间 +$namespace: v; +// el命名空间 +$elNamespace: el; diff --git a/grailed-ui-admin-vue3/src/types/components.d.ts b/grailed-ui-admin-vue3/src/types/components.d.ts new file mode 100644 index 0000000..8de1f33 --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/components.d.ts @@ -0,0 +1,56 @@ +export type ComponentName = + | 'Radio' + | 'RadioButton' + | 'Checkbox' + | 'CheckboxButton' + | 'Input' + | 'Autocomplete' + | 'InputNumber' + | 'Select' + | 'Cascader' + | 'Switch' + | 'Slider' + | 'TimePicker' + | 'DatePicker' + | 'Rate' + | 'ColorPicker' + | 'Transfer' + | 'Divider' + | 'TimeSelect' + | 'SelectV2' + | 'TreeSelect' + | 'InputPassword' + | 'Editor' + | 'UploadImg' + | 'UploadImgs' + | 'UploadFile' + +export type ColProps = { + span?: number + xs?: number + sm?: number + md?: number + lg?: number + xl?: number + tag?: string +} + +export type ComponentOptions = { + label?: string + value?: FormValueType + disabled?: boolean + key?: string | number + children?: ComponentOptions[] + options?: ComponentOptions[] +} & Recordable + +export type ComponentOptionsAlias = { + labelField?: string + valueField?: string +} + +export type ComponentProps = { + optionsAlias?: ComponentOptionsAlias + options?: ComponentOptions[] + optionsSlot?: boolean +} & Recordable diff --git a/grailed-ui-admin-vue3/src/types/configGlobal.d.ts b/grailed-ui-admin-vue3/src/types/configGlobal.d.ts new file mode 100644 index 0000000..f6d7b3c --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/configGlobal.d.ts @@ -0,0 +1,4 @@ +import { ElementPlusSize } from './elementPlus' +export interface ConfigGlobalTypes { + size?: ElementPlusSize +} diff --git a/grailed-ui-admin-vue3/src/types/contextMenu.d.ts b/grailed-ui-admin-vue3/src/types/contextMenu.d.ts new file mode 100644 index 0000000..0738d0e --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/contextMenu.d.ts @@ -0,0 +1,7 @@ +export type contextMenuSchema = { + disabled?: boolean + divided?: boolean + icon?: string + label: string + command?: (item: contextMenuSchema) => void +} diff --git a/grailed-ui-admin-vue3/src/types/descriptions.d.ts b/grailed-ui-admin-vue3/src/types/descriptions.d.ts new file mode 100644 index 0000000..35c0b81 --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/descriptions.d.ts @@ -0,0 +1,13 @@ +export interface DescriptionsSchema { + span?: number // 占多少分 + field: string // 字段名 + label?: string // label名 + width?: string | number + minWidth?: string | number + align?: 'left' | 'center' | 'right' + labelAlign?: 'left' | 'center' | 'right' + className?: string + labelClassName?: string + dateFormat?: string // add by 星语:支持时间的格式化 + dictType?: string // add by 星语:支持 dict 字典数据 +} diff --git a/grailed-ui-admin-vue3/src/types/elementPlus.d.ts b/grailed-ui-admin-vue3/src/types/elementPlus.d.ts new file mode 100644 index 0000000..2c6b76e --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/elementPlus.d.ts @@ -0,0 +1,3 @@ +export type ElementPlusSize = 'default' | 'small' | 'large' + +export type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger' diff --git a/grailed-ui-admin-vue3/src/types/form.d.ts b/grailed-ui-admin-vue3/src/types/form.d.ts new file mode 100644 index 0000000..980c8cc --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/form.d.ts @@ -0,0 +1,44 @@ +import type { CSSProperties } from 'vue' +import { ColProps, ComponentProps, ComponentName } from '@/types/components' +import type { AxiosPromise } from 'axios' + +export type FormSetPropsType = { + field: string + path: string + value: any +} + +export type FormValueType = string | number | string[] | number[] | boolean | undefined | null + +export type FormItemProps = { + labelWidth?: string | number + required?: boolean + rules?: Recordable + error?: string + showMessage?: boolean + inlineMessage?: boolean + style?: CSSProperties +} + +export type FormSchema = { + // 唯一值 + field: string + // 标题 + label?: string + // 提示 + labelMessage?: string + // col组件属性 + colProps?: ColProps + // 表单组件属性,slots对应的是表单组件的插槽,规则:${field}-xxx,具体可以查看element-plus文档 + componentProps?: { slots?: Recordable } & ComponentProps + // formItem组件属性 + formItemProps?: FormItemProps + // 渲染的组件 + component?: ComponentName + // 初始值 + value?: FormValueType + // 是否隐藏 + hidden?: boolean + // 远程加载下拉项 + api?: () => AxiosPromise +} diff --git a/grailed-ui-admin-vue3/src/types/icon.d.ts b/grailed-ui-admin-vue3/src/types/icon.d.ts new file mode 100644 index 0000000..d1ffcdb --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/icon.d.ts @@ -0,0 +1,5 @@ +export interface IconTypes { + size?: number + color?: string + icon: string +} diff --git a/grailed-ui-admin-vue3/src/types/infoTip.d.ts b/grailed-ui-admin-vue3/src/types/infoTip.d.ts new file mode 100644 index 0000000..6eff083 --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/infoTip.d.ts @@ -0,0 +1,4 @@ +export interface TipSchema { + label: string + keys?: string[] +} diff --git a/grailed-ui-admin-vue3/src/types/layout.d.ts b/grailed-ui-admin-vue3/src/types/layout.d.ts new file mode 100644 index 0000000..cad3e2a --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/layout.d.ts @@ -0,0 +1 @@ +export type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu' diff --git a/grailed-ui-admin-vue3/src/types/localeDropdown.d.ts b/grailed-ui-admin-vue3/src/types/localeDropdown.d.ts new file mode 100644 index 0000000..c749dce --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/localeDropdown.d.ts @@ -0,0 +1,10 @@ +export interface Language { + el: Recordable + name: string +} + +export interface LocaleDropdownType { + lang: LocaleType + name?: string + elLocale?: Language +} diff --git a/grailed-ui-admin-vue3/src/types/qrcode.d.ts b/grailed-ui-admin-vue3/src/types/qrcode.d.ts new file mode 100644 index 0000000..86cdf0b --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/qrcode.d.ts @@ -0,0 +1,9 @@ +export interface QrcodeLogo { + src?: string + logoSize?: number + bgColor?: string + borderSize?: number + crossOrigin?: string + borderRadius?: number + logoRadius?: number +} diff --git a/grailed-ui-admin-vue3/src/types/table.d.ts b/grailed-ui-admin-vue3/src/types/table.d.ts new file mode 100644 index 0000000..9cb4205 --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/table.d.ts @@ -0,0 +1,44 @@ +export type TableColumn = { + field: string + label?: string + width?: number | string + fixed?: 'left' | 'right' + children?: TableColumn[] +} & Recordable + +export type VxeTableColumn = { + field: string + title?: string + children?: TableColumn[] +} & Recordable + +export type TableSlotDefault = { + row: Recordable + column: TableColumn + $index: number +} & Recordable + +export interface Pagination { + small?: boolean + background?: boolean + pageSize?: number + defaultPageSize?: number + total?: number + pageCount?: number + pagerCount?: number + currentPage?: number + defaultCurrentPage?: number + layout?: string + pageSizes?: number[] + popperClass?: string + prevText?: string + nextText?: string + disabled?: boolean + hideOnSinglePage?: boolean +} + +export interface TableSetPropsType { + field: string + path: string + value: any +} diff --git a/grailed-ui-admin-vue3/src/types/theme.d.ts b/grailed-ui-admin-vue3/src/types/theme.d.ts new file mode 100644 index 0000000..ad649b0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/types/theme.d.ts @@ -0,0 +1,16 @@ +export type ThemeTypes = { + elColorPrimary?: string + leftMenuBorderColor?: string + leftMenuBgColor?: string + leftMenuBgLightColor?: string + leftMenuBgActiveColor?: string + leftMenuCollapseBgActiveColor?: string + leftMenuTextColor?: string + leftMenuTextActiveColor?: string + logoTitleTextColor?: string + logoBorderColor?: string + topHeaderBgColor?: string + topHeaderTextColor?: string + topHeaderHoverColor?: string + topToolBorderColor?: string +} diff --git a/grailed-ui-admin-vue3/src/utils/Logger.ts b/grailed-ui-admin-vue3/src/utils/Logger.ts new file mode 100644 index 0000000..ca58df2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/Logger.ts @@ -0,0 +1,100 @@ +const isArray = function (obj: any): boolean { + return Object.prototype.toString.call(obj) === '[object Array]' +} + +const Logger = () => {} + +Logger.typeColor = function (type: string) { + let color = '' + switch (type) { + case 'primary': + color = '#2d8cf0' + break + case 'success': + color = '#19be6b' + break + case 'info': + color = '#909399' + break + case 'warn': + color = '#ff9900' + break + case 'error': + color = '#f03f14' + break + default: + color = '#35495E' + break + } + return color +} + +Logger.print = function (type = 'default', text: any, back = false) { + if (typeof text === 'object') { + // 如果是對象則調用打印對象方式 + isArray(text) ? console.table(text) : console.dir(text) + return + } + if (back) { + // 如果是打印帶背景圖的 + console.log( + `%c ${text} `, + `background:${Logger.typeColor(type)}; padding: 2px; border-radius: 4px; color: #fff;` + ) + } else { + console.log( + `%c ${text} `, + `border: 1px solid ${Logger.typeColor(type)}; + padding: 2px; border-radius: 4px; + color: ${Logger.typeColor(type)};` + ) + } +} + +Logger.printBack = function (type = 'primary', text) { + this.print(type, text, true) +} + +Logger.pretty = function (type = 'primary', title, text) { + if (typeof text === 'object') { + console.group('Console Group', title) + console.log( + `%c ${title}`, + `background:${Logger.typeColor(type)};border:1px solid ${Logger.typeColor(type)}; + padding: 1px; border-radius: 4px; color: #fff;` + ) + isArray(text) ? console.table(text) : console.dir(text) + console.groupEnd() + return + } + console.log( + `%c ${title} %c ${text} %c`, + `background:${Logger.typeColor(type)};border:1px solid ${Logger.typeColor(type)}; + padding: 1px; border-radius: 4px 0 0 4px; color: #fff;`, + `border:1px solid ${Logger.typeColor(type)}; + padding: 1px; border-radius: 0 4px 4px 0; color: ${Logger.typeColor(type)};`, + 'background:transparent' + ) +} + +Logger.prettyPrimary = function (title, ...text) { + text.forEach((t) => this.pretty('primary', title, t)) +} + +Logger.prettySuccess = function (title, ...text) { + text.forEach((t) => this.pretty('success', title, t)) +} + +Logger.prettyWarn = function (title, ...text) { + text.forEach((t) => this.pretty('warn', title, t)) +} + +Logger.prettyError = function (title, ...text) { + text.forEach((t) => this.pretty('error', title, t)) +} + +Logger.prettyInfo = function (title, ...text) { + text.forEach((t) => this.pretty('info', title, t)) +} + +export default Logger diff --git a/grailed-ui-admin-vue3/src/utils/auth.ts b/grailed-ui-admin-vue3/src/utils/auth.ts new file mode 100644 index 0000000..7da49b0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/auth.ts @@ -0,0 +1,92 @@ +import { useCache } from '@/hooks/web/useCache' +import { TokenType } from '@/api/login/types' +import { decrypt, encrypt } from '@/utils/jsencrypt' + +const { wsCache } = useCache() + +const AccessTokenKey = 'ACCESS_TOKEN' +const RefreshTokenKey = 'REFRESH_TOKEN' + +// 获取token +export const getAccessToken = () => { + // 此处与TokenKey相同,此写法解决初始化时Cookies中不存在TokenKey报错 + return wsCache.get(AccessTokenKey) ? wsCache.get(AccessTokenKey) : wsCache.get('ACCESS_TOKEN') +} + +// 刷新token +export const getRefreshToken = () => { + return wsCache.get(RefreshTokenKey) +} + +// 设置token +export const setToken = (token: TokenType) => { + wsCache.set(RefreshTokenKey, token.refreshToken) + wsCache.set(AccessTokenKey, token.accessToken) +} + +// 删除token +export const removeToken = () => { + wsCache.delete(AccessTokenKey) + wsCache.delete(RefreshTokenKey) +} + +/** 格式化token(jwt格式) */ +export const formatToken = (token: string): string => { + return 'Bearer ' + token +} +// ========== 账号相关 ========== + +const LoginFormKey = 'LOGINFORM' + +export type LoginFormType = { + tenantName: string + username: string + password: string + rememberMe: boolean +} + +export const getLoginForm = () => { + const loginForm: LoginFormType = wsCache.get(LoginFormKey) + if (loginForm) { + loginForm.password = decrypt(loginForm.password) as string + } + return loginForm +} + +export const setLoginForm = (loginForm: LoginFormType) => { + loginForm.password = encrypt(loginForm.password) as string + wsCache.set(LoginFormKey, loginForm, { exp: 30 * 24 * 60 * 60 }) +} + +export const removeLoginForm = () => { + wsCache.delete(LoginFormKey) +} + +// ========== 租户相关 ========== + +const TenantIdKey = 'TENANT_ID' +const TenantNameKey = 'TENANT_NAME' + +export const getTenantName = () => { + return wsCache.get(TenantNameKey) +} + +export const setTenantName = (username: string) => { + wsCache.set(TenantNameKey, username, { exp: 30 * 24 * 60 * 60 }) +} + +export const removeTenantName = () => { + wsCache.delete(TenantNameKey) +} + +export const getTenantId = () => { + return wsCache.get(TenantIdKey) +} + +export const setTenantId = (username: string) => { + wsCache.set(TenantIdKey, username) +} + +export const removeTenantId = () => { + wsCache.delete(TenantIdKey) +} diff --git a/grailed-ui-admin-vue3/src/utils/color.ts b/grailed-ui-admin-vue3/src/utils/color.ts new file mode 100644 index 0000000..6888583 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/color.ts @@ -0,0 +1,153 @@ +/** + * 判断是否 十六进制颜色值. + * 输入形式可为 #fff000 #f00 + * + * @param String color 十六进制颜色值 + * @return Boolean + */ +export const isHexColor = (color: string) => { + const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-f]{6})$/ + return reg.test(color) +} + +/** + * RGB 颜色值转换为 十六进制颜色值. + * r, g, 和 b 需要在 [0, 255] 范围内 + * + * @return String 类似#ff00ff + * @param r + * @param g + * @param b + */ +export const rgbToHex = (r: number, g: number, b: number) => { + // tslint:disable-next-line:no-bitwise + const hex = ((r << 16) | (g << 8) | b).toString(16) + return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex +} + +/** + * Transform a HEX color to its RGB representation + * @param {string} hex The color to transform + * @returns The RGB representation of the passed color + */ +export const hexToRGB = (hex: string, opacity?: number) => { + let sHex = hex.toLowerCase() + if (isHexColor(hex)) { + if (sHex.length === 4) { + let sColorNew = '#' + for (let i = 1; i < 4; i += 1) { + sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1)) + } + sHex = sColorNew + } + const sColorChange: number[] = [] + for (let i = 1; i < 7; i += 2) { + sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2))) + } + return opacity + ? 'RGBA(' + sColorChange.join(',') + ',' + opacity + ')' + : 'RGB(' + sColorChange.join(',') + ')' + } + return sHex +} + +export const colorIsDark = (color: string) => { + if (!isHexColor(color)) return + const [r, g, b] = hexToRGB(color) + .replace(/(?:\(|\)|rgb|RGB)*/g, '') + .split(',') + .map((item) => Number(item)) + return r * 0.299 + g * 0.578 + b * 0.114 < 192 +} + +/** + * Darkens a HEX color given the passed percentage + * @param {string} color The color to process + * @param {number} amount The amount to change the color by + * @returns {string} The HEX representation of the processed color + */ +export const darken = (color: string, amount: number) => { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color + amount = Math.trunc((255 * amount) / 100) + return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight( + color.substring(2, 4), + amount + )}${subtractLight(color.substring(4, 6), amount)}` +} + +/** + * Lightens a 6 char HEX color according to the passed percentage + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed color represented as HEX + */ +export const lighten = (color: string, amount: number) => { + color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color + amount = Math.trunc((255 * amount) / 100) + return `#${addLight(color.substring(0, 2), amount)}${addLight( + color.substring(2, 4), + amount + )}${addLight(color.substring(4, 6), amount)}` +} + +/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */ +/** + * Sums the passed percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +const addLight = (color: string, amount: number) => { + const cc = parseInt(color, 16) + amount + const c = cc > 255 ? 255 : cc + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}` +} + +/** + * Calculates luminance of an rgb color + * @param {number} r red + * @param {number} g green + * @param {number} b blue + */ +const luminanace = (r: number, g: number, b: number) => { + const a = [r, g, b].map((v) => { + v /= 255 + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4) + }) + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722 +} + +/** + * Calculates contrast between two rgb colors + * @param {string} rgb1 rgb color 1 + * @param {string} rgb2 rgb color 2 + */ +const contrast = (rgb1: string[], rgb2: number[]) => { + return ( + (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) / + (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05) + ) +} + +/** + * Determines what the best text color is (black or white) based con the contrast with the background + * @param hexColor - Last selected color by the user + */ +export const calculateBestTextColor = (hexColor: string) => { + const rgbColor = hexToRGB(hexColor.substring(1)) + const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0]) + + return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF' +} + +/** + * Subtracts the indicated percentage to the R, G or B of a HEX color + * @param {string} color The color to change + * @param {number} amount The amount to change the color by + * @returns {string} The processed part of the color + */ +const subtractLight = (color: string, amount: number) => { + const cc = parseInt(color, 16) - amount + const c = cc < 0 ? 0 : cc + return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}` +} diff --git a/grailed-ui-admin-vue3/src/utils/constants.ts b/grailed-ui-admin-vue3/src/utils/constants.ts new file mode 100644 index 0000000..edde87d --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/constants.ts @@ -0,0 +1,292 @@ +/** + * Created by 芋道源码 + * + * 枚举类 + */ + +// 全局通用状态枚举 +export const CommonStatusEnum = { + ENABLE: 0, // 开启 + DISABLE: 1 // 禁用 +} + +/** + * 菜单的类型枚举 + */ +export const SystemMenuTypeEnum = { + DIR: 1, // 目录 + MENU: 2, // 菜单 + BUTTON: 3 // 按钮 +} + +/** + * 角色的类型枚举 + */ +export const SystemRoleTypeEnum = { + SYSTEM: 1, // 内置角色 + CUSTOM: 2 // 自定义角色 +} + +/** + * 数据权限的范围枚举 + */ +export const SystemDataScopeEnum = { + ALL: 1, // 全部数据权限 + DEPT_CUSTOM: 2, // 指定部门数据权限 + DEPT_ONLY: 3, // 部门数据权限 + DEPT_AND_CHILD: 4, // 部门及以下数据权限 + DEPT_SELF: 5 // 仅本人数据权限 +} + +/** + * 代码生成模板类型 + */ +export const InfraCodegenTemplateTypeEnum = { + CRUD: 1, // 基础 CRUD + TREE: 2, // 树形 CRUD + SUB: 3 // 主子表 CRUD +} + +/** + * 任务状态的枚举 + */ +export const InfraJobStatusEnum = { + INIT: 0, // 初始化中 + NORMAL: 1, // 运行中 + STOP: 2 // 暂停运行 +} + +/** + * API 异常数据的处理状态 + */ +export const InfraApiErrorLogProcessStatusEnum = { + INIT: 0, // 未处理 + DONE: 1, // 已处理 + IGNORE: 2 // 已忽略 +} + +/** + * 用户的社交平台的类型枚举 + */ +export const SystemUserSocialTypeEnum = { + DINGTALK: { + title: '钉钉', + type: 20, + source: 'dingtalk', + img: 'https://s1.ax1x.com/2022/05/22/OzMDRs.png' + }, + WECHAT_ENTERPRISE: { + title: '企业微信', + type: 30, + source: 'wechat_enterprise', + img: 'https://s1.ax1x.com/2022/05/22/OzMrzn.png' + } +} + +/** + * 支付渠道枚举 + */ +export const PayChannelEnum = { + WX_PUB: { + code: 'wx_pub', + name: '微信 JSAPI 支付' + }, + WX_LITE: { + code: 'wx_lite', + name: '微信小程序支付' + }, + WX_APP: { + code: 'wx_app', + name: '微信 APP 支付' + }, + ALIPAY_PC: { + code: 'alipay_pc', + name: '支付宝 PC 网站支付' + }, + ALIPAY_WAP: { + code: 'alipay_wap', + name: '支付宝 WAP 网站支付' + }, + ALIPAY_APP: { + code: 'alipay_app', + name: '支付宝 APP 支付' + }, + ALIPAY_QR: { + code: 'alipay_qr', + name: '支付宝扫码支付' + }, + ALIPAY_BAR: { + code: 'alipay_bar', + name: '支付宝条码支付' + }, + MOCK: { + code: 'mock', + name: '模拟支付' + } +} + +/** + * 支付订单状态枚举 + */ +export const PayOrderStatusEnum = { + WAITING: { + status: 0, + name: '未支付' + }, + SUCCESS: { + status: 10, + name: '已支付' + }, + CLOSED: { + status: 20, + name: '未支付' + } +} + +/** + * 支付订单回调状态枚举 + */ +export const PayOrderNotifyStatusEnum = { + NO: { + status: 0, + name: '未通知' + }, + SUCCESS: { + status: 10, + name: '通知成功' + }, + FAILURE: { + status: 20, + name: '通知失败' + } +} + +/** + * 支付订单退款状态枚举 + */ +export const PayOrderRefundStatusEnum = { + NO: { + status: 0, + name: '未退款' + }, + SOME: { + status: 10, + name: '部分退款' + }, + ALL: { + status: 20, + name: '全部退款' + } +} + +/** + * 支付退款订单状态枚举 + */ +export const PayRefundStatusEnum = { + CREATE: { + status: 0, + name: '退款订单生成' + }, + SUCCESS: { + status: 1, + name: '退款成功' + }, + FAILURE: { + status: 2, + name: '退款失败' + }, + PROCESSING_NOTIFY: { + status: 3, + name: '退款中,渠道通知结果' + }, + PROCESSING_QUERY: { + status: 4, + name: '退款中,系统查询结果' + }, + UNKNOWN_RETRY: { + status: 5, + name: '状态未知,请重试' + }, + UNKNOWN_QUERY: { + status: 6, + name: '状态未知,系统查询结果' + }, + CLOSE: { + status: 99, + name: '退款关闭' + } +} + +/** + * 商品 SPU 状态 + */ +export const ProductSpuStatusEnum = { + RECYCLE: { + status: -1, + name: '回收站' + }, + DISABLE: { + status: 0, + name: '下架' + }, + ENABLE: { + status: 1, + name: '上架' + } +} + +/** + * 优惠劵模板的有限期类型的枚举 + */ +export const CouponTemplateValidityTypeEnum = { + DATE: { + type: 1, + name: '固定日期可用' + }, + TERM: { + type: 2, + name: '领取之后可用' + } +} + +/** + * 营销的商品范围枚举 + */ +export const PromotionProductScopeEnum = { + ALL: { + scope: 1, + name: '全部商品参与' + }, + SPU: { + scope: 2, + name: '指定商品参与' + } +} + +/** + * 营销的条件类型枚举 + */ +export const PromotionConditionTypeEnum = { + PRICE: { + type: 10, + name: '满 N 元' + }, + COUNT: { + type: 20, + name: '满 N 件' + } +} + +/** + * 优惠类型枚举 + */ +export const PromotionDiscountTypeEnum = { + PRICE: { + type: 1, + name: '满减' + }, + PERCENT: { + type: 2, + name: '折扣' + } +} diff --git a/grailed-ui-admin-vue3/src/utils/dict.ts b/grailed-ui-admin-vue3/src/utils/dict.ts new file mode 100644 index 0000000..705efe2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/dict.ts @@ -0,0 +1,198 @@ +/** + * 数据字典工具类 + */ +import { useDictStoreWithOut } from '@/store/modules/dict' +import { ElementPlusInfoType } from '@/types/elementPlus' + +const dictStore = useDictStoreWithOut() + +/** + * 获取 dictType 对应的数据字典数组 + * + * @param dictType 数据类型 + * @returns {*|Array} 数据字典数组 + */ +export interface DictDataType { + dictType: string + label: string + value: string | number | boolean + colorType: ElementPlusInfoType | '' + cssClass: string +} + +export const getDictOptions = (dictType: string) => { + return dictStore.getDictByType(dictType) || [] +} + +export const getIntDictOptions = (dictType: string) => { + const dictOption: DictDataType[] = [] + const dictOptions: DictDataType[] = getDictOptions(dictType) + dictOptions.forEach((dict: DictDataType) => { + dictOption.push({ + ...dict, + value: parseInt(dict.value + '') + }) + }) + return dictOption +} + +export const getStrDictOptions = (dictType: string) => { + const dictOption: DictDataType[] = [] + const dictOptions: DictDataType[] = getDictOptions(dictType) + dictOptions.forEach((dict: DictDataType) => { + dictOption.push({ + ...dict, + value: dict.value + '' + }) + }) + return dictOption +} + +export const getBoolDictOptions = (dictType: string) => { + const dictOption: DictDataType[] = [] + const dictOptions: DictDataType[] = getDictOptions(dictType) + dictOptions.forEach((dict: DictDataType) => { + dictOption.push({ + ...dict, + value: dict.value + '' === 'true' + }) + }) + return dictOption +} + +export const getDictObj = (dictType: string, value: any) => { + const dictOptions: DictDataType[] = getDictOptions(dictType) + dictOptions.forEach((dict: DictDataType) => { + if (dict.value === value.toString()) { + return dict + } + }) +} + +/** + * 获得字典数据的文本展示 + * + * @param dictType 字典类型 + * @param value 字典数据的值 + */ +export const getDictLabel = (dictType: string, value: any) => { + const dictOptions: DictDataType[] = getDictOptions(dictType) + const dictLabel = ref('') + dictOptions.forEach((dict: DictDataType) => { + if (dict.value === value) { + dictLabel.value = dict.label + } + }) + return dictLabel.value +} + +export enum DICT_TYPE { + USER_TYPE = 'user_type', + INFRA_YES_NO = 'infra_yes_no', + COMMON_STATUS = 'common_status', + SYSTEM_TENANT_PACKAGE_ID = 'system_tenant_package_id', + + // ========== SYSTEM 模块 ========== + SYSTEM_USER_SEX = 'system_user_sex', + SYSTEM_MENU_TYPE = 'system_menu_type', + SYSTEM_ROLE_TYPE = 'system_role_type', + SYSTEM_DATA_SCOPE = 'system_data_scope', + SYSTEM_NOTICE_TYPE = 'system_notice_type', + SYSTEM_OPERATE_TYPE = 'system_operate_type', + SYSTEM_LOGIN_TYPE = 'system_login_type', + SYSTEM_LOGIN_RESULT = 'system_login_result', + SYSTEM_SMS_CHANNEL_CODE = 'system_sms_channel_code', + SYSTEM_SMS_TEMPLATE_TYPE = 'system_sms_template_type', + SYSTEM_SMS_SEND_STATUS = 'system_sms_send_status', + SYSTEM_SMS_RECEIVE_STATUS = 'system_sms_receive_status', + SYSTEM_ERROR_CODE_TYPE = 'system_error_code_type', + SYSTEM_OAUTH2_GRANT_TYPE = 'system_oauth2_grant_type', + SYSTEM_MAIL_SEND_STATUS = 'system_mail_send_status', + SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type', + + // ========== INFRA 模块 ========== + INFRA_BOOLEAN_STRING = 'infra_boolean_string', + INFRA_JOB_STATUS = 'infra_job_status', + INFRA_JOB_LOG_STATUS = 'infra_job_log_status', + INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status', + INFRA_CONFIG_TYPE = 'infra_config_type', + INFRA_CODEGEN_TEMPLATE_TYPE = 'infra_codegen_template_type', + INFRA_CODEGEN_FRONT_TYPE = 'infra_codegen_front_type', + INFRA_CODEGEN_SCENE = 'infra_codegen_scene', + INFRA_FILE_STORAGE = 'infra_file_storage', + + // ========== BPM 模块 ========== + BPM_MODEL_CATEGORY = 'bpm_model_category', + BPM_MODEL_FORM_TYPE = 'bpm_model_form_type', + BPM_TASK_ASSIGN_RULE_TYPE = 'bpm_task_assign_rule_type', + BPM_PROCESS_INSTANCE_STATUS = 'bpm_process_instance_status', + BPM_PROCESS_INSTANCE_RESULT = 'bpm_process_instance_result', + BPM_TASK_ASSIGN_SCRIPT = 'bpm_task_assign_script', + BPM_OA_LEAVE_TYPE = 'bpm_oa_leave_type', + + // ========== PAY 模块 ========== + PAY_CHANNEL_WECHAT_VERSION = 'pay_channel_wechat_version', // 微信渠道版本 + PAY_CHANNEL_ALIPAY_SIGN_TYPE = 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型 + PAY_CHANNEL_ALIPAY_MODE = 'pay_channel_alipay_mode', // 支付宝公钥类型 + PAY_CHANNEL_ALIPAY_SERVER_TYPE = 'pay_channel_alipay_server_type', // 支付宝网关地址 + PAY_CHANNEL_CODE_TYPE = 'pay_channel_code_type', // 支付渠道编码类型 + PAY_ORDER_NOTIFY_STATUS = 'pay_order_notify_status', // 商户支付订单回调状态 + PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态 + PAY_ORDER_REFUND_STATUS = 'pay_order_refund_status', // 商户支付订单退款状态 + PAY_REFUND_ORDER_STATUS = 'pay_refund_order_status', // 退款订单状态 + PAY_REFUND_ORDER_TYPE = 'pay_refund_order_type', // 退款订单类别 + + // ========== MP 模块 ========== + MP_AUTO_REPLY_REQUEST_MATCH = 'mp_auto_reply_request_match', // 自动回复请求匹配类型 + MP_MESSAGE_TYPE = 'mp_message_type', // 消息类型 + + // ========== MALL - 会员模块 ========== + MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型 + MEMBER_POINT_STATUS = 'member_point_status', // 积分的状态 + MEMBER_CURRENCY_TYPE = 'member_currency_type', // 积分的状态 + + // ========== MALL - 商品模块 ========== + PRODUCT_UNIT = 'product_unit', // 商品单位 + PRODUCT_SPU_STATUS = 'product_spu_status', //商品状态 + + // ========== MALL - 交易模块 ========== + EXPRESS_CHARGE_MODE = 'trade_delivery_express_charge_mode', //快递的计费方式 + TRADE_AFTER_SALE_STATUS = 'trade_after_sale_status', // 售后 - 状态 + TRADE_AFTER_SALE_WAY = 'trade_after_sale_way', // 售后 - 方式 + TRADE_AFTER_SALE_TYPE = 'trade_after_sale_type', // 售后 - 类型 + TRADE_ORDER_TYPE = 'trade_order_type', // 订单 - 类型 + TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态 + TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态 + TERMINAL = 'terminal', // 终端 + + // ========== MALL - 营销模块 ========== + PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型 + PROMOTION_PRODUCT_SCOPE = 'promotion_product_scope', // 营销的商品范围 + PROMOTION_COUPON_TEMPLATE_VALIDITY_TYPE = 'promotion_coupon_template_validity_type', // 优惠劵模板的有限期类型 + PROMOTION_COUPON_STATUS = 'promotion_coupon_status', // 优惠劵的状态 + PROMOTION_COUPON_TAKE_TYPE = 'promotion_coupon_take_type', // 优惠劵的领取方式 + PROMOTION_ACTIVITY_STATUS = 'promotion_activity_status', // 优惠活动的状态 + PROMOTION_CONDITION_TYPE = 'promotion_condition_type', // 营销的条件类型枚举 + + // ========== MEMBER - 会员 ========== + MEMBER_TASK_STATUS = 'member_task_status', // 会员状态 + BALANCE_RECORD_TYPE = 'balance_record_type', // 余额类型 + TASK_EXECUTE_STATUS = 'task_execute_status', // 会员任务执行状态 + COMBO_RECORD_STATUS = 'combo_record_status', // 连单记录领取状态 + BALANCE_RECORD_AMOUNT_TYPE = 'balance_record_amount_type', // 金额记录变更类型 + + // ========== WITHDRAWAL - 提现 ========== + MEMBER_WITHDRAWAL_STATUS = 'member_withdrawal_status', + MEMBER_WITHDRAWAL_TYPE = 'member_withdrawal_type', + MEMBER_USER_CRYPTO_CURRENCY_TYPE = 'member_user_crypto_currency_type', + + // ========== CHANNEL - 渠道 ========== + CHANNEL_TYPE = 'channel_type', + CHANNEL_SCENARIO = 'channel_scenario', + + // ========== MESSAGE - 消息 ========== + MESSAGE_TYPE = 'message_type', + + // ========== MESSAGE - 内容 ========== + CONTENT_TYPE = 'content_type', +} diff --git a/grailed-ui-admin-vue3/src/utils/domUtils.ts b/grailed-ui-admin-vue3/src/utils/domUtils.ts new file mode 100644 index 0000000..dbc1989 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/domUtils.ts @@ -0,0 +1,289 @@ +import { isServer } from './is' +const ieVersion = isServer ? 0 : Number((document as any).documentMode) +const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g +const MOZ_HACK_REGEXP = /^moz([A-Z])/ + +export interface ViewportOffsetResult { + left: number + top: number + right: number + bottom: number + rightIncludeBody: number + bottomIncludeBody: number +} + +/* istanbul ignore next */ +const trim = function (string: string) { + return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '') +} + +/* istanbul ignore next */ +const camelCase = function (name: string) { + return name + .replace(SPECIAL_CHARS_REGEXP, function (_, __, letter, offset) { + return offset ? letter.toUpperCase() : letter + }) + .replace(MOZ_HACK_REGEXP, 'Moz$1') +} + +/* istanbul ignore next */ +export function hasClass(el: Element, cls: string) { + if (!el || !cls) return false + if (cls.indexOf(' ') !== -1) { + throw new Error('className should not contain space.') + } + if (el.classList) { + return el.classList.contains(cls) + } else { + return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1 + } +} + +/* istanbul ignore next */ +export function addClass(el: Element, cls: string) { + if (!el) return + let curClass = el.className + const classes = (cls || '').split(' ') + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i] + if (!clsName) continue + + if (el.classList) { + el.classList.add(clsName) + } else if (!hasClass(el, clsName)) { + curClass += ' ' + clsName + } + } + if (!el.classList) { + el.className = curClass + } +} + +/* istanbul ignore next */ +export function removeClass(el: Element, cls: string) { + if (!el || !cls) return + const classes = cls.split(' ') + let curClass = ' ' + el.className + ' ' + + for (let i = 0, j = classes.length; i < j; i++) { + const clsName = classes[i] + if (!clsName) continue + + if (el.classList) { + el.classList.remove(clsName) + } else if (hasClass(el, clsName)) { + curClass = curClass.replace(' ' + clsName + ' ', ' ') + } + } + if (!el.classList) { + el.className = trim(curClass) + } +} + +export function getBoundingClientRect(element: Element): DOMRect | number { + if (!element || !element.getBoundingClientRect) { + return 0 + } + return element.getBoundingClientRect() +} + +/** + * 获取当前元素的left、top偏移 + * left:元素最左侧距离文档左侧的距离 + * top:元素最顶端距离文档顶端的距离 + * right:元素最右侧距离文档右侧的距离 + * bottom:元素最底端距离文档底端的距离 + * rightIncludeBody:元素最左侧距离文档右侧的距离 + * bottomIncludeBody:元素最底端距离文档最底部的距离 + * + * @description: + */ +export function getViewportOffset(element: Element): ViewportOffsetResult { + const doc = document.documentElement + + const docScrollLeft = doc.scrollLeft + const docScrollTop = doc.scrollTop + const docClientLeft = doc.clientLeft + const docClientTop = doc.clientTop + + const pageXOffset = window.pageXOffset + const pageYOffset = window.pageYOffset + + const box = getBoundingClientRect(element) + + const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect + + const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0) + const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0) + const offsetLeft = retLeft + pageXOffset + const offsetTop = rectTop + pageYOffset + + const left = offsetLeft - scrollLeft + const top = offsetTop - scrollTop + + const clientWidth = window.document.documentElement.clientWidth + const clientHeight = window.document.documentElement.clientHeight + return { + left: left, + top: top, + right: clientWidth - rectWidth - left, + bottom: clientHeight - rectHeight - top, + rightIncludeBody: clientWidth - left, + bottomIncludeBody: clientHeight - top + } +} + +/* istanbul ignore next */ +export const on = function ( + element: HTMLElement | Document | Window, + event: string, + handler: EventListenerOrEventListenerObject +): void { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } +} + +/* istanbul ignore next */ +export const off = function ( + element: HTMLElement | Document | Window, + event: string, + handler: any +): void { + if (element && event && handler) { + element.removeEventListener(event, handler, false) + } +} + +/* istanbul ignore next */ +export const once = function (el: HTMLElement, event: string, fn: EventListener): void { + const listener = function (this: any, ...args: unknown[]) { + if (fn) { + // @ts-ignore + fn.apply(this, args) + } + off(el, event, listener) + } + on(el, event, listener) +} + +/* istanbul ignore next */ +export const getStyle = + ieVersion < 9 + ? function (element: Element | any, styleName: string) { + if (isServer) return + if (!element || !styleName) return null + styleName = camelCase(styleName) + if (styleName === 'float') { + styleName = 'styleFloat' + } + try { + switch (styleName) { + case 'opacity': + try { + return element.filters.item('alpha').opacity / 100 + } catch (e) { + return 1.0 + } + default: + return element.style[styleName] || element.currentStyle + ? element.currentStyle[styleName] + : null + } + } catch (e) { + return element.style[styleName] + } + } + : function (element: Element | any, styleName: string) { + if (isServer) return + if (!element || !styleName) return null + styleName = camelCase(styleName) + if (styleName === 'float') { + styleName = 'cssFloat' + } + try { + const computed = (document as any).defaultView.getComputedStyle(element, '') + return element.style[styleName] || computed ? computed[styleName] : null + } catch (e) { + return element.style[styleName] + } + } + +/* istanbul ignore next */ +export function setStyle(element: Element | any, styleName: any, value: any) { + if (!element || !styleName) return + + if (typeof styleName === 'object') { + for (const prop in styleName) { + if (Object.prototype.hasOwnProperty.call(styleName, prop)) { + setStyle(element, prop, styleName[prop]) + } + } + } else { + styleName = camelCase(styleName) + if (styleName === 'opacity' && ieVersion < 9) { + element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')' + } else { + element.style[styleName] = value + } + } +} + +/* istanbul ignore next */ +export const isScroll = (el: Element, vertical: any) => { + if (isServer) return + + const determinedDirection = vertical !== null || vertical !== undefined + const overflow = determinedDirection + ? vertical + ? getStyle(el, 'overflow-y') + : getStyle(el, 'overflow-x') + : getStyle(el, 'overflow') + + return overflow.match(/(scroll|auto)/) +} + +/* istanbul ignore next */ +export const getScrollContainer = (el: Element, vertical?: any) => { + if (isServer) return + + let parent: any = el + while (parent) { + if ([window, document, document.documentElement].includes(parent)) { + return window + } + if (isScroll(parent, vertical)) { + return parent + } + parent = parent.parentNode + } + + return parent +} + +/* istanbul ignore next */ +export const isInContainer = (el: Element, container: any) => { + if (isServer || !el || !container) return false + + const elRect = el.getBoundingClientRect() + let containerRect + + if ([window, document, document.documentElement, null, undefined].includes(container)) { + containerRect = { + top: 0, + right: window.innerWidth, + bottom: window.innerHeight, + left: 0 + } + } else { + containerRect = container.getBoundingClientRect() + } + + return ( + elRect.top < containerRect.bottom && + elRect.bottom > containerRect.top && + elRect.right > containerRect.left && + elRect.left < containerRect.right + ) +} diff --git a/grailed-ui-admin-vue3/src/utils/download.ts b/grailed-ui-admin-vue3/src/utils/download.ts new file mode 100644 index 0000000..ab20014 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/download.ts @@ -0,0 +1,38 @@ +const download0 = (data: Blob, fileName: string, mineType: string) => { + // 创建 blob + const blob = new Blob([data], { type: mineType }) + // 创建 href 超链接,点击进行下载 + window.URL = window.URL || window.webkitURL + const href = URL.createObjectURL(blob) + const downA = document.createElement('a') + downA.href = href + downA.download = fileName + downA.click() + // 销毁超连接 + window.URL.revokeObjectURL(href) +} + +const download = { + // 下载 Excel 方法 + excel: (data: Blob, fileName: string) => { + download0(data, fileName, 'application/vnd.ms-excel') + }, + // 下载 Word 方法 + word: (data: Blob, fileName: string) => { + download0(data, fileName, 'application/msword') + }, + // 下载 Zip 方法 + zip: (data: Blob, fileName: string) => { + download0(data, fileName, 'application/zip') + }, + // 下载 Html 方法 + html: (data: Blob, fileName: string) => { + download0(data, fileName, 'text/html') + }, + // 下载 Markdown 方法 + markdown: (data: Blob, fileName: string) => { + download0(data, fileName, 'text/markdown') + } +} + +export default download diff --git a/grailed-ui-admin-vue3/src/utils/filt.ts b/grailed-ui-admin-vue3/src/utils/filt.ts new file mode 100644 index 0000000..b1a7b2c --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/filt.ts @@ -0,0 +1,157 @@ +export const openWindow = ( + url: string, + opt?: { + target?: '_self' | '_blank' | string + noopener?: boolean + noreferrer?: boolean + } +) => { + const { target = '__blank', noopener = true, noreferrer = true } = opt || {} + const feature: string[] = [] + + noopener && feature.push('noopener=yes') + noreferrer && feature.push('noreferrer=yes') + + window.open(url, target, feature.join(',')) +} + +/** + * @description: base64 to blob + */ +export const dataURLtoBlob = (base64Buf: string): Blob => { + const arr = base64Buf.split(',') + const typeItem = arr[0] + const mime = typeItem.match(/:(.*?);/)![1] + const bstr = window.atob(arr[1]) + let n = bstr.length + const u8arr = new Uint8Array(n) + while (n--) { + u8arr[n] = bstr.charCodeAt(n) + } + return new Blob([u8arr], { type: mime }) +} + +/** + * img url to base64 + * @param url + */ +export const urlToBase64 = (url: string, mineType?: string): Promise => { + return new Promise((resolve, reject) => { + let canvas = document.createElement('CANVAS') as Nullable + const ctx = canvas!.getContext('2d') + + const img = new Image() + img.crossOrigin = '' + img.onload = function () { + if (!canvas || !ctx) { + return reject() + } + canvas.height = img.height + canvas.width = img.width + ctx.drawImage(img, 0, 0) + const dataURL = canvas.toDataURL(mineType || 'image/png') + canvas = null + resolve(dataURL) + } + img.src = url + }) +} + +/** + * Download online pictures + * @param url + * @param filename + * @param mime + * @param bom + */ +export const downloadByOnlineUrl = ( + url: string, + filename: string, + mime?: string, + bom?: BlobPart +) => { + urlToBase64(url).then((base64) => { + downloadByBase64(base64, filename, mime, bom) + }) +} + +/** + * Download pictures based on base64 + * @param buf + * @param filename + * @param mime + * @param bom + */ +export const downloadByBase64 = (buf: string, filename: string, mime?: string, bom?: BlobPart) => { + const base64Buf = dataURLtoBlob(buf) + downloadByData(base64Buf, filename, mime, bom) +} + +/** + * Download according to the background interface file stream + * @param {*} data + * @param {*} filename + * @param {*} mime + * @param {*} bom + */ +export const downloadByData = (data: BlobPart, filename: string, mime?: string, bom?: BlobPart) => { + const blobData = typeof bom !== 'undefined' ? [bom, data] : [data] + const blob = new Blob(blobData, { type: mime || 'application/octet-stream' }) + + const blobURL = window.URL.createObjectURL(blob) + const tempLink = document.createElement('a') + tempLink.style.display = 'none' + tempLink.href = blobURL + tempLink.setAttribute('download', filename) + if (typeof tempLink.download === 'undefined') { + tempLink.setAttribute('target', '_blank') + } + document.body.appendChild(tempLink) + tempLink.click() + document.body.removeChild(tempLink) + window.URL.revokeObjectURL(blobURL) +} + +/** + * Download file according to file address + * @param {*} sUrl + */ +export const downloadByUrl = ({ + url, + target = '_blank', + fileName +}: { + url: string + target?: '_self' | '_blank' + fileName?: string +}): boolean => { + const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1 + const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1 + + if (/(iP)/g.test(window.navigator.userAgent)) { + console.error('Your browser does not support download!') + return false + } + if (isChrome || isSafari) { + const link = document.createElement('a') + link.href = url + link.target = target + + if (link.download !== undefined) { + link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length) + } + + if (document.createEvent) { + const e = document.createEvent('MouseEvents') + e.initEvent('click', true, true) + link.dispatchEvent(e) + return true + } + } + if (url.indexOf('?') === -1) { + url += '?download' + } + + openWindow(url, { target }) + return true +} diff --git a/grailed-ui-admin-vue3/src/utils/formCreate.ts b/grailed-ui-admin-vue3/src/utils/formCreate.ts new file mode 100644 index 0000000..6d7dbc7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/formCreate.ts @@ -0,0 +1,54 @@ +/** + * 针对 https://github.com/xaboy/form-create-designer 封装的工具类 + */ + +// 编码表单 Conf +export const encodeConf = (designerRef: object) => { + // @ts-ignore + return JSON.stringify(designerRef.value.getOption()) +} + +// 编码表单 Fields +export const encodeFields = (designerRef: object) => { + // @ts-ignore + const rule = designerRef.value.getRule() + const fields: string[] = [] + rule.forEach((item) => { + fields.push(JSON.stringify(item)) + }) + return fields +} + +// 解码表单 Fields +export const decodeFields = (fields: string[]) => { + const rule: object[] = [] + fields.forEach((item) => { + rule.push(JSON.parse(item)) + }) + return rule +} + +// 设置表单的 Conf 和 Fields +export const setConfAndFields = (designerRef: object, conf: string, fields: string) => { + // @ts-ignore + designerRef.value.setOption(JSON.parse(conf)) + // @ts-ignore + designerRef.value.setRule(decodeFields(fields)) +} + +// 设置表单的 Conf 和 Fields +export const setConfAndFields2 = ( + detailPreview: object, + conf: string, + fields: string, + value?: object +) => { + // @ts-ignore + detailPreview.value.option = JSON.parse(conf) + // @ts-ignore + detailPreview.value.rule = decodeFields(fields) + if (value) { + // @ts-ignore + detailPreview.value.value = value + } +} diff --git a/grailed-ui-admin-vue3/src/utils/formRules.ts b/grailed-ui-admin-vue3/src/utils/formRules.ts new file mode 100644 index 0000000..2989867 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/formRules.ts @@ -0,0 +1,7 @@ +const { t } = useI18n() + +// 必填项 +export const required = { + required: true, + message: t('common.required') +} diff --git a/grailed-ui-admin-vue3/src/utils/formatTime.ts b/grailed-ui-admin-vue3/src/utils/formatTime.ts new file mode 100644 index 0000000..5e5c854 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/formatTime.ts @@ -0,0 +1,223 @@ +import dayjs from 'dayjs' + +/** + * 时间日期转换 + * @param date 当前时间,new Date() 格式 + * @param format 需要转换的时间格式字符串 + * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd` + * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ" + * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW" + * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ" + * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ" + * @returns 返回拼接后的时间字符串 + */ +export function formatDate(date: Date, format?: string): string { + // 日期不存在,则返回空 + if (!date) { + return '' + } + // 日期存在,则进行格式化 + if (format === undefined) { + format = 'YYYY-MM-DD HH:mm:ss' + } + return dayjs(date).format(format) +} + +/** + * 获取当前的日期+时间 + */ +export function getNowDateTime() { + return dayjs() +} + +/** + * 获取当前日期是第几周 + * @param dateTime 当前传入的日期值 + * @returns 返回第几周数字值 + */ +export function getWeek(dateTime: Date): number { + const temptTime = new Date(dateTime.getTime()) + // 周几 + const weekday = temptTime.getDay() || 7 + // 周1+5天=周六 + temptTime.setDate(temptTime.getDate() - weekday + 1 + 5) + let firstDay = new Date(temptTime.getFullYear(), 0, 1) + const dayOfWeek = firstDay.getDay() + let spendDay = 1 + if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1 + firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay) + const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000) + return Math.ceil(d / 7) +} + +/** + * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前` + * @param param 当前时间,new Date() 格式或者字符串时间格式 + * @param format 需要转换的时间格式字符串 + * @description param 10秒: 10 * 1000 + * @description param 1分: 60 * 1000 + * @description param 1小时: 60 * 60 * 1000 + * @description param 24小时:60 * 60 * 24 * 1000 + * @description param 3天: 60 * 60* 24 * 1000 * 3 + * @returns 返回拼接后的时间字符串 + */ +export function formatPast(param: string | Date, format = 'YYYY-mm-dd HH:MM:SS'): string { + // 传入格式处理、存储转换值 + let t: any, s: number + // 获取js 时间戳 + let time: number = new Date().getTime() + // 是否是对象 + typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param) + // 当前时间戳 - 传入时间戳 + time = Number.parseInt(`${time - t}`) + if (time < 10000) { + // 10秒内 + return '刚刚' + } else if (time < 60000 && time >= 10000) { + // 超过10秒少于1分钟内 + s = Math.floor(time / 1000) + return `${s}秒前` + } else if (time < 3600000 && time >= 60000) { + // 超过1分钟少于1小时 + s = Math.floor(time / 60000) + return `${s}分钟前` + } else if (time < 86400000 && time >= 3600000) { + // 超过1小时少于24小时 + s = Math.floor(time / 3600000) + return `${s}小时前` + } else if (time < 259200000 && time >= 86400000) { + // 超过1天少于3天内 + s = Math.floor(time / 86400000) + return `${s}天前` + } else { + // 超过3天 + const date = typeof param === 'string' || 'object' ? new Date(param) : param + return formatDate(date, format) + } +} + +/** + * 时间问候语 + * @param param 当前时间,new Date() 格式 + * @description param 调用 `formatAxis(new Date())` 输出 `上午好` + * @returns 返回拼接后的时间字符串 + */ +export function formatAxis(param: Date): string { + const hour: number = new Date(param).getHours() + if (hour < 6) return '凌晨好' + else if (hour < 9) return '早上好' + else if (hour < 12) return '上午好' + else if (hour < 14) return '中午好' + else if (hour < 17) return '下午好' + else if (hour < 19) return '傍晚好' + else if (hour < 22) return '晚上好' + else return '夜里好' +} + +/** + * 将毫秒,转换成时间字符串。例如说,xx 分钟 + * + * @param ms 毫秒 + * @returns {string} 字符串 + */ +export function formatPast2(ms) { + const day = Math.floor(ms / (24 * 60 * 60 * 1000)) + const hour = Math.floor(ms / (60 * 60 * 1000) - day * 24) + const minute = Math.floor(ms / (60 * 1000) - day * 24 * 60 - hour * 60) + const second = Math.floor(ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60) + if (day > 0) { + return day + '天' + hour + '小时' + minute + '分钟' + } + if (hour > 0) { + return hour + '小时' + minute + '分钟' + } + if (minute > 0) { + return minute + '分钟' + } + if (second > 0) { + return second + '秒' + } else { + return 0 + '秒' + } +} + +/** + * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD HH:mm:ss 格式 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +// @ts-ignore +export const dateFormatter = (row, column, cellValue) => { + if (!cellValue) { + return + } + return formatDate(cellValue) +} + +/** + * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD 格式 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +// @ts-ignore +export const dateFormatter2 = (row, column, cellValue) => { + if (!cellValue) { + return + } + return formatDate(cellValue, 'YYYY-MM-DD') +} + +/** + * 设置起始日期,时间为00:00:00 + * @param param 传入日期 + * @returns 带时间00:00:00的日期 + */ +export function beginOfDay(param: Date) { + return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 0, 0, 0) +} + +/** + * 设置结束日期,时间为23:59:59 + * @param param 传入日期 + * @returns 带时间23:59:59的日期 + */ +export function endOfDay(param: Date) { + return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 23, 59, 59) +} + +/** + * 计算两个日期间隔天数 + * @param param1 日期1 + * @param param2 日期2 + */ +export function betweenDay(param1: Date, param2: Date) { + param1 = convertDate(param1) + param2 = convertDate(param2) + // 计算差值 + return Math.floor((param2.getTime() - param1.getTime()) / (24 * 3600 * 1000)) +} + +/** + * 日期计算 + * @param param1 日期 + * @param param2 添加的时间 + */ +export function addTime(param1: Date, param2: number) { + param1 = convertDate(param1) + return new Date(param1.getTime() + param2) +} + +/** + * 日期转换 + * @param param 日期 + */ +export function convertDate(param: Date | string) { + if (typeof param === 'string') { + return new Date(param) + } + return param +} diff --git a/grailed-ui-admin-vue3/src/utils/index.ts b/grailed-ui-admin-vue3/src/utils/index.ts new file mode 100644 index 0000000..3d596a3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/index.ts @@ -0,0 +1,211 @@ +/** + * + * @param component 需要注册的组件 + * @param alias 组件别名 + * @returns any + */ +export const withInstall = (component: T, alias?: string) => { + const comp = component as any + comp.install = (app: any) => { + app.component(comp.name || comp.displayName, component) + if (alias) { + app.config.globalProperties[alias] = component + } + } + return component as T & Plugin +} + +/** + * @param str 需要转下划线的驼峰字符串 + * @returns 字符串下划线 + */ +export const humpToUnderline = (str: string): string => { + return str.replace(/([A-Z])/g, '-$1').toLowerCase() +} + +/** + * @param str 需要转驼峰的下划线字符串 + * @returns 字符串驼峰 + */ +export const underlineToHump = (str: string): string => { + if (!str) return '' + return str.replace(/\-(\w)/g, (_, letter: string) => { + return letter.toUpperCase() + }) +} + +export const setCssVar = (prop: string, val: any, dom = document.documentElement) => { + dom.style.setProperty(prop, val) +} + +/** + * 查找数组对象的某个下标 + * @param {Array} ary 查找的数组 + * @param {Functon} fn 判断的方法 + */ +// eslint-disable-next-line +export const findIndex = (ary: Array, fn: Fn): number => { + if (ary.findIndex) { + return ary.findIndex(fn) + } + let index = -1 + ary.some((item: T, i: number, ary: Array) => { + const ret: T = fn(item, i, ary) + if (ret) { + index = i + return ret + } + }) + return index +} + +export const trim = (str: string) => { + return str.replace(/(^\s*)|(\s*$)/g, '') +} + +/** + * @param {Date | number | string} time 需要转换的时间 + * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss + */ +export const formatTime = (time: Date | number | string, fmt: string) => { + if (!time) return '' + else { + const date = new Date(time) + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'H+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds(), + 'q+': Math.floor((date.getMonth() + 3) / 3), + S: date.getMilliseconds() + } + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + for (const k in o) { + if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) + ) + } + } + return fmt + } +} + +/** + * 生成随机字符串 + */ +export const toAnyString = () => { + const str: string = 'xxxxx-xxxxx-4xxxx-yxxxx-xxxxx'.replace(/[xy]/g, (c: string) => { + const r: number = (Math.random() * 16) | 0 + const v: number = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString() + }) + return str +} + +export const generateUUID = () => { + if (typeof crypto === 'object') { + if (typeof crypto.randomUUID === 'function') { + return crypto.randomUUID() + } + if (typeof crypto.getRandomValues === 'function' && typeof Uint8Array === 'function') { + const callback = (c: any) => { + const num = Number(c) + return (num ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (num / 4)))).toString( + 16 + ) + } + return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, callback) + } + } + let timestamp = new Date().getTime() + let performanceNow = + (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0 + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + let random = Math.random() * 16 + if (timestamp > 0) { + random = (timestamp + random) % 16 | 0 + timestamp = Math.floor(timestamp / 16) + } else { + random = (performanceNow + random) % 16 | 0 + performanceNow = Math.floor(performanceNow / 16) + } + return (c === 'x' ? random : (random & 0x3) | 0x8).toString(16) + }) +} + +/** + * element plus 的文件大小 Formatter 实现 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +// @ts-ignore +export const fileSizeFormatter = (row, column, cellValue) => { + const fileSize = cellValue + const unitArr = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + const srcSize = parseFloat(fileSize) + const index = Math.floor(Math.log(srcSize) / Math.log(1024)) + const size = srcSize / Math.pow(1024, index) + const sizeStr = size.toFixed(2) //保留的小数位数 + return sizeStr + ' ' + unitArr[index] +} + +/** + * 将值复制到目标对象,且以目标对象属性为准,例:target: {a:1} source:{a:2,b:3} 结果为:{a:2} + * @param target 目标对象 + * @param source 源对象 + */ +export const copyValueToTarget = (target, source) => { + const newObj = Object.assign({}, target, source) + // 删除多余属性 + Object.keys(newObj).forEach((key) => { + // 如果不是target中的属性则删除 + if (Object.keys(target).indexOf(key) === -1) { + delete newObj[key] + } + }) + // 更新目标对象值 + Object.assign(target, newObj) +} + +// TODO @puhui999:返回要带上 .00 哈.例如说 1.00 +/** + * 将一个整数转换为分数保留两位小数 + * @param num + */ +export const formatToFraction = (num: number | string | undefined): number => { + if (typeof num === 'undefined') return 0 + const parsedNumber = typeof num === 'string' ? parseFloat(num) : num + return parseFloat((parsedNumber / 100).toFixed(2)) +} + +/** + * 将一个分数转换为整数 + * @param num + */ +export const convertToInteger = (num: number | string | undefined): number => { + if (typeof num === 'undefined') return 0 + const parsedNumber = typeof num === 'string' ? parseFloat(num) : num + // TODO 分转元后还有小数则四舍五入 + return Math.round(parsedNumber * 100) +} + +/** + * 元转分 + */ +export const yuanToFen = (amount: string | number): number => { + return Math.round(Number(amount) * 100) +} + +/** + * 分转元 + */ +export const fenToYuan = (amount: string | number): number => { + return Number((Number(amount) / 100).toFixed(2)) +} diff --git a/grailed-ui-admin-vue3/src/utils/is.ts b/grailed-ui-admin-vue3/src/utils/is.ts new file mode 100644 index 0000000..3752985 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/is.ts @@ -0,0 +1,105 @@ +// copy to vben-admin + +const toString = Object.prototype.toString + +export const is = (val: unknown, type: string) => { + return toString.call(val) === `[object ${type}]` +} + +export const isDef = (val?: T): val is T => { + return typeof val !== 'undefined' +} + +export const isUnDef = (val?: T): val is T => { + return !isDef(val) +} + +export const isObject = (val: any): val is Record => { + return val !== null && is(val, 'Object') +} + +export const isEmpty = (val: T): val is T => { + if (isArray(val) || isString(val)) { + return val.length === 0 + } + + if (val instanceof Map || val instanceof Set) { + return val.size === 0 + } + + if (isObject(val)) { + return Object.keys(val).length === 0 + } + + return false +} + +export const isDate = (val: unknown): val is Date => { + return is(val, 'Date') +} + +export const isNull = (val: unknown): val is null => { + return val === null +} + +export const isNullAndUnDef = (val: unknown): val is null | undefined => { + return isUnDef(val) && isNull(val) +} + +export const isNullOrUnDef = (val: unknown): val is null | undefined => { + return isUnDef(val) || isNull(val) +} + +export const isNumber = (val: unknown): val is number => { + return is(val, 'Number') +} + +export const isPromise = (val: unknown): val is Promise => { + return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch) +} + +export const isString = (val: unknown): val is string => { + return is(val, 'String') +} + +export const isFunction = (val: unknown): val is Function => { + return typeof val === 'function' +} + +export const isBoolean = (val: unknown): val is boolean => { + return is(val, 'Boolean') +} + +export const isRegExp = (val: unknown): val is RegExp => { + return is(val, 'RegExp') +} + +export const isArray = (val: any): val is Array => { + return val && Array.isArray(val) +} + +export const isWindow = (val: any): val is Window => { + return typeof window !== 'undefined' && is(val, 'Window') +} + +export const isElement = (val: unknown): val is Element => { + return isObject(val) && !!val.tagName +} + +export const isMap = (val: unknown): val is Map => { + return is(val, 'Map') +} + +export const isServer = typeof window === 'undefined' + +export const isClient = !isServer + +export const isUrl = (path: string): boolean => { + const reg = + /(((^https?:(?:\/\/)?)(?:[-:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&%@.\w_]*)#?(?:[\w]*))?)$/ + return reg.test(path) +} + +export const isDark = (): boolean => { + return window.matchMedia('(prefers-color-scheme: dark)').matches +} diff --git a/grailed-ui-admin-vue3/src/utils/jsencrypt.ts b/grailed-ui-admin-vue3/src/utils/jsencrypt.ts new file mode 100644 index 0000000..374d5f6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/jsencrypt.ts @@ -0,0 +1,31 @@ +import { JSEncrypt } from 'jsencrypt' + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = + 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = + 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export const encrypt = (txt: string) => { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export const decrypt = (txt: string) => { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} diff --git a/grailed-ui-admin-vue3/src/utils/permission.ts b/grailed-ui-admin-vue3/src/utils/permission.ts new file mode 100644 index 0000000..a63ee62 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/permission.ts @@ -0,0 +1,45 @@ +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' + +const { t } = useI18n() // 国际化 + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value: string[]) { + if (value && value instanceof Array && value.length > 0) { + const { wsCache } = useCache() + const permissionDatas = value + const all_permission = '*:*:*' + const permissions = wsCache.get(CACHE_KEY.USER).permissions + const hasPermission = permissions.some((permission) => { + return all_permission === permission || permissionDatas.includes(permission) + }) + return !!hasPermission + } else { + console.error(t('permission.hasPermission')) + return false + } +} + +/** + * 角色权限校验 + * @param {string[]} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value: string[]) { + if (value && value instanceof Array && value.length > 0) { + const { wsCache } = useCache() + const permissionRoles = value + const super_admin = 'admin' + const roles = wsCache.get(CACHE_KEY.USER).roles + const hasRole = roles.some((role) => { + return super_admin === role || permissionRoles.includes(role) + }) + return !!hasRole + } else { + console.error(t('permission.hasRole')) + return false + } +} diff --git a/grailed-ui-admin-vue3/src/utils/propTypes.ts b/grailed-ui-admin-vue3/src/utils/propTypes.ts new file mode 100644 index 0000000..fb8f84e --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/propTypes.ts @@ -0,0 +1,28 @@ +import { createTypes, VueTypesInterface, VueTypeValidableDef } from 'vue-types' +import { CSSProperties } from 'vue' + +// 自定义扩展vue-types +type PropTypes = VueTypesInterface & { + readonly style: VueTypeValidableDef +} + +const propTypes = createTypes({ + func: undefined, + bool: undefined, + string: undefined, + number: undefined, + object: undefined, + integer: undefined +}) as PropTypes + +// 需要自定义扩展的类型 +// see: https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#the-extend-method +// propTypes.extend([ +// { +// name: 'style', +// getter: true, +// type: [String, Object], +// default: undefined +// } +// ]) +export { propTypes } diff --git a/grailed-ui-admin-vue3/src/utils/routerHelper.ts b/grailed-ui-admin-vue3/src/utils/routerHelper.ts new file mode 100644 index 0000000..a682565 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/routerHelper.ts @@ -0,0 +1,238 @@ +import type { RouteLocationNormalized, Router, RouteRecordNormalized } from 'vue-router' +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' +import { isUrl } from '@/utils/is' +import { cloneDeep, omit } from 'lodash-es' + +const modules = import.meta.glob('../views/**/*.{vue,tsx}') +/** + * 注册一个异步组件 + * @param componentPath 例:/bpm/oa/leave/detail + */ +export const registerComponent = (componentPath: string) => { + for (const item in modules) { + if (item.includes(componentPath)) { + // 使用异步组件的方式来动态加载组件 + // @ts-ignore + return defineAsyncComponent(modules[item]) + } + } +} +/* Layout */ +export const Layout = () => import('@/layout/Layout.vue') + +export const getParentLayout = () => { + return () => + new Promise((resolve) => { + resolve({ + name: 'ParentLayout' + }) + }) +} + +// 按照路由中meta下的rank等级升序来排序路由 +export const ascending = (arr: any[]) => { + arr.forEach((v) => { + if (v?.meta?.rank === null) v.meta.rank = undefined + if (v?.meta?.rank === 0) { + if (v.name !== 'home' && v.path !== '/') { + console.warn('rank only the home page can be 0') + } + } + }) + return arr.sort((a: { meta: { rank: number } }, b: { meta: { rank: number } }) => { + return a?.meta?.rank - b?.meta?.rank + }) +} + +export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormalized => { + if (!route) return route + const { matched, ...opt } = route + return { + ...opt, + matched: (matched + ? matched.map((item) => ({ + meta: item.meta, + name: item.name, + path: item.path + })) + : undefined) as RouteRecordNormalized[] + } +} + +// 后端控制路由生成 +export const generateRoute = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => { + const res: AppRouteRecordRaw[] = [] + const modulesRoutesKeys = Object.keys(modules) + for (const route of routes) { + const meta = { + title: route.name, + icon: route.icon, + hidden: !route.visible, + noCache: !route.keepAlive, + alwaysShow: + route.children && + route.children.length === 1 && + (route.alwaysShow !== undefined ? route.alwaysShow : true) + } + // 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive + let data: AppRouteRecordRaw = { + path: route.path, + name: + route.componentName && route.componentName.length > 0 + ? route.componentName + : toCamelCase(route.path, true), + redirect: route.redirect, + meta: meta + } + //处理顶级非目录路由 + if (!route.children && route.parentId == 0 && route.component) { + data.component = Layout + data.meta = {} + data.name = toCamelCase(route.path, true) + 'Parent' + data.redirect = '' + meta.alwaysShow = true + const childrenData: AppRouteRecordRaw = { + path: '', + name: toCamelCase(route.path, true), + redirect: route.redirect, + meta: meta + } + const index = route?.component + ? modulesRoutesKeys.findIndex((ev) => ev.includes(route.component)) + : modulesRoutesKeys.findIndex((ev) => ev.includes(route.path)) + childrenData.component = modules[modulesRoutesKeys[index]] + data.children = [childrenData] + } else { + // 目录 + if (route.children) { + data.component = Layout + data.redirect = getRedirect(route.path, route.children) + // 外链 + } else if (isUrl(route.path)) { + data = { + path: '/external-link', + component: Layout, + meta: { + name: route.name + }, + children: [data] + } as AppRouteRecordRaw + // 菜单 + } else { + // 对后端传component组件路径和不传做兼容(如果后端传component组件路径,那么path可以随便写,如果不传,component组件路径会根path保持一致) + const index = route?.component + ? modulesRoutesKeys.findIndex((ev) => ev.includes(route.component)) + : modulesRoutesKeys.findIndex((ev) => ev.includes(route.path)) + data.component = modules[modulesRoutesKeys[index]] + } + if (route.children) { + data.children = generateRoute(route.children) + } + } + res.push(data as AppRouteRecordRaw) + } + return res +} +export const getRedirect = (parentPath: string, children: AppCustomRouteRecordRaw[]) => { + if (!children || children.length == 0) { + return parentPath + } + const path = generateRoutePath(parentPath, children[0].path) + // 递归子节点 + if (children[0].children) return getRedirect(path, children[0].children) +} +const generateRoutePath = (parentPath: string, path: string) => { + if (parentPath.endsWith('/')) { + parentPath = parentPath.slice(0, -1) // 移除默认的 / + } + if (!path.startsWith('/')) { + path = '/' + path + } + return parentPath + path +} +export const pathResolve = (parentPath: string, path: string) => { + if (isUrl(path)) return path + const childPath = path.startsWith('/') || !path ? path : `/${path}` + return `${parentPath}${childPath}`.replace(/\/\//g, '/') +} + +// 路由降级 +export const flatMultiLevelRoutes = (routes: AppRouteRecordRaw[]) => { + const modules: AppRouteRecordRaw[] = cloneDeep(routes) + for (let index = 0; index < modules.length; index++) { + const route = modules[index] + if (!isMultipleRoute(route)) { + continue + } + promoteRouteLevel(route) + } + return modules +} + +// 层级是否大于2 +const isMultipleRoute = (route: AppRouteRecordRaw) => { + if (!route || !Reflect.has(route, 'children') || !route.children?.length) { + return false + } + + const children = route.children + + let flag = false + for (let index = 0; index < children.length; index++) { + const child = children[index] + if (child.children?.length) { + flag = true + break + } + } + return flag +} + +// 生成二级路由 +const promoteRouteLevel = (route: AppRouteRecordRaw) => { + let router: Router | null = createRouter({ + routes: [route as RouteRecordRaw], + history: createWebHashHistory() + }) + + const routes = router.getRoutes() + addToChildren(routes, route.children || [], route) + router = null + + route.children = route.children?.map((item) => omit(item, 'children')) +} + +// 添加所有子菜单 +const addToChildren = ( + routes: RouteRecordNormalized[], + children: AppRouteRecordRaw[], + routeModule: AppRouteRecordRaw +) => { + for (let index = 0; index < children.length; index++) { + const child = children[index] + const route = routes.find((item) => item.name === child.name) + if (!route) { + continue + } + routeModule.children = routeModule.children || [] + if (!routeModule.children.find((item) => item.name === route.name)) { + routeModule.children?.push(route as unknown as AppRouteRecordRaw) + } + if (child.children?.length) { + addToChildren(routes, child.children, routeModule) + } + } +} +const toCamelCase = (str: string, upperCaseFirst: boolean) => { + str = (str || '') + .replace(/-(.)/g, function (group1: string) { + return group1.toUpperCase() + }) + .replaceAll('-', '') + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1) + } + + return str +} diff --git a/grailed-ui-admin-vue3/src/utils/tree.ts b/grailed-ui-admin-vue3/src/utils/tree.ts new file mode 100644 index 0000000..c8503f5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/tree.ts @@ -0,0 +1,399 @@ +interface TreeHelperConfig { + id: string + children: string + pid: string +} + +const DEFAULT_CONFIG: TreeHelperConfig = { + id: 'id', + children: 'children', + pid: 'pid' +} +export const defaultProps = { + children: 'children', + label: 'name', + value: 'id', + isLeaf: 'leaf' +} + +const getConfig = (config: Partial) => Object.assign({}, DEFAULT_CONFIG, config) + +// tree from list +export const listToTree = (list: any[], config: Partial = {}): T[] => { + const conf = getConfig(config) as TreeHelperConfig + const nodeMap = new Map() + const result: T[] = [] + const { id, children, pid } = conf + + for (const node of list) { + node[children] = node[children] || [] + nodeMap.set(node[id], node) + } + for (const node of list) { + const parent = nodeMap.get(node[pid]) + ;(parent ? parent.children : result).push(node) + } + return result +} + +export const treeToList = (tree: any, config: Partial = {}): T => { + config = getConfig(config) + const { children } = config + const result: any = [...tree] + for (let i = 0; i < result.length; i++) { + if (!result[i][children!]) continue + result.splice(i + 1, 0, ...result[i][children!]) + } + return result +} + +export const findNode = ( + tree: any, + func: Fn, + config: Partial = {} +): T | null => { + config = getConfig(config) + const { children } = config + const list = [...tree] + for (const node of list) { + if (func(node)) return node + node[children!] && list.push(...node[children!]) + } + return null +} + +export const findNodeAll = ( + tree: any, + func: Fn, + config: Partial = {} +): T[] => { + config = getConfig(config) + const { children } = config + const list = [...tree] + const result: T[] = [] + for (const node of list) { + func(node) && result.push(node) + node[children!] && list.push(...node[children!]) + } + return result +} + +export const findPath = ( + tree: any, + func: Fn, + config: Partial = {} +): T | T[] | null => { + config = getConfig(config) + const path: T[] = [] + const list = [...tree] + const visitedSet = new Set() + const { children } = config + while (list.length) { + const node = list[0] + if (visitedSet.has(node)) { + path.pop() + list.shift() + } else { + visitedSet.add(node) + node[children!] && list.unshift(...node[children!]) + path.push(node) + if (func(node)) { + return path + } + } + } + return null +} + +export const findPathAll = (tree: any, func: Fn, config: Partial = {}) => { + config = getConfig(config) + const path: any[] = [] + const list = [...tree] + const result: any[] = [] + const visitedSet = new Set(), + { children } = config + while (list.length) { + const node = list[0] + if (visitedSet.has(node)) { + path.pop() + list.shift() + } else { + visitedSet.add(node) + node[children!] && list.unshift(...node[children!]) + path.push(node) + func(node) && result.push([...path]) + } + } + return result +} + +export const filter = ( + tree: T[], + func: (n: T) => boolean, + config: Partial = {} +): T[] => { + config = getConfig(config) + const children = config.children as string + + function listFilter(list: T[]) { + return list + .map((node: any) => ({ ...node })) + .filter((node) => { + node[children] = node[children] && listFilter(node[children]) + return func(node) || (node[children] && node[children].length) + }) + } + + return listFilter(tree) +} + +export const forEach = ( + tree: T[], + func: (n: T) => any, + config: Partial = {} +): void => { + config = getConfig(config) + const list: any[] = [...tree] + const { children } = config + for (let i = 0; i < list.length; i++) { + // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿 + if (func(list[i])) { + return + } + children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]) + } +} + +/** + * @description: Extract tree specified structure + */ +export const treeMap = ( + treeData: T[], + opt: { children?: string; conversion: Fn } +): T[] => { + return treeData.map((item) => treeMapEach(item, opt)) +} + +/** + * @description: Extract tree specified structure + */ +export const treeMapEach = ( + data: any, + { children = 'children', conversion }: { children?: string; conversion: Fn } +) => { + const haveChildren = Array.isArray(data[children]) && data[children].length > 0 + const conversionData = conversion(data) || {} + if (haveChildren) { + return { + ...conversionData, + [children]: data[children].map((i: number) => + treeMapEach(i, { + children, + conversion + }) + ) + } + } else { + return { + ...conversionData + } + } +} + +/** + * 递归遍历树结构 + * @param treeDatas 树 + * @param callBack 回调 + * @param parentNode 父节点 + */ +export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => { + treeDatas.forEach((element) => { + const newNode = callBack(element, parentNode) || element + if (element.children) { + eachTree(element.children, callBack, newNode) + } + }) +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export const handleTree = (data: any[], id?: string, parentId?: string, children?: string) => { + if (!Array.isArray(data)) { + console.warn('data must be an array') + return [] + } + const config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + } + + const childrenListMap = {} + const nodeIds = {} + const tree: any[] = [] + + for (const d of data) { + const parentId = d[config.parentId] + if (childrenListMap[parentId] == null) { + childrenListMap[parentId] = [] + } + nodeIds[d[config.id]] = d + childrenListMap[parentId].push(d) + } + + for (const d of data) { + const parentId = d[config.parentId] + if (nodeIds[parentId] == null) { + tree.push(d) + } + } + + for (const t of tree) { + adaptToChildrenList(t) + } + + function adaptToChildrenList(o) { + if (childrenListMap[o[config.id]] !== null) { + o[config.childrenList] = childrenListMap[o[config.id]] + } + if (o[config.childrenList]) { + for (const c of o[config.childrenList]) { + adaptToChildrenList(c) + } + } + } + + return tree +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + * @param {*} rootId 根Id 默认 0 + */ +// @ts-ignore +export const handleTree2 = (data, id, parentId, children, rootId) => { + id = id || 'id' + parentId = parentId || 'parentId' + // children = children || 'children' + rootId = + rootId || + Math.min( + ...data.map((item) => { + return item[parentId] + }) + ) || + 0 + // 对源数据深度克隆 + const cloneData = JSON.parse(JSON.stringify(data)) + // 循环所有项 + const treeData = cloneData.filter((father) => { + const branchArr = cloneData.filter((child) => { + // 返回每一项的子级数组 + return father[id] === child[parentId] + }) + branchArr.length > 0 ? (father.children = branchArr) : '' + // 返回第一层 + return father[parentId] === rootId + }) + return treeData !== '' ? treeData : data +} + +/** + * 校验选中的节点,是否为指定 level + * + * @param tree 要操作的树结构数据 + * @param nodeId 需要判断在什么层级的数据 + * @param level 检查的级别, 默认检查到二级 + * @return true 是;false 否 + */ +export const checkSelectedNode = (tree: any[], nodeId: any, level = 2): boolean => { + if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) { + console.warn('tree must be an array') + return false + } + + // 校验是否是一级节点 + if (tree.some((item) => item.id === nodeId)) { + return false + } + + // 递归计数 + let count = 1 + + // 深层次校验 + function performAThoroughValidation(arr: any[]): boolean { + count += 1 + for (const item of arr) { + if (item.id === nodeId) { + return true + } else if (typeof item.children !== 'undefined' && item.children.length !== 0) { + if (performAThoroughValidation(item.children)) { + return true + } + } + } + return false + } + + for (const item of tree) { + count = 1 + if (performAThoroughValidation(item.children)) { + // 找到后对比是否是期望的层级 + if (count >= level) { + return true + } + } + } + + return false +} + +/** + * 获取节点的完整结构 + * @param tree 树数据 + * @param nodeId 节点 id + */ +export const treeToString = (tree: any[], nodeId) => { + if (typeof tree === 'undefined' || !Array.isArray(tree) || tree.length === 0) { + console.warn('tree must be an array') + return '' + } + // 校验是否是一级节点 + const node = tree.find((item) => item.id === nodeId) + if (typeof node !== 'undefined') { + return node.name + } + let str = '' + + function performAThoroughValidation(arr) { + for (const item of arr) { + if (item.id === nodeId) { + str += `/${item.name}` + return true + } else if (typeof item.children !== 'undefined' && item.children.length !== 0) { + str += `/${item.name}` + if (performAThoroughValidation(item.children)) { + return true + } + } + } + return false + } + + for (const item of tree) { + str = `${item.name}` + if (performAThoroughValidation(item.children)) { + break + } + } + return str +} diff --git a/grailed-ui-admin-vue3/src/utils/tsxHelper.ts b/grailed-ui-admin-vue3/src/utils/tsxHelper.ts new file mode 100644 index 0000000..6087fa3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/utils/tsxHelper.ts @@ -0,0 +1,16 @@ +import { Slots } from 'vue' +import { isFunction } from '@/utils/is' + +export const getSlot = (slots: Slots, slot = 'default', data?: Recordable) => { + // Reflect.has 判断一个对象是否存在某个属性 + if (!slots || !Reflect.has(slots, slot)) { + return null + } + if (!isFunction(slots[slot])) { + console.error(`${slot} is not a function!`) + return null + } + const slotFn = slots[slot] + if (!slotFn) return null + return slotFn(data) +} diff --git a/grailed-ui-admin-vue3/src/views/Error/403.vue b/grailed-ui-admin-vue3/src/views/Error/403.vue new file mode 100644 index 0000000..a3ec487 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/Error/403.vue @@ -0,0 +1,8 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/Error/404.vue b/grailed-ui-admin-vue3/src/views/Error/404.vue new file mode 100644 index 0000000..f6a08de --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/Error/404.vue @@ -0,0 +1,7 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/Error/500.vue b/grailed-ui-admin-vue3/src/views/Error/500.vue new file mode 100644 index 0000000..998487d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/Error/500.vue @@ -0,0 +1,7 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/Home/Index.vue b/grailed-ui-admin-vue3/src/views/Home/Index.vue new file mode 100644 index 0000000..505623a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/Home/Index.vue @@ -0,0 +1,224 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mall/trade/delivery/pickUpStore/index.vue b/grailed-ui-admin-vue3/src/views/mall/trade/delivery/pickUpStore/index.vue new file mode 100644 index 0000000..c896344 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mall/trade/delivery/pickUpStore/index.vue @@ -0,0 +1,201 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mall/trade/order/index.vue b/grailed-ui-admin-vue3/src/views/mall/trade/order/index.vue new file mode 100644 index 0000000..d51ec11 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mall/trade/order/index.vue @@ -0,0 +1,572 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mall/trade/order/tradeOrderDetail.vue b/grailed-ui-admin-vue3/src/views/mall/trade/order/tradeOrderDetail.vue new file mode 100644 index 0000000..83b0b9c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mall/trade/order/tradeOrderDetail.vue @@ -0,0 +1,365 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/UserAssignRoleForm.vue b/grailed-ui-admin-vue3/src/views/member/UserAssignRoleForm.vue new file mode 100644 index 0000000..57d7353 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/UserAssignRoleForm.vue @@ -0,0 +1,96 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/UserForm.vue b/grailed-ui-admin-vue3/src/views/member/UserForm.vue new file mode 100644 index 0000000..9ee126b --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/UserForm.vue @@ -0,0 +1,203 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/UserImportForm.vue b/grailed-ui-admin-vue3/src/views/member/UserImportForm.vue new file mode 100644 index 0000000..ad9eae3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/UserImportForm.vue @@ -0,0 +1,133 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/balanceAccount/BalanceAccountForm.vue b/grailed-ui-admin-vue3/src/views/member/balanceAccount/BalanceAccountForm.vue new file mode 100644 index 0000000..fda2014 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/balanceAccount/BalanceAccountForm.vue @@ -0,0 +1,117 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/balanceAccount/index.vue b/grailed-ui-admin-vue3/src/views/member/balanceAccount/index.vue new file mode 100644 index 0000000..6006454 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/balanceAccount/index.vue @@ -0,0 +1,229 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/balanceRecord/BalanceRecordForm.vue b/grailed-ui-admin-vue3/src/views/member/balanceRecord/BalanceRecordForm.vue new file mode 100644 index 0000000..7307289 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/balanceRecord/BalanceRecordForm.vue @@ -0,0 +1,139 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/balanceRecord/index.vue b/grailed-ui-admin-vue3/src/views/member/balanceRecord/index.vue new file mode 100644 index 0000000..66554e7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/balanceRecord/index.vue @@ -0,0 +1,237 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/BankWithdrawalDetailForm.vue b/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/BankWithdrawalDetailForm.vue new file mode 100644 index 0000000..9b11c6c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/BankWithdrawalDetailForm.vue @@ -0,0 +1,138 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/index.vue b/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/index.vue new file mode 100644 index 0000000..9526e50 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/bankWithdrawalDetail/index.vue @@ -0,0 +1,226 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/brand/BrandForm.vue b/grailed-ui-admin-vue3/src/views/member/brand/BrandForm.vue new file mode 100644 index 0000000..3dfd2fc --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/brand/BrandForm.vue @@ -0,0 +1,119 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/brand/index.vue b/grailed-ui-admin-vue3/src/views/member/brand/index.vue new file mode 100644 index 0000000..377e284 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/brand/index.vue @@ -0,0 +1,188 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/category/CategoryForm.vue b/grailed-ui-admin-vue3/src/views/member/category/CategoryForm.vue new file mode 100644 index 0000000..da2566c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/category/CategoryForm.vue @@ -0,0 +1,124 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/category/index.vue b/grailed-ui-admin-vue3/src/views/member/category/index.vue new file mode 100644 index 0000000..5bc9865 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/category/index.vue @@ -0,0 +1,214 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/channel/ChannelForm.vue b/grailed-ui-admin-vue3/src/views/member/channel/ChannelForm.vue new file mode 100644 index 0000000..8d2fd35 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/channel/ChannelForm.vue @@ -0,0 +1,137 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/channel/index.vue b/grailed-ui-admin-vue3/src/views/member/channel/index.vue new file mode 100644 index 0000000..a1e5651 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/channel/index.vue @@ -0,0 +1,223 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/channelConfig/ChannelConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/channelConfig/ChannelConfigForm.vue new file mode 100644 index 0000000..b80215a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/channelConfig/ChannelConfigForm.vue @@ -0,0 +1,132 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/channelConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/channelConfig/index.vue new file mode 100644 index 0000000..e26cb8e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/channelConfig/index.vue @@ -0,0 +1,262 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/checkIn/CheckInForm.vue b/grailed-ui-admin-vue3/src/views/member/checkIn/CheckInForm.vue new file mode 100644 index 0000000..58f38db --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/checkIn/CheckInForm.vue @@ -0,0 +1,105 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/checkIn/index.vue b/grailed-ui-admin-vue3/src/views/member/checkIn/index.vue new file mode 100644 index 0000000..e8d1894 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/checkIn/index.vue @@ -0,0 +1,211 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationConfig/CombinationConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/combinationConfig/CombinationConfigForm.vue new file mode 100644 index 0000000..946056e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationConfig/CombinationConfigForm.vue @@ -0,0 +1,132 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/combinationConfig/index.vue new file mode 100644 index 0000000..5c51408 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationConfig/index.vue @@ -0,0 +1,256 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationRecord/CombinationRecordForm.vue b/grailed-ui-admin-vue3/src/views/member/combinationRecord/CombinationRecordForm.vue new file mode 100644 index 0000000..aeb1793 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationRecord/CombinationRecordForm.vue @@ -0,0 +1,136 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationRecord/index.vue b/grailed-ui-admin-vue3/src/views/member/combinationRecord/index.vue new file mode 100644 index 0000000..04d0a27 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationRecord/index.vue @@ -0,0 +1,293 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationReocrd/CombinationReocrdForm.vue b/grailed-ui-admin-vue3/src/views/member/combinationReocrd/CombinationReocrdForm.vue new file mode 100644 index 0000000..a039062 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationReocrd/CombinationReocrdForm.vue @@ -0,0 +1,136 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/combinationReocrd/index.vue b/grailed-ui-admin-vue3/src/views/member/combinationReocrd/index.vue new file mode 100644 index 0000000..68b5f68 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/combinationReocrd/index.vue @@ -0,0 +1,293 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/contentCarouse/ContentCarouseForm.vue b/grailed-ui-admin-vue3/src/views/member/contentCarouse/ContentCarouseForm.vue new file mode 100644 index 0000000..84f68c3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/contentCarouse/ContentCarouseForm.vue @@ -0,0 +1,132 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/contentCarouse/index.vue b/grailed-ui-admin-vue3/src/views/member/contentCarouse/index.vue new file mode 100644 index 0000000..2d5329a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/contentCarouse/index.vue @@ -0,0 +1,215 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/ContinuousSignInConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/ContinuousSignInConfigForm.vue new file mode 100644 index 0000000..e8920ba --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/ContinuousSignInConfigForm.vue @@ -0,0 +1,101 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/index.vue new file mode 100644 index 0000000..41a694d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/continuousSignInConfig/index.vue @@ -0,0 +1,184 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/countries/CountriesForm.vue b/grailed-ui-admin-vue3/src/views/member/countries/CountriesForm.vue new file mode 100644 index 0000000..42a53c6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/countries/CountriesForm.vue @@ -0,0 +1,121 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/countries/index.vue b/grailed-ui-admin-vue3/src/views/member/countries/index.vue new file mode 100644 index 0000000..f371128 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/countries/index.vue @@ -0,0 +1,223 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/CryptoWithdrawalDetailForm.vue b/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/CryptoWithdrawalDetailForm.vue new file mode 100644 index 0000000..52cde16 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/CryptoWithdrawalDetailForm.vue @@ -0,0 +1,119 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/index.vue b/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/index.vue new file mode 100644 index 0000000..e391980 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/cryptoWithdrawalDetail/index.vue @@ -0,0 +1,182 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/CumulativeSignInConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/CumulativeSignInConfigForm.vue new file mode 100644 index 0000000..124ea6b --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/CumulativeSignInConfigForm.vue @@ -0,0 +1,101 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/index.vue new file mode 100644 index 0000000..d22f349 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/cumulativeSignInConfig/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/DailySignInConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/DailySignInConfigForm.vue new file mode 100644 index 0000000..897c0bc --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/DailySignInConfigForm.vue @@ -0,0 +1,102 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/index.vue new file mode 100644 index 0000000..7647e2a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/dailySignInConfig/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/financeConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/financeConfig/index.vue new file mode 100644 index 0000000..d6ea9fc --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/financeConfig/index.vue @@ -0,0 +1,128 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/h5Pages/index.vue b/grailed-ui-admin-vue3/src/views/member/h5Pages/index.vue new file mode 100644 index 0000000..a06e278 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/h5Pages/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/index.vue b/grailed-ui-admin-vue3/src/views/member/index.vue new file mode 100644 index 0000000..6ce6893 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/index.vue @@ -0,0 +1,352 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/levelConfig/LevelConfigForm.vue b/grailed-ui-admin-vue3/src/views/member/levelConfig/LevelConfigForm.vue new file mode 100644 index 0000000..d2375e3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/levelConfig/LevelConfigForm.vue @@ -0,0 +1,134 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/levelConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/levelConfig/index.vue new file mode 100644 index 0000000..c8a8582 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/levelConfig/index.vue @@ -0,0 +1,204 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/member/customTask/CustomTaskForm.vue b/grailed-ui-admin-vue3/src/views/member/member/customTask/CustomTaskForm.vue new file mode 100644 index 0000000..02de609 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/member/customTask/CustomTaskForm.vue @@ -0,0 +1,117 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/member/customTask/index.vue b/grailed-ui-admin-vue3/src/views/member/member/customTask/index.vue new file mode 100644 index 0000000..9da2a57 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/member/customTask/index.vue @@ -0,0 +1,236 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/messageSession/MessageSessionForm.vue b/grailed-ui-admin-vue3/src/views/member/messageSession/MessageSessionForm.vue new file mode 100644 index 0000000..d829835 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/messageSession/MessageSessionForm.vue @@ -0,0 +1,102 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/messageSession/index.vue b/grailed-ui-admin-vue3/src/views/member/messageSession/index.vue new file mode 100644 index 0000000..04720b5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/messageSession/index.vue @@ -0,0 +1,231 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderApprove.vue b/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderApprove.vue new file mode 100644 index 0000000..d32b8a9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderApprove.vue @@ -0,0 +1,53 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderForm.vue b/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderForm.vue new file mode 100644 index 0000000..b24ba90 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/payOrder/PayOrderForm.vue @@ -0,0 +1,223 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/payOrder/index.vue b/grailed-ui-admin-vue3/src/views/member/payOrder/index.vue new file mode 100644 index 0000000..9909073 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/payOrder/index.vue @@ -0,0 +1,317 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/payOrderExtension/PayOrderExtensionForm.vue b/grailed-ui-admin-vue3/src/views/member/payOrderExtension/PayOrderExtensionForm.vue new file mode 100644 index 0000000..024bb04 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/payOrderExtension/PayOrderExtensionForm.vue @@ -0,0 +1,145 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/payOrderExtension/index.vue b/grailed-ui-admin-vue3/src/views/member/payOrderExtension/index.vue new file mode 100644 index 0000000..d2600ce --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/payOrderExtension/index.vue @@ -0,0 +1,275 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/product/ProductForm.vue b/grailed-ui-admin-vue3/src/views/member/product/ProductForm.vue new file mode 100644 index 0000000..fdd038d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/product/ProductForm.vue @@ -0,0 +1,140 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/product/index.vue b/grailed-ui-admin-vue3/src/views/member/product/index.vue new file mode 100644 index 0000000..8b0b8fa --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/product/index.vue @@ -0,0 +1,197 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/signInRecord/SignInRecordForm.vue b/grailed-ui-admin-vue3/src/views/member/signInRecord/SignInRecordForm.vue new file mode 100644 index 0000000..bbc05e1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/signInRecord/SignInRecordForm.vue @@ -0,0 +1,118 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/signInRecord/index.vue b/grailed-ui-admin-vue3/src/views/member/signInRecord/index.vue new file mode 100644 index 0000000..db1b320 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/signInRecord/index.vue @@ -0,0 +1,227 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/siteConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/siteConfig/index.vue new file mode 100644 index 0000000..1be1a5a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/siteConfig/index.vue @@ -0,0 +1,134 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/tagRelations/TagRelationsForm.vue b/grailed-ui-admin-vue3/src/views/member/tagRelations/TagRelationsForm.vue new file mode 100644 index 0000000..1fc1c13 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/tagRelations/TagRelationsForm.vue @@ -0,0 +1,96 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/tagRelations/index.vue b/grailed-ui-admin-vue3/src/views/member/tagRelations/index.vue new file mode 100644 index 0000000..9d51638 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/tagRelations/index.vue @@ -0,0 +1,198 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/tags/TagsForm.vue b/grailed-ui-admin-vue3/src/views/member/tags/TagsForm.vue new file mode 100644 index 0000000..5690580 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/tags/TagsForm.vue @@ -0,0 +1,101 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/tags/index.vue b/grailed-ui-admin-vue3/src/views/member/tags/index.vue new file mode 100644 index 0000000..56ec88a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/tags/index.vue @@ -0,0 +1,190 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/taskComment/TaskCommentForm.vue b/grailed-ui-admin-vue3/src/views/member/taskComment/TaskCommentForm.vue new file mode 100644 index 0000000..ea2ebd0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/taskComment/TaskCommentForm.vue @@ -0,0 +1,190 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/taskComment/index.vue b/grailed-ui-admin-vue3/src/views/member/taskComment/index.vue new file mode 100644 index 0000000..9015ed5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/taskComment/index.vue @@ -0,0 +1,363 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/taskConfig/index.vue b/grailed-ui-admin-vue3/src/views/member/taskConfig/index.vue new file mode 100644 index 0000000..2b61b8d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/taskConfig/index.vue @@ -0,0 +1,218 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/taskRecord/TaskRecordForm.vue b/grailed-ui-admin-vue3/src/views/member/taskRecord/TaskRecordForm.vue new file mode 100644 index 0000000..d91073d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/taskRecord/TaskRecordForm.vue @@ -0,0 +1,171 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/taskRecord/index.vue b/grailed-ui-admin-vue3/src/views/member/taskRecord/index.vue new file mode 100644 index 0000000..571b636 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/taskRecord/index.vue @@ -0,0 +1,205 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/BalanceAccountTable.vue b/grailed-ui-admin-vue3/src/views/member/user/BalanceAccountTable.vue new file mode 100644 index 0000000..a5097c3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/BalanceAccountTable.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/BalanceRecordTable.vue b/grailed-ui-admin-vue3/src/views/member/user/BalanceRecordTable.vue new file mode 100644 index 0000000..bdbb312 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/BalanceRecordTable.vue @@ -0,0 +1,29 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/CombinationConfigTable.vue b/grailed-ui-admin-vue3/src/views/member/user/CombinationConfigTable.vue new file mode 100644 index 0000000..ac09d7f --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/CombinationConfigTable.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/CustomTaskTable.vue b/grailed-ui-admin-vue3/src/views/member/user/CustomTaskTable.vue new file mode 100644 index 0000000..a93e1d7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/CustomTaskTable.vue @@ -0,0 +1,60 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/TaskRecordTable.vue b/grailed-ui-admin-vue3/src/views/member/user/TaskRecordTable.vue new file mode 100644 index 0000000..2357503 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/TaskRecordTable.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/views/member/user/UserCreditScoreTable.vue b/grailed-ui-admin-vue3/src/views/member/user/UserCreditScoreTable.vue new file mode 100644 index 0000000..4a72d68 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/UserCreditScoreTable.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/views/member/user/UserForm.vue b/grailed-ui-admin-vue3/src/views/member/user/UserForm.vue new file mode 100644 index 0000000..2f55a18 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/UserForm.vue @@ -0,0 +1,278 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/user/UserLevelTable.vue b/grailed-ui-admin-vue3/src/views/member/user/UserLevelTable.vue new file mode 100644 index 0000000..25e33a4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/UserLevelTable.vue @@ -0,0 +1,91 @@ + + + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/views/member/user/UserPasswordTable.vue b/grailed-ui-admin-vue3/src/views/member/user/UserPasswordTable.vue new file mode 100644 index 0000000..a7b4338 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/UserPasswordTable.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/views/member/user/UserWithdrawalPasswordTable.vue b/grailed-ui-admin-vue3/src/views/member/user/UserWithdrawalPasswordTable.vue new file mode 100644 index 0000000..8eda1b9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/UserWithdrawalPasswordTable.vue @@ -0,0 +1,52 @@ + + + \ No newline at end of file diff --git a/grailed-ui-admin-vue3/src/views/member/user/index.vue b/grailed-ui-admin-vue3/src/views/member/user/index.vue new file mode 100644 index 0000000..05e7f56 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/user/index.vue @@ -0,0 +1,565 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/member/userBank/UserBankForm.vue b/grailed-ui-admin-vue3/src/views/member/userBank/UserBankForm.vue new file mode 100644 index 0000000..9fa88b5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userBank/UserBankForm.vue @@ -0,0 +1,138 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/userBank/index.vue b/grailed-ui-admin-vue3/src/views/member/userBank/index.vue new file mode 100644 index 0000000..f5e680e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userBank/index.vue @@ -0,0 +1,238 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/userCrypto/UserCryptoForm.vue b/grailed-ui-admin-vue3/src/views/member/userCrypto/UserCryptoForm.vue new file mode 100644 index 0000000..7a762b2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userCrypto/UserCryptoForm.vue @@ -0,0 +1,138 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/userCrypto/index.vue b/grailed-ui-admin-vue3/src/views/member/userCrypto/index.vue new file mode 100644 index 0000000..4a83c7c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userCrypto/index.vue @@ -0,0 +1,191 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/userExtension/UserExtensionForm.vue b/grailed-ui-admin-vue3/src/views/member/userExtension/UserExtensionForm.vue new file mode 100644 index 0000000..6335229 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userExtension/UserExtensionForm.vue @@ -0,0 +1,136 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/userExtension/index.vue b/grailed-ui-admin-vue3/src/views/member/userExtension/index.vue new file mode 100644 index 0000000..8bc0870 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/userExtension/index.vue @@ -0,0 +1,202 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalApproveForm.vue b/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalApproveForm.vue new file mode 100644 index 0000000..34419ad --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalApproveForm.vue @@ -0,0 +1,128 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalForm.vue b/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalForm.vue new file mode 100644 index 0000000..ef80e0a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/withdrawal/WithdrawalForm.vue @@ -0,0 +1,163 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/member/withdrawal/index.vue b/grailed-ui-admin-vue3/src/views/member/withdrawal/index.vue new file mode 100644 index 0000000..0dab6cf --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/member/withdrawal/index.vue @@ -0,0 +1,329 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/message/blacklist/BlacklistForm.vue b/grailed-ui-admin-vue3/src/views/message/blacklist/BlacklistForm.vue new file mode 100644 index 0000000..bebc20c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/blacklist/BlacklistForm.vue @@ -0,0 +1,96 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/message/blacklist/index.vue b/grailed-ui-admin-vue3/src/views/message/blacklist/index.vue new file mode 100644 index 0000000..7162cd1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/blacklist/index.vue @@ -0,0 +1,184 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/message/content/ContentForm.vue b/grailed-ui-admin-vue3/src/views/message/content/ContentForm.vue new file mode 100644 index 0000000..b7286da --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/content/ContentForm.vue @@ -0,0 +1,154 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/message/content/index.vue b/grailed-ui-admin-vue3/src/views/message/content/index.vue new file mode 100644 index 0000000..da8b702 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/content/index.vue @@ -0,0 +1,266 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/message/memberRemark/MemberRemarkForm.vue b/grailed-ui-admin-vue3/src/views/message/memberRemark/MemberRemarkForm.vue new file mode 100644 index 0000000..1dd0c4d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/memberRemark/MemberRemarkForm.vue @@ -0,0 +1,101 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/message/memberRemark/index.vue b/grailed-ui-admin-vue3/src/views/message/memberRemark/index.vue new file mode 100644 index 0000000..f472677 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/memberRemark/index.vue @@ -0,0 +1,195 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/message/quickGroup/QuickGroupForm.vue b/grailed-ui-admin-vue3/src/views/message/quickGroup/QuickGroupForm.vue new file mode 100644 index 0000000..05c5892 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/quickGroup/QuickGroupForm.vue @@ -0,0 +1,91 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/message/quickGroup/index.vue b/grailed-ui-admin-vue3/src/views/message/quickGroup/index.vue new file mode 100644 index 0000000..9543327 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/quickGroup/index.vue @@ -0,0 +1,186 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/message/quickReplies/QuickRepliesForm.vue b/grailed-ui-admin-vue3/src/views/message/quickReplies/QuickRepliesForm.vue new file mode 100644 index 0000000..a19a2df --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/quickReplies/QuickRepliesForm.vue @@ -0,0 +1,143 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/message/quickReplies/index.vue b/grailed-ui-admin-vue3/src/views/message/quickReplies/index.vue new file mode 100644 index 0000000..58334bd --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/message/quickReplies/index.vue @@ -0,0 +1,239 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/account/AccountForm.vue b/grailed-ui-admin-vue3/src/views/mp/account/AccountForm.vue new file mode 100644 index 0000000..c721013 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/account/AccountForm.vue @@ -0,0 +1,160 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/account/index.vue b/grailed-ui-admin-vue3/src/views/mp/account/index.vue new file mode 100644 index 0000000..212035a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/account/index.vue @@ -0,0 +1,195 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyForm.vue b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyForm.vue new file mode 100644 index 0000000..1c9dee4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyForm.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyTable.vue b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyTable.vue new file mode 100644 index 0000000..2abe9f2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/ReplyTable.vue @@ -0,0 +1,115 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/autoReply/components/types.ts b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/types.ts new file mode 100644 index 0000000..68bc5c9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/autoReply/components/types.ts @@ -0,0 +1,7 @@ +// 消息类型(Follow: 关注时回复;Message: 消息回复;Keyword: 关键词回复) +// 作为 tab.name,enum 的数字不能随意修改,与 api 参数相关 +export enum MsgType { + Follow = 1, + Message = 2, + Keyword = 3 +} diff --git a/grailed-ui-admin-vue3/src/views/mp/autoReply/index.vue b/grailed-ui-admin-vue3/src/views/mp/autoReply/index.vue new file mode 100644 index 0000000..0b00647 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/autoReply/index.vue @@ -0,0 +1,241 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/index.ts new file mode 100644 index 0000000..97556b2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/index.ts @@ -0,0 +1,3 @@ +import WxAccountSelect from './main.vue' + +export default WxAccountSelect diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/main.vue new file mode 100644 index 0000000..2a6ca50 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-account-select/main.vue @@ -0,0 +1,47 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-location/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-location/index.ts new file mode 100644 index 0000000..14ba864 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-location/index.ts @@ -0,0 +1,3 @@ +import WxLocation from './main.vue' + +export default WxLocation diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-location/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-location/main.vue new file mode 100644 index 0000000..0b68d49 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-location/main.vue @@ -0,0 +1,73 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/index.ts new file mode 100644 index 0000000..eeda31d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/index.ts @@ -0,0 +1,6 @@ +import WxMaterialSelect from './main.vue' +import { NewsType, MaterialType } from './types' + +export { NewsType, MaterialType } + +export default WxMaterialSelect diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/main.vue new file mode 100644 index 0000000..aad25ea --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/main.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/types.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/types.ts new file mode 100644 index 0000000..d4add1d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-material-select/types.ts @@ -0,0 +1,11 @@ +export enum NewsType { + Draft = '2', + Published = '1' +} + +export enum MaterialType { + Image = 'image', + Voice = 'voice', + Video = 'video', + News = 'news' +} diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/card.scss b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/card.scss new file mode 100644 index 0000000..7fbbe80 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/card.scss @@ -0,0 +1,116 @@ +.avue-card { + &__item { + margin-bottom: 16px; + border: 1px solid #e8e8e8; + background-color: #fff; + box-sizing: border-box; + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + list-style: none; + font-feature-settings: 'tnum'; + cursor: pointer; + height: 200px; + + &:hover { + border-color: rgba(0, 0, 0, 0.09); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); + } + + &--add { + border: 1px dashed #000; + width: 100%; + color: rgba(0, 0, 0, 0.45); + background-color: #fff; + border-color: #d9d9d9; + border-radius: 2px; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + + i { + margin-right: 10px; + } + + &:hover { + color: #40a9ff; + background-color: #fff; + border-color: #40a9ff; + } + } + } + + &__body { + display: flex; + padding: 24px; + } + + &__detail { + flex: 1; + } + + &__avatar { + width: 48px; + height: 48px; + border-radius: 48px; + overflow: hidden; + margin-right: 12px; + + img { + width: 100%; + height: 100%; + } + } + + &__title { + color: rgba(0, 0, 0, 0.85); + margin-bottom: 12px; + font-size: 16px; + + &:hover { + color: #1890ff; + } + } + + &__info { + color: rgba(0, 0, 0, 0.45); + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + height: 64px; + } + + &__menu { + display: flex; + justify-content: space-around; + height: 50px; + background: #f7f9fa; + color: rgba(0, 0, 0, 0.45); + text-align: center; + line-height: 50px; + + &:hover { + color: #1890ff; + } + } +} + +/** joolun 额外加的 */ +.avue-comment__main { + flex: unset !important; + border-radius: 5px !important; + margin: 0 8px !important; +} + +.avue-comment__header { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.avue-comment__body { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/comment.scss b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/comment.scss new file mode 100644 index 0000000..7812c2a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/comment.scss @@ -0,0 +1,126 @@ +/* 来自 https://github.com/nmxiaowei/avue/blob/master/styles/src/element-ui/comment.scss */ +.avue-comment { + margin-bottom: 30px; + display: flex; + align-items: flex-start; + + &--reverse { + flex-direction: row-reverse; + + .avue-comment__main { + &:before, + &:after { + left: auto; + right: -8px; + border-width: 8px 0 8px 8px; + } + + &:before { + border-left-color: #dedede; + } + + &:after { + border-left-color: #f8f8f8; + margin-right: 1px; + margin-left: auto; + } + } + } + + &__avatar { + width: 48px; + height: 48px; + border-radius: 50%; + border: 1px solid transparent; + box-sizing: border-box; + vertical-align: middle; + } + + &__header { + padding: 5px 15px; + background: #f8f8f8; + border-bottom: 1px solid #eee; + display: flex; + align-items: center; + justify-content: space-between; + } + + &__author { + font-weight: 700; + font-size: 14px; + color: #999; + } + + &__main { + flex: 1; + margin: 0 20px; + position: relative; + border: 1px solid #dedede; + border-radius: 2px; + + &:before, + &:after { + position: absolute; + top: 10px; + left: -8px; + right: 100%; + width: 0; + height: 0; + display: block; + content: ' '; + border-color: transparent; + border-style: solid solid outset; + border-width: 8px 8px 8px 0; + pointer-events: none; + } + + &:before { + border-right-color: #dedede; + z-index: 1; + } + + &:after { + border-right-color: #f8f8f8; + margin-left: 1px; + z-index: 2; + } + } + + &__body { + padding: 15px; + overflow: hidden; + background: #fff; + font-family: + Segoe UI, + Lucida Grande, + Helvetica, + Arial, + Microsoft YaHei, + FreeSans, + Arimo, + Droid Sans, + wenquanyi micro hei, + Hiragino Sans GB, + Hiragino Sans GB W3, + FontAwesome, + sans-serif; + color: #333; + font-size: 14px; + } + + blockquote { + margin: 0; + font-family: + Georgia, + Times New Roman, + Times, + Kai, + Kaiti SC, + KaiTi, + BiauKai, + FontAwesome, + serif; + padding: 1px 0 1px 15px; + border-left: 4px solid #ddd; + } +} diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/Msg.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/Msg.vue new file mode 100644 index 0000000..c35e268 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/Msg.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgEvent.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgEvent.vue new file mode 100644 index 0000000..77beda4 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgEvent.vue @@ -0,0 +1,49 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgList.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgList.vue new file mode 100644 index 0000000..ce7063b --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/components/MsgList.vue @@ -0,0 +1,62 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/index.ts new file mode 100644 index 0000000..fd9eddd --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/index.ts @@ -0,0 +1,6 @@ +import WxMsg from './main.vue' +import { MsgType } from './types' + +export { MsgType } + +export default WxMsg diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/main.vue new file mode 100644 index 0000000..8b7cc3a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/main.vue @@ -0,0 +1,192 @@ + + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/types.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/types.ts new file mode 100644 index 0000000..38a0ff8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-msg/types.ts @@ -0,0 +1,17 @@ +export enum MsgType { + Event = 'event', + Text = 'text', + Voice = 'voice', + Image = 'image', + Video = 'video', + Link = 'link', + Location = 'location', + Music = 'music', + News = 'news' +} + +export interface User { + nickname: string + avatar: string + accountId: number +} diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-music/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-music/index.ts new file mode 100644 index 0000000..c421126 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-music/index.ts @@ -0,0 +1,3 @@ +import WxMusic from './main.vue' + +export default WxMusic diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-music/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-music/main.vue new file mode 100644 index 0000000..6b44f44 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-music/main.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-news/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-news/index.ts new file mode 100644 index 0000000..e68f4d5 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-news/index.ts @@ -0,0 +1,3 @@ +import WxNews from './main.vue' + +export default WxNews diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-news/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-news/main.vue new file mode 100644 index 0000000..154291b --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-news/main.vue @@ -0,0 +1,119 @@ + + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabImage.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabImage.vue new file mode 100644 index 0000000..a291577 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabImage.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabMusic.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabMusic.vue new file mode 100644 index 0000000..c7caecb --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabMusic.vue @@ -0,0 +1,116 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabNews.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabNews.vue new file mode 100644 index 0000000..565b1fb --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabNews.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabText.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabText.vue new file mode 100644 index 0000000..307e48f --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabText.vue @@ -0,0 +1,22 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVideo.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVideo.vue new file mode 100644 index 0000000..7d67d2f --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVideo.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVoice.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVoice.vue new file mode 100644 index 0000000..5a7a42d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/TabVoice.vue @@ -0,0 +1,160 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/types.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/types.ts new file mode 100644 index 0000000..3e07d6e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/components/types.ts @@ -0,0 +1,54 @@ +enum ReplyType { + News = 'news', + Image = 'image', + Voice = 'voice', + Video = 'video', + Music = 'music', + Text = 'text' +} + +interface _Reply { + accountId: number + type: ReplyType + name?: string | null + content?: string | null + mediaId?: string | null + url?: string | null + title?: string | null + description?: string | null + thumbMediaId?: string | null + thumbMediaUrl?: string | null + musicUrl?: string | null + hqMusicUrl?: string | null + introduction?: string | null + articles?: any[] +} + +type Reply = _Reply //Partial<_Reply> + +enum NewsType { + Published = '1', + Draft = '2' +} + +/** 利用旧的reply[accountId, type]初始化新的Reply */ +const createEmptyReply = (old: Reply | Ref): Reply => { + return { + accountId: unref(old).accountId, + type: unref(old).type, + name: null, + content: null, + mediaId: null, + url: null, + title: null, + description: null, + thumbMediaId: null, + thumbMediaUrl: null, + musicUrl: null, + hqMusicUrl: null, + introduction: null, + articles: [] + } +} + +export { Reply, NewsType, ReplyType, createEmptyReply } diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/index.ts new file mode 100644 index 0000000..d1da217 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/index.ts @@ -0,0 +1,7 @@ +import { Reply, NewsType, ReplyType, createEmptyReply } from './components/types' + +import WxReplySelect from './main.vue' + +export type { Reply } +export { createEmptyReply, NewsType, ReplyType } +export default WxReplySelect diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/main.vue new file mode 100644 index 0000000..2c9d5f2 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-reply/main.vue @@ -0,0 +1,208 @@ + + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/index.ts new file mode 100644 index 0000000..91e00ef --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/index.ts @@ -0,0 +1,3 @@ +import WxVideoPlayer from './main.vue' + +export default WxVideoPlayer diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/main.vue new file mode 100644 index 0000000..092b0e8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-video-play/main.vue @@ -0,0 +1,73 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/index.ts b/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/index.ts new file mode 100644 index 0000000..9eb78e0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/index.ts @@ -0,0 +1,3 @@ +import WxVoicePlayer from './main.vue' + +export default WxVoicePlayer diff --git a/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/main.vue b/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/main.vue new file mode 100644 index 0000000..fe7f0ca --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/components/wx-voice-play/main.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/components/CoverSelect.vue b/grailed-ui-admin-vue3/src/views/mp/draft/components/CoverSelect.vue new file mode 100644 index 0000000..499f1a6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/components/CoverSelect.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/components/DraftTable.vue b/grailed-ui-admin-vue3/src/views/mp/draft/components/DraftTable.vue new file mode 100644 index 0000000..bb512d8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/components/DraftTable.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/components/NewsForm.vue b/grailed-ui-admin-vue3/src/views/mp/draft/components/NewsForm.vue new file mode 100644 index 0000000..9b1e474 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/components/NewsForm.vue @@ -0,0 +1,304 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/components/index.ts b/grailed-ui-admin-vue3/src/views/mp/draft/components/index.ts new file mode 100644 index 0000000..51e843d --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/components/index.ts @@ -0,0 +1,7 @@ +import type { Article, NewsItem, NewsItemList } from './types' +import { createEmptyNewsItem } from './types' +import DraftTable from './DraftTable.vue' +import NewsForm from './NewsForm.vue' + +export { DraftTable, NewsForm, createEmptyNewsItem } +export type { Article, NewsItem, NewsItemList } diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/components/types.ts b/grailed-ui-admin-vue3/src/views/mp/draft/components/types.ts new file mode 100644 index 0000000..a8cf00c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/components/types.ts @@ -0,0 +1,40 @@ +interface NewsItem { + title: string + thumbMediaId: string + author: string + digest: string + showCoverPic: string + content: string + contentSourceUrl: string + needOpenComment: string + onlyFansCanComment: string + thumbUrl: string +} + +interface NewsItemList { + newsItem: NewsItem[] +} + +interface Article { + mediaId: string + content: NewsItemList + updateTime: number +} + +const createEmptyNewsItem = (): NewsItem => { + return { + title: '', + thumbMediaId: '', + author: '', + digest: '', + showCoverPic: '', + content: '', + contentSourceUrl: '', + needOpenComment: '', + onlyFansCanComment: '', + thumbUrl: '' + } +} + +export type { Article, NewsItem, NewsItemList } +export { createEmptyNewsItem } diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/editor-config.ts b/grailed-ui-admin-vue3/src/views/mp/draft/editor-config.ts new file mode 100644 index 0000000..ee3b95e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/editor-config.ts @@ -0,0 +1,75 @@ +import { IEditorConfig } from '@wangeditor/editor' +import { getAccessToken, getTenantId } from '@/utils/auth' + +const message = useMessage() + +type InsertFnType = (url: string, alt: string, href: string) => void + +export const createEditorConfig = ( + server: string, + accountId: number | undefined +): Partial => { + return { + MENU_CONF: { + ['uploadImage']: { + server, + // 单个文件的最大体积限制,默认为 2M + maxFileSize: 5 * 1024 * 1024, + // 最多可上传几个文件,默认为 100 + maxNumberOfFiles: 10, + // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 [] + allowedFileTypes: ['image/*'], + + // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。 + meta: { + accountId: accountId, + type: 'image' + }, + // 将 meta 拼接到 url 参数中,默认 false + metaWithUrl: true, + + // 自定义增加 http header + headers: { + Accept: '*', + Authorization: 'Bearer ' + getAccessToken(), + 'tenant-id': getTenantId() + }, + + // 跨域是否传递 cookie ,默认为 false + withCredentials: true, + + // 超时时间,默认为 10 秒 + timeout: 5 * 1000, // 5 秒 + + // form-data fieldName,后端接口参数名称,默认值wangeditor-uploaded-image + fieldName: 'file', + + // 上传之前触发 + onBeforeUpload(file: File) { + console.log(file) + return file + }, + // 上传进度的回调函数 + onProgress(progress: number) { + // progress 是 0-100 的数字 + console.log('progress', progress) + }, + onSuccess(file: File, res: any) { + console.log('onSuccess', file, res) + }, + onFailed(file: File, res: any) { + message.alertError(res.message) + console.log('onFailed', file, res) + }, + onError(file: File, err: any, res: any) { + message.alertError(err.message) + console.error('onError', file, err, res) + }, + // 自定义插入图片 + customInsert(res: any, insertFn: InsertFnType) { + insertFn(res.data.url, 'image', res.data.url) + } + } + } + } +} diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/index.vue b/grailed-ui-admin-vue3/src/views/mp/draft/index.vue new file mode 100644 index 0000000..db24596 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/draft/mock.js b/grailed-ui-admin-vue3/src/views/mp/draft/mock.js new file mode 100644 index 0000000..e8493f6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/draft/mock.js @@ -0,0 +1,151 @@ +export default { + list: [ + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-q-G9pdsmZw0OYG4FzHQkKfpLfEwIH51wy2bxisx8PvW', + content: { + newsItem: [ + { + title: '我是标题(OOO)', + author: '我是作者', + digest: '我是摘要', + content: '我是内容', + contentSourceUrl: 'https://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9XaFphcmtJVFh3VEc4Q1MxQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuN2QxTE56SFBCYXc2RE9NcUxIeS1CQjJuUHhTWjBlN2VOeGRpRi1fZUhwN1FNQjdrQV9yRU9EU0hibHREZmZoVW5acnZrN3ZjaWsxejR3RGpKczBzTHFIM0dFNFZWVkpBc0dWWlAzUEhlVmpnfn4%3D&chksm=1f6354802814dd969ef83c0f3babe555c614270b30bc383beaf7ffd13b0257f0fe5ced9af694#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn.png' + }, + { + title: '我是标题(XXX)', + author: '我是作者', + digest: '我是摘要', + content: '我是内容', + contentSourceUrl: 'https://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9yTlYwOEs1clpwcE5OUEhCQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuN0NSMjFqN3N1aUZMbFNVLTZHN2ZDME9qOGp2THk2RFNlSTlKZ3Y1czFVZDdQQm5IeUg3dEppSUtpQUh5SExOOTRkT3dHNUdBdHdWSWlOendlREV3dS1jUEVQbFpiVTZmVW5iRWhZcGdkNTFRfn4%3D&chksm=1f6354802814dd96a403151cd44c7da4eecf0e475d25423e46ecd795b513bafd829a75daef9b#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn.png' + } + ] + }, + updateTime: 1673655730 + }, + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-jGpXnO73ihN0lsNXknCRQHapp2xgHMRxHKG50LituFe', + content: { + newsItem: [ + { + title: '我是标题(修改)', + author: '我是作者', + digest: '我是摘要', + content: '我是内容', + contentSourceUrl: 'https://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl95WVFXYndIZnZJd0t5cjgvQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuN1dlNURPbWswbEF4RDd5dVJTdjQ4cm9Cc0Q1TWhpMUh6SE1hVEE3ZHljaHhlZjZYSGF5N2JNSHpDTlh6ajNZbkpGTGpTcUQ4M3NMdW41ZUpXNFZZQ1VKbVlaMVp5ekxEV1czREdsY1dOYTZnfn4%3D&chksm=1f6354be2814dda8e6238037c2ebd52b1c8e80e93249a861ad80e4d40e5ca7207233475ca689#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn.png' + } + ] + }, + updateTime: 1673655584 + }, + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-v5SrbNCPpD6M_p3TmSrYwTjKogs-0DMJgmjMyNZPeMO', + content: { + newsItem: [ + { + title: '1321', + author: '3232', + digest: '1333', + content: '

444

', + contentSourceUrl: 'http://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-tlQmcl3RdC-Jcgns6IQtf7zenGy3b86WLT7GzUcrb1T', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9jelJiaDAzbmdpSkJOZ2M2QWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuNDNXVVc2ZDRYeTY0Zm1weXR6dE9vQWh1TzEwbEpUVnRfVzJyaGFDNXBkZ0ZXM2JFOTNaRHNhOHRUeFdEanhMeS01X01kMUNWQ1BpRER3cjYwTl9pMnpFLUJhZXFucVVfM1pDUXlTUEl1S25nfn4%3D&chksm=1f6354bc2814ddaa56a90ad5bc3d078601c8d1589ba01827a8170587bc830ff9747b5f59c3a0#rd', + thumbUrl: + 'http://mmbiz.qpic.cn/mmbiz_png/btUmCVHwbJUoicwBiacjVeQbu6QxgBVrukfSJXz509boa21SpH8OVHAqXCJiaiaAaHQJNxwwsa0gHRXVr0G5EZYamw/0?wx_fmt=png' + } + ] + }, + updateTime: 1673628969 + }, + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-vdWrisK5EZbk4Y3tzh8P0PG0eEUbnQrh0BcsEb3WNP0', + content: { + newsItem: [ + { + title: 'tudou', + author: 'haha', + digest: '312', + content: '

132312

', + contentSourceUrl: 'http://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-pgFtUNLu1foMSAMkoOsrQrTZ8EtTMssBLfTtzP0dfjG', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9qdkJ1ZjBoUmg2Uk9TS3RlQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuNVg2aTJsaC1fMkU2eXNacUplN3VDTTZFZkhtMjhuTUZvWkxsNDBRSXExY2tiVXRHb09TaHgtREhzY3doZ0JYeC1TSTZ5eWZldXJsOWtfbV8yMi1aYkcyZ2pOY0haM0Ntb3VSWEtxUGVFRlNBfn4%3D&chksm=1f6354ba2814ddacf0184b24d310483641ef190b1faac098c285eb416c70017e2f54decfa1af#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-pgFtUNLu1foMSAMkoOsrQrTZ8EtTMssBLfTtzP0dfjG.png' + } + ] + }, + updateTime: 1673628760 + }, + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-u9kTIm1DhWZDdXyxsxUVv2Z5DAB99IPxkIRTUUD206k', + content: { + newsItem: [ + { + title: '12', + author: '333', + digest: '123', + content: '123', + contentSourceUrl: 'https://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-jVixJGgnBnkBPRbuVptOW0CHYuQFyiOVNtamctS8xU8', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9qVVhpSDZUaFJWTzBBWWRVQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuNWRnTDJWYmF2NER0clV1bThmQ0xUR3hqQnJkZ3BJSUNmNDJmc0lCZ1dadkVnZ3Z5bkN4YWtVUjhoaWZWYzZURUR4NnpMd0Y4Z3U5aUdib0lkMzI4Rjg3SG9JX2FycTMxbUctOHplaTlQVVhnfn4%3D&chksm=1f6354b62814dda076c778af33f06580165d8aa81f7798d55cfabb1886b5c74d9b2124a3535c#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-jVixJGgnBnkBPRbuVptOW0CHYuQFyiOVNtamctS8xU8.jpg' + } + ] + }, + updateTime: 1673626494 + }, + { + mediaId: 'r6ryvl6LrxBU0miaST4Y-sO24upobaENDmeByfBTfaozB3aOqSMAV0lGy-UkHXE7', + content: { + newsItem: [ + { + title: '我是标题', + author: '我是作者', + digest: '我是摘要', + content: '我是内容', + contentSourceUrl: 'https://www.iocoder.cn', + thumbMediaId: 'r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn', + showCoverPic: 0, + needOpenComment: 0, + onlyFansCanComment: 0, + url: 'http://mp.weixin.qq.com/s?__biz=MzA3NjM4MzQzOQ==&tempkey=MTIxMl9LT2dqRnpMNUpsR0hjYWtBQWwxQ3R5R0JGTXBDM1Q0N2ZFQm8zeUphOFlwNEpXSWxTYm9RQnJ6cHVuNGNmazZTdlE5WkxvU0tfX2V5cjV2WjJiR0xjQUhyREFSZWo2eWNrUW9EYVh6ZkpWRXBLR3FmTEV6YldBMno3Q2ZvVXBSdzlaVDc3aFhndEpQWUwzWmFMUWt0YVVURE1VZ1FsQTdPMlRtc3JBfn4%3D&chksm=1f6354aa2814ddbcc2637382f963a8742993ac38ebcebe6e3411df5ac82ac7bbdb391be6494a#rd', + thumbUrl: + 'http://test.yudao.iocoder.cn/r6ryvl6LrxBU0miaST4Y-pIcmK-zAAId-9TGgy-DrSLhjVuWbuT3ZBjk9K1yQ0Dn.png' + } + ] + }, + updateTime: 1673534279 + } + ], + total: 6 +} diff --git a/grailed-ui-admin-vue3/src/views/mp/freePublish/index.vue b/grailed-ui-admin-vue3/src/views/mp/freePublish/index.vue new file mode 100644 index 0000000..2ed8ae7 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/freePublish/index.vue @@ -0,0 +1,336 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/hooks/useUpload.ts b/grailed-ui-admin-vue3/src/views/mp/hooks/useUpload.ts new file mode 100644 index 0000000..b0e7053 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/hooks/useUpload.ts @@ -0,0 +1,50 @@ +import type { UploadRawFile } from 'element-plus' + +const message = useMessage() // 消息 + +enum UploadType { + Image = 'image', + Voice = 'voice', + Video = 'video' +} + +const useBeforeUpload = (type: UploadType, maxSizeMB: number) => { + const fn = (rawFile: UploadRawFile): boolean => { + let allowTypes: string[] = [] + let name = '' + + switch (type) { + case UploadType.Image: + allowTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/jpg'] + maxSizeMB = 2 + name = '图片' + break + case UploadType.Voice: + allowTypes = ['audio/mp3', 'audio/mpeg', 'audio/wma', 'audio/wav', 'audio/amr'] + maxSizeMB = 2 + name = '语音' + break + case UploadType.Video: + allowTypes = ['video/mp4'] + maxSizeMB = 10 + name = '视频' + break + } + // 格式不正确 + if (!allowTypes.includes(rawFile.type)) { + message.error(`上传${name}格式不对!`) + return false + } + // 大小不正确 + if (rawFile.size / 1024 / 1024 > maxSizeMB) { + message.error(`上传${name}大小不能超过${maxSizeMB}M!`) + return false + } + + return true + } + + return fn +} + +export { UploadType, useBeforeUpload } diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/ImageTable.vue b/grailed-ui-admin-vue3/src/views/mp/material/components/ImageTable.vue new file mode 100644 index 0000000..52c608f --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/ImageTable.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/UploadFile.vue b/grailed-ui-admin-vue3/src/views/mp/material/components/UploadFile.vue new file mode 100644 index 0000000..1476917 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/UploadFile.vue @@ -0,0 +1,74 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/UploadVideo.vue b/grailed-ui-admin-vue3/src/views/mp/material/components/UploadVideo.vue new file mode 100644 index 0000000..28f050c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/UploadVideo.vue @@ -0,0 +1,126 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/VideoTable.vue b/grailed-ui-admin-vue3/src/views/mp/material/components/VideoTable.vue new file mode 100644 index 0000000..cbaa902 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/VideoTable.vue @@ -0,0 +1,59 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/VoiceTable.vue b/grailed-ui-admin-vue3/src/views/mp/material/components/VoiceTable.vue new file mode 100644 index 0000000..76fab7a --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/VoiceTable.vue @@ -0,0 +1,51 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/material/components/upload.ts b/grailed-ui-admin-vue3/src/views/mp/material/components/upload.ts new file mode 100644 index 0000000..7158ab1 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/components/upload.ts @@ -0,0 +1,31 @@ +import type { UploadProps, UploadRawFile } from 'element-plus' +import { getAccessToken } from '@/utils/auth' +import { UploadType, useBeforeUpload } from '@/views/mp/hooks/useUpload' + +const HEADERS = { Authorization: 'Bearer ' + getAccessToken() } // 请求头 +const UPLOAD_URL = import.meta.env.VITE_BASE_URL + '/admin-api/mp/material/upload-permanent' // 上传地址 + +interface UploadData { + type: UploadType + title: string + introduction: string +} + +const beforeImageUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => + useBeforeUpload(UploadType.Image, 2)(rawFile) + +const beforeVoiceUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => + useBeforeUpload(UploadType.Voice, 2)(rawFile) + +const beforeVideoUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => + useBeforeUpload(UploadType.Video, 10)(rawFile) + +export { + HEADERS, + UPLOAD_URL, + UploadType, + UploadData, + beforeImageUpload, + beforeVoiceUpload, + beforeVideoUpload +} diff --git a/grailed-ui-admin-vue3/src/views/mp/material/index.vue b/grailed-ui-admin-vue3/src/views/mp/material/index.vue new file mode 100644 index 0000000..b72c9ad --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/material/index.vue @@ -0,0 +1,154 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/assets/iphone_backImg.png b/grailed-ui-admin-vue3/src/views/mp/menu/assets/iphone_backImg.png new file mode 100644 index 0000000..bb09591 Binary files /dev/null and b/grailed-ui-admin-vue3/src/views/mp/menu/assets/iphone_backImg.png differ diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_foot.png b/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_foot.png new file mode 100644 index 0000000..4a89d4b Binary files /dev/null and b/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_foot.png differ diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_head.png b/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_head.png new file mode 100644 index 0000000..248cfb7 Binary files /dev/null and b/grailed-ui-admin-vue3/src/views/mp/menu/assets/menu_head.png differ diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuEditor.vue b/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuEditor.vue new file mode 100644 index 0000000..5df1785 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuEditor.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuPreviewer.vue b/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuPreviewer.vue new file mode 100644 index 0000000..a0c851e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/menu/components/MenuPreviewer.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/components/menuOptions.ts b/grailed-ui-admin-vue3/src/views/mp/menu/components/menuOptions.ts new file mode 100644 index 0000000..d86dd78 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/menu/components/menuOptions.ts @@ -0,0 +1,42 @@ +export default [ + { + value: 'view', + label: '跳转网页' + }, + { + value: 'miniprogram', + label: '跳转小程序' + }, + { + value: 'click', + label: '点击回复' + }, + { + value: 'article_view_limited', + label: '跳转图文消息' + }, + { + value: 'scancode_push', + label: '扫码直接返回结果' + }, + { + value: 'scancode_waitmsg', + label: '扫码回复' + }, + { + value: 'pic_sysphoto', + label: '系统拍照发图' + }, + { + value: 'pic_photo_or_album', + label: '拍照或者相册' + }, + { + value: 'pic_weixin', + label: '微信相册' + }, + { + value: 'location_select', + label: '选择地理位置' + } +] diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/components/types.ts b/grailed-ui-admin-vue3/src/views/mp/menu/components/types.ts new file mode 100644 index 0000000..b9f7659 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/menu/components/types.ts @@ -0,0 +1,73 @@ +export interface Replay { + title: string + description: string + picUrl: string + url: string +} + +export type MenuType = + | '' + | 'click' + | 'view' + | 'scancode_waitmsg' + | 'scancode_push' + | 'pic_sysphoto' + | 'pic_photo_or_album' + | 'pic_weixin' + | 'location_select' + | 'article_view_limited' + +interface _RawMenu { + // db + id: number + parentId: number + accountId: number + appId: string + createTime: number + + // mp-native + name: string + menuKey: string + type: MenuType + url: string + miniProgramAppId: string + miniProgramPagePath: string + articleId: string + replyMessageType: string + replyContent: string + replyMediaId: string + replyMediaUrl: string + replyThumbMediaId: string + replyThumbMediaUrl: string + replyTitle: string + replyDescription: string + replyArticles: Replay + replyMusicUrl: string + replyHqMusicUrl: string +} + +export type RawMenu = Partial<_RawMenu> + +interface _Reply { + type: string + accountId: number + content: string + mediaId: string + url: string + thumbMediaId: string + thumbMediaUrl: string + title: string + description: string + articles: null | Replay[] + musicUrl: string + hqMusicUrl: string +} + +export type Reply = Partial<_Reply> + +interface _Menu extends RawMenu { + children: _Menu[] + reply: Reply +} + +export type Menu = Partial<_Menu> diff --git a/grailed-ui-admin-vue3/src/views/mp/menu/index.vue b/grailed-ui-admin-vue3/src/views/mp/menu/index.vue new file mode 100644 index 0000000..03be6b9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/menu/index.vue @@ -0,0 +1,401 @@ + + + + + + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/message/MessageTable.vue b/grailed-ui-admin-vue3/src/views/mp/message/MessageTable.vue new file mode 100644 index 0000000..ebc3d74 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/message/MessageTable.vue @@ -0,0 +1,145 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/message/index.vue b/grailed-ui-admin-vue3/src/views/mp/message/index.vue new file mode 100644 index 0000000..255a8ee --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/message/index.vue @@ -0,0 +1,152 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/statistics/index.vue b/grailed-ui-admin-vue3/src/views/mp/statistics/index.vue new file mode 100644 index 0000000..37ca2a0 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/statistics/index.vue @@ -0,0 +1,368 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/mp/tag/TagForm.vue b/grailed-ui-admin-vue3/src/views/mp/tag/TagForm.vue new file mode 100644 index 0000000..9a85bec --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/tag/TagForm.vue @@ -0,0 +1,98 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/tag/index.vue b/grailed-ui-admin-vue3/src/views/mp/tag/index.vue new file mode 100644 index 0000000..df76ce9 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/tag/index.vue @@ -0,0 +1,154 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/user/UserForm.vue b/grailed-ui-admin-vue3/src/views/mp/user/UserForm.vue new file mode 100644 index 0000000..818fdd8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/user/UserForm.vue @@ -0,0 +1,102 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/mp/user/index.vue b/grailed-ui-admin-vue3/src/views/mp/user/index.vue new file mode 100644 index 0000000..6147351 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/mp/user/index.vue @@ -0,0 +1,181 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/app/components/AppForm.vue b/grailed-ui-admin-vue3/src/views/pay/app/components/AppForm.vue new file mode 100644 index 0000000..4277fb6 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/app/components/AppForm.vue @@ -0,0 +1,130 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/pay/app/components/channel/AlipayChannelForm.vue b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/AlipayChannelForm.vue new file mode 100644 index 0000000..46dc431 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/AlipayChannelForm.vue @@ -0,0 +1,316 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/app/components/channel/MockChannelForm.vue b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/MockChannelForm.vue new file mode 100644 index 0000000..49cb3ab --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/MockChannelForm.vue @@ -0,0 +1,122 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/app/components/channel/WeixinChannelForm.vue b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/WeixinChannelForm.vue new file mode 100644 index 0000000..bafa4bf --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/app/components/channel/WeixinChannelForm.vue @@ -0,0 +1,342 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/app/index.vue b/grailed-ui-admin-vue3/src/views/pay/app/index.vue new file mode 100644 index 0000000..d3f993e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/app/index.vue @@ -0,0 +1,452 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/merchant/MerchantForm.vue b/grailed-ui-admin-vue3/src/views/pay/merchant/MerchantForm.vue new file mode 100644 index 0000000..731b86e --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/merchant/MerchantForm.vue @@ -0,0 +1,113 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/merchant/index.vue b/grailed-ui-admin-vue3/src/views/pay/merchant/index.vue new file mode 100644 index 0000000..669b43c --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/merchant/index.vue @@ -0,0 +1,245 @@ + + diff --git a/grailed-ui-admin-vue3/src/views/pay/order/OrderDetail.vue b/grailed-ui-admin-vue3/src/views/pay/order/OrderDetail.vue new file mode 100644 index 0000000..4716b25 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/order/OrderDetail.vue @@ -0,0 +1,117 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/pay/order/index.vue b/grailed-ui-admin-vue3/src/views/pay/order/index.vue new file mode 100644 index 0000000..4759af3 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/order/index.vue @@ -0,0 +1,339 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/pay/refund/RefundDetail.vue b/grailed-ui-admin-vue3/src/views/pay/refund/RefundDetail.vue new file mode 100644 index 0000000..c6a4010 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/refund/RefundDetail.vue @@ -0,0 +1,117 @@ + + + diff --git a/grailed-ui-admin-vue3/src/views/pay/refund/index.vue b/grailed-ui-admin-vue3/src/views/pay/refund/index.vue new file mode 100644 index 0000000..16da170 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/pay/refund/index.vue @@ -0,0 +1,344 @@ + + + + diff --git a/grailed-ui-admin-vue3/src/views/report/goview/index.vue b/grailed-ui-admin-vue3/src/views/report/goview/index.vue new file mode 100644 index 0000000..39fa8d8 --- /dev/null +++ b/grailed-ui-admin-vue3/src/views/report/goview/index.vue @@ -0,0 +1,10 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.ts new file mode 100644 index 0000000..80be43c --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.ts @@ -0,0 +1,21 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { ImageConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import logo from '@/assets/logo.png' + +export const option = { + // 图片路径 + dataset: logo, + // 适应方式 + fit: 'contain', + // 圆角 + borderRadius: 10 +} + +export default class Config extends PublicConfigClass implements CreateComponentType +{ + public key = ImageConfig.key + public chartConfig = cloneDeep(ImageConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.vue new file mode 100644 index 0000000..8383672 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/config.vue @@ -0,0 +1,67 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.ts new file mode 100644 index 0000000..3be876d --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' + +export const ImageConfig: ConfigType = { + key: 'Image', + chartKey: 'VImage', + conKey: 'VCImage', + title: '图片', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.INFORMATIONS, + chartFrame: ChartFrameEnum.COMMON, + image: 'photo.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.vue new file mode 100644 index 0000000..fc3b98f --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Image/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.ts new file mode 100644 index 0000000..41db6a9 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.ts @@ -0,0 +1,24 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { VideoConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import video from '@/assets/videos/earth.mp4' + +export const option = { + // 视频路径 + dataset: video, + // 循环播放 + loop: true, + // 静音 + muted: true, + // 适应方式 + fit: 'contain', + // 圆角 + borderRadius: 10 +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = VideoConfig.key + public chartConfig = cloneDeep(VideoConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.vue new file mode 100644 index 0000000..14a5acc --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/config.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.ts new file mode 100644 index 0000000..769cfc5 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const VideoConfig: ConfigType = { + key: 'Video', + chartKey: 'VVideo', + conKey: 'VCVideo', + title: '视频', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.INFORMATIONS, + chartFrame: ChartFrameEnum.COMMON, + image: 'video.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.vue new file mode 100644 index 0000000..b184c83 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/Video/index.vue @@ -0,0 +1,65 @@ + + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.ts new file mode 100644 index 0000000..f941097 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.ts @@ -0,0 +1,95 @@ +import { echartOptionProfixHandle, PublicConfigClass } from '@/packages/public' +import { WordCloudConfig } from './index' +import { CreateComponentType } from '@/packages/index.d' +import cloneDeep from 'lodash/cloneDeep' +import dataJson from './data.json' + +export const includes = [] + +export const ShapeEnumList = [ + { label: '圆形', value: 'circle' }, + { label: '心形', value: 'cardioid' }, + { label: '钻石', value: 'diamond' }, + { label: '右三角形', value: 'triangle-forward' }, + { label: '三角形', value: 'triangle' }, + { label: '五边形', value: 'pentagon' }, + { label: '星星', value: 'star' } +] + +export const option = { + dataset: [...dataJson], + tooltip: {}, + series: [ + { + type: 'wordCloud', + + // “云”绘制的形状,可以是表示为回调函数,也可以是固定关键字。 + // 可用值有:circle|cardioid|diamond|triangle-forward|triangle|pentagon|star + shape: 'circle', + + // 白色区域将被排除在绘制文本之外的剪影图像。 + // 随着云的形状生长,形状选项将继续应用。 + // maskImage: maskImage, + + // Folllowing left/top/width/height/right/bottom are used for positioning the word cloud + // Default to be put in the center and has 75% x 80% size. + left: 'center', + top: 'center', + width: '70%', + height: '80%', + right: null, + bottom: null, + + // 文本大小范围,默认 [12,60] + sizeRange: [12, 60], + + // 文本旋转范围和程度的步骤。 文本将通过旋转步骤45在[-90,90]中随机旋转 + rotationRange: [0, 0], + rotationStep: 0, + + // size of the grid in pixels for marking the availability of the canvas + // 网格大小越大,单词之间的差距就越大。 + gridSize: 8, + + // 设置为true,以允许单词在画布之外部分地绘制。允许绘制大于画布的大小 + drawOutOfBound: false, + + // If perform layout animation. + // NOTE disable it will lead to UI blocking when there is lots of words. + layoutAnimation: true, + + // Global text style + textStyle: { + fontFamily: 'sans-serif', + fontWeight: 'bold' + // 颜色可以是回调功能或颜色字符串 + // color: function () { + // // 随机颜色 + // return ( + // 'rgb(' + + // [Math.round(Math.random() * 160), Math.round(Math.random() * 160), Math.round(Math.random() * 160)].join( + // ',' + // ) + + // ')' + // ) + // } + }, + emphasis: { + focus: 'self', + + textStyle: { + shadowBlur: 10, + shadowColor: '#333' + } + }, + data: [...dataJson] + } + ] +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = WordCloudConfig.key + public chartConfig = cloneDeep(WordCloudConfig) + // 图表配置项 + public option = echartOptionProfixHandle(option, includes) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.vue new file mode 100644 index 0000000..7893425 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/config.vue @@ -0,0 +1,82 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/data.json b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/data.json new file mode 100644 index 0000000..f091872 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/data.json @@ -0,0 +1,90 @@ +[ + { + "name": "数据可视化", + "value": 8000, + "textStyle": { + "color": "#78fbb2" + }, + "emphasis": { + "textStyle": { + "color": "red" + } + } + }, + { + "name": "GO VIEW", + "value": 6181 + }, + { + "name": "低代码", + "value": 4386 + }, + { + "name": "Vue3", + "value": 4055 + }, + { + "name": "TypeScript4", + "value": 2467 + }, + { + "name": "Vite2", + "value": 2244 + }, + { + "name": "NaiveUI", + "value": 1898 + }, + { + "name": "ECharts5", + "value": 1484 + }, + { + "name": "Axios", + "value": 1112 + }, + { + "name": "Pinia2", + "value": 965 + }, + { + "name": "PlopJS", + "value": 847 + }, + { + "name": "sfc", + "value": 582 + }, + { + "name": "SCSS", + "value": 555 + }, + { + "name": "pnpm", + "value": 550 + }, + { + "name": "eslint", + "value": 462 + }, + { + "name": "json", + "value": 366 + }, + { + "name": "图表", + "value": 360 + }, + { + "name": "地图", + "value": 282 + }, + { + "name": "时钟", + "value": 273 + }, + { + "name": "标题", + "value": 265 + } +] diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.ts new file mode 100644 index 0000000..05949f7 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const WordCloudConfig: ConfigType = { + key: 'WordCloud', + chartKey: 'VWordCloud', + conKey: 'VCWordCloud', + title: '词云', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.INFORMATIONS, + chartFrame: ChartFrameEnum.COMMON, + image: 'words_cloud.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.vue new file mode 100644 index 0000000..4c9626e --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/WordCloud/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Mores/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Mores/index.ts new file mode 100644 index 0000000..8fadc44 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Mores/index.ts @@ -0,0 +1,6 @@ +import { ImageConfig } from './Image/index' +import { IframeConfig } from './Iframe/index' +import { VideoConfig } from './Video/index' +import { WordCloudConfig } from './WordCloud/index' + +export default [WordCloudConfig, ImageConfig, VideoConfig, IframeConfig] diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.ts new file mode 100644 index 0000000..eb04f09 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.ts @@ -0,0 +1,42 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TextBarrageConfig } from './index' +import { chartInitConfig } from '@/settings/designSetting' +import cloneDeep from 'lodash/cloneDeep' + +export enum FontWeightEnum { + NORMAL = '常规', + BOLD = '加粗', +} + +export const FontWeightObject = { + [FontWeightEnum.NORMAL]: 'normal', + [FontWeightEnum.BOLD]: 'bold', +} + +export const option = { + + dataset: '让数字化看得见', + fontSize: 32, + fontColor: '#ffffff', + fontWeight: 'normal', + // 字间距 + letterSpacing: 5, + //阴影 + showShadow: true, + boxShadow: 'none', + hShadow: 0, + vShadow: 0, + blurShadow: 8, + colorShadow: '#0075ff', + //动画 + animationTime: 0, + animationSpeed: 50, +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = TextBarrageConfig.key + public attr = { ...chartInitConfig, w: 500, h: 70, zIndex: -1 } + public chartConfig = cloneDeep(TextBarrageConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.vue new file mode 100644 index 0000000..e2a5ad5 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/config.vue @@ -0,0 +1,89 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.ts new file mode 100644 index 0000000..95e5016 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.ts @@ -0,0 +1,13 @@ +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' + +export const TextBarrageConfig: ConfigType = { + key: 'TextBarrage', + chartKey: 'VTextBarrage', + conKey: 'VCTextBarrage', + title: '弹幕文字', + category: ChatCategoryEnum.TEXT, + categoryName: ChatCategoryEnumName.TEXT, + package: PackagesCategoryEnum.INFORMATIONS, + image: 'text_barrage.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.vue new file mode 100644 index 0000000..54e9df2 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextBarrage/index.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.ts new file mode 100644 index 0000000..5ee2e1a --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.ts @@ -0,0 +1,52 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TextCommonConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export enum WritingModeEnum { + HORIZONTAL = '水平', + VERTICAL = '垂直' +} + +export const WritingModeObject = { + [WritingModeEnum.HORIZONTAL]: 'horizontal-tb', + [WritingModeEnum.VERTICAL]: 'vertical-rl' +} + +export enum FontWeightEnum { + NORMAL = '常规', + BOLD = '加粗', +} + +export const FontWeightObject = { + [FontWeightEnum.NORMAL]: 'normal', + [FontWeightEnum.BOLD]: 'bold', +} + +export const option = { + link: '', + linkHead: 'http://', + dataset: '我是文本', + fontSize: 20, + fontColor: '#ffffff', + paddingX: 10, + paddingY: 10, + textAlign: 'center', // 水平对齐方式 + fontWeight: 'normal', + + // 边框 + borderWidth: 0, + borderColor: '#ffffff', + borderRadius: 5, + + // 字间距 + letterSpacing: 5, + writingMode: 'horizontal-tb', + backgroundColor: '#00000000' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = TextCommonConfig.key + public chartConfig = cloneDeep(TextCommonConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.vue new file mode 100644 index 0000000..c2a9e44 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/config.vue @@ -0,0 +1,134 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.ts new file mode 100644 index 0000000..7adeea9 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.ts @@ -0,0 +1,13 @@ +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' + +export const TextCommonConfig: ConfigType = { + key: 'TextCommon', + chartKey: 'VTextCommon', + conKey: 'VCTextCommon', + title: '文字', + category: ChatCategoryEnum.TEXT, + categoryName: ChatCategoryEnumName.TEXT, + package: PackagesCategoryEnum.INFORMATIONS, + image: 'text_static.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.vue new file mode 100644 index 0000000..c60a2fc --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextCommon/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.ts new file mode 100644 index 0000000..e509952 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.ts @@ -0,0 +1,20 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TextGradientConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' + +export const option = { + dataset: '我是渐变文本', + size: 20, + gradient: { + from: '#0000FFFF', + to: '#00FF00FF', + deg: 45 + } +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = TextGradientConfig.key + public chartConfig = cloneDeep(TextGradientConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.vue new file mode 100644 index 0000000..44e0875 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/config.vue @@ -0,0 +1,45 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.ts new file mode 100644 index 0000000..1ab75ac --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' + +export const TextGradientConfig: ConfigType = { + key: 'TextGradient', + chartKey: 'VTextGradient', + conKey: 'VCTextGradient', + title: '渐变文字', + category: ChatCategoryEnum.TEXT, + categoryName: ChatCategoryEnumName.TEXT, + package: PackagesCategoryEnum.INFORMATIONS, + chartFrame: ChartFrameEnum.NAIVE_UI, + image: 'text_gradient.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.vue b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.vue new file mode 100644 index 0000000..3145090 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/TextGradient/index.vue @@ -0,0 +1,54 @@ + + + + diff --git a/grailed-ui-go-view/src/packages/components/Informations/Texts/index.ts b/grailed-ui-go-view/src/packages/components/Informations/Texts/index.ts new file mode 100644 index 0000000..960dcae --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/Texts/index.ts @@ -0,0 +1,5 @@ +import { TextCommonConfig } from './TextCommon/index' +import { TextBarrageConfig } from './TextBarrage/index' +import { TextGradientConfig } from './TextGradient/index' + +export default [TextCommonConfig, TextGradientConfig, TextBarrageConfig] diff --git a/grailed-ui-go-view/src/packages/components/Informations/index.d.ts b/grailed-ui-go-view/src/packages/components/Informations/index.d.ts new file mode 100644 index 0000000..f66a7a0 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/index.d.ts @@ -0,0 +1,11 @@ +export enum ChatCategoryEnum { + TEXT = 'Texts', + TITLE = 'Titles', + MORE = 'Mores' +} + +export enum ChatCategoryEnumName { + TEXT = '文本', + TITLE = '标题', + MORE = '更多' +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/packages/components/Informations/index.ts b/grailed-ui-go-view/src/packages/components/Informations/index.ts new file mode 100644 index 0000000..78f5ae1 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Informations/index.ts @@ -0,0 +1,4 @@ +import Texts from './Texts' +import Mores from './Mores' + +export const InformationList = [...Texts, ...Mores] diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.ts b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.ts new file mode 100644 index 0000000..6749328 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.ts @@ -0,0 +1,36 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TableListConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import dataJson from './data.json' + +export const option = { + // 数据 + dataset: dataJson, + // 表行数 + rowNum: 5, + // 轮播时间 + waitTime: 2, + // 数值单位 + unit: '', + // 自动排序 + sort: true, + color: '#1370fb', + textColor: '#CDD2F8FF', + borderColor: '#1370fb80', + carousel: 'single', + //序号字体大小 + indexFontSize: 12, + //左侧数据字体大小 + leftFontSize: 12, + //右侧数据字体大小 + rightFontSize: 12, + // 格式化 + valueFormatter(item: { value: any}) { return item.value} +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = TableListConfig.key + public chartConfig = cloneDeep(TableListConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.vue b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.vue new file mode 100644 index 0000000..fb76b46 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/config.vue @@ -0,0 +1,95 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/data.json b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/data.json new file mode 100644 index 0000000..ed8bb52 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/data.json @@ -0,0 +1,14 @@ +[ + { "name": "荣成", "value": 26700 }, + { "name": "河南", "value": 20700 }, + { "name": "河北", "value": 18700 }, + { "name": "徐州", "value": 17800 }, + { "name": "漯河", "value": 16756 }, + { "name": "三门峡", "value": 12343 }, + { "name": "郑州", "value": 9822 }, + { "name": "周口", "value": 8912 }, + { "name": "濮阳", "value": 6834 }, + { "name": "信阳", "value": 5875 }, + { "name": "新乡", "value": 3832 }, + { "name": "大同", "value": 1811 } +] diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.ts b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.ts new file mode 100644 index 0000000..51d502f --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const TableListConfig: ConfigType = { + key: 'TableList', + chartKey: 'VTableList', + conKey: 'VCTableList', + title: '滚动排名列表', + category: ChatCategoryEnum.TABLE, + categoryName: ChatCategoryEnumName.TABLE, + package: PackagesCategoryEnum.TABLES, + chartFrame: ChartFrameEnum.COMMON, + image: 'tables_list.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.vue b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.vue new file mode 100644 index 0000000..24324ec --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableList/index.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.ts b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.ts new file mode 100644 index 0000000..f92f690 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.ts @@ -0,0 +1,26 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { TableScrollBoardConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import dataJson from './data.json' + +export const option = { + header: ['列1', '列2', '列3'], + dataset: dataJson, + index: true, + columnWidth: [30, 100, 100], + align: ['center', 'right', 'right', 'right'], + rowNum: 5, + waitTime: 2, + headerHeight: 35, + carousel: 'single', + headerBGC: '#00BAFF', + oddRowBGC: '#003B51', + evenRowBGC: '#0A2732' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = TableScrollBoardConfig.key + public chartConfig = cloneDeep(TableScrollBoardConfig) + public option = cloneDeep(option) +} diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.vue b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.vue new file mode 100644 index 0000000..834cfb5 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/config.vue @@ -0,0 +1,100 @@ + + + diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/data.json b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/data.json new file mode 100644 index 0000000..2508e6f --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/data.json @@ -0,0 +1,12 @@ +[ + ["行1列1", "行1列2", "行1列3"], + ["行2列1", "行2列2", "行2列3"], + ["行3列1", "行3列2", "行3列3"], + ["行4列1", "行4列2", "行4列3"], + ["行5列1", "行5列2", "行5列3"], + ["行6列1", "行6列2", "行6列3"], + ["行7列1", "行7列2", "行7列3"], + ["行8列1", "行8列2", "行8列3"], + ["行9列1", "行9列2", "行9列3"], + ["行10列1", "行10列2", "行10列3"] +] diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.ts b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.ts new file mode 100644 index 0000000..5ecc6e6 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const TableScrollBoardConfig: ConfigType = { + key: 'TableScrollBoard', + chartKey: 'VTableScrollBoard', + conKey: 'VCTableScrollBoard', + title: '轮播列表', + category: ChatCategoryEnum.TABLE, + categoryName: ChatCategoryEnumName.TABLE, + package: PackagesCategoryEnum.TABLES, + chartFrame: ChartFrameEnum.COMMON, + image: 'table_scrollboard.png' +} diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.vue b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.vue new file mode 100644 index 0000000..669be3e --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/TableScrollBoard/index.vue @@ -0,0 +1,388 @@ + + + + + diff --git a/grailed-ui-go-view/src/packages/components/Tables/Tables/index.ts b/grailed-ui-go-view/src/packages/components/Tables/Tables/index.ts new file mode 100644 index 0000000..dbad93e --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/Tables/index.ts @@ -0,0 +1,4 @@ +import { TableListConfig } from './TableList' +import { TableScrollBoardConfig } from './TableScrollBoard' + +export default [TableListConfig, TableScrollBoardConfig] diff --git a/grailed-ui-go-view/src/packages/components/Tables/index.d.ts b/grailed-ui-go-view/src/packages/components/Tables/index.d.ts new file mode 100644 index 0000000..f4e0fea --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/index.d.ts @@ -0,0 +1,7 @@ +export enum ChatCategoryEnum { + TABLE = 'Tables', +} + +export enum ChatCategoryEnumName { + TABLE = '表格', +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/packages/components/Tables/index.ts b/grailed-ui-go-view/src/packages/components/Tables/index.ts new file mode 100644 index 0000000..530e056 --- /dev/null +++ b/grailed-ui-go-view/src/packages/components/Tables/index.ts @@ -0,0 +1,3 @@ +import Tables from './Tables' + +export const TableList = [...Tables] diff --git a/grailed-ui-go-view/src/packages/index.d.ts b/grailed-ui-go-view/src/packages/index.d.ts new file mode 100644 index 0000000..e1f626b --- /dev/null +++ b/grailed-ui-go-view/src/packages/index.d.ts @@ -0,0 +1,171 @@ +import { BaseEvent, EventLife } from '@/enums/eventEnum' +import type { GlobalThemeJsonType } from '@/settings/chartThemes/index' +import type { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' + +export enum ChartFrameEnum { + // 支持 dataset 的 echarts 框架 + ECHARTS = 'echarts', + // UI 组件框架 + NAIVE_UI = 'naiveUI', + // 自定义带数据组件 + COMMON = 'common', + // 无数据变更 + STATIC = 'static' +} + +// 组件配置 +export type ConfigType = { + key: string + chartKey: string + conKey: string + title: string + category: string + categoryName: string + package: string + chartFrame?: ChartFrameEnum + image: string +} + +// 数据请求 +interface requestConfig { + request: RequestConfigType +} + +// Echarts 数据类型 +interface EchartsDataType { + dimensions: string[] + source: any[] +} + +// 组件状态 +export interface StatusType { + lock: boolean + hide: boolean +} + +// 滤镜/变换枚举 +export enum FilterEnum { + // 是否启用 + FILTERS_SHOW = 'filterShow', + + // 透明度 + OPACITY = 'opacity', + // 饱和度 + SATURATE = 'saturate', + // 对比度 + CONTRAST = 'contrast', + // 色相 + HUE_ROTATE = 'hueRotate', + // 亮度 + BRIGHTNESS = 'brightness', + + // 旋转 + ROTATE_Z = 'rotateZ', + ROTATE_X = 'rotateX', + ROTATE_Y = 'rotateY', + + // 倾斜 + SKEW_X = 'skewX', + SKEW_Y = 'skewY', + + // 混合模式 + BLEND_MODE = 'blendMode' +} + +export const BlendModeEnumList = [ + { label: '正常', value: 'normal' }, + { label: '正片叠底', value: 'multiply' }, + { label: '叠加', value: 'overlay' }, + { label: '滤色', value: 'screen' }, + { label: '变暗', value: 'darken' }, + { label: '变亮', value: 'lighten' }, + { label: '颜色减淡', value: 'color-dodge' }, + { label: '颜色加深', value: 'color-burn;' }, + { label: '强光', value: 'hard-light' }, + { label: '柔光', value: 'soft-light' }, + { label: '差值', value: 'difference' }, + { label: '排除', value: 'exclusion' }, + { label: '色相', value: 'hue' }, + { label: '饱和度', value: 'saturation' }, + { label: '颜色', value: 'color' }, + { label: '亮度', value: 'luminosity' } +] + +// 组件实例类 +export interface PublicConfigType { + id: string + isGroup: boolean + attr: { x: number; y: number; w: number; h: number; zIndex: number; offsetX: number; offsetY: number } + styles: { + [FilterEnum.FILTERS_SHOW]: boolean + [FilterEnum.OPACITY]: number + [FilterEnum.SATURATE]: number + [FilterEnum.CONTRAST]: number + [FilterEnum.HUE_ROTATE]: number + [FilterEnum.BRIGHTNESS]: number + + [FilterEnum.ROTATE_Z]: number + [FilterEnum.ROTATE_X]: number + [FilterEnum.ROTATE_Y]: number + + [FilterEnum.SKEW_X]: number + [FilterEnum.SKEW_Y]: number + [FilterEnum.BLEND_MODE]: string + // 动画 + animations: string[] + } + filter?: string + status: StatusType + events: { + baseEvent: { + [K in BaseEvent]?: string + }, + advancedEvents: { + [K in EventLife]?: string + } + } +} + +export interface CreateComponentType extends PublicConfigType, requestConfig { + key: string + chartConfig: ConfigType + option: GlobalThemeJsonType, +} + +// 组件成组实例类 +export interface CreateComponentGroupType extends CreateComponentType { + groupList: Array +} + +// 获取组件实例类中某个key对应value类型的方法 +export type PickCreateComponentType = Pick[T] + +// 包分类枚举 +export enum PackagesCategoryEnum { + CHARTS = 'Charts', + TABLES = 'Tables', + INFORMATIONS = 'Informations', + DECORATES = 'Decorates' +} + +// 包分类名称 +export enum PackagesCategoryName { + CHARTS = '图表', + TABLES = '列表', + INFORMATIONS = '信息', + DECORATES = '小组件' +} + +// 获取组件 +export enum FetchComFlagType { + VIEW, + CONFIG +} + +// 图表包类型 +export type PackagesType = { + [PackagesCategoryEnum.CHARTS]: ConfigType[] + [PackagesCategoryEnum.INFORMATIONS]: ConfigType[] + [PackagesCategoryEnum.TABLES]: ConfigType[] + [PackagesCategoryEnum.DECORATES]: ConfigType[] +} diff --git a/grailed-ui-go-view/src/packages/index.ts b/grailed-ui-go-view/src/packages/index.ts new file mode 100644 index 0000000..4f530fa --- /dev/null +++ b/grailed-ui-go-view/src/packages/index.ts @@ -0,0 +1,81 @@ +import { ChartList } from '@/packages/components/Charts/index' +import { DecorateList } from '@/packages/components/Decorates/index' +import { InformationList } from '@/packages/components/Informations/index' +import { TableList } from '@/packages/components/Tables/index' +import { PackagesCategoryEnum, PackagesType, ConfigType, FetchComFlagType } from '@/packages/index.d' + +const configModules = import.meta.globEager('./components/**/config.vue') +const indexModules = import.meta.globEager('./components/**/index.vue') +const imagesModules = import.meta.globEager('../assets/images/chart/**') + +// * 所有图表 +export let packagesList: PackagesType = { + [PackagesCategoryEnum.CHARTS]: ChartList, + [PackagesCategoryEnum.INFORMATIONS]: InformationList, + [PackagesCategoryEnum.TABLES]: TableList, + [PackagesCategoryEnum.DECORATES]: DecorateList +} + +/** + * * 获取目标组件配置信息 + * @param targetData + */ +export const createComponent = async (targetData: ConfigType) => { + const { category, key } = targetData + const chart = await import(`./components/${targetData.package}/${category}/${key}/config.ts`) + return new chart.default() +} + +/** + * * 获取组件 + * @param {string} chartName 名称 + * @param {FetchComFlagType} flag 标识 0为展示组件, 1为配置组件 + */ +const fetchComponent = (chartName: string, flag: FetchComFlagType) => { + const module = flag === FetchComFlagType.VIEW ? indexModules : configModules + for (const key in module) { + const urlSplit = key.split('/') + if (urlSplit[urlSplit.length - 2] === chartName) { + return module[key] + } + } +} + +/** + * * 获取展示组件 + * @param {ConfigType} dropData 配置项 + */ +export const fetchChartComponent = (dropData: ConfigType) => { + const { key } = dropData + return fetchComponent(key, FetchComFlagType.VIEW)?.default +} + +/** + * * 获取配置组件 + * @param {ConfigType} dropData 配置项 + */ +export const fetchConfigComponent = (dropData: ConfigType) => { + const { key } = dropData + return fetchComponent(key, FetchComFlagType.CONFIG)?.default +} + +/** + * * 获取图片内容 + * @param {ConfigType} targetData 配置项 + */ +export const fetchImages = async (targetData?: ConfigType) => { + if (!targetData) return '' + // 新数据动态处理 + const { image, package: targetDataPackage } = targetData + // 兼容旧数据 + if (image.includes('@') || image.includes('base64')) return image + + const imageName = image.substring(image.lastIndexOf('/') + 1) + for (const key in imagesModules) { + const urlSplit = key.split('/') + if (urlSplit[urlSplit.length - 1] === imageName) { + return imagesModules[key]?.default + } + } + return '' +} diff --git a/grailed-ui-go-view/src/packages/public/chart.ts b/grailed-ui-go-view/src/packages/public/chart.ts new file mode 100644 index 0000000..d36a850 --- /dev/null +++ b/grailed-ui-go-view/src/packages/public/chart.ts @@ -0,0 +1,35 @@ +import merge from 'lodash/merge' +import pick from 'lodash/pick' +import { EchartsDataType } from '../index.d' +import { globalThemeJson } from '@/settings/chartThemes/index' + +/** + * * 合并 color 和全局配置项 + * @param option 配置 + * @param themeSetting 设置 + * @param excludes 排除元素 + * @returns object + */ +export const mergeTheme = (option: T, themeSetting: U, includes: string[]) => { + return (option = merge({}, pick(themeSetting, includes), option)) +} + +/** + * * ECharts option 统一前置处理 + * @param option + * @return option + */ +export const echartOptionProfixHandle = (option: any, includes: string[]) => { + option['backgroundColor'] = 'rgba(0,0,0,0)' + return mergeTheme(option, globalThemeJson, includes) +} + +/** + * * 设置数据 + * @param option + * @return option + */ +export const setData = (option: any, data: EchartsDataType) => { + option.dataset = data + return option +} diff --git a/grailed-ui-go-view/src/packages/public/index.ts b/grailed-ui-go-view/src/packages/public/index.ts new file mode 100644 index 0000000..f6810cf --- /dev/null +++ b/grailed-ui-go-view/src/packages/public/index.ts @@ -0,0 +1,2 @@ +export * from '@/packages/public/chart' +export * from '@/packages/public/publicConfig' diff --git a/grailed-ui-go-view/src/packages/public/publicConfig.ts b/grailed-ui-go-view/src/packages/public/publicConfig.ts new file mode 100644 index 0000000..c428863 --- /dev/null +++ b/grailed-ui-go-view/src/packages/public/publicConfig.ts @@ -0,0 +1,132 @@ +import { getUUID } from '@/utils' +import { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' +import { groupTitle } from '@/settings/designSetting' +import { BaseEvent, EventLife } from '@/enums/eventEnum' +import { + RequestHttpEnum, + RequestDataTypeEnum, + RequestHttpIntervalEnum, + RequestContentTypeEnum, + RequestBodyEnum +} from '@/enums/httpEnum' +import { + ChartFrameEnum, + PublicConfigType, + CreateComponentType, + CreateComponentGroupType +} from '@/packages/index.d' +import { chartInitConfig } from '@/settings/designSetting' +import cloneDeep from 'lodash/cloneDeep' + +// 请求基础属性 +export const requestConfig: RequestConfigType = { + requestDataType: RequestDataTypeEnum.STATIC, + requestHttpType: RequestHttpEnum.GET, + requestUrl: '', + requestInterval: undefined, + requestIntervalUnit: RequestHttpIntervalEnum.SECOND, + requestContentType: RequestContentTypeEnum.DEFAULT, + requestParamsBodyType: RequestBodyEnum.NONE, + requestSQLContent: { + sql: 'select * from where' + }, + requestParams: { + Body: { + 'form-data': {}, + 'x-www-form-urlencoded': {}, + json: '', + xml: '' + }, + Header: {}, + Params: {} + } +} + +// 单实例类 +export class PublicConfigClass implements PublicConfigType { + public id = getUUID() + public isGroup = false + // 基本信息 + public attr = { ...chartInitConfig, zIndex: -1 } + // 基本样式 + public styles = { + // 使用滤镜 + filterShow: false, + // 色相 + hueRotate: 0, + // 饱和度 + saturate: 1, + // 对比度 + contrast: 1, + // 亮度 + brightness: 1, + // 透明 + opacity: 1, + + // 旋转 + rotateZ: 0, + rotateX: 0, + rotateY: 0, + + // 倾斜 + skewX: 0, + skewY: 0, + + // 混合模式 + blendMode: 'normal', + + // 动画 + animations: [] + } + // 状态 + public status = { + lock: false, + hide: false + } + // 请求 + public request = cloneDeep(requestConfig) + // 数据过滤 + public filter = undefined + // 事件 + public events = { + baseEvent: { + [BaseEvent.ON_CLICK]: undefined, + [BaseEvent.ON_DBL_CLICK]: undefined, + [BaseEvent.ON_MOUSE_ENTER]: undefined, + [BaseEvent.ON_MOUSE_LEAVE]: undefined + }, + advancedEvents: { + [EventLife.VNODE_MOUNTED]: undefined, + [EventLife.VNODE_BEFORE_MOUNT]: undefined + } + } +} + +// 多选成组类 +export class PublicGroupConfigClass extends PublicConfigClass implements CreateComponentGroupType { + // 成组 + public isGroup = true + // 名称 + public chartConfig = { + key: 'group', + chartKey: 'group', + conKey: 'group', + category: 'group', + categoryName: 'group', + package: 'group', + chartFrame: ChartFrameEnum.COMMON, + title: groupTitle, + image: '' + } + // 组成员列表 + public groupList: Array = [] + // ---- 原有 --- + // key + public key = 'group' + // 配置 + public option = {} + // 标识 + public id = getUUID() + // 基本信息 + public attr = { w: 0, h: 0, x: 0, y: 0, offsetX: 0, offsetY: 0, zIndex: -1 } +} diff --git a/grailed-ui-go-view/src/plugins/customComponents.ts b/grailed-ui-go-view/src/plugins/customComponents.ts new file mode 100644 index 0000000..81e67df --- /dev/null +++ b/grailed-ui-go-view/src/plugins/customComponents.ts @@ -0,0 +1,17 @@ +import type { App } from 'vue' +import { GoSkeleton } from '@/components/GoSkeleton' +import { GoLoading } from '@/components/GoLoading' +import { SketchRule } from 'vue3-sketch-ruler' + +/** + * 全局注册自定义组件 + * @param app + */ +export function setupCustomComponents(app: App) { + // 骨架屏 + app.component('GoSkeleton', GoSkeleton) + // 加载 + app.component('GoLoading', GoLoading) + // 标尺 + app.component('SketchRule', SketchRule) +} diff --git a/grailed-ui-go-view/src/plugins/directives.ts b/grailed-ui-go-view/src/plugins/directives.ts new file mode 100644 index 0000000..2b752aa --- /dev/null +++ b/grailed-ui-go-view/src/plugins/directives.ts @@ -0,0 +1,17 @@ +import { App } from 'vue'; +import VueLazyLoad from 'vue3-lazyload' +import { requireErrorImg } from '@/utils' + +// import { x } from '@/directives'; + +/** + * 注册全局自定义指令 + * @param app + */ +export function setupDirectives(app: App) { + // 图片懒加载 + app.use(VueLazyLoad, { + error: requireErrorImg(), + }) + // app.directive('x', x); +} diff --git a/grailed-ui-go-view/src/plugins/icon.ts b/grailed-ui-go-view/src/plugins/icon.ts new file mode 100644 index 0000000..29d9bc3 --- /dev/null +++ b/grailed-ui-go-view/src/plugins/icon.ts @@ -0,0 +1,302 @@ +import { + Close as CloseIcon, + Remove as RemoveIcon, + Resize as ResizeIcon, + EllipsisHorizontalSharp as EllipsisHorizontalCircleSharpIcon, + CopyOutline as CopyIcon, + Trash as TrashIcon, + Pencil as PencilIcon, + HammerOutline as HammerIcon, + DesktopOutline as DesktopOutlineIcon, + Download as DownloadIcon, + DownloadOutline as DownloadOutlineIcon, + Share as ShareIcon, + Send as SendIcon, + InformationCircleOutline as InformationCircleIcon, + Grid as GridIcon, + TvOutline as TvOutlineIcon, + DocumentText as DocumentTextIcon, + Language as LanguageIcon, + Moon as MoonIcon, + Sunny as SunnyIcon, + Person as PersonIcon, + PersonOutline as PersonOutlineIcon, + LogOutOutline as LogOutOutlineIcon, + ChatboxEllipses as ChatboxEllipsesIcon, + LockOpenOutline as LockOpenOutlineIcon, + LockClosedOutline as LockClosedOutlineIcon, + HelpCircleOutline as HelpOutlineIcon, + CodeSlash as CodeSlashIcon, + Create as CreateIcon, + Rocket as RocketIcon, + Duplicate as DuplicateIcon, + DuplicateOutline as DuplicateOutlineIcon, + Fish as FishIcon, + BarChart as BarChartIcon, + Layers as LayersIcon, + Prism as PrismIcon, + Construct as ConstructIcon, + ChevronBackOutline as ChevronBackOutlineIcon, + Flash as FlashIcon, + SettingsSharp as SettingsSharpIcon, + Home as HomeIcon, + Card as CardIcon, + ChevronUp as ChevronUpIcon, + ChevronDown as ChevronDownIcon, + ClipboardOutline as ClipboardOutlineIcon, + BrowsersOutline as BrowsersOutlineIcon, + Cut as CutIcon, + Square as SquareIcon, + ColorPalette as ColorPaletteIcon, + Leaf as LeafIcon, + ColorWand as ColorWandIcon, + ArrowBack as ArrowBackIcon, + ArrowForward as ArrowForwardIcon, + Planet as PawIcon, + Search as SearchIcon, + Reload as ReloadIcon, + ChevronUpOutline as ChevronUpOutlineIcon, + ChevronDownOutline as ChevronDownOutlineIcon, + Pulse as PulseIcon, + Folder as FolderIcon, + FolderOpen as FolderOpenIcon, + Image as ImageIcon, + Images as ImagesIcon, + List as ListIcon, + EyeOutline as EyeOutlineIcon, + EyeOffOutline as EyeOffOutlineIcon, + Albums as AlbumsIcon +} from '@vicons/ionicons5' + +import { + TableSplit as TableSplitIcon, + Roadmap as RoadmapIcon, + SpellCheck as SpellCheckIcon, + GraphicalDataFlow as GraphicalDataFlowIcon, + Store as StoreIcon, + Devices as DevicesIcon, + ObjectStorage as ObjectStorageIcon, + DicomOverlay as DicomOverlayIcon, + UpToTop as UpToTopIcon, + DownToBottom as DownToBottomIcon, + StackedMove as StackedMoveIcon, + PaintBrush as PaintBrushIcon, + ComposerEdit as ZAxisIcon, + AlignHorizontalLeft as AlignHorizontalLeftIcon, + AlignVerticalCenter as AlignVerticalCenterIcon, + AlignVerticalTop as AlignVerticalTopIcon, + AlignHorizontalCenter as AlignHorizontalCenterIcon, + AlignHorizontalRight as AlignHorizontalRightIcon, + AlignVerticalBottom as AlignVerticalBottomIcon, + DocumentAdd as DocumentAddIcon, + DocumentDownload as DocumentDownloadIcon, + Scale as ScaleIcon, + FitToScreen as FitToScreenIcon, + FitToHeight as FitToHeightIcon, + FitToWidth as FitToWidthIcon, + Save as SaveIcon, + Carbon3DCursor as Carbon3DCursorIcon, + Carbon3DSoftware as Carbon3DSoftwareIcon, + Filter as FilterIcon, + FilterEdit as FilterEditIcon, + Laptop as LaptopIcon +} from '@vicons/carbon' + +const ionicons5 = { + // 帮助(问号) + HelpOutlineIcon, + // 添加 + DuplicateIcon, + // 添加 Outline + DuplicateOutlineIcon, + // 代码 + CodeSlashIcon, + // 修改代码 + CreateIcon, + // 事件(火箭) + RocketIcon, + // 退出 + LogOutOutlineIcon, + // 锁 + LockOpenOutlineIcon, + LockClosedOutlineIcon, + // 人 + PersonIcon, + // 人2 + PersonOutlineIcon, + // 更多(省略号) + ChatboxEllipsesIcon, + // 月亮 + MoonIcon, + // 太阳 + SunnyIcon, + // 关闭 + CloseIcon, + // 移除(最小化) + RemoveIcon, + // 调整(最大化) + ResizeIcon, + // 省略号 + EllipsisHorizontalCircleSharpIcon, + // 复制 + CopyIcon, + // 删除(垃圾桶) + TrashIcon, + // 编辑1(笔) + PencilIcon, + // 编辑2(锤子) + HammerIcon, + // 电脑 + DesktopOutlineIcon, + // 下载 + DownloadIcon, + DownloadOutlineIcon, + // 导出 + ShareIcon, + // 导出 + SendIcon, + // 信息 + InformationCircleIcon, + // 项目 + GridIcon, + // 电脑1 + TvOutlineIcon, + // 预览,浏览器 + BrowsersOutlineIcon, + // 文档 + DocumentTextIcon, + // 语言 + LanguageIcon, + // 新项目(鱼) + FishIcon, + // 图表 + BarChartIcon, + // 图层 + LayersIcon, + // 组件详情设置(三棱镜) + PrismIcon, + // 正方体 + ConstructIcon, + // 折叠/回退 + ChevronBackOutlineIcon, + // 后端数据(闪电) + FlashIcon, + // 设置(齿轮) + SettingsSharpIcon, + // 回退 + HomeIcon, + // 控件(卡片) + CardIcon, + // 上移 + ChevronUpIcon, + // 下移 + ChevronDownIcon, + // 剪贴板 + ClipboardOutlineIcon, + // 剪贴 + CutIcon, + // 正方形 + SquareIcon, + // 色彩选择 + ColorPaletteIcon, + ZAxisIcon, + // 气球 + LeafIcon, + // 颜色 + ColorWandIcon, + // 撤回 + ArrowBackIcon, + // 前进 + ArrowForwardIcon, + // 狗爪 + PawIcon, + // 搜索(放大镜) + SearchIcon, + // 加载 + ReloadIcon, + // 过滤器 + FilterIcon, + // 向上 + ChevronUpOutlineIcon, + // 向下 + ChevronDownOutlineIcon, + // 脉搏 + PulseIcon, + // 文件夹 + FolderIcon, + // 文件夹打开 + FolderOpenIcon, + // 图片 + ImageIcon, + // 多个图片 + ImagesIcon, + // 列表 + ListIcon, + // 眼睛 + EyeOutlineIcon, + EyeOffOutlineIcon, + // 图表列表 + AlbumsIcon +} + +const carbon = { + // 图表 + RoadmapIcon, + // 信息 + SpellCheckIcon, + // 表格 + TableSplitIcon, + // 装饰 + GraphicalDataFlowIcon, + // 项目 + DevicesIcon, + // 模板市场 + StoreIcon, + // 我的模板 + ObjectStorageIcon, + // 键盘 + DicomOverlayIcon, + // 置顶 + UpToTopIcon, + // 置底 + DownToBottomIcon, + // 移动 + StackedMoveIcon, + // 清空剪切板(刷子) + PaintBrushIcon, + // 坐标轴 + ZAxisIcon, + AlignHorizontalLeftIcon, + AlignVerticalCenterIcon, + AlignVerticalTopIcon, + AlignHorizontalCenterIcon, + AlignHorizontalRightIcon, + AlignVerticalBottomIcon, + // 添加文件 + DocumentAddIcon, + // 下载文件 + DocumentDownloadIcon, + // 预览展示方式 + ScaleIcon, + FitToScreenIcon, + FitToHeightIcon, + FitToWidthIcon, + // 保存 + SaveIcon, + // 成组 + Carbon3DCursorIcon, + // 解组 + Carbon3DSoftwareIcon, + // 过滤器 + FilterIcon, + FilterEditIcon, + // 图层 + LaptopIcon +} + +// https://www.xicons.org/#/ 还有很多 + +export const icon = { + ionicons5, + carbon +} diff --git a/grailed-ui-go-view/src/plugins/index.ts b/grailed-ui-go-view/src/plugins/index.ts new file mode 100644 index 0000000..c500f63 --- /dev/null +++ b/grailed-ui-go-view/src/plugins/index.ts @@ -0,0 +1,4 @@ +export { setupNaive } from '@/plugins/naive' +export { setupDirectives } from '@/plugins/directives' +export { setupCustomComponents } from '@/plugins/customComponents' +export { icon } from '@/plugins/icon' diff --git a/grailed-ui-go-view/src/plugins/naive.ts b/grailed-ui-go-view/src/plugins/naive.ts new file mode 100644 index 0000000..ab4dbb1 --- /dev/null +++ b/grailed-ui-go-view/src/plugins/naive.ts @@ -0,0 +1,211 @@ +import type { App } from 'vue' +import { + create, + NA, + NP, + NH1, + NH2, + NH3, + NH4, + NH5, + NCode, + NCountdown, + NText, + NTime, + NEllipsis, + NConfigProvider, + NMessageProvider, + NDialogProvider, + NGradientText, + NInput, + NImage, + NButton, + NButtonGroup, + NForm, + NFormItem, + NCheckboxGroup, + NCheckbox, + NIcon, + NLayout, + NLayoutHeader, + NLayoutContent, + NLayoutFooter, + NLayoutSider, + NMenu, + NBreadcrumb, + NBreadcrumbItem, + NDropdown, + NSpace, + NTooltip, + NAvatar, + NTabs, + NTab, + NTabPane, + NCard, + NRow, + NCol, + NDrawer, + NDrawerContent, + NDivider, + NSwitch, + NBadge, + NAlert, + NElement, + NTag, + NNotificationProvider, + NNumberAnimation, + NProgress, + NDatePicker, + NGrid, + NGridItem, + NList, + NListItem, + NThing, + NDataTable, + NPopover, + NPagination, + NSelect, + NSlider, + NRadioGroup, + NRadio, + NSteps, + NStep, + NInputGroup, + NInputGroupLabel, + NResult, + NDescriptions, + NDescriptionsItem, + NTable, + NInputNumber, + NLoadingBarProvider, + NModal, + NUpload, + NUploadFileList, + NUploadTrigger, + NUploadDragger, + NTree, + NSpin, + NTimeline, + NTimelineItem, + NTimePicker, + NBackTop, + NSkeleton, + NStatistic, + NCarousel, + NScrollbar, + NPopselect, + NCollapse, + NCollapseItem, + NColorPicker, + NWatermark, + NEmpty, + NCollapseTransition +} from 'naive-ui' + +const naive = create({ + components: [ + NA, + NP, + NH1, + NH2, + NH3, + NH4, + NH5, + NCode, + NCountdown, + NText, + NTime, + NEllipsis, + NMessageProvider, + NDialogProvider, + NConfigProvider, + NGradientText, + NInput, + NButton, + NButtonGroup, + NForm, + NFormItem, + NCheckboxGroup, + NCheckbox, + NIcon, + NImage, + NLayout, + NLayoutHeader, + NLayoutContent, + NLayoutFooter, + NLayoutSider, + NMenu, + NBreadcrumb, + NBreadcrumbItem, + NDropdown, + NSpace, + NTooltip, + NAvatar, + NTabs, + NTab, + NTabPane, + NCard, + NRow, + NCol, + NDrawer, + NDrawerContent, + NDivider, + NSwitch, + NBadge, + NAlert, + NElement, + NTag, + NNotificationProvider, + NNumberAnimation, + NProgress, + NDatePicker, + NGrid, + NGridItem, + NList, + NListItem, + NThing, + NDataTable, + NPopover, + NPagination, + NSlider, + NSelect, + NRadioGroup, + NRadio, + NSteps, + NStep, + NInputGroup, + NInputGroupLabel, + NResult, + NDescriptions, + NDescriptionsItem, + NTable, + NInputNumber, + NLoadingBarProvider, + NModal, + NUpload, + NUploadFileList, + NUploadTrigger, + NUploadDragger, + NTree, + NSpin, + NTimeline, + NTimelineItem, + NTimePicker, + NBackTop, + NSkeleton, + NStatistic, + NCarousel, + NScrollbar, + NPopselect, + NCollapse, + NCollapseItem, + NColorPicker, + NWatermark, + NEmpty, + NCollapseTransition + ] +}) + +export function setupNaive(app: App) { + app.use(naive) +} diff --git a/grailed-ui-go-view/src/router/base.ts b/grailed-ui-go-view/src/router/base.ts new file mode 100644 index 0000000..8e4202b --- /dev/null +++ b/grailed-ui-go-view/src/router/base.ts @@ -0,0 +1,80 @@ +import { RouteRecordRaw } from 'vue-router' +import type { AppRouteRecordRaw } from '@/router/types'; +import { ErrorPage404, ErrorPage403, ErrorPage500, Layout, RedirectHome, RedirectUnPublish } from '@/router/constant'; +import { PageEnum } from '@/enums/pageEnum' +import { GoReload } from '@/components/GoReload' + + +export const LoginRoute: RouteRecordRaw = { + path: PageEnum.BASE_LOGIN, + name: PageEnum.BASE_LOGIN_NAME, + component: () => import('@/views/login/index.vue'), + meta: { + title: '登录', + }, +}; + +export const HttpErrorPage: RouteRecordRaw[] = [ + { + path: '/error/404', + name: PageEnum.ERROR_PAGE_NAME_404, + component: ErrorPage404, + meta: { + title: PageEnum.ERROR_PAGE_NAME_404, + }, + }, + { + path: '/error/403', + name: PageEnum.ERROR_PAGE_NAME_403, + component: ErrorPage403, + meta: { + title: PageEnum.ERROR_PAGE_NAME_403, + }, + }, + { + path: '/error/500', + name: PageEnum.ERROR_PAGE_NAME_500, + component: ErrorPage500, + meta: { + title: PageEnum.ERROR_PAGE_NAME_500, + }, + }, +] + +export const ErrorPageRoute: AppRouteRecordRaw = { + path: '/:path(.*)*', + name: 'ErrorPage', + component: ErrorPage404, + meta: { + title: PageEnum.ERROR_PAGE_NAME_404, + hideBreadcrumb: true, + } +}; + +export const ReloadRoute: AppRouteRecordRaw = { + path: PageEnum.RELOAD, + name: PageEnum.RELOAD_NAME, + component: GoReload, + meta: { + title: PageEnum.RELOAD_NAME, + }, +} + +export const RedirectRoute: RouteRecordRaw[] = [ + { + path: PageEnum.REDIRECT, + name: PageEnum.REDIRECT_NAME, + component: RedirectHome, + meta: { + title: PageEnum.REDIRECT_NAME, + }, + }, + { + path: PageEnum.REDIRECT_UN_PUBLISH, + name: PageEnum.REDIRECT_UN_PUBLISH_NAME, + component: RedirectUnPublish, + meta: { + title: PageEnum.REDIRECT_UN_PUBLISH_NAME, + }, + }, +] diff --git a/grailed-ui-go-view/src/router/constant.ts b/grailed-ui-go-view/src/router/constant.ts new file mode 100644 index 0000000..d540b6f --- /dev/null +++ b/grailed-ui-go-view/src/router/constant.ts @@ -0,0 +1,13 @@ +export const ErrorPage404 = () => import('@/views/exception/404.vue'); + +export const ErrorPage403 = () => import('@/views/exception/403.vue'); + +export const ErrorPage500 = () => import('@/views/exception/500.vue'); + +export const RedirectHome = () => import('@/views/redirect/index.vue'); + +export const RedirectUnPublish = () => import('@/views/redirect/UnPublish.vue'); + +export const Layout = () => import('@/layout/index.vue'); + +export const ParentLayout = () => import('@/layout/parentLayout.vue'); diff --git a/grailed-ui-go-view/src/router/index.ts b/grailed-ui-go-view/src/router/index.ts new file mode 100644 index 0000000..c8977dd --- /dev/null +++ b/grailed-ui-go-view/src/router/index.ts @@ -0,0 +1,44 @@ +import type { App } from 'vue' +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' +import { createRouterGuards } from './router-guards' +import { PageEnum } from '@/enums/pageEnum' +import { HttpErrorPage, LoginRoute, ReloadRoute, RedirectRoute } from '@/router/base' +import { Layout } from '@/router/constant' + +import modules from '@/router/modules' + +const RootRoute: Array = [ + { + path: '/', + name: 'Root', + redirect: PageEnum.BASE_HOME, + component: Layout, + meta: { + title: 'Root', + }, + children: [ + ...HttpErrorPage, + ...RedirectRoute, + modules.projectRoutes, + modules.chartRoutes, + modules.previewRoutes, + modules.editRoutes + ] + } +] + + +export const constantRouter: any[] = [LoginRoute, ...RootRoute, ReloadRoute]; + +const router = createRouter({ + history: createWebHashHistory(''), + routes: constantRouter, + strict: true, +}) + +export function setupRouter(app: App) { + app.use(router); + // 创建路由守卫 + createRouterGuards(router) +} +export default router diff --git a/grailed-ui-go-view/src/router/modules/chart.route.ts b/grailed-ui-go-view/src/router/modules/chart.route.ts new file mode 100644 index 0000000..c910767 --- /dev/null +++ b/grailed-ui-go-view/src/router/modules/chart.route.ts @@ -0,0 +1,21 @@ +import { RouteRecordRaw } from 'vue-router' +import { ChartEnum } from '@/enums/pageEnum' + +// 引入路径 +const importPath = { + 'ChartEnum.CHART_HOME_NAME': () => import('@/views/chart/index.vue') +} + +const chartRoutes: RouteRecordRaw = { + path: ChartEnum.CHART_HOME, + name: ChartEnum.CHART_HOME_NAME, + component: importPath['ChartEnum.CHART_HOME_NAME'], + meta: { + title: '工作空间', + isRoot: true, + noKeepAlive: true, + } +} + + +export default chartRoutes \ No newline at end of file diff --git a/grailed-ui-go-view/src/router/modules/edit.route.ts b/grailed-ui-go-view/src/router/modules/edit.route.ts new file mode 100644 index 0000000..50b8168 --- /dev/null +++ b/grailed-ui-go-view/src/router/modules/edit.route.ts @@ -0,0 +1,20 @@ +import { RouteRecordRaw } from 'vue-router' +import { EditEnum } from '@/enums/pageEnum' + +// 引入路径 +const importPath = { + [EditEnum.CHART_EDIT_NAME]: () => import('@/views/edit/index.vue') +} + +const chartRoutes: RouteRecordRaw = { + path: EditEnum.CHART_EDIT, + name: EditEnum.CHART_EDIT_NAME, + component: importPath[EditEnum.CHART_EDIT_NAME], + meta: { + title: '编辑', + isRoot: true + } +} + + +export default chartRoutes \ No newline at end of file diff --git a/grailed-ui-go-view/src/router/modules/index.ts b/grailed-ui-go-view/src/router/modules/index.ts new file mode 100644 index 0000000..c134d95 --- /dev/null +++ b/grailed-ui-go-view/src/router/modules/index.ts @@ -0,0 +1,11 @@ +import projectRoutes from './project.router' +import chartRoutes from './chart.route' +import previewRoutes from './preview.route' +import editRoutes from './edit.route' + +export default { + projectRoutes, + chartRoutes, + previewRoutes, + editRoutes +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/router/modules/preview.route.ts b/grailed-ui-go-view/src/router/modules/preview.route.ts new file mode 100644 index 0000000..ae3d919 --- /dev/null +++ b/grailed-ui-go-view/src/router/modules/preview.route.ts @@ -0,0 +1,20 @@ +import { RouteRecordRaw } from 'vue-router' +import { PreviewEnum } from '@/enums/pageEnum' + +// 引入路径 +const importPath = { + 'PreviewEnum.CHART_PREVIEW_NAME': () => import('@/views/preview/wrapper.vue') +} + +const chartRoutes: RouteRecordRaw = { + path: PreviewEnum.CHART_PREVIEW, + name: PreviewEnum.CHART_PREVIEW_NAME, + component: importPath['PreviewEnum.CHART_PREVIEW_NAME'], + meta: { + title: '预览', + isRoot: true + } +} + + +export default chartRoutes \ No newline at end of file diff --git a/grailed-ui-go-view/src/router/modules/project.router.ts b/grailed-ui-go-view/src/router/modules/project.router.ts new file mode 100644 index 0000000..45f51f1 --- /dev/null +++ b/grailed-ui-go-view/src/router/modules/project.router.ts @@ -0,0 +1,49 @@ +import { RouteRecordRaw } from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' + +// 引入路径 +const importPath = { + 'PageEnum.BASE_HOME_NAME': () => import('@/views/project/index.vue'), + 'PageEnum.BASE_HOME_ITEMS_NAME': () => import('@/views/project/items/index.vue'), + 'PageEnum.BASE_HOME_TEMPLATE_NAME': () => import('@/views/project/mtTemplate/index.vue'), + 'PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME': () => import('@/views/project/templateMarket/index.vue') +} + +const projectRoutes: RouteRecordRaw = { + path: PageEnum.BASE_HOME, + name: PageEnum.BASE_HOME_NAME, + component: importPath['PageEnum.BASE_HOME_NAME'], + redirect: PageEnum.BASE_HOME_ITEMS, + meta: { + title: '项目', + isRoot: true + }, + children: [ + { + path: PageEnum.BASE_HOME_ITEMS, + name: PageEnum.BASE_HOME_ITEMS_NAME, + component: importPath['PageEnum.BASE_HOME_ITEMS_NAME'], + meta: { + title: '我的项目' + } + }, + { + path: PageEnum.BASE_HOME_TEMPLATE, + name: PageEnum.BASE_HOME_TEMPLATE_NAME, + component: importPath['PageEnum.BASE_HOME_TEMPLATE_NAME'], + meta: { + title: '我的模板' + } + }, + { + path: PageEnum.BASE_HOME_TEMPLATE_MARKET, + name: PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME, + component: importPath['PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME'], + meta: { + title: '模板市场' + } + } + ] +} + +export default projectRoutes diff --git a/grailed-ui-go-view/src/router/router-guards.ts b/grailed-ui-go-view/src/router/router-guards.ts new file mode 100644 index 0000000..bdaa7fb --- /dev/null +++ b/grailed-ui-go-view/src/router/router-guards.ts @@ -0,0 +1,40 @@ +import { Router } from 'vue-router'; +import { PageEnum, PreviewEnum } from '@/enums/pageEnum' +import { loginCheck } from '@/utils' + +// 路由白名单 +const routerAllowList = [ + // 登录 + PageEnum.BASE_LOGIN_NAME, + // 预览 + PreviewEnum.CHART_PREVIEW_NAME +] + +export function createRouterGuards(router: Router) { + // 前置 + router.beforeEach(async (to, from, next) => { + const Loading = window['$loading']; + Loading && Loading.start(); + const isErrorPage = router.getRoutes().findIndex((item) => item.name === to.name); + if (isErrorPage === -1) { + next({ name: PageEnum.ERROR_PAGE_NAME_404 }) + } + + // @ts-ignore + if (!routerAllowList.includes(to.name) && !loginCheck()) { + next({ name: PageEnum.BASE_LOGIN_NAME }) + } + next() + }) + + router.afterEach((to, _, failure) => { + const Loading = window['$loading']; + document.title = (to?.meta?.title as string) || document.title; + Loading && Loading.finish(); + }) + + // 错误 + router.onError((error) => { + console.log(error, '路由错误'); + }); +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/router/types.ts b/grailed-ui-go-view/src/router/types.ts new file mode 100644 index 0000000..59c3b14 --- /dev/null +++ b/grailed-ui-go-view/src/router/types.ts @@ -0,0 +1,40 @@ +import type { RouteRecordRaw, RouteMeta } from 'vue-router' +import { defineComponent } from 'vue' + +declare type Recordable = Record + +export type Component = + | ReturnType + | (() => Promise) + | (() => Promise) + +// @ts-ignore +export interface AppRouteRecordRaw extends Omit { + name: string + meta: RouteMeta + component?: Component | string + components?: Component + children?: AppRouteRecordRaw[] + props?: Recordable + fullPath?: string +} + +export interface Meta { + // 名称 + title: string + // 是否忽略权限 + ignoreAuth?: boolean + permissions?: string[] + // 是否不缓存 + noKeepAlive?: boolean + // 是否固定在tab上 + affix?: boolean + // tab上的图标 + icon?: string + // 跳转地址 + frameSrc?: string + // 外链跳转地址 + externalLink?: string + //隐藏 + hidden?: boolean +} diff --git a/grailed-ui-go-view/src/settings/animations/index.ts b/grailed-ui-go-view/src/settings/animations/index.ts new file mode 100644 index 0000000..65106a7 --- /dev/null +++ b/grailed-ui-go-view/src/settings/animations/index.ts @@ -0,0 +1,57 @@ +export const animations = [ + { + label: '强调动画', + children: [ + { label: '弹跳', value: 'bounce' }, + { label: '闪烁', value: 'flash' }, + { label: '放大缩小', value: 'pulse' }, + { label: '放大缩小弹簧', value: 'rubberBand' }, + { label: '左右晃动', value: 'headShake' }, + { label: '左右扇形摇摆', value: 'swing' }, + { label: '放大晃动缩小', value: 'tada' }, + { label: '扇形摇摆', value: 'wobble' }, + { label: '左右上下晃动', value: 'jello' }, + ] + }, + { + label: '移入动画', + children: [ + { label: '渐显', value: 'fadeIn' }, + { label: '向右进入', value: 'fadeInLeft' }, + { label: '向左进入', value: 'fadeInRight' }, + { label: '向上进入', value: 'fadeInUp' }, + { label: '向下进入', value: 'fadeInDown' }, + { label: '向右长距进入', value: 'fadeInLeftBig' }, + { label: '向左长距进入', value: 'fadeInRightBig' }, + { label: '向上长距进入', value: 'fadeInUpBig' }, + { label: '向下长距进入', value: 'fadeInDownBig' }, + { label: '旋转进入', value: 'rotateIn' }, + { label: '左顺时针旋转', value: 'rotateInDownLeft' }, + { label: '右逆时针旋转', value: 'rotateInDownRight' }, + { label: '左逆时针旋转', value: 'rotateInUpLeft' }, + { label: '右逆时针旋转', value: 'rotateInUpRight' }, + { label: '弹入', value: 'bounceIn' }, + { label: '向右弹入', value: 'bounceInLeft' }, + { label: '向左弹入', value: 'bounceInRight' }, + { label: '向上弹入', value: 'bounceInUp' }, + { label: '向下弹入', value: 'bounceInDown' }, + { label: '光速从右进入', value: 'lightSpeedInRight' }, + { label: '光速从左进入', value: 'lightSpeedInLeft' }, + { label: '光速从右退出', value: 'lightSpeedOutRight' }, + { label: '光速从左退出', value: 'lightSpeedOutLeft' }, + { label: 'Y轴旋转', value: 'flip' }, + { label: '中心X轴旋转', value: 'flipInX' }, + { label: '中心Y轴旋转', value: 'flipInY' }, + { label: '左长半径旋转', value: 'rollIn' }, + { label: '由小变大进入', value: 'zoomIn' }, + { label: '左变大进入', value: 'zoomInLeft' }, + { label: '右变大进入', value: 'zoomInRight' }, + { label: '向上变大进入', value: 'zoomInUp' }, + { label: '向下变大进入', value: 'zoomInDown' }, + { label: '向右滑动展开', value: 'slideInLeft' }, + { label: '向左滑动展开', value: 'slideInRight' }, + { label: '向上滑动展开', value: 'slideInUp' }, + { label: '向下滑动展开', value: 'slideInDown' } + ] + } +] diff --git a/grailed-ui-go-view/src/settings/chartThemes/global.theme.json b/grailed-ui-go-view/src/settings/chartThemes/global.theme.json new file mode 100644 index 0000000..1c099af --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/global.theme.json @@ -0,0 +1,101 @@ +{ + "title": { + "show": true, + "textStyle": { + "color": "#BFBFBF", + "fontSize": 18 + }, + "subtextStyle": { + "color": "#A2A2A2", + "fontSize": 14 + } + }, + "xAxis": { + "show": true, + "name": "", + "nameGap": 15, + "nameTextStyle": { + "color": "#B9B8CE", + "fontSize": 12 + }, + "inverse": false, + "axisLabel": { + "show": true, + "fontSize": 12, + "color": "#B9B8CE", + "rotate": 0 + }, + "position": "bottom", + "axisLine": { + "show": true, + "lineStyle": { + "color": "#B9B8CE", + "width": 1 + }, + "onZero": true + }, + "axisTick": { + "show": true, + "length": 5 + }, + "splitLine": { + "show": false, + "lineStyle": { + "color": "#484753", + "width": 1, + "type": "solid" + } + } + }, + "yAxis": { + "show": true, + "name": "", + "nameGap": 15, + "nameTextStyle": { + "color": "#B9B8CE", + "fontSize": 12 + }, + "inverse": false, + "axisLabel": { + "show": true, + "fontSize": 12, + "color": "#B9B8CE", + "rotate": 0 + }, + "position": "left", + "axisLine": { + "show": true, + "lineStyle": { + "color": "#B9B8CE", + "width": 1 + }, + "onZero": true + }, + "axisTick": { + "show": true, + "length": 5 + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": "#484753", + "width": 1, + "type": "solid" + } + } + }, + "legend": { + "show": true, + "top": "5%", + "textStyle": { + "color": "#B9B8CE" + } + }, + "grid": { + "show": false, + "left": "10%", + "top": "60", + "right": "10%", + "bottom": "60" + } +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/index.ts b/grailed-ui-go-view/src/settings/chartThemes/index.ts new file mode 100644 index 0000000..d066d85 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/index.ts @@ -0,0 +1,91 @@ +import customed from './themes/customed.json' +import dark from './themes/dark.json' +import chalk from './themes/chalk.json' +import essos from './themes/essos.json' +import macarons from './themes/macarons.json' +import purplePassion from './themes/purple-passion.json' +import roma from './themes/roma.json' +import shine from './themes/shine.json' +import vintage from './themes/vintage.json' +import walden from './themes/walden.json' +import westeros from './themes/westeros.json' +import wonderland from './themes/wonderland.json' +// 默认主题详细配置 +import themeJson from './global.theme.json' + +export const chartColors = { + dark, + customed, + macarons, + walden, + purplePassion, + vintage, + chalk, + westeros, + wonderland, + essos, + shine, + roma +} + +// 默认主题 +export const defaultTheme = 'dark' + +// 主题色列表 +export type ChartColorsNameType = keyof typeof chartColorsName +export const chartColorsName = { + dark: '明亮', + customed: '暗淡', + macarons: '马卡龙', + walden: '蓝绿', + purplePassion: '深紫', + vintage: '复古', + chalk: '粉青', + westeros: '灰粉', + wonderland: '青草', + essos: '橘红', + shine: '深色', + roma: '罗马红' +} + +// 主题色列表 +export const chartColorsshow = { + dark: 'linear-gradient(to right, #4992ff 0%, #7cffb2 100%)', + customed: 'linear-gradient(to right, #5470c6 0%, #91cc75 100%)', + macarons: 'linear-gradient(to right, #2ec7c9 0%, #b6a2de 100%)', + walden: 'linear-gradient(to right, #3fb1e3 0%, #6be6c1 100%)', + purplePassion: 'linear-gradient(to right, #9b8bba 0%, #e098c7 100%)', + vintage: 'linear-gradient(to right, #d87c7c 0%, #919e8b 100%)', + chalk: 'linear-gradient(to right, #fc97af 0%, #87f7cf 100%)', + westeros: 'linear-gradient(to right, #516b91 0%, #edafda 100%)', + wonderland: 'linear-gradient(to right, #4ea397 0%, #22c3aa 100%)', + essos: 'linear-gradient(to right, #893448 0%, #d95850 100%)', + shine: 'linear-gradient(to right, #c12e34 0%, #0098d9 100%)', + roma: 'linear-gradient(to right, #e01f54 0%, #5e4ea5 100%)' +} +// 渐变主题色列表(主色1、主色2、阴影、渐变1、渐变2) +export const chartColorsSearch = { + dark: ['#4992ff', '#7cffb2', 'rgba(68, 181, 226, 0.3)', 'rgba(73, 146, 255, 0.5)', 'rgba(124, 255, 178, 0.5)'], + customed: ['#5470c6', '#91cc75', 'rgba(84, 112, 198, 0.5)', 'rgba(84, 112, 198, 0.5)', 'rgba(145, 204, 117, 0.5)'], + macarons: ['#2ec7c9', '#b6a2de', 'rgba(182, 162, 222, 0.3)', 'rgba(46, 199, 201, 0.5)', 'rgba(182, 162, 222, 0.5)'], + + walden: ['#3fb1e3', '#6be6c1', 'rgba(68, 181, 226, 0.3)', 'rgba(63, 177, 227, 0.5)', 'rgba(107, 230, 193, 0.5)'], + purplePassion: ['#9b8bba', '#e098c7', 'rgba(182, 162, 222, 0.3)', 'rgba(155, 139, 186, 0.5)', 'rgba(237, 175, 218, 0.5)'], + vintage: ['#d87c7c', '#919e8b', 'rgba(182, 162, 222, 0.3)', 'rgba(216, 124, 124, 0.5)', 'rgba(145, 158, 139, 0.5)'], + + chalk: ['#fc97af', '#87f7cf', 'rgba(135, 247, 207, 0.3)', 'rgba(252, 151, 175, 0.5)', 'rgba(135, 247, 207, 0.5)'], + westeros: ['#516b91', '#edafda', 'rgba(81, 107, 145, 0.3)', 'rgba(81, 107, 145, 0.5)', 'rgba(89, 196, 230, 0.5)'], + wonderland: ['#4ea397', '#22c3aa', 'rgba(68, 181, 226, 0.3)', 'rgba(78, 163, 151, 0.5)', 'rgba(34, 195, 170, 0.5)'], + + essos: ['#893448', '#d95850', 'rgba(137, 52, 72, 0.3)', 'rgba(137, 52, 72, 0.5)', 'rgba(217, 88, 80, 0.5)'], + shine: ['#c12e34', '#0098d9', 'rgba(137, 52, 72, 0.3)', 'rgba(193, 46, 52, 0.5)', 'rgba(230, 182, 0, 0.5)'], + roma: ['#e01f54', '#5e4ea5', 'rgba(137, 52, 72, 0.3)', 'rgba(224, 31, 84, 0.5)', 'rgba(94, 78, 165, 0.5)'], +} + +// 默认主题详细配置 +type ThemeJsonType = typeof themeJson +export interface GlobalThemeJsonType extends Partial { + dataset?: any, + [T:string]: any +} +export const globalThemeJson = {...themeJson, dataset: null,} diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/chalk.json b/grailed-ui-go-view/src/settings/chartThemes/themes/chalk.json new file mode 100644 index 0000000..09ac926 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/chalk.json @@ -0,0 +1,12 @@ +{ + "color": [ + "#fc97af", + "#87f7cf", + "#f7f494", + "#72ccff", + "#f7c5a0", + "#d4a4eb", + "#d2f5a6", + "#76f2f2" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/customed.json b/grailed-ui-go-view/src/settings/chartThemes/themes/customed.json new file mode 100644 index 0000000..d29733a --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/customed.json @@ -0,0 +1,13 @@ +{ + "color": [ + "#5470c6", + "#91cc75", + "#fac858", + "#ee6666", + "#73c0de", + "#3ba272", + "#fc8452", + "#9a60b4", + "#ea7ccc" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/dark.json b/grailed-ui-go-view/src/settings/chartThemes/themes/dark.json new file mode 100644 index 0000000..59126d9 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/dark.json @@ -0,0 +1,13 @@ +{ + "color": [ + "#4992ff", + "#7cffb2", + "#fddd60", + "#ff6e76", + "#58d9f9", + "#05c091", + "#ff8a45", + "#8d48e3", + "#dd79ff" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/essos.json b/grailed-ui-go-view/src/settings/chartThemes/themes/essos.json new file mode 100644 index 0000000..18823d4 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/essos.json @@ -0,0 +1,10 @@ +{ + "color": [ + "#893448", + "#d95850", + "#eb8146", + "#ffb248", + "#f2d643", + "#ebdba4" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/macarons.json b/grailed-ui-go-view/src/settings/chartThemes/themes/macarons.json new file mode 100644 index 0000000..a800789 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/macarons.json @@ -0,0 +1,24 @@ +{ + "color": [ + "#2ec7c9", + "#b6a2de", + "#5ab1ef", + "#ffb980", + "#d87a80", + "#8d98b3", + "#e5cf0d", + "#97b552", + "#95706d", + "#dc69aa", + "#07a2a4", + "#9a7fd1", + "#588dd5", + "#f5994e", + "#c05050", + "#59678c", + "#c9ab00", + "#7eb00a", + "#6f5553", + "#c14089" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/purple-passion.json b/grailed-ui-go-view/src/settings/chartThemes/themes/purple-passion.json new file mode 100644 index 0000000..d96e410 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/purple-passion.json @@ -0,0 +1,10 @@ +{ + "color": [ + "#9b8bba", + "#e098c7", + "#8fd3e8", + "#71669e", + "#cc70af", + "#7cb4cc" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/roma.json b/grailed-ui-go-view/src/settings/chartThemes/themes/roma.json new file mode 100644 index 0000000..2b527f5 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/roma.json @@ -0,0 +1,24 @@ +{ + "color": [ + "#e01f54", + "#5e4ea5", + "#f5e8c8", + "#b8d2c7", + "#c6b38e", + "#a4d8c2", + "#f3d999", + "#d3758f", + "#dcc392", + "#2e4783", + "#82b6e9", + "#ff6347", + "#a092f1", + "#0a915d", + "#eaf889", + "#6699FF", + "#ff6666", + "#3cb371", + "#d5b158", + "#38b6b6" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/shine.json b/grailed-ui-go-view/src/settings/chartThemes/themes/shine.json new file mode 100644 index 0000000..4c4e0f8 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/shine.json @@ -0,0 +1,12 @@ +{ + "color": [ + "#c12e34", + "#e6b600", + "#0098d9", + "#2b821d", + "#005eaa", + "#339ca8", + "#cda819", + "#32a487" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/vintage.json b/grailed-ui-go-view/src/settings/chartThemes/themes/vintage.json new file mode 100644 index 0000000..28190dd --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/vintage.json @@ -0,0 +1,14 @@ +{ + "color": [ + "#d87c7c", + "#919e8b", + "#d7ab82", + "#6e7074", + "#61a0a8", + "#efa18d", + "#787464", + "#cc7e63", + "#724e58", + "#4b565b" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/walden.json b/grailed-ui-go-view/src/settings/chartThemes/themes/walden.json new file mode 100644 index 0000000..2cf15ab --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/walden.json @@ -0,0 +1,10 @@ +{ + "color": [ + "#3fb1e3", + "#6be6c1", + "#626c91", + "#a0a7e6", + "#c4ebad", + "#96dee8" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/westeros.json b/grailed-ui-go-view/src/settings/chartThemes/themes/westeros.json new file mode 100644 index 0000000..257891d --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/westeros.json @@ -0,0 +1,10 @@ +{ + "color": [ + "#516b91", + "#59c4e6", + "#edafda", + "#93b7e3", + "#a5e7f0", + "#cbb0e3" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/chartThemes/themes/wonderland.json b/grailed-ui-go-view/src/settings/chartThemes/themes/wonderland.json new file mode 100644 index 0000000..06c3311 --- /dev/null +++ b/grailed-ui-go-view/src/settings/chartThemes/themes/wonderland.json @@ -0,0 +1,10 @@ +{ + "color": [ + "#4ea397", + "#22c3aa", + "#7bd9a5", + "#d0648a", + "#f58db2", + "#f2b3c9" + ] +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/settings/designColor.json b/grailed-ui-go-view/src/settings/designColor.json new file mode 100644 index 0000000..77ddf15 --- /dev/null +++ b/grailed-ui-go-view/src/settings/designColor.json @@ -0,0 +1,3677 @@ +[ + { + "CMYK": [4, 5, 18, 0], + "RGB": [249, 244, 220], + "hex": "#f9f4dc", + "name": "乳白", + "pinyin": "rubai" + }, + { + "CMYK": [3, 8, 30, 0], + "RGB": [249, 236, 195], + "hex": "#f7e8aa", + "name": "杏仁黄", + "pinyin": "xingrenhuang" + }, + { + "CMYK": [4, 13, 67, 0], + "RGB": [248, 223, 114], + "hex": "#f8df72", + "name": "茉莉黄", + "pinyin": "molihuang" + }, + { + "CMYK": [5, 14, 68, 1], + "RGB": [248, 223, 112], + "hex": "#f8df70", + "name": "麦秆黄", + "pinyin": "maiganhuang" + }, + { + "CMYK": [2, 16, 84, 0], + "RGB": [251, 218, 65], + "hex": "#fbda41", + "name": "油菜花黄", + "pinyin": "youcaihuahuang" + }, + { + "CMYK": [1, 18, 94, 0], + "RGB": [254, 215, 26], + "hex": "#fed71a", + "name": "佛手黄", + "pinyin": "foshouhuang" + }, + { + "CMYK": [3, 16, 50, 0], + "RGB": [247, 222, 152], + "hex": "#f7de98", + "name": "篾黄", + "pinyin": "miehuang" + }, + { + "CMYK": [3, 17, 69, 0], + "RGB": [248, 216, 106], + "hex": "#f8d86a", + "name": "葵扇黄", + "pinyin": "kuishanhuang" + }, + { + "CMYK": [0, 20, 87, 0], + "RGB": [252, 211, 55], + "hex": "#fcd337", + "name": "柠檬黄", + "pinyin": "ningmenghuang" + }, + { + "CMYK": [0, 20, 95, 0], + "RGB": [252, 210, 23], + "hex": "#fcd217", + "name": "金瓜黄", + "pinyin": "jinguahuang" + }, + { + "CMYK": [0, 21, 94, 0], + "RGB": [254, 209, 16], + "hex": "#ffd111", + "name": "藤黄", + "pinyin": "tenghuang" + }, + { + "CMYK": [2, 16, 39, 0], + "RGB": [246, 222, 173], + "hex": "#f6dead", + "name": "酪黄", + "pinyin": "laohuang" + }, + { + "CMYK": [1, 21, 70, 0], + "RGB": [249, 211, 103], + "hex": "#f9d367", + "name": "淡密黄", + "pinyin": "danmihuang" + }, + { + "CMYK": [0, 23, 88, 0], + "RGB": [251, 205, 49], + "hex": "#fbcd31", + "name": "大豆黄", + "pinyin": "dadouhuang" + }, + { + "CMYK": [0, 24, 94, 0], + "RGB": [252, 203, 22], + "hex": "#fccb16", + "name": "素馨黄", + "pinyin": "suxinhuang" + }, + { + "CMYK": [0, 24, 94, 0], + "RGB": [254, 204, 17], + "hex": "#fecc11", + "name": "向日葵黄", + "pinyin": "xiangrikuihuang" + }, + { + "CMYK": [0, 27, 88, 0], + "RGB": [251, 200, 47], + "hex": "#fbc82f", + "name": "雅梨黄", + "pinyin": "yalihuang" + }, + { + "CMYK": [0, 28, 94, 0], + "RGB": [252, 197, 21], + "hex": "#fcc515", + "name": "黄连黄", + "pinyin": "huanglianhuang" + }, + { + "CMYK": [0, 29, 95, 0], + "RGB": [252, 195, 7], + "hex": "#fcc307", + "name": "金盏黄", + "pinyin": "jinzhanhuang" + }, + { + "CMYK": [0, 32, 52, 0], + "RGB": [248, 195, 135], + "hex": "#f8c387", + "name": "蛋壳黄", + "pinyin": "dankehuang" + }, + { + "CMYK": [0, 32, 52, 0], + "RGB": [247, 193, 115], + "hex": "#f7c173", + "name": "肉色", + "pinyin": "rouse" + }, + { + "CMYK": [0, 35, 89, 0], + "RGB": [251, 185, 41], + "hex": "#fbb929", + "name": "鹅掌黄", + "pinyin": "ezhanghuang" + }, + { + "CMYK": [0, 36, 93, 0], + "RGB": [251, 182, 18], + "hex": "#fbb612", + "name": "鸡蛋黄", + "pinyin": "jidanhuang" + }, + { + "CMYK": [0, 35, 94, 0], + "RGB": [252, 183, 10], + "hex": "#fcb70a", + "name": "鼬黄", + "pinyin": "youhuang" + }, + { + "CMYK": [0, 44, 84, 0], + "RGB": [249, 166, 51], + "hex": "#f9a633", + "name": "榴萼黄", + "pinyin": "liuehuang" + }, + { + "CMYK": [0, 45, 92, 0], + "RGB": [251, 164, 20], + "hex": "#fba414", + "name": "淡橘橙", + "pinyin": "danjucheng" + }, + { + "CMYK": [0, 47, 92, 0], + "RGB": [252, 161, 6], + "hex": "#fca106", + "name": "枇杷黄", + "pinyin": "pipahuang" + }, + { + "CMYK": [0, 47, 92, 0], + "RGB": [252, 161, 4], + "hex": "#fca104", + "name": "橙皮黄", + "pinyin": "chengpihuang" + }, + { + "CMYK": [0, 56, 87, 0], + "RGB": [252, 140, 35], + "hex": "#fc8c23", + "name": "北瓜黄", + "pinyin": "beiguahuang" + }, + { + "CMYK": [0, 54, 92, 0], + "RGB": [250, 142, 22], + "hex": "#f28e16", + "name": "杏黄", + "pinyin": "xinghuang" + }, + { + "CMYK": [0, 51, 91, 0], + "RGB": [255, 153, 0], + "hex": "#ff9900", + "name": "雄黄", + "pinyin": "xionghuang" + }, + { + "CMYK": [0, 56, 91, 0], + "RGB": [251, 139, 5], + "hex": "#fb8b05", + "name": "万寿菊黄", + "pinyin": "wanshoujuhuang" + }, + { + "CMYK": [10, 13, 35, 1], + "RGB": [233, 221, 182], + "hex": "#e9ddb6", + "name": "菊蕾白", + "pinyin": "juleibai" + }, + { + "CMYK": [8, 19, 84, 1], + "RGB": [238, 208, 69], + "hex": "#eed045", + "name": "秋葵黄", + "pinyin": "qiukuihuang" + }, + { + "CMYK": [6, 20, 92, 1], + "RGB": [242, 206, 43], + "hex": "#f2ce2b", + "name": "硫华黄", + "pinyin": "liuhuahuang" + }, + { + "CMYK": [6, 22, 92, 0], + "RGB": [241, 202, 23], + "hex": "#f1ca17", + "name": "柚黄", + "pinyin": "youhuang" + }, + { + "CMYK": [15, 20, 66, 2], + "RGB": [221, 200, 113], + "hex": "#ddc871", + "name": "芒果黄", + "pinyin": "mangguohuang" + }, + { + "CMYK": [14, 22, 85, 2], + "RGB": [223, 194, 67], + "hex": "#dfc243", + "name": "蒿黄", + "pinyin": "haohuang" + }, + { + "CMYK": [12, 24, 95, 2], + "RGB": [226, 192, 39], + "hex": "#e2c027", + "name": "姜黄", + "pinyin": "jianghuang" + }, + { + "CMYK": [11, 25, 99, 1], + "RGB": [228, 191, 17], + "hex": "#e4bf11", + "name": "香蕉黄", + "pinyin": "xiangjiaohuang" + }, + { + "CMYK": [17, 27, 94, 4], + "RGB": [210, 180, 44], + "hex": "#d2b42c", + "name": "草黄", + "pinyin": "caohuang" + }, + { + "CMYK": [17, 29, 100, 4], + "RGB": [210, 177, 22], + "hex": "#d2b116", + "name": "新禾绿", + "pinyin": "xinhelv" + }, + { + "CMYK": [28, 26, 45, 7], + "RGB": [183, 174, 143], + "hex": "#b7ae8f", + "name": "月灰", + "pinyin": "yuehui" + }, + { + "CMYK": [30, 30, 70, 12], + "RGB": [173, 158, 85], + "hex": "#ad9e5f", + "name": "淡灰绿", + "pinyin": "danhuilv" + }, + { + "CMYK": [38, 38, 76, 24], + "RGB": [142, 128, 75], + "hex": "#8e804b", + "name": "草灰绿", + "pinyin": "caohuilv" + }, + { + "CMYK": [36, 42, 100, 29], + "RGB": [136, 115, 34], + "hex": "#887322", + "name": "苔绿", + "pinyin": "tailv" + }, + { + "CMYK": [36, 42, 100, 30], + "RGB": [134, 112, 24], + "hex": "#867018", + "name": "碧螺春绿", + "pinyin": "biluochunlv" + }, + { + "CMYK": [47, 47, 65, 42], + "RGB": [104, 94, 72], + "hex": "#685e48", + "name": "燕羽灰", + "pinyin": "yanyuhui" + }, + { + "CMYK": [46, 47, 69, 42], + "RGB": [105, 94, 69], + "hex": "#695e45", + "name": "蟹壳灰", + "pinyin": "xiekehui" + }, + { + "CMYK": [48, 48, 100, 45], + "RGB": [100, 88, 34], + "hex": "#645822", + "name": "潭水绿", + "pinyin": "tanshuilv" + }, + { + "CMYK": [50, 50, 10, 48], + "RGB": [94, 83, 20], + "hex": "#5e5314", + "name": "橄榄绿", + "pinyin": "ganlanlv" + }, + { + "CMYK": [2, 6, 18, 0], + "RGB": [249, 241, 219], + "hex": "#f9f1db", + "name": "蚌肉白", + "pinyin": "bangroubai" + }, + { + "CMYK": [3, 10, 31, 0], + "RGB": [248, 232, 193], + "hex": "#f8e8c1", + "name": "豆汁黄", + "pinyin": "douzhihuang" + }, + { + "CMYK": [1, 19, 66, 0], + "RGB": [249, 215, 112], + "hex": "#f9d770", + "name": "淡茧黄", + "pinyin": "danjianhuang" + }, + { + "CMYK": [0, 26, 94, 0], + "RGB": [255, 201, 12], + "hex": "#ffc90c", + "name": "乳鸭黄", + "pinyin": "ruyahuang" + }, + { + "CMYK": [5, 11, 22, 0], + "RGB": [242, 230, 206], + "hex": "#f2e6ce", + "name": "荔肉白", + "pinyin": "liroubai" + }, + { + "CMYK": [5, 19, 50, 0], + "RGB": [240, 214, 149], + "hex": "#f0d695", + "name": "象牙黄", + "pinyin": "xiangyahuang" + }, + { + "CMYK": [3, 23, 69, 0], + "RGB": [244, 206, 105], + "hex": "#f4ce69", + "name": "炒米黄", + "pinyin": "chaomihuang" + }, + { + "CMYK": [1, 28, 89, 0], + "RGB": [246, 196, 48], + "hex": "#f6c430", + "name": "鹦鹉冠黄", + "pinyin": "yingwuguanhuang" + }, + { + "CMYK": [0, 30, 95, 0], + "RGB": [249, 193, 22], + "hex": "#f9c116", + "name": "木瓜黄", + "pinyin": "muguahuang" + }, + { + "CMYK": [0, 32, 95, 0], + "RGB": [249, 189, 16], + "hex": "#f9bd10", + "name": "浅烙黄", + "pinyin": "qianlaohuang" + }, + { + "CMYK": [11, 18, 39, 1], + "RGB": [229, 211, 170], + "hex": "#e5d3aa", + "name": "莲子白", + "pinyin": "lianzibai" + }, + { + "CMYK": [5, 35, 99, 0], + "RGB": [232, 176, 4], + "hex": "#e8b004", + "name": "谷黄", + "pinyin": "guhuang" + }, + { + "CMYK": [3, 36, 99, 0], + "RGB": [235, 177, 13], + "hex": "#ebb10d", + "name": "栀子黄", + "pinyin": "zhizihuang" + }, + { + "CMYK": [11, 39, 100, 2], + "RGB": [217, 164, 14], + "hex": "#d9a40e", + "name": "芥黄", + "pinyin": "jiehuang" + }, + { + "CMYK": [28, 27, 43, 8], + "RGB": [181, 170, 144], + "hex": "#b5aa90", + "name": "银鼠灰", + "pinyin": "yinshuhui" + }, + { + "CMYK": [26, 31, 57, 10], + "RGB": [182, 164, 118], + "hex": "#b6a476", + "name": "尘灰", + "pinyin": "chenhui" + }, + { + "CMYK": [21, 43, 100, 11], + "RGB": [183, 141, 18], + "hex": "#b78d12", + "name": "枯绿", + "pinyin": "kulv" + }, + { + "CMYK": [35, 44, 80, 30], + "RGB": [135, 114, 62], + "hex": "#87723e", + "name": "鲛青", + "pinyin": "jiaoqing" + }, + { + "CMYK": [32, 50, 100, 31], + "RGB": [135, 104, 24], + "hex": "#876818", + "name": "粽叶绿", + "pinyin": "zongyelv" + }, + { + "CMYK": [31, 51, 100, 30], + "RGB": [138, 105, 19], + "hex": "#8a6913", + "name": "灰绿", + "pinyin": "huilv" + }, + { + "CMYK": [52, 56, 64, 62], + "RGB": [74, 64, 53], + "hex": "#4a4035", + "name": "鹤灰", + "pinyin": "hehui" + }, + { + "CMYK": [48, 58, 70, 62], + "RGB": [77, 64, 48], + "hex": "#4d4030", + "name": "淡松烟", + "pinyin": "dansongyan" + }, + { + "CMYK": [45, 56, 100, 56], + "RGB": [88, 71, 23], + "hex": "#584717", + "name": "暗海水绿", + "pinyin": "anhaishuilv" + }, + { + "CMYK": [45, 55, 100, 54], + "RGB": [91, 73, 19], + "hex": "#5b4913", + "name": "棕榈绿", + "pinyin": "zonglvlv" + }, + { + "CMYK": [1, 11, 24, 0], + "RGB": [249, 223, 205], + "hex": "#f9e9cd", + "name": "米色", + "pinyin": "mise" + }, + { + "CMYK": [1, 15, 38, 0], + "RGB": [248, 224, 176], + "hex": "#f8e0b0", + "name": "淡肉色", + "pinyin": "danrouse" + }, + { + "CMYK": [0, 23, 59, 0], + "RGB": [249, 210, 125], + "hex": "#f9d27d", + "name": "麦芽糖黄", + "pinyin": "maiyatanghuang" + }, + { + "CMYK": [0, 34, 93, 0], + "RGB": [254, 186, 7], + "hex": "#feba07", + "name": "琥珀黄", + "pinyin": "hupohuang" + }, + { + "CMYK": [1, 31, 79, 0], + "RGB": [243, 191, 76], + "hex": "#f3bf4c", + "name": "甘草黄", + "pinyin": "gancaohuang" + }, + { + "CMYK": [0, 33, 83, 0], + "RGB": [248, 188, 49], + "hex": "#f8bc31", + "name": "初熟杏黄", + "pinyin": "chushuxinghuang" + }, + { + "CMYK": [10, 27, 59, 1], + "RGB": [226, 193, 124], + "hex": "#e2c17c", + "name": "浅驼色", + "pinyin": "qiantuose" + }, + { + "CMYK": [7, 32, 78, 1], + "RGB": [229, 183, 81], + "hex": "#e5b751", + "name": "沙石黄", + "pinyin": "shashihuang" + }, + { + "CMYK": [3, 38, 97, 0], + "RGB": [234, 173, 26], + "hex": "#eaad1a", + "name": "虎皮黄", + "pinyin": "hupihuang" + }, + { + "CMYK": [12, 41, 98, 2], + "RGB": [214, 160, 29], + "hex": "#d6a01d", + "name": "土黄", + "pinyin": "tuhuang" + }, + { + "CMYK": [28, 28, 41, 9], + "RGB": [180, 169, 146], + "hex": "#b4a992", + "name": "百灵鸟灰", + "pinyin": "bailingniaohui" + }, + { + "CMYK": [21, 44, 97, 11], + "RGB": [183, 139, 38], + "hex": "#b78b26", + "name": "山鸡黄", + "pinyin": "shanjihuang" + }, + { + "CMYK": [35, 47, 71, 33], + "RGB": [130, 107, 72], + "hex": "#826b48", + "name": "龟背黄", + "pinyin": "guibeihuang" + }, + { + "CMYK": [34, 52, 85, 35], + "RGB": [128, 99, 50], + "hex": "#806332", + "name": "苍黄", + "pinyin": "canghuang" + }, + { + "CMYK": [32, 56, 96, 34], + "RGB": [129, 95, 37], + "hex": "#815f25", + "name": "莱阳梨黄", + "pinyin": "laiyanglihuang" + }, + { + "CMYK": [31, 57, 100, 33], + "RGB": [131, 94, 29], + "hex": "#835e1d", + "name": "蜴蜊绿", + "pinyin": "yililv" + }, + { + "CMYK": [46, 59, 68, 61], + "RGB": [79, 64, 50], + "hex": "#4f4032", + "name": "松鼠灰", + "pinyin": "songshuhui" + }, + { + "CMYK": [44, 61, 76, 62], + "RGB": [80, 62, 42], + "hex": "#503e2a", + "name": "橄榄灰", + "pinyin": "ganlanhui" + }, + { + "CMYK": [43, 63, 88, 61], + "RGB": [81, 60, 32], + "hex": "#513c20", + "name": "蟹壳绿", + "pinyin": "xiekelv" + }, + { + "CMYK": [42, 64, 94, 60], + "RGB": [83, 60, 27], + "hex": "#533c1b", + "name": "古铜绿", + "pinyin": "gutonglv" + }, + { + "CMYK": [41, 66, 94, 60], + "RGB": [85, 59, 24], + "hex": "#553b18", + "name": "焦茶绿", + "pinyin": "jiaochalv" + }, + { + "CMYK": [1, 7, 13, 0], + "RGB": [251, 242, 227], + "hex": "#fbf2e3", + "name": "粉白", + "pinyin": "fenbai" + }, + { + "CMYK": [1, 12, 22, 0], + "RGB": [249, 232, 208], + "hex": "#f9e8d0", + "name": "落英淡粉", + "pinyin": "luoyingdanfen" + }, + { + "CMYK": [0, 27, 51, 0], + "RGB": [249, 203, 139], + "hex": "#f9cb8b", + "name": "瓜瓤粉", + "pinyin": "guarangfen" + }, + { + "CMYK": [0, 36, 72, 0], + "RGB": [251, 185, 87], + "hex": "#fbb957", + "name": "蜜黄", + "pinyin": "mihuang" + }, + { + "CMYK": [0, 44, 91, 0], + "RGB": [255, 166, 15], + "hex": "#ffa60f", + "name": "金叶黄", + "pinyin": "jinyehuang" + }, + { + "CMYK": [0, 43, 82, 0], + "RGB": [244, 168, 58], + "hex": "#f4a83a", + "name": "金莺黄", + "pinyin": "jinyinghuang" + }, + { + "CMYK": [8, 31, 50, 1], + "RGB": [227, 189, 141], + "hex": "#e3bd8d", + "name": "鹿角棕", + "pinyin": "lujiaozong" + }, + { + "CMYK": [2, 44, 83, 0], + "RGB": [231, 162, 63], + "hex": "#e7a23f", + "name": "凋叶棕", + "pinyin": "diaoyezong" + }, + { + "CMYK": [10, 41, 72, 1], + "RGB": [218, 164, 90], + "hex": "#daa45a", + "name": "玳瑁黄", + "pinyin": "daimaohuang" + }, + { + "CMYK": [7, 45, 82, 1], + "RGB": [222, 158, 68], + "hex": "#de9e44", + "name": "软木黄", + "pinyin": "ruanmuhuang" + }, + { + "CMYK": [6, 51, 95, 1], + "RGB": [220, 145, 35], + "hex": "#dc9123", + "name": "风帆黄", + "pinyin": "fengfanhuang" + }, + { + "CMYK": [19, 44, 75, 7], + "RGB": [192, 147, 81], + "hex": "#c09351", + "name": "桂皮淡棕", + "pinyin": "guipidanzong" + }, + { + "CMYK": [32, 40, 53, 22], + "RGB": [151, 132, 108], + "hex": "#97846c", + "name": "猴毛灰", + "pinyin": "houmaohui" + }, + { + "CMYK": [27, 60, 97, 21], + "RGB": [152, 101, 36], + "hex": "#986524", + "name": "山鸡褐", + "pinyin": "shanjihe" + }, + { + "CMYK": [37, 65, 84, 49], + "RGB": [102, 70, 42], + "hex": "#66462a", + "name": "驼色", + "pinyin": "tuose" + }, + { + "CMYK": [38, 69, 90, 54], + "RGB": [93, 61, 33], + "hex": "#5d3d21", + "name": "茶褐", + "pinyin": "chahe" + }, + { + "CMYK": [37, 74, 96, 55], + "RGB": [92, 55, 25], + "hex": "#5c3719", + "name": "古铜褐", + "pinyin": "gutonghe" + }, + { + "CMYK": [0, 10, 14, 0], + "RGB": [251, 236, 222], + "hex": "#fbecde", + "name": "荷花白", + "pinyin": "hehuabai" + }, + { + "CMYK": [0, 40, 52, 0], + "RGB": [248, 179, 127], + "hex": "#f8b37f", + "name": "玫瑰粉", + "pinyin": "meiguifen" + }, + { + "CMYK": [0, 62, 88, 0], + "RGB": [249, 125, 28], + "hex": "#f97d1c", + "name": "橘橙", + "pinyin": "jucheng" + }, + { + "CMYK": [0, 62, 85, 0], + "RGB": [250, 126, 35], + "hex": "#fa7e23", + "name": "美人焦橙", + "pinyin": "meirenjiaocheng" + }, + { + "CMYK": [0, 28, 25, 0], + "RGB": [247, 205, 188], + "hex": "#f7cdbc", + "name": "润红", + "pinyin": "runhong" + }, + { + "CMYK": [0, 28, 22, 0], + "RGB": [246, 206, 193], + "hex": "#f6cec1", + "name": "淡桃红", + "pinyin": "dantaohong" + }, + { + "CMYK": [0, 53, 65, 0], + "RGB": [240, 148, 93], + "hex": "#f0945d", + "name": "海螺橙", + "pinyin": "hailuocheng" + }, + { + "CMYK": [0, 44, 32, 0], + "RGB": [240, 173, 160], + "hex": "#f0ada0", + "name": "桃红", + "pinyin": "taohong" + }, + { + "CMYK": [0, 45, 34, 0], + "RGB": [238, 170, 156], + "hex": "#eeaa9c", + "name": "颊红", + "pinyin": "jiahong" + }, + { + "CMYK": [0, 49, 41, 0], + "RGB": [238, 160, 140], + "hex": "#eea08c", + "name": "淡罂粟红", + "pinyin": "danyingsuhong" + }, + { + "CMYK": [0, 58, 67, 0], + "RGB": [234, 137, 88], + "hex": "#ea8958", + "name": "晨曦红", + "pinyin": "chenxihong" + }, + { + "CMYK": [0, 65, 80, 0], + "RGB": [242, 118, 53], + "hex": "#f27635", + "name": "蟹壳红", + "pinyin": "xiekehong" + }, + { + "CMYK": [0, 69, 86, 0], + "RGB": [248, 107, 29], + "hex": "#f86b1d", + "name": "金莲花橙", + "pinyin": "jinlianhuacheng" + }, + { + "CMYK": [0, 69, 70, 0], + "RGB": [239, 111, 72], + "hex": "#ef6f48", + "name": "草莓红", + "pinyin": "caomeihong" + }, + { + "CMYK": [0, 72, 82, 0], + "RGB": [239, 99, 43], + "hex": "#ef632b", + "name": "龙睛鱼红", + "pinyin": "longjingyuhong" + }, + { + "CMYK": [0, 81, 84, 0], + "RGB": [241, 68, 29], + "hex": "#f1441d", + "name": "蜻蜓红", + "pinyin": "qingtinghong" + }, + { + "CMYK": [0, 80, 83, 0], + "RGB": [240, 75, 34], + "hex": "#f04b22", + "name": "大红", + "pinyin": "dahong" + }, + { + "CMYK": [0, 80, 85, 0], + "RGB": [242, 72, 27], + "hex": "#f2481b", + "name": "柿红", + "pinyin": "shihong" + }, + { + "CMYK": [0, 80, 85, 0], + "RGB": [243, 71, 24], + "hex": "#f34718", + "name": "榴花红", + "pinyin": "liuhuahong" + }, + { + "CMYK": [0, 83, 87, 0], + "RGB": [244, 62, 6], + "hex": "#f43e06", + "name": "银朱", + "pinyin": "yinzhu" + }, + { + "CMYK": [0, 78, 83, 0], + "RGB": [237, 81, 38], + "hex": "#ed5126", + "name": "朱红", + "pinyin": "zhuhong" + }, + { + "CMYK": [0, 50, 68, 0], + "RGB": [240, 156, 90], + "hex": "#f09c5a", + "name": "鲑鱼红", + "pinyin": "guiyuhong" + }, + { + "CMYK": [5, 69, 87, 0], + "RGB": [242, 123, 31], + "hex": "#f26b1f", + "name": "金黄", + "pinyin": "jinhuang" + }, + { + "CMYK": [7, 52, 71, 1], + "RGB": [217, 145, 86], + "hex": "#d99156", + "name": "鹿皮褐", + "pinyin": "lupihe" + }, + { + "CMYK": [4, 57, 82, 1], + "RGB": [219, 133, 64], + "hex": "#db8540", + "name": "醉瓜肉", + "pinyin": "zuiguarou" + }, + { + "CMYK": [0, 64, 93, 0], + "RGB": [222, 118, 34], + "hex": "#de7622", + "name": "麂棕", + "pinyin": "jizong" + }, + { + "CMYK": [22, 28, 34, 6], + "RGB": [193, 178, 163], + "hex": "#c1b2a3", + "name": "淡银灰", + "pinyin": "danyinhui" + }, + { + "CMYK": [18, 57, 76, 6], + "RGB": [190, 126, 74], + "hex": "#be7e4a", + "name": "淡赭", + "pinyin": "danzhe" + }, + { + "CMYK": [14, 69, 100, 4], + "RGB": [193, 101, 26], + "hex": "#c1651a", + "name": "槟榔综", + "pinyin": "binglangzong" + }, + { + "CMYK": [34, 42, 46, 23], + "RGB": [145, 128, 114], + "hex": "#918072", + "name": "银灰", + "pinyin": "yinhui" + }, + { + "CMYK": [42, 40, 46, 20], + "RGB": [154, 136, 120], + "hex": "#9a8878", + "name": "海鸥灰", + "pinyin": "haiouhui" + }, + { + "CMYK": [27, 69, 85, 22], + "RGB": [148, 88, 51], + "hex": "#945833", + "name": "淡咖啡", + "pinyin": "dankafei" + }, + { + "CMYK": [26, 76, 97, 20], + "RGB": [150, 77, 34], + "hex": "#964d22", + "name": "岩石棕", + "pinyin": "yanshizong" + }, + { + "CMYK": [25, 80, 100, 20], + "RGB": [149, 68, 22], + "hex": "#954416", + "name": "芒果棕", + "pinyin": "mangguozong" + }, + { + "CMYK": [39, 60, 58, 51], + "RGB": [98, 73, 65], + "hex": "#624941", + "name": "石板灰", + "pinyin": "shibanhui" + }, + { + "CMYK": [38, 63, 63, 50], + "RGB": [100, 72, 61], + "hex": "#64483d", + "name": "珠母灰", + "pinyin": "zhumuhui" + }, + { + "CMYK": [32, 83, 96, 41], + "RGB": [113, 54, 29], + "hex": "#71361d", + "name": "丁香棕", + "pinyin": "dingxiangzong" + }, + { + "CMYK": [30, 87, 100, 38], + "RGB": [117, 49, 23], + "hex": "#753117", + "name": "咖啡", + "pinyin": "kafei" + }, + { + "CMYK": [30, 89, 100, 39], + "RGB": [115, 46, 18], + "hex": "#732e12", + "name": "筍皮棕", + "pinyin": "sunpizong" + }, + { + "CMYK": [0, 72, 86, 0], + "RGB": [252, 99, 21], + "hex": "#fc6315", + "name": "燕颔红", + "pinyin": "yanhanhong" + }, + { + "CMYK": [3, 38, 39, 0], + "RGB": [232, 180, 154], + "hex": "#e8b49a", + "name": "玉粉红", + "pinyin": "yufenhong" + }, + { + "CMYK": [0, 70, 87, 0], + "RGB": [228, 104, 40], + "hex": "#e46828", + "name": "金驼", + "pinyin": "jintuo" + }, + { + "CMYK": [0, 76, 97, 0], + "RGB": [216, 89, 22], + "hex": "#d85916", + "name": "铁棕", + "pinyin": "tiezong" + }, + { + "CMYK": [23, 35, 38, 10], + "RGB": [183, 160, 145], + "hex": "#b7a091", + "name": "蛛网灰", + "pinyin": "zhuwanghui" + }, + { + "CMYK": [16, 77, 100, 6], + "RGB": [183, 81, 29], + "hex": "#b7511d", + "name": "淡可可棕", + "pinyin": "dankekezong" + }, + { + "CMYK": [31, 63, 66, 31], + "RGB": [139, 97, 77], + "hex": "#8b614d", + "name": "中红灰", + "pinyin": "zhonghonghui" + }, + { + "CMYK": [28, 76, 82, 26], + "RGB": [140, 75, 49], + "hex": "#8c4b31", + "name": "淡土黄", + "pinyin": "dantuhuang" + }, + { + "CMYK": [28, 83, 92, 28], + "RGB": [135, 61, 36], + "hex": "#873d24", + "name": "淡豆沙", + "pinyin": "dandousha" + }, + { + "CMYK": [27, 85, 98, 27], + "RGB": [136, 58, 30], + "hex": "#883a1e", + "name": "椰壳棕", + "pinyin": "yekezong" + }, + { + "CMYK": [40, 64, 61, 56], + "RGB": [91, 66, 58], + "hex": "#5b423a", + "name": "淡铁灰", + "pinyin": "dantiehui" + }, + { + "CMYK": [37, 72, 72, 52], + "RGB": [96, 61, 48], + "hex": "#603d30", + "name": "中灰驼", + "pinyin": "zhonghuituo" + }, + { + "CMYK": [34, 82, 85, 47], + "RGB": [103, 52, 36], + "hex": "#673424", + "name": "淡栗棕", + "pinyin": "danlizong" + }, + { + "CMYK": [33, 89, 92, 48], + "RGB": [101, 43, 28], + "hex": "#652b1c", + "name": "可可棕", + "pinyin": "kekezong" + }, + { + "CMYK": [32, 90, 95, 45], + "RGB": [105, 42, 27], + "hex": "#692a1b", + "name": "柞叶棕", + "pinyin": "zhayezong" + }, + { + "CMYK": [0, 53, 59, 0], + "RGB": [251, 153, 104], + "hex": "#fb9968", + "name": "野蔷薇红", + "pinyin": "yeqiangweihong" + }, + { + "CMYK": [0, 65, 79, 0], + "RGB": [252, 121, 48], + "hex": "#fc7930", + "name": "菠萝红", + "pinyin": "boluohong" + }, + { + "CMYK": [2, 31, 31, 0], + "RGB": [237, 195, 174], + "hex": "#edc3ae", + "name": "藕荷", + "pinyin": "ouhe" + }, + { + "CMYK": [0, 70, 91, 0], + "RGB": [225, 103, 35], + "hex": "#e16723", + "name": "陶瓷红", + "pinyin": "taocihong" + }, + { + "CMYK": [16, 23, 27, 2], + "RGB": [212, 196, 183], + "hex": "#d4c4b7", + "name": "晓灰", + "pinyin": "xiaohui" + }, + { + "CMYK": [9, 64, 78, 1], + "RGB": [207, 117, 67], + "hex": "#cf7543", + "name": "余烬红", + "pinyin": "yujinhong" + }, + { + "CMYK": [8, 72, 93, 1], + "RGB": [205, 98, 39], + "hex": "#cd6227", + "name": "火砖红", + "pinyin": "huozhuanhong" + }, + { + "CMYK": [22, 64, 71, 12], + "RGB": [170, 106, 76], + "hex": "#aa6a4c", + "name": "火泥棕", + "pinyin": "huonizong" + }, + { + "CMYK": [20, 76, 92, 9], + "RGB": [166, 82, 44], + "hex": "#a6522c", + "name": "绀红", + "pinyin": "ganhong" + }, + { + "CMYK": [31, 79, 77, 37], + "RGB": [119, 61, 49], + "hex": "#773d31", + "name": "橡树棕", + "pinyin": "xiangshuzong" + }, + { + "CMYK": [45, 68, 57, 66], + "RGB": [72, 51, 50], + "hex": "#483332", + "name": "海报灰", + "pinyin": "haibaohui" + }, + { + "CMYK": [41, 76, 64, 65], + "RGB": [175, 46, 43], + "hex": "#4b2e2b", + "name": "玫瑰灰", + "pinyin": "meiguihui" + }, + { + "CMYK": [41, 84, 71, 67], + "RGB": [72, 37, 34], + "hex": "#482522", + "name": "火山棕", + "pinyin": "huoshanzong" + }, + { + "CMYK": [40, 92, 78, 66], + "RGB": [72, 30, 28], + "hex": "#481e1c", + "name": "豆沙", + "pinyin": "dousha" + }, + { + "CMYK": [0, 9, 12, 0], + "RGB": [251, 238, 226], + "hex": "#fbeee2", + "name": "淡米粉", + "pinyin": "danmifen" + }, + { + "CMYK": [0, 19, 19, 0], + "RGB": [246, 220, 206], + "hex": "#f6dcce", + "name": "初桃粉红", + "pinyin": "chutaofenhong" + }, + { + "CMYK": [0, 27, 27, 0], + "RGB": [247, 207, 186], + "hex": "#f7cfba", + "name": "介壳淡粉红", + "pinyin": "jieqiaodanfenhong" + }, + { + "CMYK": [0, 43, 43, 0], + "RGB": [246, 173, 143], + "hex": "#f6ad8f", + "name": "淡藏花红", + "pinyin": "dancanghuahong" + }, + { + "CMYK": [0, 58, 61, 0], + "RGB": [246, 140, 96], + "hex": "#f68c60", + "name": "瓜瓤红", + "pinyin": "guaranghong" + }, + { + "CMYK": [0, 67, 74, 0], + "RGB": [249, 114, 61], + "hex": "#f9723d", + "name": "芙蓉红", + "pinyin": "furonghong" + }, + { + "CMYK": [0, 74, 85, 0], + "RGB": [250, 93, 25], + "hex": "#fa5d19", + "name": "莓酱红", + "pinyin": "meijianghong" + }, + { + "CMYK": [0, 62, 66, 0], + "RGB": [238, 128, 85], + "hex": "#ee8055", + "name": "法螺红", + "pinyin": "faluohong" + }, + { + "CMYK": [4, 82, 99, 0], + "RGB": [207, 72, 19], + "hex": "#cf4813", + "name": "落霞红", + "pinyin": "luoxiahong" + }, + { + "CMYK": [21, 43, 43, 9], + "RGB": [184, 148, 133], + "hex": "#b89485", + "name": "淡玫瑰灰", + "pinyin": "danmeiguihui" + }, + { + "CMYK": [18, 80, 92, 7], + "RGB": [177, 75, 40], + "hex": "#b14b28", + "name": "蟹蝥红", + "pinyin": "xiemaohong" + }, + { + "CMYK": [27, 91, 95, 28], + "RGB": [134, 48, 32], + "hex": "#863020", + "name": "火岩棕", + "pinyin": "huoyanzong" + }, + { + "CMYK": [27, 96, 100, 27], + "RGB": [134, 38, 23], + "hex": "#862617", + "name": "赭石", + "pinyin": "zheshi" + }, + { + "CMYK": [36, 90, 82, 56], + "RGB": [89, 38, 32], + "hex": "#592620", + "name": "暗驼棕", + "pinyin": "antuozong" + }, + { + "CMYK": [35, 96, 88, 55], + "RGB": [90, 31, 27], + "hex": "#5a1f1b", + "name": "酱棕", + "pinyin": "jiangzong" + }, + { + "CMYK": [34, 98, 91, 53], + "RGB": [92, 30, 25], + "hex": "#5c1e19", + "name": "栗棕", + "pinyin": "lizong" + }, + { + "CMYK": [0, 31, 24, 0], + "RGB": [244, 199, 186], + "hex": "#f4c7ba", + "name": "洋水仙红", + "pinyin": "yangshuixianhong" + }, + { + "CMYK": [0, 67, 55, 0], + "RGB": [241, 118, 102], + "hex": "#f17666", + "name": "谷鞘红", + "pinyin": "guqiaohong" + }, + { + "CMYK": [0, 77, 69, 0], + "RGB": [241, 86, 66], + "hex": "#f15642", + "name": "苹果红", + "pinyin": "pingguohong" + }, + { + "CMYK": [0, 84, 82, 0], + "RGB": [245, 57, 28], + "hex": "#f5391c", + "name": "铁水红", + "pinyin": "tieshuihong" + }, + { + "CMYK": [0, 76, 67, 0], + "RGB": [242, 90, 71], + "hex": "#f25a47", + "name": "桂红", + "pinyin": "guihong" + }, + { + "CMYK": [0, 84, 82, 0], + "RGB": [243, 59, 31], + "hex": "#f33b1f", + "name": "极光红", + "pinyin": "jiguanghong" + }, + { + "CMYK": [0, 38, 25, 0], + "RGB": [242, 185, 178], + "hex": "#f2b9b2", + "name": "粉红", + "pinyin": "fenhong" + }, + { + "CMYK": [0, 53, 36, 0], + "RGB": [241, 151, 144], + "hex": "#f19790", + "name": "舌红", + "pinyin": "shehong" + }, + { + "CMYK": [0, 76, 68, 0], + "RGB": [240, 90, 70], + "hex": "#f05a46", + "name": "曲红", + "pinyin": "quhong" + }, + { + "CMYK": [0, 83, 81, 0], + "RGB": [242, 62, 35], + "hex": "#f23e23", + "name": "红汞红", + "pinyin": "honggonghong" + }, + { + "CMYK": [0, 29, 16, 0], + "RGB": [242, 202, 201], + "hex": "#f2cac9", + "name": "淡绯", + "pinyin": "danfei" + }, + { + "CMYK": [0, 43, 24, 0], + "RGB": [239, 175, 173], + "hex": "#efafad", + "name": "无花果红", + "pinyin": "wuhuaguohong" + }, + { + "CMYK": [0, 57, 36, 0], + "RGB": [241, 144, 140], + "hex": "#f1908c", + "name": "榴子红", + "pinyin": "liuzihong" + }, + { + "CMYK": [0, 83, 81, 0], + "RGB": [240, 63, 36], + "hex": "#f03f24", + "name": "胭脂红", + "pinyin": "yanzhihong" + }, + { + "CMYK": [0, 50, 23, 0], + "RGB": [240, 161, 168], + "hex": "#f0a1a8", + "name": "合欢红", + "pinyin": "hehuanhong" + }, + { + "CMYK": [0, 56, 27, 0], + "RGB": [241, 147, 156], + "hex": "#f1939c", + "name": "春梅红", + "pinyin": "chunmeihong" + }, + { + "CMYK": [0, 65, 38, 0], + "RGB": [240, 124, 130], + "hex": "#f07c82", + "name": "香叶红", + "pinyin": "xiangyehong" + }, + { + "CMYK": [0, 80, 72, 0], + "RGB": [240, 74, 58], + "hex": "#f04a3a", + "name": "珊瑚红", + "pinyin": "shanhuhong" + }, + { + "CMYK": [0, 84, 82, 0], + "RGB": [241, 60, 34], + "hex": "#f13c22", + "name": "萝卜红", + "pinyin": "luobohong" + }, + { + "CMYK": [0, 65, 29, 0], + "RGB": [231, 124, 142], + "hex": "#e77c8e", + "name": "淡茜红", + "pinyin": "danqianhong" + }, + { + "CMYK": [0, 77, 49, 0], + "RGB": [237, 90, 101], + "hex": "#ed5a65", + "name": "艳红", + "pinyin": "yanhong" + }, + { + "CMYK": [0, 81, 66, 0], + "RGB": [237, 72, 69], + "hex": "#ed4845", + "name": "淡菽红", + "pinyin": "danshuhong" + }, + { + "CMYK": [0, 84, 76, 0], + "RGB": [237, 59, 47], + "hex": "#ed3b2f", + "name": "鱼鳃红", + "pinyin": "yusaihong" + }, + { + "CMYK": [0, 86, 82, 0], + "RGB": [237, 51, 33], + "hex": "#ed3321", + "name": "樱桃红", + "pinyin": "yingtaohong" + }, + { + "CMYK": [0, 82, 44, 0], + "RGB": [238, 72, 102], + "hex": "#ee4866", + "name": "淡蕊香红", + "pinyin": "danruixianghong" + }, + { + "CMYK": [0, 82, 46, 0], + "RGB": [238, 72, 99], + "hex": "#ee4863", + "name": "石竹红", + "pinyin": "shizhuhong" + }, + { + "CMYK": [0, 82, 50, 0], + "RGB": [239, 71, 93], + "hex": "#ef475d", + "name": "草茉莉红", + "pinyin": "caomolihong" + }, + { + "CMYK": [0, 84, 60, 0], + "RGB": [238, 63, 77], + "hex": "#ee3f4d", + "name": "茶花红", + "pinyin": "chahuahong" + }, + { + "CMYK": [0, 86, 74, 0], + "RGB": [237, 51, 51], + "hex": "#ed3333", + "name": "枸枢红", + "pinyin": "goushuhong" + }, + { + "CMYK": [0, 88, 81, 0], + "RGB": [236, 43, 36], + "hex": "#ec2b24", + "name": "秋海棠红", + "pinyin": "qiuhaitanghong" + }, + { + "CMYK": [0, 89, 84, 0], + "RGB": [235, 38, 26], + "hex": "#eb261a", + "name": "丽春红", + "pinyin": "lichunhong" + }, + { + "CMYK": [0, 90, 90, 0], + "RGB": [222, 42, 24], + "hex": "#de2a18", + "name": "夕阳红", + "pinyin": "xiyanghong" + }, + { + "CMYK": [0, 92, 95, 0], + "RGB": [212, 37, 23], + "hex": "#d42517", + "name": "鹤顶红", + "pinyin": "hedinghong" + }, + { + "CMYK": [19, 89, 85, 9], + "RGB": [171, 55, 47], + "hex": "#ab372f", + "name": "鹅血石红", + "pinyin": "exueshihong" + }, + { + "CMYK": [17, 98, 100, 8], + "RGB": [172, 31, 24], + "hex": "#ac1f18", + "name": "覆盆子红", + "pinyin": "fupenzihong" + }, + { + "CMYK": [36, 81, 64, 54], + "RGB": [93, 49, 49], + "hex": "#5d3131", + "name": "貂紫", + "pinyin": "diaozi" + }, + { + "CMYK": [35, 94, 77, 53], + "RGB": [92, 34, 35], + "hex": "#5c2223", + "name": "暗玉紫", + "pinyin": "anyuzi" + }, + { + "CMYK": [35, 100, 85, 54], + "RGB": [90, 25, 27], + "hex": "#5a191b", + "name": "栗紫", + "pinyin": "lizi" + }, + { + "CMYK": [35, 100, 80, 54], + "RGB": [90, 18, 22], + "hex": "#5a1216", + "name": "葡萄酱紫", + "pinyin": "putaojiangzi" + }, + { + "CMYK": [0, 49, 27, 0], + "RGB": [238, 162, 164], + "hex": "#eea2a4", + "name": "牡丹粉红", + "pinyin": "mudanfenhong" + }, + { + "CMYK": [0, 78, 44, 0], + "RGB": [237, 85, 106], + "hex": "#ed556a", + "name": "山茶红", + "pinyin": "shanchahong" + }, + { + "CMYK": [0, 86, 55, 0], + "RGB": [240, 55, 82], + "hex": "#f03752", + "name": "海棠红", + "pinyin": "haitanghong" + }, + { + "CMYK": [13, 83, 62, 3], + "RGB": [192, 72, 81], + "hex": "#c04851", + "name": "玉红", + "pinyin": "yuhong" + }, + { + "CMYK": [11, 93, 77, 2], + "RGB": [192, 44, 56], + "hex": "#c02c38", + "name": "高粱红", + "pinyin": "gaolianghong" + }, + { + "CMYK": [22, 76, 54, 12], + "RGB": [167, 83, 90], + "hex": "#a7535a", + "name": "满江红", + "pinyin": "manjianghong" + }, + { + "CMYK": [28, 100, 86, 33], + "RGB": [124, 24, 35], + "hex": "#7c1823", + "name": "枣红", + "pinyin": "zaohong" + }, + { + "CMYK": [39, 92, 67, 64], + "RGB": [76, 31, 36], + "hex": "#4c1f24", + "name": "葡萄紫", + "pinyin": "putaozi" + }, + { + "CMYK": [39, 100, 79, 63], + "RGB": [77, 16, 24], + "hex": "#4d1018", + "name": "酱紫", + "pinyin": "jiangzi" + }, + { + "CMYK": [0, 89, 62, 0], + "RGB": [238, 39, 70], + "hex": "#ee2746", + "name": "淡曙红", + "pinyin": "danshuhong" + }, + { + "CMYK": [0, 93, 76, 0], + "RGB": [222, 28, 49], + "hex": "#de1c31", + "name": "唐菖蒲红", + "pinyin": "tangchangpuhong" + }, + { + "CMYK": [1, 95, 82, 0], + "RGB": [209, 26, 45], + "hex": "#d11a2d", + "name": "鹅冠红", + "pinyin": "eguanhong" + }, + { + "CMYK": [13, 76, 50, 2], + "RGB": [196, 90, 101], + "hex": "#c45a65", + "name": "莓红", + "pinyin": "meihong" + }, + { + "CMYK": [10, 96, 82, 2], + "RGB": [194, 31, 48], + "hex": "#c21f30", + "name": "枫叶红", + "pinyin": "fengyehong" + }, + { + "CMYK": [19, 99, 86, 11], + "RGB": [166, 27, 41], + "hex": "#a61b29", + "name": "苋菜红", + "pinyin": "xiancaihong" + }, + { + "CMYK": [29, 73, 51, 28], + "RGB": [137, 78, 84], + "hex": "#894e54", + "name": "烟红", + "pinyin": "yanhong" + }, + { + "CMYK": [27, 98, 79, 30], + "RGB": [130, 32, 43], + "hex": "#82202b", + "name": "暗紫苑红", + "pinyin": "anziyuanhong" + }, + { + "CMYK": [27, 100, 90, 29], + "RGB": [130, 17, 31], + "hex": "#82111f", + "name": "殷红", + "pinyin": "yanhong" + }, + { + "CMYK": [36, 95, 71, 59], + "RGB": [84, 30, 36], + "hex": "#541e24", + "name": "猪肝紫", + "pinyin": "zhuganzi" + }, + { + "CMYK": [38, 100, 81, 61], + "RGB": [80, 10, 22], + "hex": "#500a16", + "name": "金鱼紫", + "pinyin": "jinyuzi" + }, + { + "CMYK": [1, 11, 9, 0], + "RGB": [248, 235, 230], + "hex": "#f8ebe6", + "name": "草珠红", + "pinyin": "caozhuhong" + }, + { + "CMYK": [0, 68, 21, 0], + "RGB": [236, 118, 150], + "hex": "#ec7696", + "name": "淡绛红", + "pinyin": "danjianghong" + }, + { + "CMYK": [0, 86, 30, 0], + "RGB": [239, 52, 115], + "hex": "#ef3473", + "name": "品红", + "pinyin": "pinhong" + }, + { + "CMYK": [0, 69, 22, 0], + "RGB": [234, 114, 147], + "hex": "#ea7293", + "name": "凤仙花红", + "pinyin": "fengxianhuahong" + }, + { + "CMYK": [0, 52, 18, 0], + "RGB": [236, 155, 173], + "hex": "#ec9bad", + "name": "粉团花红", + "pinyin": "fentuanhuahong" + }, + { + "CMYK": [0, 80, 28, 0], + "RGB": [235, 80, 126], + "hex": "#eb507e", + "name": "夹竹桃红", + "pinyin": "jiazhutaohong" + }, + { + "CMYK": [0, 88, 36, 0], + "RGB": [237, 47, 106], + "hex": "#ed2f6a", + "name": "榲桲红", + "pinyin": "wenpohong" + }, + { + "CMYK": [0, 39, 14, 0], + "RGB": [238, 184, 195], + "hex": "#eeb8c3", + "name": "姜红", + "pinyin": "jianghong" + }, + { + "CMYK": [0, 80, 27, 0], + "RGB": [234, 81, 127], + "hex": "#ea517f", + "name": "莲瓣红", + "pinyin": "lianbanhong" + }, + { + "CMYK": [0, 33, 11, 0], + "RGB": [241, 196, 205], + "hex": "#f1c4cd", + "name": "水红", + "pinyin": "shuihong" + }, + { + "CMYK": [0, 60, 18, 0], + "RGB": [236, 138, 164], + "hex": "#ec8aa4", + "name": "报春红", + "pinyin": "baochunhong" + }, + { + "CMYK": [8, 78, 35, 1], + "RGB": [206, 87, 109], + "hex": "#ce5777", + "name": "月季红", + "pinyin": "yuejihong" + }, + { + "CMYK": [0, 52, 15, 0], + "RGB": [237, 157, 178], + "hex": "#ed9db2", + "name": "豇豆红", + "pinyin": "jiangdouhong" + }, + { + "CMYK": [0, 63, 18, 0], + "RGB": [239, 130, 160], + "hex": "#ef82a0", + "name": "霞光红", + "pinyin": "xiaguanghong" + }, + { + "CMYK": [0, 85, 33, 0], + "RGB": [235, 60, 112], + "hex": "#eb3c70", + "name": "松叶牡丹红", + "pinyin": "songyemudanhong" + }, + { + "CMYK": [0, 88, 40, 0], + "RGB": [236, 44, 100], + "hex": "#ec2c64", + "name": "喜蛋红", + "pinyin": "xidanhong" + }, + { + "CMYK": [5, 38, 20, 0], + "RGB": [227, 180, 184], + "hex": "#e3b4b8", + "name": "鼠鼻红", + "pinyin": "shubihong" + }, + { + "CMYK": [5, 96, 73, 1], + "RGB": [204, 22, 58], + "hex": "#cc163a", + "name": "尖晶玉红", + "pinyin": "jianjingyuhong" + }, + { + "CMYK": [16, 61, 34, 4], + "RGB": [194, 124, 136], + "hex": "#c27c88", + "name": "山黎豆红", + "pinyin": "shanlidouhong" + }, + { + "CMYK": [13, 90, 56, 3], + "RGB": [191, 53, 83], + "hex": "#bf3553", + "name": "锦葵红", + "pinyin": "jinkuihong" + }, + { + "CMYK": [41, 64, 44, 36], + "RGB": [115, 87, 92], + "hex": "#73575c", + "name": "鼠背灰", + "pinyin": "shubeihui" + }, + { + "CMYK": [33, 100, 75, 49], + "RGB": [98, 22, 36], + "hex": "#621624", + "name": "甘蔗紫", + "pinyin": "ganzhezi" + }, + { + "CMYK": [32, 100, 84, 49], + "RGB": [99, 7, 28], + "hex": "#63071c", + "name": "石竹紫", + "pinyin": "shizhuzi" + }, + { + "CMYK": [57, 72, 54, 74], + "RGB": [54, 40, 43], + "hex": "#36282b", + "name": "苍蝇灰", + "pinyin": "cangyinghui" + }, + { + "CMYK": [52, 88, 58, 81], + "RGB": [48, 22, 28], + "hex": "#30161c", + "name": "卵石紫", + "pinyin": "luanshizi" + }, + { + "CMYK": [56, 88, 62, 84], + "RGB": [43, 18, 22], + "hex": "#2b1216", + "name": "李紫", + "pinyin": "lizi" + }, + { + "CMYK": [58, 90, 63, 83], + "RGB": [45, 12, 19], + "hex": "#2d0c13", + "name": "茄皮紫", + "pinyin": "qiepizi" + }, + { + "CMYK": [0, 76, 16, 0], + "RGB": [206, 94, 138], + "hex": "#ce5e8a", + "name": "吊钟花红", + "pinyin": "diaozhonghuahong" + }, + { + "CMYK": [0, 81, 18, 0], + "RGB": [236, 78, 138], + "hex": "#ec4e8a", + "name": "兔眼红", + "pinyin": "tuyanhong" + }, + { + "CMYK": [0, 87, 24, 0], + "RGB": [238, 44, 121], + "hex": "#ee2c79", + "name": "紫荆红", + "pinyin": "zijinghong" + }, + { + "CMYK": [24, 99, 52, 19], + "RGB": [149, 28, 72], + "hex": "#951c48", + "name": "菜头紫", + "pinyin": "caitouzi" + }, + { + "CMYK": [34, 97, 54, 50], + "RGB": [98, 29, 52], + "hex": "#621d34", + "name": "鹞冠紫", + "pinyin": "yaoguanzi" + }, + { + "CMYK": [33, 100, 58, 60], + "RGB": [98, 16, 46], + "hex": "#62102e", + "name": "葡萄酒红", + "pinyin": "putaojiuhong" + }, + { + "CMYK": [53, 81, 50, 74], + "RGB": [56, 33, 41], + "hex": "#382129", + "name": "磨石紫", + "pinyin": "moshizi" + }, + { + "CMYK": [48, 90, 50, 76], + "RGB": [56, 25, 36], + "hex": "#381924", + "name": "檀紫", + "pinyin": "tanzi" + }, + { + "CMYK": [50, 91, 54, 79], + "RGB": [51, 20, 30], + "hex": "#33141e", + "name": "火鹅紫", + "pinyin": "huoezi" + }, + { + "CMYK": [53, 92, 55, 81], + "RGB": [49, 15, 27], + "hex": "#310f1b", + "name": "墨紫", + "pinyin": "mozi" + }, + { + "CMYK": [0, 48, 15, 0], + "RGB": [238, 166, 183], + "hex": "#eea6b7", + "name": "晶红", + "pinyin": "jinghong" + }, + { + "CMYK": [0, 82, 16, 0], + "RGB": [239, 73, 139], + "hex": "#ef498b", + "name": "扁豆花红", + "pinyin": "biandouhuahong" + }, + { + "CMYK": [2, 66, 22, 0], + "RGB": [222, 120, 151], + "hex": "#de7897", + "name": "白芨红", + "pinyin": "baijihong" + }, + { + "CMYK": [0, 85, 24, 0], + "RGB": [222, 63, 124], + "hex": "#de3f7c", + "name": "嫩菱红", + "pinyin": "nenlinghong" + }, + { + "CMYK": [5, 87, 30, 1], + "RGB": [209, 60, 116], + "hex": "#d13c74", + "name": "菠根红", + "pinyin": "bogenhong" + }, + { + "CMYK": [15, 68, 28, 2], + "RGB": [197, 112, 139], + "hex": "#c5708b", + "name": "酢酱草红", + "pinyin": "cujiangcaohong" + }, + { + "CMYK": [22, 83, 34, 11], + "RGB": [168, 69, 107], + "hex": "#a8456b", + "name": "洋葱紫", + "pinyin": "yangcongzi" + }, + { + "CMYK": [40, 92, 47, 64], + "RGB": [75, 30, 47], + "hex": "#4b1e2f", + "name": "海象紫", + "pinyin": "haixiangzi" + }, + { + "CMYK": [41, 97, 49, 68], + "RGB": [70, 22, 41], + "hex": "#461629", + "name": "绀紫", + "pinyin": "ganzi" + }, + { + "CMYK": [42, 99, 51, 69], + "RGB": [68, 14, 37], + "hex": "#440e25", + "name": "古铜紫", + "pinyin": "gutongzi" + }, + { + "CMYK": [0, 30, 12, 0], + "RGB": [240, 201, 207], + "hex": "#f0c9cf", + "name": "石蕊红", + "pinyin": "shiruihong" + }, + { + "CMYK": [0, 50, 16, 0], + "RGB": [235, 160, 179], + "hex": "#eba0b3", + "name": "芍药耕红", + "pinyin": "shaoyaogenghong" + }, + { + "CMYK": [0, 88, 23, 0], + "RGB": [236, 45, 122], + "hex": "#ec2d7a", + "name": "藏花红", + "pinyin": "canghuahong" + }, + { + "CMYK": [0, 71, 18, 0], + "RGB": [225, 108, 150], + "hex": "#e16c96", + "name": "初荷红", + "pinyin": "chuhehong" + }, + { + "CMYK": [6, 13, 7, 0], + "RGB": [237, 227, 231], + "hex": "#ede3e7", + "name": "马鞭草紫", + "pinyin": "mabiancaozi" + }, + { + "CMYK": [7, 20, 8, 0], + "RGB": [233, 215, 223], + "hex": "#e9d7df", + "name": "丁香淡紫", + "pinyin": "dingxiangdanzi" + }, + { + "CMYK": [7, 79, 18, 0], + "RGB": [210, 86, 140], + "hex": "#d2568c", + "name": "丹紫红", + "pinyin": "danzihong" + }, + { + "CMYK": [4, 89, 21, 0], + "RGB": [210, 53, 125], + "hex": "#d2357d", + "name": "玫瑰红", + "pinyin": "meiguihong" + }, + { + "CMYK": [19, 27, 9, 0], + "RGB": [209, 194, 211], + "hex": "#d1c2d3", + "name": "淡牵牛紫", + "pinyin": "danqianniuzi" + }, + { + "CMYK": [21, 37, 12, 0], + "RGB": [200, 173, 196], + "hex": "#c8adc4", + "name": "凤信紫", + "pinyin": "fengxinzi" + }, + { + "CMYK": [23, 53, 14, 1], + "RGB": [192, 142, 175], + "hex": "#c08eaf", + "name": "萝兰紫", + "pinyin": "luolanzi" + }, + { + "CMYK": [18, 91, 18, 2], + "RGB": [186, 47, 123], + "hex": "#ba2f7b", + "name": "玫瑰紫", + "pinyin": "meiguizi" + }, + { + "CMYK": [58, 56, 17, 2], + "RGB": [128, 118, 163], + "hex": "#8076a3", + "name": "藤萝紫", + "pinyin": "tengluozi" + }, + { + "CMYK": [57, 62, 16, 2], + "RGB": [128, 109, 158], + "hex": "#806d9e", + "name": "槿紫", + "pinyin": "jinzi" + }, + { + "CMYK": [56, 72, 15, 1], + "RGB": [129, 92, 148], + "hex": "#815c94", + "name": "蕈紫", + "pinyin": "xunzi" + }, + { + "CMYK": [54, 89, 12, 1], + "RGB": [129, 60, 133], + "hex": "#813c85", + "name": "桔梗紫", + "pinyin": "jiegengzi" + }, + { + "CMYK": [52, 100, 17, 7], + "RGB": [126, 22, 113], + "hex": "#7e1671", + "name": "魏紫", + "pinyin": "weizi" + }, + { + "CMYK": [3, 26, 10, 0], + "RGB": [233, 204, 211], + "hex": "#e9ccd3", + "name": "芝兰紫", + "pinyin": "zhilanzi" + }, + { + "CMYK": [10, 67, 12, 0], + "RGB": [210, 118, 163], + "hex": "#d276a3", + "name": "菱锰红", + "pinyin": "lingmenghong" + }, + { + "CMYK": [11, 97, 10, 0], + "RGB": [204, 85, 149], + "hex": "#cc5595", + "name": "龙须红", + "pinyin": "longxuhong" + }, + { + "CMYK": [8, 22, 12, 0], + "RGB": [230, 210, 213], + "hex": "#e6d2d5", + "name": "蓟粉红", + "pinyin": "jifenhong" + }, + { + "CMYK": [16, 79, 14, 1], + "RGB": [195, 86, 145], + "hex": "#c35691", + "name": "电气石红", + "pinyin": "dianqishihong" + }, + { + "CMYK": [19, 68, 18, 1], + "RGB": [192, 111, 152], + "hex": "#c06f98", + "name": "樱草紫", + "pinyin": "yingcaozi" + }, + { + "CMYK": [25, 31, 26, 5], + "RGB": [189, 174, 173], + "hex": "#bdaead", + "name": "芦穗灰", + "pinyin": "lusuihui" + }, + { + "CMYK": [26, 43, 26, 6], + "RGB": [181, 152, 161], + "hex": "#b598a1", + "name": "隐红灰", + "pinyin": "yinhonghui" + }, + { + "CMYK": [27, 97, 27, 14], + "RGB": [155, 30, 100], + "hex": "#9b1e64", + "name": "苋菜紫", + "pinyin": "xiancaizi" + }, + { + "CMYK": [39, 53, 38, 25], + "RGB": [133, 109, 114], + "hex": "#856d72", + "name": "芦灰", + "pinyin": "luhui" + }, + { + "CMYK": [49, 71, 49, 58], + "RGB": [79, 56, 62], + "hex": "#4f383e", + "name": "暮云灰", + "pinyin": "muyunhui" + }, + { + "CMYK": [49, 82, 46, 63], + "RGB": [72, 41, 54], + "hex": "#482936", + "name": "斑鸠灰", + "pinyin": "banjiuhui" + }, + { + "CMYK": [4, 11, 9, 0], + "RGB": [242, 231, 229], + "hex": "#f2e7e5", + "name": "淡藤萝紫", + "pinyin": "dantengluozi" + }, + { + "CMYK": [10, 27, 11, 0], + "RGB": [224, 200, 209], + "hex": "#e0c8d1", + "name": "淡青紫", + "pinyin": "danqingzi" + }, + { + "CMYK": [24, 58, 15, 1], + "RGB": [188, 132, 168], + "hex": "#bc84a8", + "name": "青蛤壳紫", + "pinyin": "qinghakezi" + }, + { + "CMYK": [31, 71, 15, 1], + "RGB": [173, 101, 152], + "hex": "#ad6598", + "name": "豆蔻紫", + "pinyin": "doukouzi" + }, + { + "CMYK": [35, 75, 18, 2], + "RGB": [163, 92, 143], + "hex": "#a35c8f", + "name": "扁豆紫", + "pinyin": "biandouzi" + }, + { + "CMYK": [39, 91, 15, 3], + "RGB": [152, 54, 128], + "hex": "#983680", + "name": "芥花紫", + "pinyin": "jiehuazi" + }, + { + "CMYK": [43, 97, 19, 8], + "RGB": [139, 38, 113], + "hex": "#8b2671", + "name": "青莲", + "pinyin": "qinglian" + }, + { + "CMYK": [44, 85, 24, 10], + "RGB": [137, 66, 118], + "hex": "#894276", + "name": "芓紫", + "pinyin": "zizi" + }, + { + "CMYK": [45, 99, 24, 16], + "RGB": [126, 32, 101], + "hex": "#7e2065", + "name": "葛巾紫", + "pinyin": "gejinzi" + }, + { + "CMYK": [49, 100, 29, 32], + "RGB": [104, 23, 82], + "hex": "#681752", + "name": "牵牛紫", + "pinyin": "qianniuzi" + }, + { + "CMYK": [53, 75, 41, 41], + "RGB": [93, 63, 81], + "hex": "#5d3f51", + "name": "紫灰", + "pinyin": "zihui" + }, + { + "CMYK": [55, 87, 41, 52], + "RGB": [78, 42, 64], + "hex": "#4e2a40", + "name": "龙睛鱼紫", + "pinyin": "longjingyuzi" + }, + { + "CMYK": [58, 96, 40, 61], + "RGB": [65, 28, 53], + "hex": "#411c35", + "name": "荸荠紫", + "pinyin": "biqizi" + }, + { + "CMYK": [63, 74, 52, 70], + "RGB": [54, 41, 47], + "hex": "#36292f", + "name": "古鼎灰", + "pinyin": "gudinghui" + }, + { + "CMYK": [81, 87, 54, 84], + "RGB": [30, 19, 29], + "hex": "#1e131d", + "name": "乌梅紫", + "pinyin": "wumeizi" + }, + { + "CMYK": [83, 87, 55, 86], + "RGB": [28, 13, 26], + "hex": "#1c0d1a", + "name": "深牵牛紫", + "pinyin": "shenqianniuzi" + }, + { + "CMYK": [7, 5, 7, 0], + "RGB": [241, 240, 237], + "hex": "#f1f0ed", + "name": "银白", + "pinyin": "yinbai" + }, + { + "CMYK": [13, 10, 9, 0], + "RGB": [226, 225, 228], + "hex": "#e2e1e4", + "name": "芡食白", + "pinyin": "qianshibai" + }, + { + "CMYK": [23, 18, 12, 1], + "RGB": [204, 204, 214], + "hex": "#ccccd6", + "name": "远山紫", + "pinyin": "yuanshanzi" + }, + { + "CMYK": [39, 31, 17, 2], + "RGB": [167, 168, 189], + "hex": "#a7a8bd", + "name": "淡蓝紫", + "pinyin": "danlanzi" + }, + { + "CMYK": [74, 64, 14, 1], + "RGB": [97, 100, 159], + "hex": "#61649f", + "name": "山梗紫", + "pinyin": "shangengzi" + }, + { + "CMYK": [63, 53, 22, 5], + "RGB": [116, 117, 155], + "hex": "#74759b", + "name": "螺甸紫", + "pinyin": "luodianzi" + }, + { + "CMYK": [21, 17, 19, 1], + "RGB": [207, 204, 201], + "hex": "#cfccc9", + "name": "玛瑙灰", + "pinyin": "manaohui" + }, + { + "CMYK": [80, 73, 21, 6], + "RGB": [82, 82, 136], + "hex": "#525288", + "name": "野菊紫", + "pinyin": "yejuzi" + }, + { + "CMYK": [100, 93, 21, 5], + "RGB": [46, 49, 124], + "hex": "#2e317c", + "name": "满天星紫", + "pinyin": "mantianxingzi" + }, + { + "CMYK": [48, 45, 40, 26], + "RGB": [122, 115, 116], + "hex": "#7a7374", + "name": "锌灰", + "pinyin": "xinhui" + }, + { + "CMYK": [91, 84, 40, 43], + "RGB": [48, 47, 75], + "hex": "#302f4b", + "name": "野葡萄紫", + "pinyin": "yeputaozi" + }, + { + "CMYK": [70, 69, 49, 56], + "RGB": [62, 56, 65], + "hex": "#3e3841", + "name": "剑锋紫", + "pinyin": "jianfengzi" + }, + { + "CMYK": [79, 74, 49, 60], + "RGB": [50, 47, 59], + "hex": "#322f3b", + "name": "龙葵紫", + "pinyin": "longkuizi" + }, + { + "CMYK": [90, 84, 50, 69], + "RGB": [34, 32, 46], + "hex": "#22202e", + "name": "暗龙胆紫", + "pinyin": "anlongdanzi" + }, + { + "CMYK": [98, 93, 48, 73], + "RGB": [31, 32, 64], + "hex": "#1f2040", + "name": "晶石紫", + "pinyin": "jingshizi" + }, + { + "CMYK": [100, 94, 52, 77], + "RGB": [19, 17, 36], + "hex": "#131124", + "name": "暗蓝紫", + "pinyin": "anlanzi" + }, + { + "CMYK": [95, 46, 10, 1], + "RGB": [39, 117, 182], + "hex": "#2775b6", + "name": "景泰蓝", + "pinyin": "jingtailan" + }, + { + "CMYK": [96, 47, 11, 1], + "RGB": [36, 116, 181], + "hex": "#2474b5", + "name": "尼罗蓝", + "pinyin": "niluolan" + }, + { + "CMYK": [25, 6, 10, 0], + "RGB": [208, 223, 230], + "hex": "#d0dfe6", + "name": "远天蓝", + "pinyin": "yuantianlan" + }, + { + "CMYK": [53, 19, 15, 1], + "RGB": [147, 181, 207], + "hex": "#93b5cf", + "name": "星蓝", + "pinyin": "xinglan" + }, + { + "CMYK": [74, 27, 16, 2], + "RGB": [97, 154, 195], + "hex": "#619ac3", + "name": "羽扇豆蓝", + "pinyin": "yushandoulan" + }, + { + "CMYK": [95, 45, 10, 1], + "RGB": [35, 118, 183], + "hex": "#2376b7", + "name": "花青", + "pinyin": "huaqing" + }, + { + "CMYK": [78, 27, 17, 2], + "RGB": [86, 152, 195], + "hex": "#5698c3", + "name": "睛蓝", + "pinyin": "jinglan" + }, + { + "CMYK": [99, 44, 10, 1], + "RGB": [33, 119, 184], + "hex": "#2177b8", + "name": "虹蓝", + "pinyin": "honglan" + }, + { + "CMYK": [43, 4, 16, 0], + "RGB": [176, 213, 223], + "hex": "#b0d5df", + "name": "湖水蓝", + "pinyin": "hushuilan" + }, + { + "CMYK": [59, 12, 19, 0], + "RGB": [138, 188, 209], + "hex": "#8abcd1", + "name": "秋波蓝", + "pinyin": "qiubolan" + }, + { + "CMYK": [73, 17, 20, 1], + "RGB": [102, 169, 201], + "hex": "#66a9c9", + "name": "涧石蓝", + "pinyin": "jianshilan" + }, + { + "CMYK": [93, 36, 15, 2], + "RGB": [41, 131, 187], + "hex": "#2983bb", + "name": "潮蓝", + "pinyin": "chaolan" + }, + { + "CMYK": [99, 48, 11, 1], + "RGB": [23, 114, 180], + "hex": "#1772b4", + "name": "群青", + "pinyin": "qunqing" + }, + { + "CMYK": [74, 2, 24, 0], + "RGB": [99, 187, 208], + "hex": "#63bbd0", + "name": "霁青", + "pinyin": "jiqing" + }, + { + "CMYK": [77, 7, 24, 0], + "RGB": [92, 179, 204], + "hex": "#5cb3cc", + "name": "碧青", + "pinyin": "biqing" + }, + { + "CMYK": [94, 32, 17, 3], + "RGB": [36, 134, 185], + "hex": "#2486b9", + "name": "宝石蓝", + "pinyin": "baoshilan" + }, + { + "CMYK": [98, 43, 14, 2], + "RGB": [22, 119, 179], + "hex": "#1677b3", + "name": "天蓝", + "pinyin": "tianlan" + }, + { + "CMYK": [100, 52, 11, 1], + "RGB": [18, 107, 174], + "hex": "#126bae", + "name": "柏林蓝", + "pinyin": "bolinlan" + }, + { + "CMYK": [92, 10, 25, 1], + "RGB": [34, 162, 195], + "hex": "#22a2c3", + "name": "海青", + "pinyin": "haiqing" + }, + { + "CMYK": [94, 16, 23, 3], + "RGB": [26, 148, 188], + "hex": "#1a94bc", + "name": "钴蓝", + "pinyin": "gulan" + }, + { + "CMYK": [95, 25, 20, 4], + "RGB": [21, 139, 184], + "hex": "#158bb8", + "name": "鸢尾蓝", + "pinyin": "yuanweilan" + }, + { + "CMYK": [98, 42, 16, 3], + "RGB": [17, 119, 176], + "hex": "#1177b0", + "name": "牵牛花蓝", + "pinyin": "qianniuhualan" + }, + { + "CMYK": [100, 65, 11, 1], + "RGB": [15, 89, 164], + "hex": "#0f59a4", + "name": "飞燕草蓝", + "pinyin": "feiyancaolan" + }, + { + "CMYK": [95, 47, 14, 2], + "RGB": [43, 115, 175], + "hex": "#2b73af", + "name": "品蓝", + "pinyin": "pinlan" + }, + { + "CMYK": [24, 14, 16, 1], + "RGB": [205, 209, 211], + "hex": "#cdd1d3", + "name": "银鱼白", + "pinyin": "yinyubai" + }, + { + "CMYK": [93, 49, 17, 3], + "RGB": [49, 112, 167], + "hex": "#3170a7", + "name": "安安蓝", + "pinyin": "ananlan" + }, + { + "CMYK": [64, 52, 39, 28], + "RGB": [94, 97, 109], + "hex": "#5e616d", + "name": "鱼尾灰", + "pinyin": "yuweihui" + }, + { + "CMYK": [78, 60, 40, 31], + "RGB": [71, 81, 100], + "hex": "#475164", + "name": "鲸鱼灰", + "pinyin": "jingyuhui" + }, + { + "CMYK": [69, 64, 52, 59], + "RGB": [255, 254, 250], + "hex": "#fffefa", + "name": "海参灰", + "pinyin": "haishenhui" + }, + { + "CMYK": [76, 70, 51, 60], + "RGB": [53, 51, 60], + "hex": "#35333c", + "name": "沙鱼灰", + "pinyin": "shayuhui" + }, + { + "CMYK": [100, 89, 54, 79], + "RGB": [15, 20, 35], + "hex": "#0f1423", + "name": "钢蓝", + "pinyin": "ganglan" + }, + { + "CMYK": [35, 13, 13, 0], + "RGB": [186, 204, 217], + "hex": "#baccd9", + "name": "云水蓝", + "pinyin": "yunshuilan" + }, + { + "CMYK": [55, 20, 18, 1], + "RGB": [143, 178, 201], + "hex": "#8fb2c9", + "name": "晴山蓝", + "pinyin": "qingshanlan" + }, + { + "CMYK": [100, 60, 8, 1], + "RGB": [22, 97, 171], + "hex": "#1661ab", + "name": "靛青", + "pinyin": "dianqing" + }, + { + "CMYK": [29, 16, 17, 1], + "RGB": [196, 203, 207], + "hex": "#c4cbcf", + "name": "大理石灰", + "pinyin": "dalishihui" + }, + { + "CMYK": [100, 67, 16, 3], + "RGB": [21, 85, 154], + "hex": "#15559a", + "name": "海涛蓝", + "pinyin": "haitaolan" + }, + { + "CMYK": [81, 41, 24, 8], + "RGB": [78, 124, 161], + "hex": "#4e7ca1", + "name": "蝶翅蓝", + "pinyin": "diechilan" + }, + { + "CMYK": [93, 50, 21, 6], + "RGB": [52, 108, 156], + "hex": "#346c9c", + "name": "海军蓝", + "pinyin": "haijunlan" + }, + { + "CMYK": [77, 68, 54, 66], + "RGB": [47, 47, 53], + "hex": "#2f2f35", + "name": "水牛灰", + "pinyin": "shuiniuhui" + }, + { + "CMYK": [80, 70, 53, 65], + "RGB": [45, 46, 54], + "hex": "#2d2e36", + "name": "牛角灰", + "pinyin": "niujiaohui" + }, + { + "CMYK": [100, 86, 54, 78], + "RGB": [19, 24, 36], + "hex": "#131824", + "name": "燕颔蓝", + "pinyin": "yanhanlan" + }, + { + "CMYK": [21, 6, 10, 0], + "RGB": [216, 227, 231], + "hex": "#d8e3e7", + "name": "云峰白", + "pinyin": "yunfengbai" + }, + { + "CMYK": [32, 8, 13, 0], + "RGB": [195, 215, 223], + "hex": "#c3d7df", + "name": "井天蓝", + "pinyin": "jingtianlan" + }, + { + "CMYK": [91, 24, 22, 4], + "RGB": [47, 144, 185], + "hex": "#2f90b9", + "name": "云山蓝", + "pinyin": "yunshanlan" + }, + { + "CMYK": [96, 34, 18, 4], + "RGB": [23, 129, 181], + "hex": "#1781b5", + "name": "釉蓝", + "pinyin": "youlan" + }, + { + "CMYK": [28, 12, 17, 0], + "RGB": [199, 210, 212], + "hex": "#c7d2d4", + "name": "鸥蓝", + "pinyin": "oulan" + }, + { + "CMYK": [100, 53, 21, 6], + "RGB": [17, 101, 154], + "hex": "#11659a", + "name": "搪磁蓝", + "pinyin": "tangcilan" + }, + { + "CMYK": [29, 18, 21, 2], + "RGB": [192, 196, 195], + "hex": "#c0c4c3", + "name": "月影白", + "pinyin": "yueyingbai" + }, + { + "CMYK": [36, 20, 23, 2], + "RGB": [178, 187, 190], + "hex": "#b2bbbe", + "name": "星灰", + "pinyin": "xinghui" + }, + { + "CMYK": [70, 38, 36, 18], + "RGB": [94, 121, 135], + "hex": "#5e7987", + "name": "淡蓝灰", + "pinyin": "danlanhui" + }, + { + "CMYK": [100, 68, 32, 20], + "RGB": [20, 74, 116], + "hex": "#144a74", + "name": "鷃蓝", + "pinyin": "yanlan" + }, + { + "CMYK": [55, 40, 40, 23], + "RGB": [116, 120, 122], + "hex": "#74787a", + "name": "嫩灰", + "pinyin": "nenhui" + }, + { + "CMYK": [77, 50, 41, 31], + "RGB": [73, 92, 105], + "hex": "#495c69", + "name": "战舰灰", + "pinyin": "zhanjianhui" + }, + { + "CMYK": [67, 57, 49, 49], + "RGB": [71, 72, 76], + "hex": "#47484c", + "name": "瓦罐灰", + "pinyin": "waguanhui" + }, + { + "CMYK": [87, 69, 51, 58], + "RGB": [43, 51, 62], + "hex": "#2b333e", + "name": "青灰", + "pinyin": "qinghui" + }, + { + "CMYK": [100, 77, 50, 62], + "RGB": [28, 41, 56], + "hex": "#1c2938", + "name": "鸽蓝", + "pinyin": "gelan" + }, + { + "CMYK": [100, 82, 51, 64], + "RGB": [20, 35, 52], + "hex": "#142334", + "name": "钢青", + "pinyin": "gangqing" + }, + { + "CMYK": [100, 84, 51, 68], + "RGB": [16, 31, 48], + "hex": "#101f30", + "name": "暗蓝", + "pinyin": "anlan" + }, + { + "CMYK": [11, 0, 8, 0], + "RGB": [238, 247, 242], + "hex": "#eef7f2", + "name": "月白", + "pinyin": "yuebai" + }, + { + "CMYK": [33, 0, 14, 0], + "RGB": [198, 230, 232], + "hex": "#c6e6e8", + "name": "海天蓝", + "pinyin": "haitianlan" + }, + { + "CMYK": [57, 0, 22, 0], + "RGB": [147, 213, 220], + "hex": "#93d5dc", + "name": "清水蓝", + "pinyin": "qingshuilan" + }, + { + "CMYK": [79, 0, 27, 0], + "RGB": [81, 196, 211], + "hex": "#51c4d3", + "name": "瀑布蓝", + "pinyin": "pubulan" + }, + { + "CMYK": [89, 0, 29, 0], + "RGB": [41, 183, 203], + "hex": "#29b7cb", + "name": "蔚蓝", + "pinyin": "weilan" + }, + { + "CMYK": [92, 0, 28, 0], + "RGB": [14, 176, 201], + "hex": "#0eb0c9", + "name": "孔雀蓝", + "pinyin": "kongquelan" + }, + { + "CMYK": [93, 0, 31, 0], + "RGB": [16, 174, 194], + "hex": "#10aec2", + "name": "甸子蓝", + "pinyin": "dianzilan" + }, + { + "CMYK": [78, 36, 0, 0], + "RGB": [87, 195, 194], + "hex": "#57c3c2", + "name": "石绿", + "pinyin": "shilv" + }, + { + "CMYK": [40, 0, 30, 0], + "RGB": [185, 222, 201], + "hex": "#b9dec9", + "name": "竹篁绿", + "pinyin": "zhuhuanglv" + }, + { + "CMYK": [64, 0, 46, 0], + "RGB": [131, 203, 172], + "hex": "#83cbac", + "name": "粉绿", + "pinyin": "fenlv" + }, + { + "CMYK": [95, 0, 52, 0], + "RGB": [18, 170, 156], + "hex": "#12aa9c", + "name": "美蝶绿", + "pinyin": "meidielv" + }, + { + "CMYK": [75, 0, 61, 0], + "RGB": [102, 193, 140], + "hex": "#66c18c", + "name": "毛绿", + "pinyin": "maolv" + }, + { + "CMYK": [78, 0, 62, 0], + "RGB": [93, 190, 138], + "hex": "#5dbe8a", + "name": "蔻梢绿", + "pinyin": "koushaolv" + }, + { + "CMYK": [81, 0, 62, 0], + "RGB": [85, 187, 138], + "hex": "#55bb8a", + "name": "麦苗绿", + "pinyin": "maimiaolv" + }, + { + "CMYK": [86, 0, 63, 0], + "RGB": [69, 183, 135], + "hex": "#45b787", + "name": "蛙绿", + "pinyin": "walv" + }, + { + "CMYK": [92, 0, 64, 0], + "RGB": [43, 174, 133], + "hex": "#2bae85", + "name": "铜绿", + "pinyin": "tonglv" + }, + { + "CMYK": [96, 0, 64, 0], + "RGB": [27, 167, 132], + "hex": "#1ba784", + "name": "竹绿", + "pinyin": "zhulv" + }, + { + "CMYK": [98, 2, 64, 0], + "RGB": [18, 161, 130], + "hex": "#12a182", + "name": "蓝绿", + "pinyin": "lanlv" + }, + { + "CMYK": [32, 7, 18, 0], + "RGB": [196, 215, 214], + "hex": "#c4d7d6", + "name": "穹灰", + "pinyin": "qionghui" + }, + { + "CMYK": [94, 11, 33, 1], + "RGB": [30, 158, 179], + "hex": "#1e9eb3", + "name": "翠蓝", + "pinyin": "cuilan" + }, + { + "CMYK": [96, 16, 31, 3], + "RGB": [15, 149, 176], + "hex": "#0f95b0", + "name": "胆矾蓝", + "pinyin": "danfanlan" + }, + { + "CMYK": [96, 18, 34, 4], + "RGB": [20, 145, 168], + "hex": "#1491a8", + "name": "樫鸟蓝", + "pinyin": "jianniaolan" + }, + { + "CMYK": [64, 18, 32, 2], + "RGB": [124, 171, 177], + "hex": "#7cabb1", + "name": "闪蓝", + "pinyin": "shanlan" + }, + { + "CMYK": [40, 24, 32, 6], + "RGB": [164, 172, 167], + "hex": "#a4aca7", + "name": "冰山蓝", + "pinyin": "bingshanlan" + }, + { + "CMYK": [56, 26, 36, 7], + "RGB": [134, 157, 157], + "hex": "#869d9d", + "name": "虾壳青", + "pinyin": "xiakeqing" + }, + { + "CMYK": [71, 28, 39, 10], + "RGB": [100, 142, 147], + "hex": "#648e93", + "name": "晚波蓝", + "pinyin": "wanbolan" + }, + { + "CMYK": [89, 27, 41, 13], + "RGB": [59, 129, 140], + "hex": "#3b818c", + "name": "蜻蜓蓝", + "pinyin": "qingtinglan" + }, + { + "CMYK": [99, 33, 38, 21], + "RGB": [18, 110, 130], + "hex": "#126e82", + "name": "玉鈫蓝", + "pinyin": "yuqinlan" + }, + { + "CMYK": [57, 37, 42, 21], + "RGB": [115, 124, 123], + "hex": "#737c7b", + "name": "垩灰", + "pinyin": "ehui" + }, + { + "CMYK": [65, 40, 44, 26], + "RGB": [97, 113, 114], + "hex": "#617172", + "name": "夏云灰", + "pinyin": "xiayunhui" + }, + { + "CMYK": [100, 52, 46, 43], + "RGB": [19, 72, 87], + "hex": "#134857", + "name": "苍蓝", + "pinyin": "canglan" + }, + { + "CMYK": [67, 53, 51, 50], + "RGB": [71, 75, 76], + "hex": "#474b4c", + "name": "黄昏灰", + "pinyin": "huanghunhui" + }, + { + "CMYK": [94, 58, 54, 60], + "RGB": [33, 55, 61], + "hex": "#21373d", + "name": "灰蓝", + "pinyin": "huilan" + }, + { + "CMYK": [100, 64, 56, 68], + "RGB": [19, 44, 51], + "hex": "#132c33", + "name": "深灰蓝", + "pinyin": "shenhuilan" + }, + { + "CMYK": [49, 5, 37, 0], + "RGB": [164, 202, 182], + "hex": "#a4cab6", + "name": "玉簪绿", + "pinyin": "yuzanlv" + }, + { + "CMYK": [96, 12, 66, 2], + "RGB": [44, 150, 120], + "hex": "#2c9678", + "name": "青矾绿", + "pinyin": "qingfanlv" + }, + { + "CMYK": [52, 11, 37, 0], + "RGB": [154, 190, 175], + "hex": "#9abeaf", + "name": "草原远绿", + "pinyin": "caoyuanyuanlv" + }, + { + "CMYK": [74, 14, 51, 1], + "RGB": [105, 167, 148], + "hex": "#69a794", + "name": "梧枝绿", + "pinyin": "wuzhilv" + }, + { + "CMYK": [55, 16, 40, 1], + "RGB": [146, 179, 165], + "hex": "#92b3a5", + "name": "浪花绿", + "pinyin": "langhualv" + }, + { + "CMYK": [99, 23, 70, 10], + "RGB": [36, 128, 103], + "hex": "#248067", + "name": "海王绿", + "pinyin": "haiwanglv" + }, + { + "CMYK": [88, 24, 61, 9], + "RGB": [66, 134, 117], + "hex": "#428675", + "name": "亚丁绿", + "pinyin": "yadinglv" + }, + { + "CMYK": [40, 27, 36, 8], + "RGB": [159, 163, 154], + "hex": "#9fa39a", + "name": "镍灰", + "pinyin": "niehui" + }, + { + "CMYK": [52, 28, 42, 10], + "RGB": [138, 152, 142], + "hex": "#8a988e", + "name": "明灰", + "pinyin": "minghui" + }, + { + "CMYK": [63, 31, 50, 14], + "RGB": [112, 136, 125], + "hex": "#70887d", + "name": "淡绿灰", + "pinyin": "danlvhui" + }, + { + "CMYK": [82, 32, 60, 20], + "RGB": [73, 117, 104], + "hex": "#497568", + "name": "飞泉绿", + "pinyin": "feiquanlv" + }, + { + "CMYK": [62, 43, 52, 34], + "RGB": [93, 101, 95], + "hex": "#5d655f", + "name": "狼烟灰", + "pinyin": "langyanhui" + }, + { + "CMYK": [85, 44, 64, 52], + "RGB": [49, 74, 67], + "hex": "#314a43", + "name": "绿灰", + "pinyin": "lvhui" + }, + { + "CMYK": [93, 46, 70, 61], + "RGB": [34, 62, 54], + "hex": "#223e36", + "name": "苍绿", + "pinyin": "canglv" + }, + { + "CMYK": [98, 46, 73, 63], + "RGB": [26, 59, 50], + "hex": "#1a3b32", + "name": "深海绿", + "pinyin": "shenhailv" + }, + { + "CMYK": [67, 60, 57, 68], + "RGB": [54, 52, 51], + "hex": "#363433", + "name": "长石灰", + "pinyin": "changshihui" + }, + { + "CMYK": [82, 60, 65, 80], + "RGB": [31, 38, 35], + "hex": "#1f2623", + "name": "苷蓝绿", + "pinyin": "ganlanlv" + }, + { + "CMYK": [90, 62, 67, 86], + "RGB": [20, 30, 27], + "hex": "#141e1b", + "name": "莽丛绿", + "pinyin": "mangconglv" + }, + { + "CMYK": [33, 1, 29, 0], + "RGB": [198, 223, 200], + "hex": "#c6dfc8", + "name": "淡翠绿", + "pinyin": "dancuilv" + }, + { + "CMYK": [53, 1, 44, 0], + "RGB": [158, 204, 171], + "hex": "#9eccab", + "name": "明绿", + "pinyin": "minglv" + }, + { + "CMYK": [75, 0, 59, 0], + "RGB": [104, 184, 142], + "hex": "#68b88e", + "name": "田园绿", + "pinyin": "tianyuanlv" + }, + { + "CMYK": [98, 0, 82, 0], + "RGB": [32, 161, 98], + "hex": "#20a162", + "name": "翠绿", + "pinyin": "cuilv" + }, + { + "CMYK": [78, 6, 62, 0], + "RGB": [97, 172, 133], + "hex": "#61ac85", + "name": "淡绿", + "pinyin": "danlv" + }, + { + "CMYK": [90, 7, 73, 0], + "RGB": [64, 160, 112], + "hex": "#40a070", + "name": "葱绿", + "pinyin": "conglv" + }, + { + "CMYK": [99, 10, 91, 2], + "RGB": [34, 148, 83], + "hex": "#229453", + "name": "孔雀绿", + "pinyin": "kongquelv" + }, + { + "CMYK": [27, 11, 27, 1], + "RGB": [202, 211, 195], + "hex": "#cad3c3", + "name": "艾绿", + "pinyin": "ailv" + }, + { + "CMYK": [92, 14, 76, 2], + "RGB": [60, 149, 102], + "hex": "#3c9566", + "name": "蟾绿", + "pinyin": "chanlv" + }, + { + "CMYK": [100, 17, 92, 5], + "RGB": [32, 137, 77], + "hex": "#20894d", + "name": "宫殿绿", + "pinyin": "gongdianlv" + }, + { + "CMYK": [61, 19, 52, 3], + "RGB": [131, 167, 141], + "hex": "#83a78d", + "name": "松霜绿", + "pinyin": "songshuanglv" + }, + { + "CMYK": [81, 19, 67, 4], + "RGB": [87, 149, 114], + "hex": "#579572", + "name": "蛋白石绿", + "pinyin": "danbaishilv" + }, + { + "CMYK": [100, 22, 90, 10], + "RGB": [32, 127, 76], + "hex": "#207f4c", + "name": "薄荷绿", + "pinyin": "bohelv" + }, + { + "CMYK": [66, 29, 58, 12], + "RGB": [110, 139, 116], + "hex": "#6e8b74", + "name": "瓦松绿", + "pinyin": "wasonglv" + }, + { + "CMYK": [100, 31, 91, 25], + "RGB": [26, 104, 64], + "hex": "#1a6840", + "name": "荷叶绿", + "pinyin": "heyelv" + }, + { + "CMYK": [62, 42, 56, 34], + "RGB": [94, 102, 91], + "hex": "#5e665b", + "name": "田螺绿", + "pinyin": "tianluolv" + }, + { + "CMYK": [74, 42, 65, 40], + "RGB": [72, 91, 77], + "hex": "#485b4d", + "name": "白屈菜绿", + "pinyin": "baiqucailv" + }, + { + "CMYK": [64, 57, 60, 67], + "RGB": [57, 55, 51], + "hex": "#393733", + "name": "河豚灰", + "pinyin": "hetunhui" + }, + { + "CMYK": [68, 56, 60, 66], + "RGB": [55, 56, 52], + "hex": "#373834", + "name": "蒽油绿", + "pinyin": "enyoulv" + }, + { + "CMYK": [76, 56, 75, 72], + "RGB": [43, 49, 44], + "hex": "#2b312c", + "name": "槲寄生绿", + "pinyin": "hujishenglv" + }, + { + "CMYK": [91, 60, 76, 83], + "RGB": [21, 35, 27], + "hex": "#15231b", + "name": "云杉绿", + "pinyin": "yunshanlv" + }, + { + "CMYK": [9, 1, 14, 0], + "RGB": [240, 245, 229], + "hex": "#f0f5e5", + "name": "嫩菊绿", + "pinyin": "nenjulv" + }, + { + "CMYK": [20, 1, 23, 0], + "RGB": [223, 236, 213], + "hex": "#dfecd5", + "name": "艾背绿", + "pinyin": "aibeilv" + }, + { + "CMYK": [47, 0, 49, 0], + "RGB": [173, 213, 162], + "hex": "#add5a2", + "name": "嘉陵水绿", + "pinyin": "jialingshuilv" + }, + { + "CMYK": [89, 0, 96, 0], + "RGB": [65, 179, 73], + "hex": "#41b349", + "name": "玉髓绿", + "pinyin": "yusuilv" + }, + { + "CMYK": [88, 0, 99, 0], + "RGB": [67, 178, 68], + "hex": "#43b244", + "name": "鲜绿", + "pinyin": "xianlv" + }, + { + "CMYK": [90, 0, 100, 0], + "RGB": [65, 174, 60], + "hex": "#41ae3c", + "name": "宝石绿", + "pinyin": "baoshilv" + }, + { + "CMYK": [18, 4, 33, 0], + "RGB": [226, 231, 191], + "hex": "#e2e7bf", + "name": "海沬绿", + "pinyin": "haimeilv" + }, + { + "CMYK": [28, 4, 44, 0], + "RGB": [208, 222, 170], + "hex": "#d0deaa", + "name": "姚黄", + "pinyin": "yaohuang" + }, + { + "CMYK": [44, 3, 61, 0], + "RGB": [178, 207, 135], + "hex": "#b2cf87", + "name": "橄榄石绿", + "pinyin": "ganlanshilv" + }, + { + "CMYK": [62, 0, 76, 0], + "RGB": [140, 194, 105], + "hex": "#8cc269", + "name": "水绿", + "pinyin": "shuilv" + }, + { + "CMYK": [42, 3, 67, 0], + "RGB": [183, 208, 122], + "hex": "#b7d07a", + "name": "芦苇绿", + "pinyin": "luweilv" + }, + { + "CMYK": [28, 6, 66, 0], + "RGB": [210, 217, 122], + "hex": "#d2d97a", + "name": "槐花黄绿", + "pinyin": "huaihuahuanglv" + }, + { + "CMYK": [41, 4, 76, 0], + "RGB": [186, 207, 101], + "hex": "#bacf65", + "name": "苹果绿", + "pinyin": "pingguolv" + }, + { + "CMYK": [58, 1, 88, 0], + "RGB": [150, 194, 78], + "hex": "#96c24e", + "name": "芽绿", + "pinyin": "yalv" + }, + { + "CMYK": [19, 9, 84, 1], + "RGB": [226, 216, 73], + "hex": "#e2d849", + "name": "蝶黄", + "pinyin": "diehuang" + }, + { + "CMYK": [38, 8, 94, 1], + "RGB": [190, 201, 54], + "hex": "#bec936", + "name": "橄榄黄绿", + "pinyin": "ganlanhuanglv" + }, + { + "CMYK": [81, 0, 100, 0], + "RGB": [91, 174, 35], + "hex": "#5bae23", + "name": "鹦鹉绿", + "pinyin": "yingwulv" + }, + { + "CMYK": [84, 64, 94, 45], + "RGB": [37, 61, 36], + "hex": "#253d24", + "name": "油绿", + "pinyin": "youlv" + }, + { + "CMYK": [0, 1, 4, 0], + "RGB": [255, 254, 248], + "hex": "#fffef8", + "name": "象牙白", + "pinyin": "xiangyabai" + }, + { + "CMYK": [3, 5, 8, 0], + "RGB": [248, 244, 237], + "hex": "#f8f4ed", + "name": "汉白玉", + "pinyin": "hanbaiyu" + }, + { + "CMYK": [0, 1, 3, 0], + "RGB": [255, 254, 249], + "hex": "#fffef9", + "name": "雪白", + "pinyin": "xuebai" + }, + { + "CMYK": [4, 4, 8, 0], + "RGB": [247, 244, 237], + "hex": "#f7f4ed", + "name": "鱼肚白", + "pinyin": "yudubai" + }, + { + "CMYK": [12, 12, 16, 0], + "RGB": [228, 223, 215], + "hex": "#e4dfd7", + "name": "珍珠灰", + "pinyin": "zhenzhuhui" + }, + { + "CMYK": [16, 15, 20, 1], + "RGB": [218, 212, 203], + "hex": "#dad4cb", + "name": "浅灰", + "pinyin": "qianhui" + }, + { + "CMYK": [28, 5, 30, 5], + "RGB": [187, 181, 172], + "hex": "#bbb5ac", + "name": "铅灰", + "pinyin": "qianhui" + }, + { + "CMYK": [28, 25, 30, 5], + "RGB": [187, 181, 172], + "hex": "#bbb5ac", + "name": "中灰", + "pinyin": "zhonghui" + }, + { + "CMYK": [42, 40, 43, 23], + "RGB": [134, 126, 118], + "hex": "#867e76", + "name": "瓦灰", + "pinyin": "wahui" + }, + { + "CMYK": [43, 40, 44, 42], + "RGB": [132, 124, 116], + "hex": "#847c74", + "name": "夜灰", + "pinyin": "yehui" + }, + { + "CMYK": [42, 42, 45, 27], + "RGB": [128, 118, 110], + "hex": "#80766e", + "name": "雁灰", + "pinyin": "yanhui" + }, + { + "CMYK": [42, 42, 46, 27], + "RGB": [129, 119, 110], + "hex": "#81776e", + "name": "深灰", + "pinyin": "shenhui" + } +] diff --git a/grailed-ui-go-view/src/settings/designColorRecommend.json b/grailed-ui-go-view/src/settings/designColorRecommend.json new file mode 100644 index 0000000..51ba973 --- /dev/null +++ b/grailed-ui-go-view/src/settings/designColorRecommend.json @@ -0,0 +1,30 @@ +[ + { + "CMYK": [62, 0, 21, 16], + "RGB": [81, 214, 169], + "hex": "#51d6a9", + "name": "碧空绿", + "pinyin": "bikonlv" + }, + { + "CMYK": [73, 17, 20, 1], + "RGB": [102, 169, 201], + "hex": "#66a9c9", + "name": "涧石蓝", + "pinyin": "jianshilan" + }, + { + "CMYK": [4, 13, 67, 0], + "RGB": [248, 223, 114], + "hex": "#f8df72", + "name": "茉莉黄", + "pinyin": "molihuang" + }, + { + "CMYK": [76, 51, 0, 0], + "RGB": [60, 126, 255], + "hex": "#3c7eff", + "name": "深海蓝", + "pinyin": "shenhailan" + } +] diff --git a/grailed-ui-go-view/src/settings/designSetting.ts b/grailed-ui-go-view/src/settings/designSetting.ts new file mode 100644 index 0000000..5f76b84 --- /dev/null +++ b/grailed-ui-go-view/src/settings/designSetting.ts @@ -0,0 +1,77 @@ +import { LangEnum, PreviewScaleEnum } from '@/enums/styleEnum' +import { RequestHttpIntervalEnum } from '@/enums/httpEnum' +import designColor from './designColor.json' + +// 默认语言 +export const lang = LangEnum.ZH + +// 水印文字 +export const watermarkText = "GoView 低代码平台" + +// 分组名称 +export const groupTitle = "分组" + +// 主题配置 +export const theme = { + // 默认是否开启深色主题 + darkTheme: true, + //默认主题色 + appTheme: '#51d6a9', + appThemeDetail: null, +} + +// 图表初始配置(px) +export const chartInitConfig = { + x: 50, + y: 50, + w: 500, + h: 300, + // 不建议动 offset + offsetX: 0, + offsetY: 0, +} + +// dialog 图标的大小 +export const dialogIconSize = '20' + +// 侧边栏宽度 +export const asideWidth = '270' + +// 侧边栏折叠后的宽度,支持全部折叠会覆盖为 0 +export const asideCollapsedWidth = 60 + +// 弹窗是否可以通过点击遮罩关闭 +export const maskClosable = false + +// 全局边框圆角 +export const borderRadius = '6px' + +// 轮播间隔 +export const carouselInterval = 4000 + +// 工作台大屏背景图片大小限制(5M) +export const backgroundImageSize = 5 + +// 预览展示方式 +export const previewScaleType = PreviewScaleEnum.FIT + +// 编辑工作台同步到 JSON 的轮询间隔(5S) +export const editToJsonInterval = 5000 + +// 数据请求间隔 +export const requestInterval = 30 + +// 工作台自动保存间隔(s) +export const saveInterval = 30 + +// 数据请求间隔单位 +export const requestIntervalUnit = RequestHttpIntervalEnum.SECOND + +// 工作区域历史记录存储最大数量 +export const editHistoryMax = 100 + +// 拖拽时蒙层的 z-index,需比所有图表高 +export const canvasModelIndex = 9999 + +// 框选时蒙层的 z-index,需比所有图表高 +export const selectBoxIndex = canvasModelIndex + 10 diff --git a/grailed-ui-go-view/src/settings/httpSetting.ts b/grailed-ui-go-view/src/settings/httpSetting.ts new file mode 100644 index 0000000..4143efd --- /dev/null +++ b/grailed-ui-go-view/src/settings/httpSetting.ts @@ -0,0 +1,2 @@ +// 请求前缀 +export const axiosPre = '/admin-api' diff --git a/grailed-ui-go-view/src/settings/pathConst.ts b/grailed-ui-go-view/src/settings/pathConst.ts new file mode 100644 index 0000000..4639316 --- /dev/null +++ b/grailed-ui-go-view/src/settings/pathConst.ts @@ -0,0 +1,10 @@ +// * 外部路径地址 + +// 项目文档地址 +export const docPath = "https://doc.iocoder.cn/report/" + +// 项目源码 +export const giteeSourceCodePath = "https://gitee.com/zhijiantianya/yudao-ui-go-view" + +// 赞助 +export const sponsorPath = "https://www.mtruning.club/sponsor/" diff --git a/grailed-ui-go-view/src/settings/systemSetting.ts b/grailed-ui-go-view/src/settings/systemSetting.ts new file mode 100644 index 0000000..84eb65d --- /dev/null +++ b/grailed-ui-go-view/src/settings/systemSetting.ts @@ -0,0 +1,19 @@ +import { SettingStoreEnums, ToolsStatusEnum } from '@/store/modules/settingStore/settingStore.d' + +// * 用户配置项 +export const systemSetting = { + // 侧边栏折叠是否隐藏全部 + [SettingStoreEnums.ASIDE_ALL_COLLAPSED]: true, + // 拖拽页面左侧表单分类只有一项的时候是否隐藏 + [SettingStoreEnums.HIDE_PACKAGE_ONE_CATEGORY]: true, + // 切换语言是否进行路由刷新 + [SettingStoreEnums.CHANGE_LANG_RELOAD]: false, + // 图表移动时按方向键移动的距离 + [SettingStoreEnums.CHART_MOVE_DISTANCE]: 5, + // 图表拖拽时的吸附距离(px) + [SettingStoreEnums.CHART_ALIGN_RANGE]: 10, + // 图表工具栏状态(侧边工具状态) + [SettingStoreEnums.CHART_TOOLS_STATUS]: ToolsStatusEnum.ASIDE, + // 图表工具栏状态隐藏(刚开始不隐藏) + [SettingStoreEnums.CHART_TOOLS_STATUS_HIDE]: false, +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/store/index.ts b/grailed-ui-go-view/src/store/index.ts new file mode 100644 index 0000000..4e303ea --- /dev/null +++ b/grailed-ui-go-view/src/store/index.ts @@ -0,0 +1,10 @@ +import type { App } from 'vue'; +import { createPinia } from 'pinia'; + +const pinia = createPinia(); + +export function setupStore(app: App) { + app.use(pinia); +} + +export { pinia }; diff --git a/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.d.ts b/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.d.ts new file mode 100644 index 0000000..2050d59 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -0,0 +1,248 @@ +import { CreateComponentType, CreateComponentGroupType, FilterEnum } from '@/packages/index.d' +import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' +import { SyncEnum } from '@/enums/editPageEnum' +import { + RequestHttpEnum, + RequestContentTypeEnum, + RequestDataTypeEnum, + RequestHttpIntervalEnum, + RequestParams, + RequestBodyEnum, + RequestParamsObjType +} from '@/enums/httpEnum' +import { PreviewScaleEnum } from '@/enums/styleEnum' +import type { ChartColorsNameType, GlobalThemeJsonType } from '@/settings/chartThemes/index' + +// 项目数据枚举 +export enum ProjectInfoEnum { + // ID + PROJECT_ID = "projectId", + // 名称 + PROJECT_NAME = 'projectName', + // 描述 + REMARKS = 'remarks', + // 缩略图 + THUMBNAIL= 'thumbnail', + // 是否公开发布 + RELEASE = 'release' +} + +// 项目数据 +export type ProjectInfoType = { + [ProjectInfoEnum.PROJECT_ID]: string, + [ProjectInfoEnum.PROJECT_NAME]: string, + [ProjectInfoEnum.REMARKS]: string, + [ProjectInfoEnum.THUMBNAIL]: string, + [ProjectInfoEnum.RELEASE]: boolean +} + +// 编辑画布属性 +export enum EditCanvasTypeEnum { + EDIT_LAYOUT_DOM = 'editLayoutDom', + EDIT_CONTENT_DOM = 'editContentDom', + OFFSET = 'offset', + SCALE = 'scale', + USER_SCALE = 'userScale', + LOCK_SCALE = 'lockScale', + SAVE_STATUS = 'saveStatus', + IS_CREATE = 'isCreate', + IS_DRAG = 'isDrag', + IS_SELECT = 'isSelect' +} + +// 编辑区域(临时) +export type EditCanvasType = { + // 编辑区域 DOM + [EditCanvasTypeEnum.EDIT_LAYOUT_DOM]: HTMLElement | null + [EditCanvasTypeEnum.EDIT_CONTENT_DOM]: HTMLElement | null + // 偏移大小 + [EditCanvasTypeEnum.OFFSET]: number + // 缩放 + [EditCanvasTypeEnum.SCALE]: number + // 缩放 + [EditCanvasTypeEnum.USER_SCALE]: number + // 锁定缩放 + [EditCanvasTypeEnum.LOCK_SCALE]: boolean + // 初始化创建 + [EditCanvasTypeEnum.IS_CREATE]: boolean + // 拖拽中 + [EditCanvasTypeEnum.IS_DRAG]: boolean + // 保存状态 + [EditCanvasTypeEnum.SAVE_STATUS]: SyncEnum + // 框选中 + [EditCanvasTypeEnum.IS_SELECT]: boolean +} + +// 画布数据/滤镜/背景色/宽高主题等 +export enum EditCanvasConfigEnum { + PROJECT_NAME = 'projectName', + WIDTH = 'width', + HEIGHT = 'height', + CHART_THEME_COLOR = 'chartThemeColor', + CHART_THEME_SETTING = 'chartThemeSetting', + BACKGROUND = 'background', + BACKGROUND_IMAGE = 'backgroundImage', + SELECT_COLOR = 'selectColor', + PREVIEW_SCALE_TYPE = 'previewScaleType' +} + +// 画布属性(需保存) +export type EditCanvasConfigType = { + // ID + [EditCanvasConfigEnum.PROJECT_ID]: string, + // 项目名称 + [EditCanvasConfigEnum.PROJECT_NAME]?: string, + // 项目描述 + [EditCanvasConfigEnum.REMARKS]: string, + // 滤镜-启用 + [FilterEnum.FILTERS_SHOW]: boolean + // 滤镜-色相 + [FilterEnum.HUE_ROTATE]: number + // 滤镜-饱和度 + [FilterEnum.SATURATE]: number + // 滤镜-亮度 + [FilterEnum.BRIGHTNESS]: number + // 滤镜-对比度 + [FilterEnum.CONTRAST]: number + // 滤镜-不透明度 + [FilterEnum.OPACITY]: number + // 变换(暂不使用) + [FilterEnum.ROTATE_Z]: number + [FilterEnum.ROTATE_X]: number + [FilterEnum.ROTATE_Y]: number + [FilterEnum.SKEW_X]: number + [FilterEnum.SKEW_Y]: number + [FilterEnum.BLEND_MODE]: string + // 大屏名称 + [EditCanvasConfigEnum.PROJECT_NAME]?: string + // 大屏宽度 + [EditCanvasConfigEnum.WIDTH]: number + // 大屏高度 + [EditCanvasConfigEnum.HEIGHT]: number + // 背景色 + [EditCanvasConfigEnum.BACKGROUND]?: string + [EditCanvasConfigEnum.BACKGROUND_IMAGE]?: string | null + // 图表主题颜色 + [EditCanvasConfigEnum.CHART_THEME_COLOR]: ChartColorsNameType + // 图表全局配置 + [EditCanvasConfigEnum.CHART_THEME_SETTING]: GlobalThemeJsonType + // 图表主题颜色 + [EditCanvasConfigEnum.SELECT_COLOR]: boolean + // 预览展示方式 + [EditCanvasConfigEnum.PREVIEW_SCALE_TYPE]: PreviewScaleEnum +} + +// 坐标轴信息 +// eslint-disable-next-line no-redeclare +export enum EditCanvasTypeEnum { + START_X = 'startX', + START_Y = 'startY', + X = 'x', + Y = 'y' +} + +// 鼠标位置 +export type MousePositionType = { + // 开始 X + [EditCanvasTypeEnum.START_X]: number + // 开始 Y + [EditCanvasTypeEnum.START_Y]: number + // X + [EditCanvasTypeEnum.X]: number + // y + [EditCanvasTypeEnum.Y]: number +} + +// 操作目标 +export type TargetChartType = { + hoverId?: string + selectId: string[] +} + +// 数据记录 +export type RecordChartType = { + charts: CreateComponentType | CreateComponentGroupType | Array + type: HistoryActionTypeEnum.CUT | HistoryActionTypeEnum.COPY +} + +// Store 枚举 +export enum ChartEditStoreEnum { + PROJECT_INFO = 'projectInfo', + EDIT_RANGE = 'editRange', + EDIT_CANVAS = 'editCanvas', + RIGHT_MENU_SHOW = 'rightMenuShow', + MOUSE_POSITION = 'mousePosition', + TARGET_CHART = 'targetChart', + RECORD_CHART = 'recordChart', + // 以下需要存储 + EDIT_CANVAS_CONFIG = 'editCanvasConfig', + REQUEST_GLOBAL_CONFIG = 'requestGlobalConfig', + COMPONENT_LIST = 'componentList' +} + +// 请求公共类型 +type RequestPublicConfigType = { + // 时间单位(时分秒) + requestIntervalUnit: RequestHttpIntervalEnum + // 请求内容 + requestParams: RequestParams +} + +// 数据池项类型 +export type RequestDataPondItemType = { + dataPondId: string, + dataPondName: string, + dataPondRequestConfig: RequestConfigType +} + +// 全局的图表请求配置 +export interface RequestGlobalConfigType extends RequestPublicConfigType { + // 组件定制轮询时间 + requestInterval: number + // 请求源地址 + requestOriginUrl?: string + // 公共数据池 + requestDataPond: RequestDataPondItemType[] +} + +// 单个图表请求配置 +export interface RequestConfigType extends RequestPublicConfigType { + // 所选全局数据池的对应 id + requestDataPondId?: string + // 组件定制轮询时间 + requestInterval?: number + // 获取数据的方式 + requestDataType: RequestDataTypeEnum + // 请求方式 get/post/del/put/patch + requestHttpType: RequestHttpEnum + // 源后续的 url + requestUrl?: string + // 请求内容主体方式 普通/sql + requestContentType: RequestContentTypeEnum + // 请求体类型 + requestParamsBodyType: RequestBodyEnum + // SQL 请求对象 + requestSQLContent: { + sql: string + } +} + +// Store 类型 +export interface ChartEditStoreType { + [ChartEditStoreEnum.PROJECT_INFO]: ProjectInfoType + [ChartEditStoreEnum.EDIT_CANVAS]: EditCanvasType + [ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: EditCanvasConfigType + [ChartEditStoreEnum.RIGHT_MENU_SHOW]: boolean + [ChartEditStoreEnum.MOUSE_POSITION]: MousePositionType + [ChartEditStoreEnum.TARGET_CHART]: TargetChartType + [ChartEditStoreEnum.RECORD_CHART]?: RecordChartType + [ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]: RequestGlobalConfigType + [ChartEditStoreEnum.COMPONENT_LIST]: Array +} + +// 存储数据类型 +export interface ChartEditStorage { + [ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: EditCanvasConfigType + [ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]: RequestGlobalConfigType + [ChartEditStoreEnum.COMPONENT_LIST]: Array +} diff --git a/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.ts b/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.ts new file mode 100644 index 0000000..2101525 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartEditStore/chartEditStore.ts @@ -0,0 +1,988 @@ +import { toRaw } from 'vue' +import { defineStore } from 'pinia' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { PublicGroupConfigClass } from '@/packages/public/publicConfig' +import debounce from 'lodash/debounce' +import cloneDeep from 'lodash/cloneDeep' +import { defaultTheme, globalThemeJson } from '@/settings/chartThemes/index' +import { requestInterval, previewScaleType, requestIntervalUnit } from '@/settings/designSetting' +// 记录记录 +import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' +// 全局设置 +import { useSettingStore } from '@/store/modules/settingStore/settingStore' +// 历史类型 +import { HistoryActionTypeEnum, HistoryItemType, HistoryTargetTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' +// 画布枚举 +import { MenuEnum, SyncEnum } from '@/enums/editPageEnum' + +import { + getUUID, + loadingStart, + loadingFinish, + loadingError, + isString, + isArray +} from '@/utils' + +import { + ProjectInfoType, + ChartEditStoreEnum, + ChartEditStorage, + ChartEditStoreType, + EditCanvasType, + MousePositionType, + TargetChartType, + RecordChartType, + RequestGlobalConfigType, + EditCanvasConfigType +} from './chartEditStore.d' + +const chartHistoryStore = useChartHistoryStore() +const settingStore = useSettingStore() + +// 编辑区域内容 +export const useChartEditStore = defineStore({ + id: 'useChartEditStore', + state: (): ChartEditStoreType => ({ + // 项目数据 + projectInfo: { + projectId: '', + projectName: '', + remarks: '', + thumbnail: '', + release: false + }, + // 画布属性 + editCanvas: { + // 编辑区域 Dom + editLayoutDom: null, + editContentDom: null, + // 偏移量 + offset: 20, + // 系统控制缩放 + scale: 1, + // 用户控制的缩放 + userScale: 1, + // 锁定缩放 + lockScale: false, + // 初始化 + isCreate: false, + // 拖拽中 + isDrag: false, + // 框选中 + isSelect: false, + // 同步中 + saveStatus: SyncEnum.PENDING + }, + // 右键菜单 + rightMenuShow: false, + // 鼠标定位 + mousePosition: { + startX: 0, + startY: 0, + x: 0, + y: 0 + }, + // 目标图表 + targetChart: { + hoverId: undefined, + selectId: [] + }, + // 记录临时数据(复制等) + recordChart: undefined, + // ----------------------- + // 画布属性(需存储给后端) + editCanvasConfig: { + // 项目名称 + projectName: undefined, + // 默认宽度 + width: 1920, + // 默认高度 + height: 1080, + // 启用滤镜 + filterShow: false, + // 色相 + hueRotate: 0, + // 饱和度 + saturate: 1, + // 对比度 + contrast: 1, + // 亮度 + brightness: 1, + // 透明度 + opacity: 1, + // 变换(暂不更改) + rotateZ: 0, + rotateX: 0, + rotateY: 0, + skewX: 0, + skewY: 0, + // 混合模式 + blendMode: 'normal', + // 默认背景色 + background: undefined, + backgroundImage: undefined, + // 是否使用纯颜色 + selectColor: true, + // chart 主题色 + chartThemeColor: defaultTheme || 'dark', + // 全局配置 + chartThemeSetting: globalThemeJson, + // 适配方式 + previewScaleType: previewScaleType + }, + // 数据请求处理(需存储给后端) + requestGlobalConfig: { + requestDataPond: [], + requestOriginUrl: '', + requestInterval: requestInterval, + requestIntervalUnit: requestIntervalUnit, + requestParams: { + Body: { + 'form-data': {}, + 'x-www-form-urlencoded': {}, + json: '', + xml: '' + }, + Header: {}, + Params: {} + } + }, + // 图表数组(需存储给后端) + componentList: [] + }), + getters: { + getProjectInfo(): ProjectInfoType { + return this.projectInfo + }, + getMousePosition(): MousePositionType { + return this.mousePosition + }, + getRightMenuShow(): boolean { + return this.rightMenuShow + }, + getEditCanvas(): EditCanvasType { + return this.editCanvas + }, + getEditCanvasConfig(): EditCanvasConfigType { + return this.editCanvasConfig + }, + getTargetChart(): TargetChartType { + return this.targetChart + }, + getRecordChart(): RecordChartType | undefined { + return this.recordChart + }, + getRequestGlobalConfig(): RequestGlobalConfigType { + return this.requestGlobalConfig + }, + getComponentList(): Array { + return this.componentList + }, + // 获取需要存储的数据项 + getStorageInfo(): ChartEditStorage { + return { + [ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: this.getEditCanvasConfig, + [ChartEditStoreEnum.COMPONENT_LIST]: this.getComponentList, + [ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]: this.getRequestGlobalConfig + } + } + }, + actions: { + // * 设置 peojectInfo 数据项 + setProjectInfo(key: T, value: K) { + this.projectInfo[key] = value + }, + // * 设置 editCanvas 数据项 + setEditCanvas(key: T, value: K) { + this.editCanvas[key] = value + }, + // * 设置 editCanvasConfig(需保存后端) 数据项 + setEditCanvasConfig(key: T, value: K) { + this.editCanvasConfig[key] = value + }, + // * 设置右键菜单 + setRightMenuShow(value: boolean) { + this.rightMenuShow = value + }, + // * 设置目标数据 hover + setTargetHoverChart(hoverId?: TargetChartType['hoverId']) { + this.targetChart.hoverId = hoverId + }, + // * 设置目标数据 select + setTargetSelectChart(selectId?: string | string[], push: boolean = false) { + // 重复选中 + if (this.targetChart.selectId.find((e: string) => e === selectId)) return + + // 无 id 清空 + if (!selectId) { + this.targetChart.selectId = [] + return + } + // 多选 + if (push) { + // 字符串 + if (isString(selectId)) { + this.targetChart.selectId.push(selectId) + return + } + // 数组 + if (isArray(selectId)) { + this.targetChart.selectId.push(...selectId) + return + } + } else { + // 字符串 + if (isString(selectId)) { + this.targetChart.selectId = [selectId] + return + } + // 数组 + if (isArray(selectId)) { + this.targetChart.selectId = selectId + return + } + } + }, + // * 设置记录数据 + setRecordChart(item: RecordChartType | undefined) { + this.recordChart = cloneDeep(item) + }, + // * 设置鼠标位置 + setMousePosition(x?: number, y?: number, startX?: number, startY?: number): void { + if (x) this.mousePosition.x = x + if (y) this.mousePosition.y = y + if (startX) this.mousePosition.startX = startX + if (startY) this.mousePosition.startY = startY + }, + // * 找到目标 id 数据的下标位置,id可为父级或子集数组(无则返回-1) + fetchTargetIndex(id?: string): number { + const targetId = id || (this.getTargetChart.selectId.length && this.getTargetChart.selectId[0]) || undefined + if (!targetId) { + loadingFinish() + return -1 + } + const targetIndex = this.componentList.findIndex(e => e.id === targetId) + + // 当前 + if (targetIndex !== -1) { + return targetIndex + } else { + const length = this.getComponentList.length + for (let i = 0; i < length; i++) { + if (this.getComponentList[i].isGroup) { + for (const cItem of (this.getComponentList[i] as CreateComponentGroupType).groupList) { + if (cItem.id === targetId) { + return i + } + } + } + } + } + return -1 + }, + // * 统一格式化处理入参 id + idPreFormat(id?: string | string[]) { + const idArr = [] + if (!id) { + idArr.push(...this.getTargetChart.selectId) + return idArr + } + if (isString(id)) idArr.push(id) + if (isArray(id)) idArr.push(...id) + return idArr + }, + /** + * * 新增组件列表 + * @param componentInstance 新图表实例 + * @param isHead 是否头部插入 + * @param isHistory 是否进行记录 + * @returns + */ + addComponentList( + componentInstance: + | CreateComponentType + | CreateComponentGroupType + | Array, + isHead = false, + isHistory = false + ): void { + if (componentInstance instanceof Array) { + componentInstance.forEach(item => { + this.addComponentList(item, isHead, isHistory) + }) + return + } + if (isHistory) { + chartHistoryStore.createAddHistory([componentInstance]) + } + if (isHead) { + this.componentList.unshift(componentInstance) + return + } + this.componentList.push(componentInstance) + }, + // * 删除组件 + removeComponentList(id?: string | string[], isHistory = true): void { + try { + const idArr = this.idPreFormat(id) + const history: Array = [] + // 遍历所有对象 + if (!idArr.length) return + + loadingStart() + idArr.forEach(ids => { + const index = this.fetchTargetIndex(ids) + if (index !== -1) { + history.push(this.getComponentList[index]) + this.componentList.splice(index, 1) + } + }) + isHistory && chartHistoryStore.createDeleteHistory(history) + loadingFinish() + return + } catch (value) { + loadingError() + } + }, + // * 重置组件位置 + resetComponentPosition(item: CreateComponentType | CreateComponentGroupType, isForward: boolean): void { + const index = this.fetchTargetIndex(item.id) + if (index > -1) { + const componentInstance = this.getComponentList[index] + if (isForward) { + componentInstance.attr = Object.assign(componentInstance.attr, { + x: item.attr.x + item.attr.offsetX, + y: item.attr.y + item.attr.offsetY + }) + } else { + componentInstance.attr = Object.assign(componentInstance.attr, { + x: item.attr.x, + y: item.attr.y + }) + } + } + }, + // * 移动组件 + moveComponentList(item: Array) { + chartHistoryStore.createMoveHistory(item) + }, + // * 更新组件列表某一项的值 + updateComponentList(index: number, newData: CreateComponentType | CreateComponentGroupType) { + if (index < 1 && index > this.getComponentList.length) return + this.componentList[index] = newData + }, + // * 设置页面样式属性 + setPageStyle(key: T, value: any): void { + const dom = this.getEditCanvas.editContentDom + if (dom) { + dom.style[key] = value + } + }, + // * 移动组件列表层级位置到两端 + setBothEnds(isEnd = false, isHistory = true): void { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const length = this.getComponentList.length + if (length < 2) { + loadingFinish() + return + } + + const index = this.fetchTargetIndex() + const targetData = this.getComponentList[index] + if (index !== -1) { + // 置底排除最底层, 置顶排除最顶层 + if ((isEnd && index === 0) || (!isEnd && index === length - 1)) { + loadingFinish() + return + } + + // 记录原有位置 + const setIndex = (componentInstance: CreateComponentType | CreateComponentGroupType, i: number) => { + const temp = cloneDeep(componentInstance) + temp.attr.zIndex = i + return temp + } + + // 历史记录 + if (isHistory) { + chartHistoryStore.createLayerHistory( + [setIndex(targetData, index)], + isEnd ? HistoryActionTypeEnum.BOTTOM : HistoryActionTypeEnum.TOP + ) + } + + // 插入两端 + this.addComponentList(targetData, isEnd) + this.getComponentList.splice(isEnd ? index + 1 : index, 1) + loadingFinish() + return + } + } catch (value) { + loadingError() + } + }, + // * 置顶 + setTop(isHistory = true): void { + this.setBothEnds(false, isHistory) + }, + // * 置底 + setBottom(isHistory = true): void { + this.setBothEnds(true, isHistory) + }, + // * 上移/下移互换图表位置 + wrap(isDown = false, isHistory = true) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const length = this.getComponentList.length + if (length < 2) { + loadingFinish() + return + } + + const index: number = this.fetchTargetIndex() + if (index !== -1) { + // 下移排除最底层, 上移排除最顶层 + if ((isDown && index === 0) || (!isDown && index === length - 1)) { + loadingFinish() + return + } + // 互换位置 + const swapIndex = isDown ? index - 1 : index + 1 + const targetItem = this.getComponentList[index] + const swapItem = this.getComponentList[swapIndex] + + // 历史记录 + if (isHistory) { + chartHistoryStore.createLayerHistory( + [targetItem], + isDown ? HistoryActionTypeEnum.DOWN : HistoryActionTypeEnum.UP + ) + } + this.updateComponentList(index, swapItem) + this.updateComponentList(swapIndex, targetItem) + loadingFinish() + return + } + } catch (value) { + loadingError() + } + }, + // * 图层上移 + setUp(isHistory = true) { + this.wrap(false, isHistory) + }, + // * 图层下移 + setDown(isHistory = true) { + this.wrap(true, isHistory) + }, + // * 复制 + setCopy(isCut = false) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + // 处理弹窗普通复制的场景 + if (document.getElementsByClassName('n-modal-body-wrapper').length) return + + loadingStart() + const index: number = this.fetchTargetIndex() + if (index !== -1) { + const copyData: RecordChartType = { + charts: this.getComponentList[index], + type: isCut ? HistoryActionTypeEnum.CUT : HistoryActionTypeEnum.COPY + } + this.setRecordChart(copyData) + window['$message'].success(isCut ? '剪切图表成功' : '复制图表成功!') + loadingFinish() + } + } catch (value) { + loadingError() + } + }, + // * 剪切 + setCut() { + this.setCopy(true) + }, + // * 粘贴 + setParse() { + try { + loadingStart() + const recordCharts = this.getRecordChart + if (recordCharts === undefined) { + loadingFinish() + return + } + const parseHandle = (e: CreateComponentType | CreateComponentGroupType) => { + e = cloneDeep(e) + e.attr.x = this.getMousePosition.x + 30 + e.attr.y = this.getMousePosition.y + 30 + // 外层生成新 id + e.id = getUUID() + // 分组列表生成新 id + if (e.isGroup) { + (e as CreateComponentGroupType).groupList.forEach((item: CreateComponentType) => { + item.id = getUUID() + }) + } + + return e + } + const isCut = recordCharts.type === HistoryActionTypeEnum.CUT + const targetList = Array.isArray(recordCharts.charts) ? recordCharts.charts : [ recordCharts.charts ] + // 多项 + targetList.forEach((e: CreateComponentType | CreateComponentGroupType) => { + this.addComponentList(parseHandle(e), undefined, true) + // 剪切需删除原数据 + if (isCut) { + this.setTargetSelectChart(e.id) + this.removeComponentList(undefined, true) + } + }) + if (isCut) this.setRecordChart(undefined) + loadingFinish() + } catch (value) { + loadingError() + } + }, + // * 撤回/前进 目标处理 + setBackAndSetForwardHandle(HistoryItem: HistoryItemType, isForward = false) { + // 处理画布 + if (HistoryItem.targetType === HistoryTargetTypeEnum.CANVAS) { + this.editCanvas = HistoryItem.historyData[0] as EditCanvasType + return + } + + // 取消选中 + this.setTargetSelectChart() + + // 重新选中 + let historyData = HistoryItem.historyData as Array + if (isArray(historyData)) { + // 选中目标元素,支持多个 + historyData.forEach((item: CreateComponentType | CreateComponentGroupType) => { + this.setTargetSelectChart(item.id, true) + }) + } + + // 处理新增类型 + const isAdd = HistoryItem.actionType === HistoryActionTypeEnum.ADD + const isDel = HistoryItem.actionType === HistoryActionTypeEnum.DELETE + if (isAdd || isDel) { + if ((isAdd && isForward) || (isDel && !isForward)) { + historyData.forEach(item => { + this.addComponentList(item) + }) + return + } + historyData.forEach(item => { + this.removeComponentList(item.id, false) + }) + return + } + + // 处理移动 + const isMove = HistoryItem.actionType === HistoryActionTypeEnum.MOVE + if (isMove) { + historyData.forEach(item => { + this.resetComponentPosition(item, isForward) + }) + return + } + + // 处理层级 + const isTop = HistoryItem.actionType === HistoryActionTypeEnum.TOP + const isBottom = HistoryItem.actionType === HistoryActionTypeEnum.BOTTOM + if (isTop || isBottom) { + if (!isForward) { + // 插入到原有位置 + if (isTop) this.getComponentList.pop() + if (isBottom) this.getComponentList.shift() + this.getComponentList.splice(historyData[0].attr.zIndex, 0, historyData[0]) + return + } + if (isTop) this.setTop(false) + if (isBottom) this.setBottom(false) + } + + const isUp = HistoryItem.actionType === HistoryActionTypeEnum.UP + const isDown = HistoryItem.actionType === HistoryActionTypeEnum.DOWN + if (isUp || isDown) { + if ((isUp && isForward) || (isDown && !isForward)) { + this.setUp(false) + return + } + this.setDown(false) + return + } + + // 处理分组 + const isGroup = HistoryItem.actionType === HistoryActionTypeEnum.GROUP + const isUnGroup = HistoryItem.actionType === HistoryActionTypeEnum.UN_GROUP + if (isGroup || isUnGroup) { + if ((isGroup && isForward) || (isUnGroup && !isForward)) { + const ids: string[] = [] + if (historyData.length > 1) { + historyData.forEach(item => { + ids.push(item.id) + }) + } else { + const group = historyData[0] as CreateComponentGroupType + group.groupList.forEach(item => { + ids.push(item.id) + }) + } + this.setGroup(ids, false) + return + } + // 都需使用子组件的id去解组 + if (historyData.length > 1) { + this.setUnGroup([(historyData[0] as CreateComponentType).id], undefined, false) + } else { + this.setUnGroup([(historyData[0] as CreateComponentGroupType).groupList[0].id], undefined, false) + } + return + } + + // 处理锁定 + const isLock = HistoryItem.actionType === HistoryActionTypeEnum.LOCK + const isUnLock = HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK + if (isLock || isUnLock) { + if ((isLock && isForward) || (isUnLock && !isForward)) { + historyData.forEach(item => { + this.setLock(!item.status.lock, false) + }) + return + } + historyData.forEach(item => { + this.setUnLock(false) + }) + return + } + + // 处理隐藏 + const isHide = HistoryItem.actionType === HistoryActionTypeEnum.HIDE + const isShow = HistoryItem.actionType === HistoryActionTypeEnum.SHOW + if (isHide || isShow) { + if ((isHide && isForward) || (isShow && !isForward)) { + historyData.forEach(item => { + this.setHide(!item.status.hide, false) + }) + return + } + historyData.forEach(item => { + this.setShow(false) + }) + return + } + }, + // * 撤回 + setBack() { + try { + loadingStart() + const targetData = chartHistoryStore.backAction() + if (!targetData) { + loadingFinish() + return + } + this.setBackAndSetForwardHandle(targetData) + loadingFinish() + } catch (value) { + loadingError() + } + }, + // * 前进 + setForward() { + try { + loadingStart() + const targetData = chartHistoryStore.forwardAction() + if (!targetData) { + loadingFinish() + return + } + this.setBackAndSetForwardHandle(targetData, true) + loadingFinish() + } catch (value) { + loadingError() + } + }, + // * 移动位置 + setMove(keyboardValue: MenuEnum) { + const index = this.fetchTargetIndex() + if (index === -1) return + const attr = this.getComponentList[index].attr + const distance = settingStore.getChartMoveDistance + switch (keyboardValue) { + case MenuEnum.ARROW_UP: + attr.y -= distance + break + case MenuEnum.ARROW_RIGHT: + attr.x += distance + break + case MenuEnum.ARROW_DOWN: + attr.y += distance + break + case MenuEnum.ARROW_LEFT: + attr.x -= distance + break + } + }, + // * 创建分组 + setGroup(id?: string | string[], isHistory = true) { + try { + const selectIds = this.idPreFormat(id) || this.getTargetChart.selectId + if (selectIds.length < 2) return + + loadingStart() + const groupClass = new PublicGroupConfigClass() + // 记录整体坐标 + const groupAttr = { + l: this.getEditCanvasConfig.width, + t: this.getEditCanvasConfig.height, + r: 0, + b: 0 + } + const targetList: CreateComponentType[] = [] + const historyList: CreateComponentType[] = [] + + // 若目标中有数组则先解组 + const newSelectIds: string[] = [] + selectIds.forEach((id: string) => { + const targetIndex = this.fetchTargetIndex(id) + if (targetIndex !== -1 && this.getComponentList[targetIndex].isGroup) { + this.setUnGroup( + [id], + (e: CreateComponentType[]) => { + e.forEach(e => { + this.addComponentList(e) + newSelectIds.push(e.id) + }) + }, + false + ) + } else if (targetIndex !== -1) { + newSelectIds.push(id) + } + }) + newSelectIds.forEach((id: string) => { + // 获取目标数据并从 list 中移除 (成组后不可再次成组, 断言处理) + const item = this.componentList.splice(this.fetchTargetIndex(id), 1)[0] as CreateComponentType + const { x, y, w, h } = item.attr + const { l, t, r, b } = groupAttr + // 左 + groupAttr.l = l > x ? x : l + // 上 + groupAttr.t = t > y ? y : t + // 宽 + groupAttr.r = r < x + w ? x + w : r + // 高 + groupAttr.b = b < y + h ? y + h : b + + targetList.push(item) + historyList.push(toRaw(item)) + }) + + // 修改原数据之前,先记录 + if (isHistory) chartHistoryStore.createGroupHistory(historyList) + + // 设置子组件的位置 + targetList.forEach((item: CreateComponentType) => { + item.attr.x = item.attr.x - groupAttr.l + item.attr.y = item.attr.y - groupAttr.t + groupClass.groupList.push(item) + }) + + // 设置 group 属性 + groupClass.attr.x = groupAttr.l + groupClass.attr.y = groupAttr.t + groupClass.attr.w = groupAttr.r - groupAttr.l + groupClass.attr.h = groupAttr.b - groupAttr.t + + this.addComponentList(groupClass) + this.setTargetSelectChart(groupClass.id) + + loadingFinish() + } catch (error) { + console.log(error) + window['$message'].error('创建分组失败,请联系管理员!') + loadingFinish() + } + }, + // * 解除分组 + setUnGroup(ids?: string[], callBack?: (e: CreateComponentType[]) => void, isHistory = true) { + try { + const selectGroupIdArr = ids || this.getTargetChart.selectId + if (selectGroupIdArr.length !== 1) return + loadingStart() + + // 解组 + const unGroup = (targetIndex: number) => { + const targetGroup = this.getComponentList[targetIndex] as CreateComponentGroupType + if (!targetGroup.isGroup) return + + // 记录数据 + if (isHistory) chartHistoryStore.createUnGroupHistory(cloneDeep([targetGroup])) + + // 分离组件并还原位置属性 + targetGroup.groupList.forEach(item => { + item.attr.x = item.attr.x + targetGroup.attr.x + item.attr.y = item.attr.y + targetGroup.attr.y + if (!callBack) { + this.addComponentList(item) + } + }) + this.setTargetSelectChart(targetGroup.id) + // 删除分组 + this.removeComponentList(targetGroup.id, false) + + if (callBack) { + callBack(targetGroup.groupList) + } + } + + const targetIndex = this.fetchTargetIndex(selectGroupIdArr[0]) + // 判断目标是否为分组父级 + if (targetIndex !== -1) { + unGroup(targetIndex) + } + + loadingFinish() + } catch (error) { + console.log(error) + window['$message'].error('解除分组失败,请联系管理员!') + loadingFinish() + } + }, + // * 锁定 + setLock(status: boolean = true, isHistory: boolean = true) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const index: number = this.fetchTargetIndex() + if (index !== -1) { + // 更新状态 + const targetItem = this.getComponentList[index] + targetItem.status.lock = status + + // 历史记录 + if (isHistory) { + status + ? chartHistoryStore.createLockHistory([targetItem]) + : chartHistoryStore.createUnLockHistory([targetItem]) + } + this.updateComponentList(index, targetItem) + // 锁定添加失焦效果 + if (status) this.setTargetSelectChart(undefined) + loadingFinish() + return + } + } catch (value) { + loadingError() + } + }, + // * 解除锁定 + setUnLock(isHistory: boolean = true) { + this.setLock(false, isHistory) + }, + // * 隐藏 + setHide(status: boolean = true, isHistory: boolean = true) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const index: number = this.fetchTargetIndex() + if (index !== -1) { + // 更新状态 + const targetItem = this.getComponentList[index] + targetItem.status.hide = status + + // 历史记录 + if (isHistory) { + status + ? chartHistoryStore.createHideHistory([targetItem]) + : chartHistoryStore.createShowHistory([targetItem]) + } + this.updateComponentList(index, targetItem) + loadingFinish() + + // 隐藏添加失焦效果 + if (status) this.setTargetSelectChart(undefined) + } + } catch (value) { + loadingError() + } + }, + // * 显示 + setShow(isHistory: boolean = true) { + this.setHide(false, isHistory) + }, + // ---------------- + // * 设置页面大小 + setPageSize(scale: number): void { + this.setPageStyle('height', `${this.editCanvasConfig.height * scale}px`) + this.setPageStyle('width', `${this.editCanvasConfig.width * scale}px`) + }, + // * 计算缩放 + computedScale() { + if (this.getEditCanvas.editLayoutDom) { + // 现有展示区域 + const width = this.getEditCanvas.editLayoutDom.clientWidth - this.getEditCanvas.offset * 2 - 5 + const height = this.getEditCanvas.editLayoutDom.clientHeight - this.getEditCanvas.offset * 4 + + // 用户设定大小 + const editCanvasWidth = this.editCanvasConfig.width + const editCanvasHeight = this.editCanvasConfig.height + + // 需保持的比例 + const baseProportion = parseFloat((editCanvasWidth / editCanvasHeight).toFixed(5)) + const currentRate = parseFloat((width / height).toFixed(5)) + + if (currentRate > baseProportion) { + // 表示更宽 + const scaleWidth = parseFloat(((height * baseProportion) / editCanvasWidth).toFixed(5)) + this.setScale(scaleWidth > 1 ? 1 : scaleWidth) + } else { + // 表示更高 + const scaleHeight = parseFloat((width / baseProportion / editCanvasHeight).toFixed(5)) + this.setScale(scaleHeight > 1 ? 1 : scaleHeight) + } + } else { + window['$message'].warning('请先创建画布,再进行缩放') + } + }, + // * 监听缩放 + listenerScale(): Function { + const resize = debounce(this.computedScale, 200) + // 默认执行一次 + resize() + // 开始监听 + window.addEventListener('resize', resize) + // 销毁函数 + const remove = () => { + window.removeEventListener('resize', resize) + } + return remove + }, + /** + * * 设置缩放 + * @param scale 0~1 number 缩放比例; + * @param force boolean 强制缩放 + */ + setScale(scale: number, force = false): void { + if (!this.getEditCanvas.lockScale || force) { + this.setPageSize(scale) + this.getEditCanvas.userScale = scale + this.getEditCanvas.scale = scale + } + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryDefine.ts b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryDefine.ts new file mode 100644 index 0000000..edb15a3 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryDefine.ts @@ -0,0 +1,23 @@ +import { HistoryTargetTypeEnum, HistoryActionTypeEnum } from './chartHistoryStore.d' + +export const historyActionTypeName = { + [HistoryActionTypeEnum.ADD]: '新增', + [HistoryActionTypeEnum.DELETE]: '删除', + [HistoryActionTypeEnum.UPDATE]: '更新', + [HistoryActionTypeEnum.MOVE]: '移动', + [HistoryActionTypeEnum.PASTE]: '粘贴', + [HistoryActionTypeEnum.COPY]: '复制', + [HistoryActionTypeEnum.CUT]: '剪切', + [HistoryActionTypeEnum.TOP]: '置顶', + [HistoryActionTypeEnum.BOTTOM]: '置底', + [HistoryActionTypeEnum.UP]: '上移', + [HistoryActionTypeEnum.DOWN]: '下移', + [HistoryActionTypeEnum.GROUP]: '成组', + [HistoryActionTypeEnum.UN_GROUP]: '解组', + [HistoryActionTypeEnum.LOCK]: '锁定', + [HistoryActionTypeEnum.UNLOCK]: '解锁', + [HistoryActionTypeEnum.HIDE]: '隐藏', + [HistoryActionTypeEnum.SHOW]: '显示', + + [HistoryTargetTypeEnum.CANVAS]: '画布初始化' +} diff --git a/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts new file mode 100644 index 0000000..9ec7920 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts @@ -0,0 +1,78 @@ +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { EditCanvasType } from '@/store/modules/chartEditStore/chartEditStore.d' + +// 操作类型枚举 + +export enum HistoryActionTypeEnum { + // 新增 + ADD = 'add', + // 删除 + DELETE = 'delete', + // 更新(位置,属性) + UPDATE = 'update', + // 移动 + MOVE = 'move', + // 复制 + COPY = 'copy', + // 剪切 + CUT = 'cut', + // 粘贴 + PASTE = 'paste', + // 置顶 + TOP = 'top', + // 置底 + BOTTOM = 'bottom', + // 上移 + UP = 'up', + // 下移 + DOWN = 'down', + // 成组 + GROUP = 'group', + // 解组 + UN_GROUP = 'unGroup', + // 锁定 + LOCK = 'lock', + // 解除锁定 + UNLOCK = 'unLock', + // 隐藏 + HIDE = 'hide', + // 显示 + SHOW = 'show' +} + +// 对象类型 +export enum HistoryTargetTypeEnum { + CANVAS = 'canvas', + CHART = 'chart' +} + +// 历史栈 +export enum HistoryStackEnum { + BACK_STACK = 'backStack', + FORWARD_STACK = 'forwardStack' +} + +// 历史记录项 +export enum HistoryStackItemEnum { + ID = 'id', + TARGET_TYPE = 'targetType', + ACTION_TYPE = 'actionType', + HISTORY_DATA = 'historyData' +} + +// 历史记录项类型 +export interface HistoryItemType { + // 会有同时操作多个组件场景 + [HistoryStackItemEnum.ID]: string + [HistoryStackItemEnum.TARGET_TYPE]: HistoryTargetTypeEnum + [HistoryStackItemEnum.ACTION_TYPE]: HistoryActionTypeEnum + [HistoryStackItemEnum.HISTORY_DATA]: CreateComponentType[] | CreateComponentGroupType[] | EditCanvasType[] +} + +// 历史 Store 类型 +export interface ChartHistoryStoreType { + // 后退栈 + [HistoryStackEnum.BACK_STACK]: Array + // 前进栈 + [HistoryStackEnum.FORWARD_STACK]: Array +} diff --git a/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.ts b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.ts new file mode 100644 index 0000000..dc67ca9 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartHistoryStore/chartHistoryStore.ts @@ -0,0 +1,188 @@ +import { defineStore } from 'pinia' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { EditCanvasType } from '@/store/modules/chartEditStore/chartEditStore.d' +import { loadingStart, loadingFinish, loadingError } from '@/utils' +import { editHistoryMax } from '@/settings/designSetting' +import { + HistoryStackItemEnum, + HistoryActionTypeEnum, + HistoryTargetTypeEnum, + HistoryItemType, + ChartHistoryStoreType +} from './chartHistoryStore.d' + +export const useChartHistoryStore = defineStore({ + id: 'useChartHistoryStore', + state: (): ChartHistoryStoreType => ({ + // 后退栈 + backStack: [], + // 前进栈 + forwardStack: [] + }), + getters: { + getBackStack(): Array { + return this.backStack + }, + getForwardStack(): Array { + return this.forwardStack + } + }, + actions: { + /** + * * 新增记录并插入栈 + * @param item 图表实例 + * @param actionType 动作类型 + * @param targetType 对象类型(默认图表) + */ + createStackItem( + item: CreateComponentType[] | CreateComponentGroupType[] | EditCanvasType[], + actionType: HistoryActionTypeEnum, + targetType: HistoryTargetTypeEnum = HistoryTargetTypeEnum.CHART + ) { + // 优化性能转为 freeze + this.pushBackStackItem( + Object.freeze({ + [HistoryStackItemEnum.ID]: new Date().getTime().toString(), + [HistoryStackItemEnum.HISTORY_DATA]: item, + [HistoryStackItemEnum.ACTION_TYPE]: actionType, + [HistoryStackItemEnum.TARGET_TYPE]: targetType + } as const) + ) + }, + // * 画布初始化 + canvasInit(canvas: EditCanvasType) { + this.createStackItem([canvas], HistoryActionTypeEnum.ADD, HistoryTargetTypeEnum.CANVAS) + }, + // * 推入后退栈 + pushBackStackItem(item: HistoryItemType | Array, notClear = false): void { + if (item instanceof Array) this.backStack = [...this.backStack, ...item] + else this.backStack.push(item) + this.backStack.splice(0, this.backStack.length - editHistoryMax) + // 新动作需清空前进栈 + if (notClear) return + this.clearForwardStack() + }, + // * 推入前进栈 + pushForwardStack(item: HistoryItemType | Array): void { + if (item instanceof Array) this.forwardStack = [...this.forwardStack, ...item] + else this.forwardStack.push(item) + }, + // * 移出后退栈 + popBackStackItem(): HistoryItemType | undefined { + if (this.backStack.length > 0) { + return this.backStack.pop() + } + }, + // * 移出前进栈 + popForwardStack(): HistoryItemType | undefined { + if (this.forwardStack.length > 0) { + return this.forwardStack.pop() + } + }, + // * 清空前进栈 + clearForwardStack() { + this.forwardStack = [] + }, + // * 清空后退栈(保留初始化) + clearBackStack() { + const canvasHistory = this.getBackStack[0] + this.backStack = [canvasHistory] + }, + // * 撤回 + backAction() { + try { + loadingStart() + // 排除画布初始化 + if (this.getBackStack.length > 1) { + const targetData = this.popBackStackItem() + if (!targetData) { + loadingFinish() + return + } + // 移除记录到前进堆 + this.pushForwardStack(targetData) + loadingFinish() + return targetData + } + loadingFinish() + } catch (error) { + loadingError() + } + }, + // * 前进 + forwardAction() { + try { + loadingStart() + if (this.getForwardStack.length) { + const targetData = this.popForwardStack() + if (!targetData) { + loadingFinish() + return + } + // 放入后退栈 + this.pushBackStackItem(targetData, true) + loadingFinish() + return targetData + } + loadingFinish() + } catch (error) { + loadingError() + } + }, + // * 新增组件记录 + createAddHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.ADD, HistoryTargetTypeEnum.CHART) + }, + // * 更新属性记录(大小、图表属性) + createUpdateHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.UPDATE, HistoryTargetTypeEnum.CHART) + }, + // * 删除组件记录 + createDeleteHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.DELETE, HistoryTargetTypeEnum.CHART) + }, + // * 移动组件记录 + createMoveHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.MOVE, HistoryTargetTypeEnum.CHART) + }, + // * 改变层级组件记录 + createLayerHistory( + item: Array, + type: + | HistoryActionTypeEnum.TOP + | HistoryActionTypeEnum.DOWN + | HistoryActionTypeEnum.UP + | HistoryActionTypeEnum.BOTTOM + ) { + this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) + }, + // * 剪切组件记录 + createPasteHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.CUT, HistoryTargetTypeEnum.CHART) + }, + // * 创建分组 + createGroupHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.GROUP, HistoryTargetTypeEnum.CHART) + }, + // * 解除分组 + createUnGroupHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.UN_GROUP, HistoryTargetTypeEnum.CHART) + }, + // * 锁定记录 + createLockHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.LOCK, HistoryTargetTypeEnum.CHART) + }, + // * 解锁记录 + createUnLockHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.UNLOCK, HistoryTargetTypeEnum.CHART) + }, + // * 隐藏记录 + createHideHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.HIDE, HistoryTargetTypeEnum.CHART) + }, + // * 展示记录 + createShowHistory(item: Array) { + this.createStackItem(item, HistoryActionTypeEnum.SHOW, HistoryTargetTypeEnum.CHART) + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts b/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts new file mode 100644 index 0000000..b485dd5 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts @@ -0,0 +1,36 @@ +export enum ChartModeEnum { + SINGLE = 'single', + DOUBLE = 'double' +} + +export enum LayerModeEnum { + THUMBNAIL = 'thumbnail', + TEXT = 'text' +} + +export enum ChartLayoutStoreEnum { + LAYERS = 'layers', + CHARTS = 'charts', + DETAILS = 'details', + Chart_TYPE = 'chartType', + LAYER_TYPE = 'layerType', + PERCENTAGE = 'percentage', + RE_POSITION_CANVAS = 'rePositionCanvas' +} + +export interface ChartLayoutType { + // 图层控制 + [ChartLayoutStoreEnum.LAYERS]: boolean + // 图表组件 + [ChartLayoutStoreEnum.CHARTS]: boolean + // 详情设置 + [ChartLayoutStoreEnum.DETAILS]: boolean + // 组件展示方式 + [ChartLayoutStoreEnum.Chart_TYPE]: ChartModeEnum + // 层级展示方式 + [ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum + // 当前正在加载的数量 + [ChartLayoutStoreEnum.PERCENTAGE]: number + // 是否重置当前画布位置 + [ChartLayoutStoreEnum.RE_POSITION_CANVAS]: boolean +} diff --git a/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.ts b/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.ts new file mode 100644 index 0000000..c2b6359 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/chartLayoutStore/chartLayoutStore.ts @@ -0,0 +1,77 @@ +import { defineStore } from 'pinia' +import { ChartLayoutType, LayerModeEnum, ChartModeEnum } from './chartLayoutStore.d' +import { setLocalStorage, getLocalStorage } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' + +const chartEditStore = useChartEditStore() + +const { GO_CHART_LAYOUT_STORE } = StorageEnum + +const storageChartLayout: Partial = getLocalStorage(GO_CHART_LAYOUT_STORE) + +// 编辑区域布局和静态设置 +export const useChartLayoutStore = defineStore({ + id: 'useChartLayoutStore', + state: (): ChartLayoutType => ({ + // 图层控制 + layers: true, + // 图表组件 + charts: true, + // 详情设置(收缩为true) + details: false, + // 组件列表展示类型(默认单列) + chartType: ChartModeEnum.SINGLE, + // 图层类型(默认图片) + layerType: LayerModeEnum.THUMBNAIL, + // 当前加载数量 + percentage: 0, + // 是否重置当前画布位置 + rePositionCanvas: false, + // 防止值不存在 + ...storageChartLayout + }), + getters: { + getLayers(): boolean { + return this.layers + }, + getCharts(): boolean { + return this.charts + }, + getDetails(): boolean { + return this.details + }, + getChartType(): ChartModeEnum { + return this.chartType + }, + getLayerType(): LayerModeEnum { + return this.layerType + }, + getPercentage(): number { + return this.percentage + }, + getRePositionCanvas(): boolean { + return this.rePositionCanvas + } + }, + actions: { + setItem(key: T, value: K): void { + this.$patch(state => { + state[key] = value + }) + // 存储本地 + setLocalStorage(GO_CHART_LAYOUT_STORE, this.$state) + // 这里需要标记重置画布位置 + this.rePositionCanvas = true; + // 重新计算拖拽区域缩放比例 + setTimeout(() => { + chartEditStore.computedScale() + }, 500) + }, + setItemUnHandle(key: T, value: K): void { + this.$patch(state => { + state[key] = value + }) + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/designStore/designStore.d.ts b/grailed-ui-go-view/src/store/modules/designStore/designStore.d.ts new file mode 100644 index 0000000..5786028 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/designStore/designStore.d.ts @@ -0,0 +1,19 @@ +import { ThemeEnum } from '@/enums/styleEnum' + +export type AppThemeColorType = { + CMYK: number[] + RGB: number[] + hex: string + name: string + pinyin: string +} + +export interface DesignStateType { + // 是否是深色主题 + darkTheme: boolean + // 主题名称 + themeName: ThemeEnum + //色号 + appTheme: string + appThemeDetail: AppThemeColorType | null +} diff --git a/grailed-ui-go-view/src/store/modules/designStore/designStore.ts b/grailed-ui-go-view/src/store/modules/designStore/designStore.ts new file mode 100644 index 0000000..d6a54bf --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/designStore/designStore.ts @@ -0,0 +1,51 @@ +import { defineStore } from 'pinia' +import { theme } from '@/settings/designSetting' +import { DesignStateType, AppThemeColorType } from './designStore.d' +import { setLocalStorage, getLocalStorage } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' +import { ThemeEnum } from '@/enums/styleEnum' + +const { GO_DESIGN_STORE } = StorageEnum + +const { darkTheme, appTheme, appThemeDetail } = theme + +const storageDesign = getLocalStorage(GO_DESIGN_STORE) + +export const useDesignStore = defineStore({ + id: 'useDesignStore', + state: (): DesignStateType => + storageDesign || { + // 是否暗黑 + darkTheme, + // 主题名称 + themeName: (darkTheme && ThemeEnum.DARK) || ThemeEnum.LIGHT, + // 颜色色号 + appTheme, + appThemeDetail, + }, + getters: { + getDarkTheme(e): boolean { + return this.darkTheme + }, + getAppTheme(): string { + return this.appTheme + }, + getAppThemeDetail(): AppThemeColorType | null { + return this.appThemeDetail + } + }, + actions: { + // 切换主题 + changeTheme(): void { + this.darkTheme = !this.darkTheme + this.themeName = this.darkTheme ? ThemeEnum.DARK : ThemeEnum.LIGHT + setLocalStorage(GO_DESIGN_STORE, this.$state) + }, + // 设置颜色 + setAppColor(color: AppThemeColorType): void { + this.appTheme = color.hex + this.appThemeDetail = color + setLocalStorage(GO_DESIGN_STORE, this.$state) + } + } +}) \ No newline at end of file diff --git a/grailed-ui-go-view/src/store/modules/langStore/langStore.d.ts b/grailed-ui-go-view/src/store/modules/langStore/langStore.d.ts new file mode 100644 index 0000000..0d71c8d --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/langStore/langStore.d.ts @@ -0,0 +1,5 @@ +import { LangEnum } from '@/enums/styleEnum' +export interface LangStateType { + // 当前语言 + lang: LangEnum, +} diff --git a/grailed-ui-go-view/src/store/modules/langStore/langStore.ts b/grailed-ui-go-view/src/store/modules/langStore/langStore.ts new file mode 100644 index 0000000..2b7d270 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/langStore/langStore.ts @@ -0,0 +1,36 @@ +import { defineStore } from 'pinia' +import { lang } from '@/settings/designSetting' +import { LangStateType } from './langStore.d' +import { LangEnum } from '@/enums/styleEnum' +import { setLocalStorage, getLocalStorage, reloadRoutePage } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' +import { useSettingStore } from '@/store/modules/settingStore/settingStore' + +const { GO_LANG_STORE } = StorageEnum +const storageLang: LangStateType = getLocalStorage(GO_LANG_STORE) + +// 语言 +export const useLangStore = defineStore({ + id: 'useLangStore', + state: (): LangStateType => + storageLang || { + lang + }, + getters: { + getLang(): LangEnum { + return this.lang + } + }, + actions: { + changeLang(lang: LangEnum): void { + const settingStore = useSettingStore() + if (this.lang === lang) return + this.lang = lang + setLocalStorage(GO_LANG_STORE, this.$state) + + if (settingStore.getChangeLangReload) { + reloadRoutePage() + } + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.d.ts b/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.d.ts new file mode 100644 index 0000000..3dcbf54 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.d.ts @@ -0,0 +1,8 @@ +import { PackagesType, ConfigType } from '@/packages/index.d' + +export { ConfigType } + +export { PackagesType } +export interface PackagesStoreType { + packagesList: PackagesType +} diff --git a/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.ts b/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.ts new file mode 100644 index 0000000..0e7254d --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/packagesStore/packagesStore.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' +import { PackagesStoreType, PackagesType } from './packagesStore.d' +import { packagesList } from '@/packages/index' + +// 组件 pakages +export const usePackagesStore = defineStore({ + id: 'usePackagesStore', + state: (): PackagesStoreType => ({ + packagesList: Object.freeze(packagesList) + }), + getters: { + getPackagesList(): PackagesType { + return this.packagesList + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/settingStore/settingStore.d.ts b/grailed-ui-go-view/src/store/modules/settingStore/settingStore.d.ts new file mode 100644 index 0000000..09ba684 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/settingStore/settingStore.d.ts @@ -0,0 +1,31 @@ +export enum ToolsStatusEnum { + DOCK = 'dock', + ASIDE = 'aside', +} + +export enum SettingStoreEnums { + // 拖拽页面左侧表单分类只有一项的时候是否隐藏 + HIDE_PACKAGE_ONE_CATEGORY = 'hidePackageOneCategory', + // 切换语言是否进行路由刷新 + CHANGE_LANG_RELOAD = 'changeLangReload', + // 侧边栏折叠是否隐藏全部 + ASIDE_ALL_COLLAPSED = 'asideAllCollapsed', + // 图表移动时按方向键移动的距离 + CHART_MOVE_DISTANCE = 'chartMoveDistance', + // 图表拖拽时的吸附距离(px) + CHART_ALIGN_RANGE = 'chartAlignRange', + // 图表工具栏状态(侧边工具状态) + CHART_TOOLS_STATUS = 'chartToolsStatus', + // 图表工具栏状态隐藏 + CHART_TOOLS_STATUS_HIDE = 'chartToolsStatusHide' +} + +export interface SettingStoreType { + [SettingStoreEnums.HIDE_PACKAGE_ONE_CATEGORY]: boolean + [SettingStoreEnums.CHANGE_LANG_RELOAD]: boolean + [SettingStoreEnums.ASIDE_ALL_COLLAPSED]: boolean + [SettingStoreEnums.CHART_MOVE_DISTANCE]: number + [SettingStoreEnums.CHART_ALIGN_RANGE]: number + [SettingStoreEnums.CHART_TOOLS_STATUS]: ToolsStatusEnum + [SettingStoreEnums.CHART_TOOLS_STATUS_HIDE]: boolean +} diff --git a/grailed-ui-go-view/src/store/modules/settingStore/settingStore.ts b/grailed-ui-go-view/src/store/modules/settingStore/settingStore.ts new file mode 100644 index 0000000..9e65311 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/settingStore/settingStore.ts @@ -0,0 +1,54 @@ +import { defineStore } from 'pinia' +import { systemSetting } from '@/settings/systemSetting' +import { asideCollapsedWidth } from '@/settings/designSetting' +import { SettingStoreType, ToolsStatusEnum } from './settingStore.d' +import { setLocalStorage, getLocalStorage } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' +const { GO_SETTING_STORE } = StorageEnum + +const storageSetting: SettingStoreType = getLocalStorage( + GO_SETTING_STORE +) + +// 全局设置 +export const useSettingStore = defineStore({ + id: 'useSettingStore', + state: (): SettingStoreType => storageSetting || systemSetting, + getters: { + getHidePackageOneCategory(): boolean { + return this.hidePackageOneCategory + }, + getChangeLangReload(): boolean { + return this.changeLangReload + }, + getAsideAllCollapsed(): boolean { + return this.asideAllCollapsed + }, + getAsideCollapsedWidth(): number { + return this.asideAllCollapsed ? 0 : asideCollapsedWidth + }, + getChartMoveDistance(): number { + return this.chartMoveDistance + }, + getChartAlignRange(): number { + return this.chartAlignRange + }, + getChartToolsStatus(): ToolsStatusEnum { + return this.chartToolsStatus + }, + getChartToolsStatusHide(): boolean { + return this.chartToolsStatusHide + }, + }, + actions: { + setItem( + key: T, + value: K + ): void { + this.$patch(state => { + state[key] = value + }) + setLocalStorage(GO_SETTING_STORE, this.$state) + } + } +}) diff --git a/grailed-ui-go-view/src/store/modules/systemStore/systemStore.d.ts b/grailed-ui-go-view/src/store/modules/systemStore/systemStore.d.ts new file mode 100644 index 0000000..f82629e --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/systemStore/systemStore.d.ts @@ -0,0 +1,31 @@ +export enum SystemStoreUserInfoEnum { + USER_TOKEN = 'userToken', + TOKEN_NAME = 'tokenName', + USER_ID = 'userId', + USER_NAME = 'userName', + NICK_NAME = 'nickName', +} + +export interface UserInfoType { + [SystemStoreUserInfoEnum.USER_TOKEN]?: string, + [SystemStoreUserInfoEnum.TOKEN_NAME]?: string, + [SystemStoreUserInfoEnum.USER_ID]?: number, + [SystemStoreUserInfoEnum.USER_NAME]?: string, + [SystemStoreUserInfoEnum.NICK_NAME]?: string, +} + +export interface TenantInfoType { + tenantId?: number, +} + +export enum SystemStoreEnum { + // 用户 + USER_INFO = 'userInfo', + // 请求 + TENANT_INFO = 'tenantInfo', +} + +export interface SystemStoreType { + [SystemStoreEnum.USER_INFO]: UserInfoType + [SystemStoreEnum.TENANT_INFO]: TenantInfoType +} diff --git a/grailed-ui-go-view/src/store/modules/systemStore/systemStore.ts b/grailed-ui-go-view/src/store/modules/systemStore/systemStore.ts new file mode 100644 index 0000000..7683213 --- /dev/null +++ b/grailed-ui-go-view/src/store/modules/systemStore/systemStore.ts @@ -0,0 +1,40 @@ +import { defineStore } from 'pinia' +import { SystemStoreType, UserInfoType, TenantInfoType } from './systemStore.d' +import { setLocalStorage, getLocalStorage } from '@/utils' +import { StorageEnum } from '@/enums/storageEnum' + +const { GO_SYSTEM_STORE } = StorageEnum + +const storageSystem: SystemStoreType = getLocalStorage(GO_SYSTEM_STORE) + +// 系统数据记录 +export const useSystemStore = defineStore({ + id: 'useSystemStore', + state: (): SystemStoreType => storageSystem || { + userInfo: { + userId: undefined, + userName: undefined, + userToken: undefined, + nickName: undefined + }, + tenantInfo: { + tenantId: undefined + } + }, + getters: { + getUserInfo(): UserInfoType { + return this.userInfo + }, + getTenantInfo(): TenantInfoType { + return this.tenantInfo + } + }, + actions: { + setItem(key: T, value: K): void { + this.$patch(state => { + state[key] = value + }); + setLocalStorage(GO_SYSTEM_STORE, this.$state) + } + } +}) diff --git a/grailed-ui-go-view/src/styles/common/_dark.scss b/grailed-ui-go-view/src/styles/common/_dark.scss new file mode 100644 index 0000000..1c9ee92 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/_dark.scss @@ -0,0 +1,36 @@ +@import './var.scss'; + +$dark: ( + // 文字颜色 + color: $--color-text-4, + //背景 + background-color: $--color-dark-bg-1, + background-color1: $--color-dark-bg-1, + background-color1-shallow: $--color-dark-bg-1-shallow, + background-color2: $--color-dark-bg-2, + background-color2-shallow: $--color-dark-bg-2-shallow, + background-color3: $--color-dark-bg-3, + background-color3-shallow: $--color-dark-bg-3-shallow, + background-color4: $--color-dark-bg-4, + background-color4-shallow: $--color-dark-bg-4-shallow, + background-color5: $--color-dark-bg-5, + background-color5-shallow: $--color-dark-bg-5-shallow, + // 毛玻璃背景 + filter-color: $--filter-color-login-dark, + filter-color-shallow: $--filter-color-login-dark-shallow, + //渐变背景 + background-image: + linear-gradient(120deg, $--color-dark-bg-1 0%, $--color-dark-bg-1 100%), + // 斑点背景 + background-point: + ( + linear-gradient($--color-dark-bg-1 14px, transparent 0), + linear-gradient(90deg, transparent 14px, $--color-text-2 0) + ), + // hover 边框颜色 + hover-border-color: $--color-dark-bg-5, + hover-border-color-shallow: $--color-dark-bg-3, + // 阴影 + box-shadow: 0 8px 10px #1e1e1e1f + +); diff --git a/grailed-ui-go-view/src/styles/common/_light.scss b/grailed-ui-go-view/src/styles/common/_light.scss new file mode 100644 index 0000000..4e91969 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/_light.scss @@ -0,0 +1,37 @@ +@import './var.scss'; + +$light: ( + // 文字颜色 + color: $--color-text, + // aside 背景 + aside-background-color: $--color-light-bg-1, + //背景 + background-color: $--color-light-bg-3, + background-color1: $--color-light-bg-1, + background-color1-shallow: $--color-light-bg-1-shallow, + background-color2: $--color-light-bg-2, + background-color2-shallow: $--color-light-bg-2-shallow, + background-color3: $--color-light-bg-3, + background-color3-shallow: $--color-light-bg-3-shallow, + background-color4: $--color-light-bg-4, + background-color4-shallow: $--color-light-bg-4-shallow, + background-color5: $--color-light-bg-5, + background-color5-shallow: $--color-light-bg-5-shallow, + // 毛玻璃背景 + filter-color: $--filter-color-login-light, + filter-color-shallow: $--filter-color-login-light-shallow, + //渐变背景 + background-image: + linear-gradient(120deg, $--color-light-bg 0%, $--color-light-bg 100%), + // 斑点背景 + background-point: + ( + linear-gradient($--color-light-bg-1 14px, transparent 0), + linear-gradient(90deg, transparent 14px, $--color-dark-bg-5 0) + ), + // hover 边框颜色 + hover-border-color: $--color-light-bg-4, + hover-border-color-shallow: $--color-light-bg-3, + // 阴影 + box-shadow: 0 8px 10px #00000012 +); diff --git a/grailed-ui-go-view/src/styles/common/animation.scss b/grailed-ui-go-view/src/styles/common/animation.scss new file mode 100644 index 0000000..5f69c7d --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/animation.scss @@ -0,0 +1,68 @@ +// 闪烁 +.go-animation-twinkle { + animation: twinkle 2s ease; + animation-iteration-count: infinite; + opacity: 1; +} +@keyframes twinkle { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} + +// 淡入淡出 +.v-modal-enter { + animation: v-modal-in 0.2s ease; +} + +.v-modal-leave { + animation: v-modal-out 0.2s ease forwards; +} + +@keyframes v-modal-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes v-modal-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +// 渐变 +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity .2s ease; +} + +// 移动动画 +.list-complete-item { + transition: all 1s; +} +.list-complete-enter-from, +.list-complete-leave-to { + opacity: 0; + transform: translateY(30px); +} +.list-complete-leave-active { + position: absolute; +} diff --git a/grailed-ui-go-view/src/styles/common/format.scss b/grailed-ui-go-view/src/styles/common/format.scss new file mode 100644 index 0000000..8fefec9 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/format.scss @@ -0,0 +1,23 @@ +body { + overflow: hidden; +} + +* { + list-style: none; +} +/* 设置滚动条的样式 */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} +/* 滚动槽 */ +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0); + border-radius: 2px; +} +/* 滚动条滑块 */ +::-webkit-scrollbar-thumb { + border-radius: 4px; + background: #a3a3a3; +} + diff --git a/grailed-ui-go-view/src/styles/common/mixins/config.scss b/grailed-ui-go-view/src/styles/common/mixins/config.scss new file mode 100644 index 0000000..3be6d24 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/mixins/config.scss @@ -0,0 +1,4 @@ +$namespace: 'go'; +$theme-light: 'light'; +$theme-dark: 'dark'; +$state-prefix: 'is-'; diff --git a/grailed-ui-go-view/src/styles/common/mixins/function.scss b/grailed-ui-go-view/src/styles/common/mixins/function.scss new file mode 100644 index 0000000..e7023db --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/mixins/function.scss @@ -0,0 +1,3 @@ +@function themed($key) { + @return map-get($theme-map, $key); +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/styles/common/mixins/mixins.scss b/grailed-ui-go-view/src/styles/common/mixins/mixins.scss new file mode 100644 index 0000000..ec6f2cc --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/mixins/mixins.scss @@ -0,0 +1,78 @@ +@import './config.scss'; +@import './function.scss'; +@import '../theme.scss'; + +@mixin go($block) { + $B: $namespace + '-' + $block; + .#{$B} { + @content; + } +} + +@mixin goId($block) { + $B: $namespace + '-' + $block; + ##{$B} { + @content; + } +} + +@mixin deep() { + :deep() { + @content; + } +} + +@mixin when($state) { + @at-root { + &.#{$state-prefix + $state} { + @content; + } + } +} + +@mixin themeify { + @each $theme-name, $theme-map in $themes { + $theme-map: $theme-map !global; + [data-theme='#{$theme-name}'] & { + @content; + } + } +} + +@mixin fetch-theme($param) { + @include themeify { + #{$param}: themed($param); + } +} + +@mixin fetch-theme-custom ($key, $value) { + @include themeify { + #{$key}: themed($value); + } +} + +//获取背景颜色 +@mixin fetch-bg-color($target) { + @include themeify { + background-color: themed($target); + } +} + +//获取背景渐变颜色 +@mixin background-image($target) { + @include themeify { + background-image: themed($target); + } +} + +//设置边框颜色 +@mixin fetch-border-color($target) { + @include themeify { + border-color: themed($target); + } +} +@mixin hover-border-color($target) { + @include themeify { + border: 1px solid themed($target); + } +} diff --git a/grailed-ui-go-view/src/styles/common/style.scss b/grailed-ui-go-view/src/styles/common/style.scss new file mode 100644 index 0000000..13dee27 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/style.scss @@ -0,0 +1,127 @@ +@import "./var.scss"; +@import "./format.scss"; +@import "./animation.scss"; +@import "./mixins/mixins.scss"; + +// 过度 +.go-transition { + transition: all 0.4s; +} + +.go-transition-quick { + transition: all 0.2s; +} + +.go-flex-center { + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} + +.go-flex-items-center { + display: flex; + align-items: center; + text-align: center; +} + +.go-flex-no-wrap { + flex-wrap: nowrap !important; +} + +.go-absolute-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +// cursor 小手 +.go-cursor-pointer { + cursor: pointer; +} + +// IE盒模型 +.go-boderbox { + box-sizing: border-box; +} + +// 毛玻璃 +.go-background-filter { + backdrop-filter: $--filter-blur-base; + @include fetch-bg-color("filter-color"); + box-shadow: $--border-shadow; +} + +// 毛玻璃 +.go-background-filter-shallow { + backdrop-filter: $--filter-blur-base; + @include fetch-bg-color("filter-color-shallow"); + box-shadow: $--border-shadow; +} + +// 边框圆角 +.go-border-radius { + border-radius: $--border-radius-base; + overflow: hidden; +} + +// 背景斑点需配合 @mixin background-image 使用 +.go-point-bg { + @include fetch-theme-custom("background-color", "background-color1"); + background-size: 15px 15px, 15px 15px; +} + +// 省略号 +.go-ellipsis-1 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break: break-all; +} + +// class:m-1 => margin:1em +// class:mt-1 => margin-top:1em +// m-0|mt-0|mx-0|my-0|p-0|pt-0|... + +@each $typekey, $type in $spacing-types { + //.m-1 + @each $sizekey, $size in $spacing-sizes { + .go-#{$typekey}-#{$sizekey} { + #{$type}: $size * $spacing-base-size; + } + } + + //.mx-1 + @each $sizekey, $size in $spacing-sizes { + .go-#{$typekey}x-#{$sizekey} { + #{$type}-left: $size * $spacing-base-size; + #{$type}-right: $size * $spacing-base-size; + } + + .go-#{$typekey}y-#{$sizekey} { + #{$type}-top: $size * $spacing-base-size; + #{$type}-bottom: $size * $spacing-base-size; + } + } + + //.mt-1 + @each $directionkey, $direction in $spacing-directions { + @each $sizekey, $size in $spacing-sizes { + .go-#{$typekey}#{$directionkey}-#{$sizekey} { + #{$type}-#{$direction}: $size * $spacing-base-size; + } + } + } + + .go-#{$typekey} { + #{$type}: 0 !important; + } +} + +.go-d-inline-block { + display: inline-block; +} +.go-d-block { + display: block; +} diff --git a/grailed-ui-go-view/src/styles/common/theme.scss b/grailed-ui-go-view/src/styles/common/theme.scss new file mode 100644 index 0000000..74cd333 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/theme.scss @@ -0,0 +1,10 @@ +@import './mixins/config.scss'; +@import './_dark.scss'; +@import './_light.scss'; + +$themes: ( + // 亮白 + #{$theme-light}: $light, + // 暗黑 + #{$theme-dark}: $dark +); diff --git a/grailed-ui-go-view/src/styles/common/var.scss b/grailed-ui-go-view/src/styles/common/var.scss new file mode 100644 index 0000000..ee4ded0 --- /dev/null +++ b/grailed-ui-go-view/src/styles/common/var.scss @@ -0,0 +1,87 @@ +// 颜色 +$--color-red: #fc625d; +$--color-warn: #fcbc40; +$--color-success: #34c749; + +// 文字 +$--color-text: #1d2129; +$--color-text-1: #4e5969; +$--color-text-2: #86909c; +$--color-text-3: #c9cdd4; +$--color-text-4: #f2f3f5; + +//.mt-1 => margin top +//spacing +$spacing-base-size: 1em; + +$spacing-types: ( + m: margin, + p: padding, +); + +$spacing-directions: ( + t: top, + r: right, + b: bottom, + l: left, +); + +$spacing-sizes: ( + 0: 0, + 1: 0.25, + 2: 0.5, + 3: 1, + 4: 1.5, + 5: 2.5, +); + +// 变亮值 +$--light-shalow: 2%; + +// 白色 +$--color-light-bg: #fff; +$--color-light-bg-1: #fafafc; +$--color-light-bg-1-shallow: lighten($--color-light-bg-1, $--light-shalow); +$--color-light-bg-2: #f2f3f5; +$--color-light-bg-2-shallow: lighten($--color-light-bg-2, $--light-shalow); +$--color-light-bg-3: #e5e6eb; +$--color-light-bg-3-shallow: lighten($--color-light-bg-3, $--light-shalow); +$--color-light-bg-4: #e3e3e4; +$--color-light-bg-4-shallow: lighten($--color-light-bg-4, $--light-shalow); +$--color-light-bg-5: #bebebe; +$--color-light-bg-5-shallow: lighten($--color-light-bg-5, $--light-shalow); + +// 变暗值 +$--dark-shalow: 2%; + +// 黑色 +$--color-dark-black: #000; +$--color-dark-bg-1: #18181c; +$--color-dark-bg-1-shallow: darken($--color-dark-bg-1, $--dark-shalow); +$--color-dark-bg-2: #232324; +$--color-dark-bg-2-shallow: darken($--color-dark-bg-2, $--dark-shalow); +$--color-dark-bg-3: #2a2a2b; +$--color-dark-bg-3-shallow: darken($--color-dark-bg-3, $--dark-shalow); +$--color-dark-bg-4: #313132; +$--color-dark-bg-4-shallow: darken($--color-dark-bg-4, $--dark-shalow); +$--color-dark-bg-5: #373739; +$--color-dark-bg-5-shallow: darken($--color-dark-bg-5, $--dark-shalow); + +// 最大宽度 +$--max-width: 1920px; +// 顶部距离 +$--header-height: 60px; +// 底部距离 +$--footer-height: 50px; +// 模糊 +$--filter-blur-base: blur(20px); +// 毛玻璃 +$--filter-color-login-dark: rgba(35,35,36, 0.7); +$--filter-color-login-dark-shallow: rgba(35,35,36, 0.3); +$--filter-color-login-light: rgba(240, 240, 240, 0.7); +$--filter-color-login-light-shallow: rgba(240, 240, 240, 0.3); + +// 边框 +$--border-radius-base: 8px; +// 阴影 +$--border-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); diff --git a/grailed-ui-go-view/src/styles/pages/index.scss b/grailed-ui-go-view/src/styles/pages/index.scss new file mode 100644 index 0000000..b8f7272 --- /dev/null +++ b/grailed-ui-go-view/src/styles/pages/index.scss @@ -0,0 +1,9 @@ +// 页面全局样式 +// 去除高德地图 logo +.amap-logo { + display: none !important; + opacity: 0 !important; +} +.amap-copyright { + opacity: 0 !important; +} diff --git a/grailed-ui-go-view/src/utils/components.ts b/grailed-ui-go-view/src/utils/components.ts new file mode 100644 index 0000000..6d07f94 --- /dev/null +++ b/grailed-ui-go-view/src/utils/components.ts @@ -0,0 +1,30 @@ +import { defineAsyncComponent, AsyncComponentLoader } from 'vue' +import { AsyncLoading, AsyncSkeletonLoading } from '@/components/GoLoading' + +/** + * * 动态注册组件 + */ +export const componentInstall = (key:string, node: T) => { + if(!window['$vue'].component(key) && node) { + window['$vue'].component(key, node) + } +} + +/** + * * 异步加载组件 + * @param loader + * @returns + */ +export const loadAsyncComponent = (loader: AsyncComponentLoader) => + defineAsyncComponent({ + loader, + loadingComponent: AsyncLoading, + delay: 20, + }) + +export const loadSkeletonAsyncComponent = (loader: AsyncComponentLoader) => + defineAsyncComponent({ + loader, + loadingComponent: AsyncSkeletonLoading, + delay: 20, + }) diff --git a/grailed-ui-go-view/src/utils/crypto.ts b/grailed-ui-go-view/src/utils/crypto.ts new file mode 100644 index 0000000..f3530da --- /dev/null +++ b/grailed-ui-go-view/src/utils/crypto.ts @@ -0,0 +1,34 @@ +import CryptoJS from 'crypto-js' +import { isString } from './type' + +const KEY = 'mt' + +/** + * * 加密 + * @param data { string } + * @returns + */ +export const cryptoEncode = (data: string): string => { + if (!isString(data)) return '' + // 加密 + const encryptedData = CryptoJS.AES.encrypt(data, KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }).toString() + return encryptedData +} + +/** + * * 解密 + * @param data { string } + * @returns + */ +export const cryptoDecode = (data: string): string => { + if (!isString(data)) return '' + // 解密 + const decryptedData = CryptoJS.AES.decrypt(data, KEY, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return decryptedData.toString(CryptoJS.enc.Utf8) +} diff --git a/grailed-ui-go-view/src/utils/file.ts b/grailed-ui-go-view/src/utils/file.ts new file mode 100644 index 0000000..4a10bd3 --- /dev/null +++ b/grailed-ui-go-view/src/utils/file.ts @@ -0,0 +1,116 @@ +/** + * * base64转file + * @param dataurl + * @param fileName + * @returns + */ +export const base64toFile = (dataurl: string, fileName: string) => { + let dataArr = dataurl.split(","), + mime = (dataArr as any[])[0].match(/:(.*?);/)[1], + bstr = atob(dataArr[1]), + n = bstr.length, + u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], fileName, { type: mime }); +} + +/** + * * file转url + */ + export const fileToUrl = (file: File): string => { + const Url = URL || window.URL || window.webkitURL + const ImageUrl = Url.createObjectURL(file) + return ImageUrl +} + +/** + * * url转file + */ + export const urlToFile = (fileUrl: string, fileName = `${new Date().getTime()}`): File => { + const dataArr = fileUrl.split(',') + const mime = (dataArr as any[])[0].match(/:(.*);/)[1] + const originStr = atob(dataArr[1]) + return new File([originStr], `${fileName}`, { type: mime }) +} + +/** + * * file转base64 + * @param file 文件数据 + * @param callback 回调函数 + */ +export const fileTobase64 = (file: File, callback: Function) => { + let reader = new FileReader() + reader.readAsDataURL(file) + reader.onload = function (e: ProgressEvent) { + if (e.target) { + let base64 = e.target.result + callback(base64) + } + } +} + +/** + * * canvas转file + * @param canvas + */ +export const canvastoFile = (canvas: HTMLCanvasElement, name?: string) => { + const dataurl = canvas.toDataURL('image/png') + return urlToFile(dataurl, name) +} + +/** + * *获取上传的文件数据 + * @param { File } file 文件对象 + */ +export const readFile = (file: File) => { + return new Promise((resolve: Function) => { + try { + const reader = new FileReader() + reader.onload = (evt: ProgressEvent) => { + if (evt.target) { + resolve(evt.target.result) + } + } + reader.readAsText(file) + } catch (error) { + window['$message'].error('文件读取失败!') + } + }) +} + +/** + * * 通过 a 标签下载数据 + * @param url + * @param filename + * @param fileSuffix + */ +export const downloadByA = (url: string, filename = new Date().getTime(), fileSuffix?: string) => { + const ele = document.createElement('a') // 创建下载链接 + ele.download = `${filename}.${fileSuffix}` //设置下载的名称 + ele.style.display = 'none' // 隐藏的可下载链接 + // 字符内容转变成blob地址 + ele.href = url + // 绑定点击时间 + document.body.appendChild(ele) + ele.click() + // 然后移除 + document.body.removeChild(ele) +} + +/** + * * 下载数据 + * @param { string } content 数据内容 + * @param { ?string } filename 文件名称(默认随机字符) + * @param { ?string } fileSuffix 文件名称(默认随机字符) + */ +export const downloadTextFile = ( + content: string, + filename = new Date().getTime(), + fileSuffix?: string +) => { + // 字符内容转变成blob地址 + const blob = new Blob([content]) + downloadByA(URL.createObjectURL(blob), filename, fileSuffix) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/utils/http.ts b/grailed-ui-go-view/src/utils/http.ts new file mode 100644 index 0000000..8e92db7 --- /dev/null +++ b/grailed-ui-go-view/src/utils/http.ts @@ -0,0 +1,6 @@ +/** + * * 请求失败统一处理 + */ +export const httpErrorHandle = () => { + window['$message'].error(window['$t']('http.error_message')) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/utils/index.ts b/grailed-ui-go-view/src/utils/index.ts new file mode 100644 index 0000000..3f01578 --- /dev/null +++ b/grailed-ui-go-view/src/utils/index.ts @@ -0,0 +1,10 @@ +export * from '@/utils/utils' +export * from '@/utils/crypto' +export * from '@/utils/router' +export * from '@/utils/storage' +export * from '@/utils/style' +export * from '@/utils/plugin' +export * from '@/utils/components' +export * from '@/utils/type' +export * from '@/utils/file' +export * from '@/utils/http' \ No newline at end of file diff --git a/grailed-ui-go-view/src/utils/plugin.ts b/grailed-ui-go-view/src/utils/plugin.ts new file mode 100644 index 0000000..34e8036 --- /dev/null +++ b/grailed-ui-go-view/src/utils/plugin.ts @@ -0,0 +1,129 @@ +import { icon } from '@/plugins' +import { DialogEnum } from '@/enums/pluginEnum' +import { dialogIconSize } from '@/settings/designSetting' +import { maskClosable } from '@/settings/designSetting' +import { DialogReactive } from 'naive-ui' +const { InformationCircleIcon } = icon.ionicons5 +import { renderIcon } from '@/utils' + +// * 开启加载 +export const loadingStart = () => { + window['$loading'].start() +} + +// * 加载结束 +export const loadingFinish = () => { + setTimeout(() => { + window['$loading'].finish() + }) +} + +// * 加载错误 +export const loadingError = () => { + setTimeout(() => { + window['$loading'].error() + }) +} + +/** + * * render 对话框 + * @param { Object} params 配置参数, 详见 https://www.naiveui.com/zh-CN/light/components/dialog + * ``` + * 最简易的 demo + * goDialog({ + * onPositiveCallback: () => {} + * }) + * ``` + */ + export const goDialog = ( + params: { + // 基本 + type?: DialogEnum + // 标题 + title?: string | (() => any) + // 提示 + message?: string + // 确定提示词 + positiveText?: string + // 取消提示词 + negativeText?: string + // 是否不展示取消按钮 + closeNegativeText?: boolean, + // 点击遮罩是否关闭 + isMaskClosable?: boolean + // 回调 + onPositiveCallback: Function + onNegativeCallback?: Function + // 异步 + promise?: boolean + promiseResCallback?: Function + promiseRejCallback?: Function + [T:string]: any + } +) => { + const { + type, + title, + message, + positiveText, + negativeText, + closeNegativeText, + isMaskClosable, + onPositiveCallback, + onNegativeCallback, + promise, + promiseResCallback, + promiseRejCallback + } = params + + const typeObj = { + // 自定义 + [DialogEnum.DELETE]: { + fn: window['$dialog'].warning, + message: message || '是否删除此数据?' + }, + // 原有 + [DialogEnum.WARNING]: { + fn: window['$dialog'].warning, + message: message || '是否执行此操作?' + }, + [DialogEnum.ERROR]: { + fn: window['$dialog'].error, + message: message || '是否执行此操作?' + }, + [DialogEnum.SUCCESS]: { + fn: window['$dialog'].success, + message: message || '是否执行此操作?' + } + } + + const dialog: DialogReactive = typeObj[type || DialogEnum.WARNING]['fn']({ + // 导入其余 NaiveUI 支持参数 + ...params, + title: title || '提示', + icon: renderIcon(InformationCircleIcon, { size: dialogIconSize }), + content: typeObj[type || DialogEnum.WARNING]['message'], + positiveText: positiveText || '确定', + negativeText: closeNegativeText ? undefined : (negativeText || '取消'), + // 是否通过遮罩关闭 + maskClosable: isMaskClosable || maskClosable, + onPositiveClick: async () => { + // 执行异步 + if (promise && onPositiveCallback) { + dialog.loading = true + try { + const res = await onPositiveCallback() + promiseResCallback && promiseResCallback(res) + } catch (err) { + promiseRejCallback && promiseRejCallback(err) + } + dialog.loading = false + return + } + onPositiveCallback && onPositiveCallback(dialog) + }, + onNegativeClick: async () => { + onNegativeCallback && onNegativeCallback(dialog) + } + }) +} diff --git a/grailed-ui-go-view/src/utils/router.ts b/grailed-ui-go-view/src/utils/router.ts new file mode 100644 index 0000000..0b9be12 --- /dev/null +++ b/grailed-ui-go-view/src/utils/router.ts @@ -0,0 +1,213 @@ +import { useRoute } from 'vue-router' +import { ResultEnum, RequestHttpHeaderEnum } from '@/enums/httpEnum' +import { ErrorPageNameMap, PageEnum, PreviewEnum } from '@/enums/pageEnum' +import { docPath, giteeSourceCodePath } from '@/settings/pathConst' +import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d' +import { StorageEnum } from '@/enums/storageEnum' +import { clearLocalStorage, getLocalStorage, clearCookie } from './storage' +import router from '@/router' +import { logoutApi } from '@/api/path' + +/** + * * 根据名字跳转路由 + * @param pageName + * @param isReplace + * @param windowOpen + */ +export const routerTurnByName = ( + pageName: string, + isReplace?: boolean, + windowOpen?: boolean +) => { + if (windowOpen) { + const path = fetchPathByName(pageName, 'href') + openNewWindow(path) + return + } + if (isReplace) { + router.replace({ + name: pageName, + }) + return + } + router.push({ + name: pageName, + }) +} + +/** + * * 根据名称获取路由信息 + * @param pageName + * @param pageName + */ +export const fetchPathByName = (pageName: string, p?: string) => { + try { + const pathData = router.resolve({ + name: pageName, + }) + return p ? (pathData as any)[p] : pathData + } catch (error) { + window['$message'].warning('查询路由信息失败,请联系管理员!') + } +} + +/** + * * 根据路径跳转路由 + * @param path + * @param query + * @param isReplace + * @param windowOpen + */ +export const routerTurnByPath = ( + path: string, + query?: Array, + isReplace?: boolean, + windowOpen?: boolean +) => { + let fullPath = '' + if (query?.length) { + fullPath = `${path}/${query.join('/')}` + } + if (windowOpen) { + return openNewWindow(fullPath) + } + if (isReplace) { + router.replace({ + path: fullPath, + }) + return + } + router.push({ + path: fullPath, + }) +} + +/** + * * 错误页重定向 + * @param icon + * @returns + */ +export const redirectErrorPage = (code: ResultEnum) => { + if (!code) return false + const pageName = ErrorPageNameMap.get(code) + if (!pageName) return false + routerTurnByName(pageName) +} + +/** + * * 重新加载当前路由页面 + */ +export const reloadRoutePage = () => { + routerTurnByName(PageEnum.RELOAD_NAME) +} + +/** + * * 退出登录 + */ +export const logout = async () => { + try { + const res = await logoutApi() + if(res && res.code === ResultEnum.SUCCESS) { + window['$message'].success(window['$t']('global.logout_success')) + clearCookie(RequestHttpHeaderEnum.COOKIE) + clearLocalStorage(StorageEnum.GO_SYSTEM_STORE) + routerTurnByName(PageEnum.BASE_LOGIN_NAME) + } + } catch (error) { + window['$message'].success(window['$t']('global.logout_failure')) + } +} + +/** + * * 新开页面 + * @param url + */ +export const openNewWindow = (url: string) => { + return window.open(url, '_blank') +} + +/** + * * 打开项目文档 + * @param url + */ +export const openDoc = () => { + openNewWindow(docPath) +} + +/** + * * 打开码云仓库地址 + * @param url + */ +export const openGiteeSourceCode = () => { + openNewWindow(giteeSourceCodePath) +} + +/** + * * 判断是否是预览页 + * @returns boolean + */ +export const isPreview = () => { + return document.location.hash.includes('preview') +} + +/** + * * 获取当前路由下的参数 + * @returns object + */ +export const fetchRouteParams = () => { + try { + const route = useRoute() + return route.params + } catch (error) { + window['$message'].warning('查询路由信息失败,请联系管理员!') + } +} + +/** + * * 通过硬解析获取当前路由下的参数 + * @returns object + */ +export const fetchRouteParamsLocation = () => { + try { + return document.location.hash.split('/').pop() || '' + } catch (error) { + window['$message'].warning('查询路由信息失败,请联系管理员!') + return '' + } +} + +/** + * * 回到主页面 + * @param confirm + */ +export const goHome = () => { + routerTurnByName(PageEnum.BASE_HOME_NAME) +} + +/** + * * 判断是否登录 + * @return boolean + */ +export const loginCheck = () => { + try { + const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE) + if (!info) return false + if (info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN]) { + return true + } + return false + } catch (error) { + return false + } +} + +/** + * * 预览地址 + * @returns + */ + export const previewPath = (id?: string | number) => { + const { origin, pathname } = document.location + const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href') + const previewPath = `${origin}${pathname}${path}/${id || fetchRouteParamsLocation()}` + return previewPath +} diff --git a/grailed-ui-go-view/src/utils/storage.ts b/grailed-ui-go-view/src/utils/storage.ts new file mode 100644 index 0000000..1827dfa --- /dev/null +++ b/grailed-ui-go-view/src/utils/storage.ts @@ -0,0 +1,110 @@ +import { JSONStringify, JSONParse } from './utils' + +/** + * * 存储本地会话数据 + * @param k 键名 + * @param v 键值(无需stringiiy) + * @returns RemovableRef + */ +export const setLocalStorage = (k: string, v: T) => { + try { + window.localStorage.setItem(k, JSONStringify(v)) + } catch (error) { + return false + } +} + +/** + * * 获取本地会话数据 + * @param k 键名 + * @returns any + */ +export const getLocalStorage = (k: string) => { + const item = window.localStorage.getItem(k) + try { + return item ? JSONParse(item) : item + } catch (err) { + return item + } +} + +/** + * * 清除本地会话数据 + * @param name + */ +export const clearLocalStorage = (name: string) => { + window.localStorage.removeItem(name) +} + +/** + * * 存储临时会话数据 + * @param k 键名 + * @param v 键值 + * @returns RemovableRef + */ +export const setSessionStorage = (k: string, v: T) => { + try { + window.sessionStorage.setItem(k, JSON.stringify(v)) + } catch (error) { + return false + } +} + +/** + * * 获取临时会话数据 + * @returns any + */ +export const getSessionStorage: (k: string) => any = (k: string) => { + const item = window.sessionStorage.getItem(k) + try { + return item ? JSONParse(item) : item + } catch (err) { + return item + } +} + +/** + * * 清除本地会话数据 + * @param name + */ +export const clearSessioStorage = (name: string) => { + window.sessionStorage.removeItem(name) +} + +/** + * * 设置 cookie + * @param name 键名 + * @param cvalue 键值 + * @param exdays 过期时间 + */ +export const setCookie = (name: string, cvalue: string, exdays: number) => { + const d = new Date(); + d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); + const expires = "expires=" + d.toUTCString(); + document.cookie = name + "=" + cvalue + "; " + expires; +} + +/** + * * 获取 cookie + * @param cname 键名 + * @returns string + */ +export const getCookie = (cname: string) => { + const name = cname + "="; + const ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1); + if (c.indexOf(name) != -1) return c.substring(name.length, c.length); + } + return ""; +} + +/** + * * 清除 cookie + * @param name 键名 + * @returns string + */ +export const clearCookie = (name: string) => { + setCookie(name, "", -1); +} diff --git a/grailed-ui-go-view/src/utils/style.ts b/grailed-ui-go-view/src/utils/style.ts new file mode 100644 index 0000000..8e8605d --- /dev/null +++ b/grailed-ui-go-view/src/utils/style.ts @@ -0,0 +1,102 @@ +import Color from 'color' +import { useDesignStore } from '@/store/modules/designStore/designStore' +import { PickCreateComponentType } from '@/packages/index.d' +import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' + +type AttrType = PickCreateComponentType<'attr'> +type StylesType = PickCreateComponentType<'styles'> + +// * 动画 +export const animationsClass = (animations: string[]) => { + if (animations.length) { + return `animate__animated animate__${animations[0]}` + } + return '' +} + +// * 滤镜 +export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => { + if (!styles || !styles.filterShow) return {} + const { opacity, saturate, contrast, hueRotate, brightness } = styles + return { + opacity: opacity, + filter: `saturate(${saturate}) contrast(${contrast}) hue-rotate(${hueRotate}deg) brightness(${brightness})` + } +} + +// * 变换 +export const getTransformStyle = (styles: StylesType) => { + const { rotateZ, rotateX, rotateY, skewX, skewY } = styles + return { + transform: `rotateZ(${rotateZ || 0}deg) rotateX(${rotateX || 0}deg) rotateY(${rotateY || 0}deg) skewX(${ + skewX || 0 + }deg) skewY(${skewY || 0}deg)` + } +} + +// * 混合模式 +export const getBlendModeStyle = (styles: StylesType) => { + if (!styles || !styles.filterShow) return {} + const { blendMode } = styles + return { + 'mix-blend-mode': blendMode + } +} + +/** + * * hsla 转换 + * @param color 颜色 + * @param alpha 默认1 + * @returns + */ +export function alpha(color: string, alpha = 1) { + return Color(color).alpha(alpha).toString() +} + +/** + * * 颜色透明 + * rgba(10, 10, 10, 0.8) -> rgba(10, 10, 10, 0.4) + * @param color 颜色 + * @param concentration 0~1 浓度 + * @returns + */ +export function fade(color: string, fade: number) { + return Color(color).fade(fade).toString() +} + +/** + * * 颜色变亮 + * hsl(100, 50%, 10%) -> hsl(100, 50%, 50%) + * @param color 颜色 + * @param concentration 0~1 浓度 + * @returns + */ +export function lighten(color: string, concentration: number) { + return Color(color).lighten(concentration).toString() +} + +/** + * * 颜色变暗 + * hsl(100, 50%, 50%) -> hsl(100, 50%, 25%) + * @param color 颜色 + * @param concentration 0~1 浓度 + * @returns + */ +export function darken(color: string, concentration: number) { + return Color(color).darken(concentration).toString() +} + +/** + * * 修改主题色 + * @param themeName 主题名称 + * @returns + */ +export const setHtmlTheme = (themeName?: string) => { + const e = window.document.documentElement + if (themeName) { + e.setAttribute('data-theme', themeName) + return + } + const designStore = useDesignStore() + e.setAttribute('data-theme', designStore.themeName) +} diff --git a/grailed-ui-go-view/src/utils/type.ts b/grailed-ui-go-view/src/utils/type.ts new file mode 100644 index 0000000..7b86c02 --- /dev/null +++ b/grailed-ui-go-view/src/utils/type.ts @@ -0,0 +1,33 @@ +import isObject from 'lodash/isObject' + +export function isString(p: any): p is string { + return typeof p === 'string' +} + +export function isNumber(p: any): p is number { + return typeof p === 'number' +} + +export function isBoolean(p: any): p is boolean { + return typeof p === 'boolean' +} + +export function isUndefined(p: any): p is undefined { + return typeof p === 'undefined' +} + +export function isNull(p: any): p is null { + return p === null +} + +export function isArray(p: any): p is [] { + return Array.isArray(p) +} + +export const toNumber = (number: number | string, toFixedNumber = 2) => { + return isString(number) ? parseFloat(parseFloat(number).toFixed(2)) : number +} + +export const toString = (str: any) => { + return isNumber(str) ? `${str}` : (isObject(str) ? JSON.stringify(str) : str) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/utils/utils.ts b/grailed-ui-go-view/src/utils/utils.ts new file mode 100644 index 0000000..281f806 --- /dev/null +++ b/grailed-ui-go-view/src/utils/utils.ts @@ -0,0 +1,406 @@ +import { h } from 'vue' +import { NIcon } from 'naive-ui' +import screenfull from 'screenfull' +import throttle from 'lodash/throttle' +import Image_404 from '../assets/images/exception/image-404.png' +import html2canvas from 'html2canvas' +import { downloadByA } from './file' +import { toString } from './type' +import cloneDeep from 'lodash/cloneDeep' +import { WinKeyboard } from '@/enums/editPageEnum' +import { RequestHttpIntervalEnum, RequestParamsObjType } from '@/enums/httpEnum' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { excludeParseEventKeyList } from '@/enums/eventEnum' + +/** + * * 判断是否是开发环境 + * @return { Boolean } + */ +export const isDev = () => { + return import.meta.env.DEV +} + +/** + * * 生成一个不重复的ID + * @param { Number } randomLength + */ +export const getUUID = (randomLength = 10) => { + return Number(Math.random().toString().substring(2, randomLength) + Date.now()).toString(36) +} + +/** + * * render 图标 + * @param icon 图标 + * @param set 设置项 + */ +export const renderIcon = (icon: any, set = {}) => { + return () => h(NIcon, set, { default: () => h(icon) }) +} +/** + * * render 语言 + * @param lang 语言标识 + * @param set 设置项 + * @param tag 要渲染成的标签 + */ +export const renderLang = (lang: string, set = {}, tag = 'span') => { + return () => h(tag, set, { default: () => window['$t'](lang) }) +} + +/** + * * 获取错误处理图片,默认 404 图 + * @returns url + */ +export const requireErrorImg = () => { + return Image_404 +} + +/** + * * 全屏操作函数 + * @param isFullscreen + * @param isEnabled + * @returns + */ +export const screenfullFn = (isFullscreen?: boolean, isEnabled?: boolean) => { + // 是否是全屏 + if (isFullscreen) return screenfull.isFullscreen + + // 是否支持全屏 + if (isEnabled) return screenfull.isEnabled + + if (screenfull.isEnabled) { + screenfull.toggle() + return + } + // TODO lang + window['$message'].warning('您的浏览器不支持全屏功能!') +} + +/** + * 修改元素位置 + * @param target 对象 + * @param x X轴 + * @param y Y轴 + */ +export const setComponentPosition = ( + target: CreateComponentType | CreateComponentGroupType, + x?: number, + y?: number +) => { + x && (target.attr.x = x) + y && (target.attr.y = y) +} + +/** + * * 设置元素属性 + * @param HTMLElement 元素 + * @param key 键名 + * @param value 键值 + */ +export const setDomAttribute = ( + HTMLElement: HTMLElement, + key: K, + value: V +) => { + if (HTMLElement) { + HTMLElement.style[key] = value + } +} + +/** + * * 判断是否是 mac + * @returns boolean + */ +export const isMac = () => { + return /macintosh|mac os x/i.test(navigator.userAgent) +} + +/** + * * 挂载监听 + */ +// eslint-disable-next-line no-undef +export const addEventListener = ( + target: HTMLElement | Document, + type: K, + listener: any, + delay?: number, + // eslint-disable-next-line no-undef + options?: boolean | AddEventListenerOptions | undefined +) => { + if (!target) return + target.addEventListener( + type, + throttle(listener, delay || 300, { + leading: true, + trailing: false + }), + options + ) +} + +/** + * * 卸载监听 + */ +// eslint-disable-next-line no-undef +export const removeEventListener = ( + target: HTMLElement | Document, + type: K, + listener: any +) => { + if (!target) return + target.removeEventListener(type, listener) +} + +/** + * * 截取画面为图片并下载 + * @param html 需要截取的 DOM + */ +export const canvasCut = (html: HTMLElement | null, callback?: Function) => { + if (!html) { + window['$message'].error('导出失败!') + if (callback) callback() + return + } + + html2canvas(html, { + backgroundColor: null, + allowTaint: true, + useCORS: true + }).then((canvas: HTMLCanvasElement) => { + window['$message'].success('导出成功!') + downloadByA(canvas.toDataURL(), undefined, 'png') + if (callback) callback() + }) +} + +/** + * * 函数过滤器 + * @param data 数据值 + * @param res 返回顶级对象 + * @param funcStr 函数字符串 + * @param isToString 是否转为字符串 + * @param errorCallBack 错误回调函数 + * @param successCallBack 成功回调函数 + * @returns + */ +export const newFunctionHandle = ( + data: any, + res: any, + funcStr?: string, + isToString?: boolean, + errorCallBack?: Function, + successCallBack?: Function +) => { + try { + if (!funcStr) return data + const fn = new Function('data', 'res', funcStr) + const fnRes = fn(cloneDeep(data), cloneDeep(res)) + const resHandle = isToString ? toString(fnRes) : fnRes + // 成功回调 + successCallBack && successCallBack(resHandle) + return resHandle + } catch (error) { + // 失败回调 + errorCallBack && errorCallBack(error) + return '函数执行错误' + } +} + +/** + * * 处理请求事件单位 + * @param num 时间间隔 + * @param unit RequestHttpIntervalEnum + * @return number 秒数 + */ +export const intervalUnitHandle = (num: number, unit: RequestHttpIntervalEnum) => { + switch (unit) { + // 秒 + case RequestHttpIntervalEnum.SECOND: + return num * 1000 + // 分 + case RequestHttpIntervalEnum.MINUTE: + return num * 1000 * 60 + // 时 + case RequestHttpIntervalEnum.HOUR: + return num * 1000 * 60 * 60 + // 天 + case RequestHttpIntervalEnum.DAY: + return num * 1000 * 60 * 60 * 24 + default: + return num * 1000 + } +} + +/** + * * 对象转换 cookie 格式 + * @param obj + * @returns string + */ +export const objToCookie = (obj: RequestParamsObjType) => { + if (!obj) return '' + + let str = '' + for (const key in obj) { + str += key + '=' + obj[key] + ';' + } + return str.substring(0, str.length - 1) +} + +/** + * * 设置按下键盘按键的底部展示 + * @param keyCode + * @returns + */ +export const setKeyboardDressShow = (keyCode?: number) => { + const code = new Map([ + [17, WinKeyboard.CTRL], + [32, WinKeyboard.SPACE] + ]) + + const dom = document.getElementById('keyboard-dress-show') + if (!dom) return + if (!keyCode) { + window.onKeySpacePressHold?.(false) + dom.innerText = '' + return + } + if (keyCode && code.has(keyCode)) { + if (keyCode == 32) window.onKeySpacePressHold?.(true) + dom.innerText = `按下了「${code.get(keyCode)}」键` + } +} + +/** + * * JSON序列化,支持函数和 undefined + * @param data + */ +export const JSONStringify = (data: T) => { + return JSON.stringify( + data, + (key, val) => { + // 处理函数丢失问题 + if (typeof val === 'function') { + return `${val}` + } + // 处理 undefined 丢失问题 + if (typeof val === 'undefined') { + return null + } + return val + }, + 2 + ) +} + +/** + * * JSON反序列化,支持函数和 undefined + * @param data + */ +export const JSONParse = (data: string) => { + return JSON.parse(data, (k, v) => { + if (excludeParseEventKeyList.includes(k)) return v + if (typeof v === 'string' && v.indexOf && (v.indexOf('function') > -1 || v.indexOf('=>') > -1)) { + return eval(`(function(){return ${v}})()`) + } else if (typeof v === 'string' && v.indexOf && (v.indexOf('return ') > -1)) { + const baseLeftIndex = v.indexOf('(') + if (baseLeftIndex > -1) { + const newFn = `function ${v.substring(baseLeftIndex)}` + return eval(`(function(){return ${newFn}})()`) + } + } + return v + }) +} + +/** + * * 修改顶部标题 + * @param title + */ +export const setTitle = (title?: string) => { + title && (document.title = title) +} + +/** + * 时间日期转换 + * @param date 当前时间,new Date() 格式 + * @param format 需要转换的时间格式字符串 + * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd` + * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ" + * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW" + * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ" + * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ" + * @returns 返回拼接后的时间字符串 + */ +export function formatDate(date: Date, format: string): string { + const we = date.getDay() // 星期 + const z = getWeek(date) // 周 + const qut = Math.floor((date.getMonth() + 3) / 3).toString() // 季度 + const opt: { [key: string]: string } = { + 'Y+': date.getFullYear().toString(), // 年 + 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1) + 'd+': date.getDate().toString(), // 日 + 'H+': date.getHours().toString(), // 时 + 'M+': date.getMinutes().toString(), // 分 + 'S+': date.getSeconds().toString(), // 秒 + 'q+': qut // 季度 + } + // 中文数字 (星期) + const week: { [key: string]: string } = { + '0': '日', + '1': '一', + '2': '二', + '3': '三', + '4': '四', + '5': '五', + '6': '六' + } + // 中文数字(季度) + const quarter: { [key: string]: string } = { + '1': '一', + '2': '二', + '3': '三', + '4': '四' + } + if (/(W+)/.test(format)) + format = format.replace( + RegExp.$1, + RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we] + ) + if (/(Q+)/.test(format)) + format = format.replace( + RegExp.$1, + RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut] + ) + if (/(Z+)/.test(format)) + format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '') + for (const k in opt) { + const r = new RegExp('(' + k + ')').exec(format) + // 若输入的长度不为1,则前面补零 + if (r) + format = format.replace( + r[1], + RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0') + ) + } + return format +} + +/** + * 获取当前日期是第几周 + * @param dateTime 当前传入的日期值 + * @returns 返回第几周数字值 + */ +export function getWeek(dateTime: Date): number { + const temptTime = new Date(dateTime.getTime()) + // 周几 + const weekday = temptTime.getDay() || 7 + // 周1+5天=周六 + temptTime.setDate(temptTime.getDate() - weekday + 1 + 5) + let firstDay = new Date(temptTime.getFullYear(), 0, 1) + const dayOfWeek = firstDay.getDay() + let spendDay = 1 + if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1 + firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay) + const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000) + const result = Math.ceil(d / 7) + return result +} diff --git a/grailed-ui-go-view/src/views/chart/ContentBox/index.ts b/grailed-ui-go-view/src/views/chart/ContentBox/index.ts new file mode 100644 index 0000000..97fd8f7 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentBox/index.ts @@ -0,0 +1,3 @@ +import ContentBox from './index.vue' + +export { ContentBox } diff --git a/grailed-ui-go-view/src/views/chart/ContentBox/index.vue b/grailed-ui-go-view/src/views/chart/ContentBox/index.vue new file mode 100644 index 0000000..8f7b5e5 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentBox/index.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.ts new file mode 100644 index 0000000..e9fe1d4 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.ts @@ -0,0 +1,3 @@ +import ChartsItemBox from './index.vue' + +export { ChartsItemBox } diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue new file mode 100644 index 0000000..7ca3b1b --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.ts new file mode 100644 index 0000000..8fffb84 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.ts @@ -0,0 +1,3 @@ +import ChartsOptionContent from './index.vue' + +export { ChartsOptionContent } diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue new file mode 100644 index 0000000..4b887f2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsOptionContent/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.ts new file mode 100644 index 0000000..119c998 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.ts @@ -0,0 +1,3 @@ +import ChartsSearch from './index.vue' + +export { ChartsSearch } diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.vue b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.vue new file mode 100644 index 0000000..f1a25dd --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/components/ChartsSearch/index.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useAside.hook.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useAside.hook.ts new file mode 100644 index 0000000..eb69d0c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useAside.hook.ts @@ -0,0 +1,92 @@ +import { shallowReactive, ref } from 'vue' +import { icon } from '@/plugins' +import { renderLang, renderIcon } from '@/utils' +import { themeColor, setItem, getCharts } from './useLayout.hook' +import { PackagesCategoryEnum, PackagesCategoryName, PackagesType } from '@/packages/index.d' +// 图表 +import { usePackagesStore } from '@/store/modules/packagesStore/packagesStore' +import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' +// 图标 +const { BarChartIcon } = icon.ionicons5 +const { + TableSplitIcon, + RoadmapIcon, + SpellCheckIcon, + GraphicalDataFlowIcon, +} = icon.carbon + + +// 图表 +export type MenuOptionsType = { + key: string + icon: ReturnType + label: ReturnType + list: PackagesType +} + +const { getPackagesList } = usePackagesStore() +const menuOptions: MenuOptionsType[] = [] + +const packagesListObj = { + [PackagesCategoryEnum.CHARTS]: { + icon: renderIcon(RoadmapIcon), + label: PackagesCategoryName.CHARTS, + }, + [PackagesCategoryEnum.INFORMATIONS]: { + icon: renderIcon(SpellCheckIcon), + label: PackagesCategoryName.INFORMATIONS, + }, + [PackagesCategoryEnum.TABLES]: { + icon: renderIcon(TableSplitIcon), + label: PackagesCategoryName.TABLES, + }, + [PackagesCategoryEnum.DECORATES]: { + icon: renderIcon(GraphicalDataFlowIcon), + label: PackagesCategoryName.DECORATES, + }, +} + +// 处理列表 +const handlePackagesList = () => { + for (const val in getPackagesList) { + menuOptions.push({ + key: val, + // @ts-ignore + icon: packagesListObj[val].icon, + // @ts-ignore + label: packagesListObj[val].label, + // @ts-ignore + list: getPackagesList[val], + }) + } +} +handlePackagesList() + +// 记录选中值 +let beforeSelect: string = menuOptions[0]['key'] +const selectValue = ref(menuOptions[0]['key']) + +// 选中的对象值 +const selectOptions = ref(menuOptions[0]) + +// 点击 item +const clickItemHandle = (key: string, item: any) => { + selectOptions.value = item + // 处理折叠 + if (beforeSelect === key) { + setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value) + } else { + setItem(ChartLayoutStoreEnum.CHARTS, true) + } + beforeSelect = key +} + +export { + getCharts, + BarChartIcon, + themeColor, + selectOptions, + selectValue, + clickItemHandle, + menuOptions, +} diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useLayout.hook.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useLayout.hook.ts new file mode 100644 index 0000000..1e35533 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/hooks/useLayout.hook.ts @@ -0,0 +1,20 @@ +import { ref, toRefs } from 'vue' + +// 布局 +import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' +// 样式 +import { useDesignStore } from '@/store/modules/designStore/designStore' + +// 全局颜色 +const designStore = useDesignStore() +const themeColor = ref(designStore.getAppTheme) + +// 结构控制 +const { setItem } = useChartLayoutStore() +const { getCharts } = toRefs(useChartLayoutStore()) + +export { + themeColor, + setItem, + getCharts +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/index.ts b/grailed-ui-go-view/src/views/chart/ContentCharts/index.ts new file mode 100644 index 0000000..f77cc12 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/index.ts @@ -0,0 +1,3 @@ +import ContentCharts from './index.vue' + +export { ContentCharts } diff --git a/grailed-ui-go-view/src/views/chart/ContentCharts/index.vue b/grailed-ui-go-view/src/views/chart/ContentCharts/index.vue new file mode 100644 index 0000000..3f81d04 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentCharts/index.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/components/ChartThemeColor/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/components/ChartThemeColor/index.vue new file mode 100644 index 0000000..8313bda --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/components/ChartThemeColor/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.ts new file mode 100644 index 0000000..2926faf --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.ts @@ -0,0 +1,3 @@ +import CanvasPage from './index.vue' + +export { CanvasPage } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue new file mode 100644 index 0000000..865aae4 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue @@ -0,0 +1,364 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartAnimation/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartAnimation/index.vue new file mode 100644 index 0000000..7614395 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartAnimation/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.ts new file mode 100644 index 0000000..73e38fa --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.ts @@ -0,0 +1,3 @@ +import ChartDataAjax from './index.vue' + +export { ChartDataAjax } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue new file mode 100644 index 0000000..736130c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.ts new file mode 100644 index 0000000..79652ba --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.ts @@ -0,0 +1,3 @@ +import ChartDataMatchingAndShow from './index.vue' + +export { ChartDataMatchingAndShow } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue new file mode 100644 index 0000000..0774a11 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.ts new file mode 100644 index 0000000..58215d1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.ts @@ -0,0 +1,3 @@ +import ChartDataMonacoEditor from './index.vue' + +export { ChartDataMonacoEditor } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue new file mode 100644 index 0000000..a0078f1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/displayTable.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/displayTable.vue new file mode 100644 index 0000000..768dc13 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/displayTable.vue @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.ts new file mode 100644 index 0000000..6617da1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.ts @@ -0,0 +1,3 @@ +import ChartDataDisplay from './index.vue' + +export { ChartDataDisplay } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.vue new file mode 100644 index 0000000..f2f6e6a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataDisplay/index.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.ts new file mode 100644 index 0000000..724b5d2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.ts @@ -0,0 +1,3 @@ +import ChartDataPondControl from './index.vue' + +export { ChartDataPondControl } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.vue new file mode 100644 index 0000000..3ff3c6c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondControl/index.vue @@ -0,0 +1,234 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.ts new file mode 100644 index 0000000..cb69adf --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.ts @@ -0,0 +1,3 @@ +import ChartDataPondList from './index.vue' + +export { ChartDataPondList } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.vue new file mode 100644 index 0000000..a19c90e --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/components/ChartDataPondList/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.ts new file mode 100644 index 0000000..af8dd52 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.ts @@ -0,0 +1,3 @@ +import ChartDataPond from './index.vue' + +export { ChartDataPond } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.vue new file mode 100644 index 0000000..ed9bc27 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataPond/index.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.ts new file mode 100644 index 0000000..a6efbcc --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.ts @@ -0,0 +1,3 @@ +import RequestGlobalConfig from './index.vue' + +export { RequestGlobalConfig } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.vue new file mode 100644 index 0000000..93dd506 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalConfig/index.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.ts new file mode 100644 index 0000000..72686c1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.ts @@ -0,0 +1,3 @@ +import RequestGlobalHeaderTable from './index.vue' + +export { RequestGlobalHeaderTable } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.vue new file mode 100644 index 0000000..514a3d3 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestGlobalHeaderTable/index.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.ts new file mode 100644 index 0000000..71865c6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.ts @@ -0,0 +1,3 @@ +import RequestHeader from './index.vue' + +export { RequestHeader } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.vue new file mode 100644 index 0000000..0801cb3 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.ts new file mode 100644 index 0000000..b016ea6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.ts @@ -0,0 +1,3 @@ +import RequestHeaderTable from './index.vue' + +export { RequestHeaderTable } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.vue new file mode 100644 index 0000000..0761d28 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeaderTable/index.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.ts new file mode 100644 index 0000000..d3242c6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.ts @@ -0,0 +1,3 @@ +import RequestTargetConfig from './index.vue' + +export { RequestTargetConfig } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.vue new file mode 100644 index 0000000..3b9f92d --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestTargetConfig/index.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.ts new file mode 100644 index 0000000..aca3331 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.ts @@ -0,0 +1,4 @@ +import ChartDataRequest from './index.vue' +import PondDataRequest from './pondIndex.vue' + +export { ChartDataRequest, PondDataRequest } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue new file mode 100644 index 0000000..84c6678 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/index.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/pondIndex.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/pondIndex.vue new file mode 100644 index 0000000..cac6f0e --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/pondIndex.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.ts new file mode 100644 index 0000000..1edd837 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.ts @@ -0,0 +1,3 @@ +import ChartDataStatic from './index.vue' + +export { ChartDataStatic } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue new file mode 100644 index 0000000..d286791 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/hooks/useFile.hooks.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/hooks/useFile.hooks.ts new file mode 100644 index 0000000..0825895 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/hooks/useFile.hooks.ts @@ -0,0 +1,49 @@ +import { ref, toRef, nextTick } from 'vue' +import { UploadCustomRequestOptions } from 'naive-ui' +import { FileTypeEnum } from '@/enums/fileTypeEnum' +import { readFile, downloadTextFile, JSONStringify, JSONParse } from '@/utils' + +export const useFile = (targetData: any) => { + const uploadFileListRef = ref() + + //@ts-ignore + const beforeUpload = ({ file }) => { + uploadFileListRef.value = [] + const type = file.file.type + if (type !== FileTypeEnum.JSON && type !== FileTypeEnum.TXT) { + window['$message'].warning('仅支持上传 【JSON】 格式文件,请重新上传!') + return false + } + return true + } + + // 自定义上传操作 + const customRequest = (options: UploadCustomRequestOptions) => { + const { file } = options + nextTick(() => { + if (file.file) { + readFile(file.file).then((fileData: any) => { + targetData.value.option.dataset = JSONParse(fileData) + }) + } else { + window['$message'].error('导入数据失败,请稍后重试或联系管理员!') + } + }) + } + + // 下载文件 + const download = () => { + try { + window['$message'].success('下载中,请耐心等待...') + downloadTextFile(JSONStringify(targetData.value.option.dataset), undefined, 'json') + } catch (error) { + window['$message'].error('下载失败,数据错误!') + } + } + return { + uploadFileListRef, + beforeUpload, + customRequest, + download + } +} diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts new file mode 100644 index 0000000..261ae32 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts @@ -0,0 +1,105 @@ +import { RequestHttpEnum, RequestHttpIntervalEnum, RequestDataTypeEnum, SelectHttpTimeNameObj } from '@/enums/httpEnum' + +// 匹配结果 +export enum DataResultEnum { + NULL = 0, + SUCCESS = 1, + FAILURE = 2, +} + +export enum TimelineTitleEnum { + FILTER = '数据过滤', + MAPPING = '数据映射', + CONTENT = '数据内容', +} + +export enum SelectCreateDataEnum { + STATIC = '静态数据', + AJAX = '动态请求', + Pond = '公共接口', +} + +export interface SelectCreateDataType { + label: SelectCreateDataEnum + value: RequestDataTypeEnum + disabled?: boolean +} + +// ajax 请求类型 +export interface SelectHttpType { + label: RequestHttpEnum + value: RequestHttpEnum + disabled?: boolean + style?: object +} + +// 类型选项 +export const selectTypeOptions: SelectHttpType[] = [ + { + label: RequestHttpEnum.GET, + value: RequestHttpEnum.GET, + style: { + color: 'greenyellow', + fontWeight: 'bold' + } + }, + { + label: RequestHttpEnum.POST, + value: RequestHttpEnum.POST, + style: { + color: 'skyblue', + fontWeight: 'bold' + } + }, + { + label: RequestHttpEnum.PUT, + value: RequestHttpEnum.PUT, + style: { + color: 'goldenrod', + fontWeight: 'bold' + } + }, + { + label: RequestHttpEnum.PATCH, + value: RequestHttpEnum.PATCH, + style: { + color: 'violet', + fontWeight: 'bold' + } + }, + { + label: RequestHttpEnum.DELETE, + value: RequestHttpEnum.DELETE, + disabled: true, + style: { + fontWeight: 'bold' + } + }, +] + +// ajax 请求间隔 +export interface SelectHttpTimeType { + label: string + value: RequestHttpIntervalEnum + disabled?: boolean +} + +// 时间选项 +export const selectTimeOptions: SelectHttpTimeType[] = [ + { + label: SelectHttpTimeNameObj[RequestHttpIntervalEnum.SECOND], + value: RequestHttpIntervalEnum.SECOND + }, + { + label: SelectHttpTimeNameObj[RequestHttpIntervalEnum.MINUTE], + value: RequestHttpIntervalEnum.MINUTE + }, + { + label: SelectHttpTimeNameObj[RequestHttpIntervalEnum.HOUR], + value: RequestHttpIntervalEnum.HOUR + }, + { + label: SelectHttpTimeNameObj[RequestHttpIntervalEnum.DAY], + value: RequestHttpIntervalEnum.DAY + }, +] \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.vue new file mode 100644 index 0000000..2915cb0 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartData/index.vue @@ -0,0 +1,49 @@ + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/importTemplate.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/importTemplate.ts new file mode 100644 index 0000000..527dd9b --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/importTemplate.ts @@ -0,0 +1,189 @@ +// 获取实例 +const eTemplateString = ` +console.log(e) +` +// 获取全局 echarts 实例 +const echartsTemplateString = ` +console.log(echarts) +` + +// 获取当前组件图表集合 +const componentsTemplateString = ` +console.log(components) +` + +// 获取 nodeModules 实例 +const nodeModulesTemplateString = ` +console.log(node_modules) +` + +// 添加点击事件 +const addClickTemplateString = ` +// 在渲染之后才能获取 dom 实例 +e.el.addEventListener('click', () => { + alert('我触发拉~'); +}, false) +` + +// 异步引入 +const importTemplateString = ` +await import('https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/lodash.js/4.17.21/lodash.js') + +// lodash 默认赋值给 "_" +console.log('isEqual', _.isEqual(['1'], ['1'])) +` + +// 修改图表 tooltip +const tooltipTemplateString = + ` +// 获取echart实例 +const chart = this.refs.vChartRef.chart + +// 图表设置tooltip +chart.setOption({ + tooltip: { + trigger: 'axis', //item + enterable: true, + formatter (params) { + return` + + '`' + + ` +
+ + 《这是一个自定义的tooltip》 +
+
+ ` + + '$' + + `{Object.entries(params[0].value).map(kv => ` + + '`' + + `
` + + '$' + + `{kv[0]}:` + + '$' + + `{kv[1]}
` + + '`' + + `).join('')} +
+ ` + + '`;' + + ` + }, + } +}) +` + +// 添加【轮播列表】样式 +const addStyleString = + ` +// 组件样式作用域标识 +const scoped = this.subTree.scopeId +function loadStyleString(css){ + let style = document.createElement('style') + style.type = 'text/css' + style.appendChild(document.createTextNode(css)) + let head = document.getElementsByTagName('head')[0] + head.appendChild(style) +} +loadStyleString(` + + '`' + + ` +.dv-scroll-board[` + + '$' + + `{scoped}] { + position: relative; + overflow: hidden; +} +.dv-scroll-board[` + + '$' + + `{scoped}]::before { + content: ''; + display: block; + position: absolute; + top: -20%; + left: -100%; + width: 550px; + height: 60px; + transform: rotate(-45deg); + background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(255, 255, 255, 0.3), rgba(0, 0, 0, 0)); + animation: cross 2s infinite; +} +@keyframes cross{ + to{ + top: 80%; + left: 100%; + transform: rotate(-45deg); + } +} +` + + '`' + + `) +` + +// 修改地图原点大小 +const editMapPointString = ` +const chart = this.refs.vChartRef.chart +// 定义地图原点大小 同理可自定义标签等等内容 +this.props.chartConfig.option.series[0].symbolSize = (val) => { + return Math.sqrt(val[2]) / 3; +} +this.setupState.vEchartsSetOption(); +let i = 0; // 当前轮播索引 +const len = 3; // 轮播部分提示 +(function showTips() { + const action = (type, dataIndex) => { + chart.dispatchAction({ + type, + dataIndex, + seriesIndex: 0, + }); + } + setInterval(() => { + action("downplay", i); + action("hideTip", i); + if (i === len) i = 0; + i++; + action("highlight", i); + action("showTip", i); + }, 2000); +})() +` + +export const templateList = [ + { + description: '获取当前组件实例', + code: eTemplateString + }, + { + description: '获取全局 echarts 实例', + code: echartsTemplateString + }, + { + description: '获取组件图表集合', + code: componentsTemplateString + }, + { + description: '获取 nodeModules 实例', + code: nodeModulesTemplateString + }, + { + description: '获取远程 CDN 库', + code: importTemplateString + }, + { + description: '设置文字组件点击事件', + code: addClickTemplateString + }, + { + description: '修改图表 tooltip', + code: tooltipTemplateString + }, + { + description: '添加【轮播列表】样式', + code: addStyleString + }, + { + description: '修改【地图】圆点,新增提示自动轮播', + code: editMapPointString + } +] diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.ts new file mode 100644 index 0000000..32daaf6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.ts @@ -0,0 +1,3 @@ +import ChartEventAdvancedHandle from './index.vue' + +export { ChartEventAdvancedHandle } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.vue new file mode 100644 index 0000000..581fefc --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventAdvancedHandle/index.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.ts new file mode 100644 index 0000000..d45f2f1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.ts @@ -0,0 +1,3 @@ +import ChartEventBaseHandle from './index.vue' + +export { ChartEventBaseHandle } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.vue new file mode 100644 index 0000000..2defea3 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/ChartEventBaseHandle/index.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/index.scss b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/index.scss new file mode 100644 index 0000000..8cd67cf --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/components/index.scss @@ -0,0 +1,51 @@ +/* 外层也要使用 */ +.func-keyword { + color: #b478cf; +} + +.func-annotate { + color: #70c0e8; +} + +@include go('chart-data-monaco-editor') { + .func-keyNameWord { + color: #70c0e8; + } + .tab-tip { + font-size: 12px; + } + &.n-card.n-modal, + .n-card { + @extend .go-background-filter; + } +} +@include deep() { + .n-layout, + .n-layout-sider { + background-color: transparent; + } + .collapse-show-box { + .n-card__content { + padding-left: 20px; + padding-right: 10px; + } + } + .go-editor-area { + max-height: 530px; + } + .checkbox--hidden:checked { + & + label { + .n-icon { + transition: all 0.3s; + transform: rotate(180deg); + } + } + & ~ .go-editor-area { + display: none; + } + } + // 优化代码换行 + .n-code > pre { + white-space: break-spaces; + } +} diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue new file mode 100644 index 0000000..05e5ce4 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartEvent/index.vue @@ -0,0 +1,21 @@ + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue new file mode 100644 index 0000000..21c7d96 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/hooks/useTargetData.hook.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/hooks/useTargetData.hook.ts new file mode 100644 index 0000000..0fde624 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/components/hooks/useTargetData.hook.ts @@ -0,0 +1,14 @@ +import { computed, Ref } from 'vue' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' + +// 获取当前对象数据 +export const useTargetData = () => { + const chartEditStore = useChartEditStore() + const targetData: Ref = computed(() => { + const list = chartEditStore.getComponentList + const targetIndex = chartEditStore.fetchTargetIndex() + return list[targetIndex] + }) + return { targetData, chartEditStore } +} diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.d.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.d.ts new file mode 100644 index 0000000..59ca5bc --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.d.ts @@ -0,0 +1,7 @@ +export enum TabsEnum { + PAGE_SETTING = 'pageSetting', + CHART_SETTING = 'chartSetting', + CHART_ANIMATION = 'chartAnimation', + CHART_DATA = 'chartData', + CHART_EVENT = 'chartEvent' +} diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.ts b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.ts new file mode 100644 index 0000000..e708cd5 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.ts @@ -0,0 +1,3 @@ +import ContentConfigurations from './index.vue' + +export { ContentConfigurations } diff --git a/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.vue b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.vue new file mode 100644 index 0000000..110a3c2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentConfigurations/index.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.ts new file mode 100644 index 0000000..d07271c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.ts @@ -0,0 +1,3 @@ +import EditAlignLine from './index.vue' + +export { EditAlignLine } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.vue new file mode 100644 index 0000000..bfa3000 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditAlignLine/index.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.ts new file mode 100644 index 0000000..d987298 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.ts @@ -0,0 +1,3 @@ +import EditBottom from './index.vue' + +export { EditBottom } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.vue new file mode 100644 index 0000000..2f21b65 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditBottom/index.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.ts new file mode 100644 index 0000000..b012584 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.ts @@ -0,0 +1,3 @@ +import EditDataSync from './index.vue' + +export { EditDataSync } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.vue new file mode 100644 index 0000000..7a2a8f8 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditDataSync/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.ts new file mode 100644 index 0000000..4fd9d52 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.ts @@ -0,0 +1,3 @@ +import EditGroup from './index.vue' + +export { EditGroup } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.vue new file mode 100644 index 0000000..5d7f146 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditGroup/index.vue @@ -0,0 +1,129 @@ + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.ts new file mode 100644 index 0000000..36ca8b2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.ts @@ -0,0 +1,3 @@ +import EditHistory from './index.vue' + +export { EditHistory } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.vue new file mode 100644 index 0000000..a9c6c6a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditHistory/index.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.ts new file mode 100644 index 0000000..eadec58 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.ts @@ -0,0 +1,3 @@ +import EditRange from './index.vue' + +export { EditRange } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.vue new file mode 100644 index 0000000..d9a7bcc --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRange/index.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.ts new file mode 100644 index 0000000..426c4ce --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.ts @@ -0,0 +1,3 @@ +import EditRule from './index.vue' + +export { EditRule } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.vue new file mode 100644 index 0000000..e200bee --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditRule/index.vue @@ -0,0 +1,356 @@ + + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.ts new file mode 100644 index 0000000..88b3334 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.ts @@ -0,0 +1,3 @@ +import EditSelect from './index.vue' + +export { EditSelect } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.vue new file mode 100644 index 0000000..90fc086 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditSelect/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.ts new file mode 100644 index 0000000..8980e45 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.ts @@ -0,0 +1,3 @@ +import EditShapeBox from './index.vue' + +export { EditShapeBox } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.vue new file mode 100644 index 0000000..b509b32 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShapeBox/index.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue new file mode 100644 index 0000000..c8ed76a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.ts new file mode 100644 index 0000000..377edf8 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.ts @@ -0,0 +1,3 @@ +import EditShortcutKey from './index.vue' + +export { EditShortcutKey } \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.vue new file mode 100644 index 0000000..1ffc816 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditShortcutKey/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useFile.hooks.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useFile.hooks.ts new file mode 100644 index 0000000..3acc824 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useFile.hooks.ts @@ -0,0 +1,68 @@ +import { ref, nextTick } from 'vue' +import { UploadCustomRequestOptions } from 'naive-ui' +import { FileTypeEnum } from '@/enums/fileTypeEnum' +import { readFile, goDialog, JSONParse } from '@/utils' +import { useSync } from '@/views/chart/hooks/useSync.hook' + +export const useFile = () => { + const importUploadFileListRef = ref() + const { updateComponent } = useSync() + // 上传-前置 + //@ts-ignore + const importBeforeUpload = ({ file }) => { + importUploadFileListRef.value = [] + const type = file.file.type + if (type !== FileTypeEnum.JSON && type !== FileTypeEnum.TXT) { + window['$message'].warning('仅支持上传 【JSON】 格式文件,请重新上传!') + return false + } + return true + } + + // 上传-导入 + const importCustomRequest = (options: UploadCustomRequestOptions) => { + const { file } = options + nextTick(() => { + if (file.file) { + readFile(file.file).then((fileData: any) => { + goDialog({ + message: '请选择导入方式:', + positiveText: '新增(可撤回)', + negativeText: '覆盖(不可撤回)', + negativeButtonProps: { type: 'info', ghost: false }, + // 新增 + onPositiveCallback: async () => { + try { + fileData = JSONParse(fileData) + await updateComponent(fileData, false, true) + window['$message'].success('导入成功!') + } catch (error) { + console.log(error) + window['$message'].error('组件导入失败,请检查文件完整性!') + } + }, + // 覆盖 + onNegativeCallback: async () => { + try { + fileData = JSONParse(fileData) + await updateComponent(fileData, true, true) + window['$message'].success('导入成功!') + } catch (error) { + console.log(error) + window['$message'].error('组件导入失败,请检查文件完整性!') + } + } + }) + }) + } else { + window['$message'].error('导入失败,请检查数据或联系管理员!') + } + }) + } + + return { + importUploadFileListRef, + importBeforeUpload, + importCustomRequest + } +} diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useSyncUpdate.hook.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useSyncUpdate.hook.ts new file mode 100644 index 0000000..3a1633a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/hooks/useSyncUpdate.hook.ts @@ -0,0 +1,65 @@ +import { watch } from 'vue' +import { useRoute } from 'vue-router' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { useSync } from '@/views/chart/hooks/useSync.hook' +import { ChartEnum } from '@/enums/pageEnum' +import { SavePageEnum } from '@/enums/editPageEnum' +import { editToJsonInterval } from '@/settings/designSetting' + +const { updateComponent, dataSyncUpdate } = useSync() +const chartEditStore = useChartEditStore() + +// 侦听器更新 +const useSyncUpdateHandle = () => { + // 定义侦听器变量 + let timer: any + const updateFn = (e: any) => updateComponent(e!.detail, true, false) + const syncData = async () => { + dataSyncUpdate && (await dataSyncUpdate()) + dispatchEvent(new CustomEvent(SavePageEnum.CHART, { detail: chartEditStore.getStorageInfo })) + } + + // 开启侦听 + const use = () => { + // // 1、定时同步数据 + // timer = setInterval(() => { + // // 窗口激活并且处于工作台 + // document.hasFocus() && syncData() + // }, editToJsonInterval) + // // 1、定时同步数据 + // timer = setInterval(() => { + // // 窗口激活并且处于工作台 + // document.hasFocus() && syncData() + // }, editToJsonInterval) + // 2、失焦同步数据 + addEventListener('blur', syncData) + + // 【监听JSON代码 刷新工作台图表】 + addEventListener(SavePageEnum.JSON, updateFn) + } + + // 关闭侦听 + const unUse = () => { + // clearInterval(timer) + // clearInterval(timer) + removeEventListener(SavePageEnum.JSON, updateFn) + removeEventListener('blur', syncData) + } + + // 路由变更时处理 + const watchHandler = (toName: any, fromName: any) => { + if (fromName == ChartEnum.CHART_HOME_NAME) { + unUse() + } + if (toName == ChartEnum.CHART_HOME_NAME) { + use() + } + } + + return watchHandler +} + +export const useSyncUpdate = () => { + const routerParamsInfo = useRoute() + watch(() => routerParamsInfo.name, useSyncUpdateHandle(), { immediate: true }) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.d.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.d.ts new file mode 100644 index 0000000..950436d --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.d.ts @@ -0,0 +1,12 @@ +export enum TypeEnum { + BUTTON = 'button', + IMPORTUPLOAD = 'importUpload' +} + +export type BtnListType = { + key: string + type: TypeEnum + name: string + icon: any + handle?: () => void +} diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.ts new file mode 100644 index 0000000..e4dcfcb --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.ts @@ -0,0 +1,3 @@ +import EditTools from './index.vue' + +export { EditTools } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.vue new file mode 100644 index 0000000..79d2eb6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/index.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/utils/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/utils/index.ts new file mode 100644 index 0000000..39e7af1 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditTools/utils/index.ts @@ -0,0 +1,41 @@ +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { canvasCut, downloadTextFile, JSONStringify } from '@/utils' +const chartEditStore = useChartEditStore() + +// 导出 +export const exportHandle = () => { + // 取消选中 + chartEditStore.setTargetSelectChart(undefined) + + // 导出数据 + downloadTextFile( + JSONStringify(chartEditStore.getStorageInfo || []), + undefined, + 'json' + ) + + // 导出图片 + const range = document.querySelector('.go-edit-range') as HTMLElement + const watermark = document.getElementById('go-edit-watermark') + // 隐藏边距线 + if (!range || !watermark) { + window['$message'].error('导出失败!') + return + } + + // 记录缩放比例 + const scaleTemp = chartEditStore.getEditCanvas.scale + // 百分百展示页面 + chartEditStore.setScale(1, true) + // 展示水印 + watermark.style.display = 'block' + + setTimeout(() => { + canvasCut(range, () => { + // 隐藏水印 + if (watermark) watermark.style.display = 'none' + // 还原页面大小 + chartEditStore.setScale(scaleTemp, true) + }) + }, 600) +} diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.ts new file mode 100644 index 0000000..77882ab --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.ts @@ -0,0 +1,3 @@ +import EditWatermark from './index.vue' + +export { EditWatermark } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.vue new file mode 100644 index 0000000..88fe429 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/components/EditWatermark/index.vue @@ -0,0 +1,29 @@ + + + + + \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useDrag.hook.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useDrag.hook.ts new file mode 100644 index 0000000..3aae554 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useDrag.hook.ts @@ -0,0 +1,382 @@ +import { toRaw } from 'vue' +import { DragKeyEnum, MouseEventButton } from '@/enums/editPageEnum' +import { createComponent } from '@/packages' +import { ConfigType } from '@/packages/index.d' +import { CreateComponentType, CreateComponentGroupType, PickCreateComponentType } from '@/packages/index.d' +import { useContextMenu } from '@/views/chart/hooks/useContextMenu.hook' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d' +import { loadingStart, loadingFinish, loadingError, setComponentPosition, JSONParse } from '@/utils' +import { throttle, cloneDeep } from 'lodash' + +const chartEditStore = useChartEditStore() +const { onClickOutSide } = useContextMenu() + +// * 拖拽到编辑区域里 +export const dragHandle = async (e: DragEvent) => { + e.preventDefault() + + try { + loadingStart() + + // 获取拖拽数据 + const drayDataString = e!.dataTransfer!.getData(DragKeyEnum.DRAG_KEY) + if (!drayDataString) { + loadingFinish() + return + } + + // 修改状态 + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_CREATE, false) + const dropData: Exclude = JSONParse(drayDataString) + + // 创建新图表组件 + let newComponent: CreateComponentType = await createComponent(dropData) + + setComponentPosition(newComponent, e.offsetX - newComponent.attr.w / 2, e.offsetY - newComponent.attr.h / 2) + chartEditStore.addComponentList(newComponent, false, true) + chartEditStore.setTargetSelectChart(newComponent.id) + loadingFinish() + } catch (error) { + loadingError() + window['$message'].warning(`图表正在研发中, 敬请期待...`) + } +} + +// * 进入拖拽区域 +export const dragoverHandle = (e: DragEvent) => { + e.preventDefault() + e.stopPropagation() + + if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy' +} + +// * 不拦截默认行为点击 +export const mousedownHandleUnStop = (e: MouseEvent, item?: CreateComponentType | CreateComponentGroupType) => { + if (item) { + chartEditStore.setTargetSelectChart(item.id) + return + } + chartEditStore.setTargetSelectChart(undefined) +} + +// * 框选 +export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | CreateComponentGroupType) => { + if (e.which == 2) return + if (window.$KeyboardActive?.space) return + + mousedownHandleUnStop(e) + + // 记录点击初始位置 + const startOffsetX = e.offsetX + const startOffsetY = e.offsetY + const startScreenX = e.screenX + const startScreenY = e.screenY + + // 记录缩放 + const scale = chartEditStore.getEditCanvas.scale + + chartEditStore.setMousePosition(undefined, undefined, startOffsetX, startOffsetY) + + // 移动框选 + const mousemove = throttle((moveEvent: MouseEvent) => { + // 取消当前选中 + chartEditStore.setTargetSelectChart() + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_SELECT, true) + + // 这里先把相对值算好,不然组件无法获取 startScreenX 和 startScreenY 的值 + const currX = startOffsetX + moveEvent.screenX - startScreenX + const currY = startOffsetY + moveEvent.screenY - startScreenY + chartEditStore.setMousePosition(currX, currY) + + // 计算框选的左上角和右下角 + const selectAttr = { + // 左上角 + x1: 0, + y1: 0, + // 右下角 + x2: 0, + y2: 0 + } + if (currX > startOffsetX && currY > startOffsetY) { + // 右下方向 + selectAttr.x1 = startOffsetX + selectAttr.y1 = startOffsetY + selectAttr.x2 = Math.round(startOffsetX + (moveEvent.screenX - startScreenX) / scale) + selectAttr.y2 = Math.round(startOffsetY + (moveEvent.screenY - startScreenY) / scale) + } else if (currX > startOffsetX && currY < startOffsetY) { + // 右上方向 + selectAttr.x1 = startOffsetX + selectAttr.y1 = Math.round(startOffsetY - (startScreenY - moveEvent.screenY) / scale) + selectAttr.x2 = Math.round(startOffsetX + (moveEvent.screenX - startScreenX) / scale) + selectAttr.y2 = startOffsetY + } else if (currX < startOffsetX && currY > startOffsetY) { + selectAttr.x1 = Math.round(startOffsetX - (startScreenX - moveEvent.screenX) / scale) + selectAttr.y1 = startOffsetY + selectAttr.x2 = startOffsetX + selectAttr.y2 = Math.round(startOffsetY + (moveEvent.screenY - startScreenY) / scale) + // 左下方向 + } else { + // 左上方向 + selectAttr.x1 = Math.round(startOffsetX - (startScreenX - moveEvent.screenX) / scale) + selectAttr.y1 = Math.round(startOffsetY - (startScreenY - moveEvent.screenY) / scale) + selectAttr.x2 = startOffsetX + selectAttr.y2 = startOffsetY + } + + // 遍历组件 + chartEditStore.getComponentList.forEach(item => { + if (!chartEditStore.getTargetChart.selectId.includes(item.id)) { + // 处理左上角 + let isSelect = false + const { x, y, w, h } = item.attr + const targetAttr = { + // 左上角 + x1: x, + y1: y, + // 右下角 + x2: x + w, + y2: y + h + } + // 全包含则选中 + if ( + targetAttr.x1 - selectAttr.x1 >= 0 && + targetAttr.y1 - selectAttr.y1 >= 0 && + targetAttr.x2 - selectAttr.x2 <= 0 && + targetAttr.y2 - selectAttr.y2 <= 0 && + !item.status.lock && + !item.status.hide + ) { + isSelect = true + chartEditStore.setTargetSelectChart(item.id, true) + } + } + }) + }, 30) + + // 鼠标抬起 + const mouseup = () => { + // 鼠标抬起时,结束mousemove的节流函数,避免选框不消失问题 + mousemove.cancel() + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_SELECT, false) + chartEditStore.setMousePosition(0, 0, 0, 0) + document.removeEventListener('mousemove', mousemove) + document.removeEventListener('mouseup', mouseup) + } + document.addEventListener('mousemove', mousemove) + document.addEventListener('mouseup', mouseup) +} + +// * 鼠标事件 +export const useMouseHandle = () => { + // * Click 事件, 松开鼠标触发 + const mouseClickHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { + e.preventDefault() + e.stopPropagation() + if (item.status.lock) return + // 若此时按下了 CTRL, 表示多选 + if (window.$KeyboardActive?.ctrl) { + // 若已选中,则去除 + if (chartEditStore.targetChart.selectId.includes(item.id)) { + const exList = chartEditStore.targetChart.selectId.filter(e => e !== item.id) + chartEditStore.setTargetSelectChart(exList) + } else { + chartEditStore.setTargetSelectChart(item.id, true) + } + } + } + + // * 按下事件(包含移动事件) + const mousedownHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { + e.preventDefault() + e.stopPropagation() + if (item.status.lock) return + onClickOutSide() + // 按下左键 + CTRL + if (e.buttons === MouseEventButton.LEFT && window.$KeyboardActive?.ctrl) return + + // 按下右键 + 选中多个 + 目标元素是多选子元素 + const selectId = chartEditStore.getTargetChart.selectId + if (e.buttons === MouseEventButton.RIGHT && selectId.length > 1 && selectId.includes(item.id)) return + + // 选中当前目标组件 + chartEditStore.setTargetSelectChart(item.id) + + // 按下右键 + if (e.buttons === MouseEventButton.RIGHT) return + + const scale = chartEditStore.getEditCanvas.scale + const canvasWidth = chartEditStore.getEditCanvasConfig.width + const canvasHeight = chartEditStore.getEditCanvasConfig.height + + // 记录图表初始位置和大小 + const targetMap = new Map() + chartEditStore.getTargetChart.selectId.forEach(id => { + const index = chartEditStore.fetchTargetIndex(id) + if (index !== -1) { + const { x, y, w, h } = toRaw(chartEditStore.getComponentList[index]).attr + targetMap.set(id, { x, y, w, h }) + } + }) + + // 记录点击初始位置 + const startX = e.screenX + const startY = e.screenY + + // 记录历史位置 + let prevComponentInstance: Array = [] + chartEditStore.getTargetChart.selectId.forEach(id => { + if (!targetMap.has(id)) return + + const index = chartEditStore.fetchTargetIndex(id) + // 拿到初始位置数据 + prevComponentInstance.push(cloneDeep(chartEditStore.getComponentList[index])) + }) + + // 记录初始位置 + chartEditStore.setMousePosition(undefined, undefined, startX, startY) + + // 移动-计算偏移量 + const mousemove = throttle((moveEvent: MouseEvent) => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, true) + chartEditStore.setMousePosition(moveEvent.screenX, moveEvent.screenY) + + // 当前偏移量,处理 scale 比例问题 + let offsetX = (moveEvent.screenX - startX) / scale + let offsetY = (moveEvent.screenY - startY) / scale + + chartEditStore.getTargetChart.selectId.forEach(id => { + if (!targetMap.has(id)) return + + const index = chartEditStore.fetchTargetIndex(id) + // 拿到初始位置数据 + const { x, y, w, h } = targetMap.get(id) + const componentInstance = chartEditStore.getComponentList[index] + + let currX = Math.round(x + offsetX) + let currY = Math.round(y + offsetY) + + // 要预留的距离 + const distance = 50 + + // 基于左上角位置检测 + currX = currX < -w + distance ? -w + distance : currX + currY = currY < -h + distance ? -h + distance : currY + + // 基于右下角位置检测 + currX = currX > canvasWidth - distance ? canvasWidth - distance : currX + currY = currY > canvasHeight - distance ? canvasHeight - distance : currY + if (componentInstance) { + componentInstance.attr = Object.assign(componentInstance.attr, { + x: currX, + y: currY + }) + } + }) + return + }, 20) + + const mouseup = () => { + try { + chartEditStore.setMousePosition(0, 0, 0, 0) + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, false) + // 加入历史栈 + if (prevComponentInstance.length) { + chartEditStore.getTargetChart.selectId.forEach(id => { + if (!targetMap.has(id)) return + const index = chartEditStore.fetchTargetIndex(id) + const curComponentInstance = chartEditStore.getComponentList[index] + // 找到记录的所选组件 + prevComponentInstance.forEach(preItem => { + if (preItem.id === id) { + preItem.attr = Object.assign(preItem.attr, { + offsetX: curComponentInstance.attr.x - preItem.attr.x, + offsetY: curComponentInstance.attr.y - preItem.attr.y + }) + } + }) + }) + chartEditStore.moveComponentList(prevComponentInstance) + } + document.removeEventListener('mousemove', mousemove) + document.removeEventListener('mouseup', mouseup) + } catch (err) { + console.log(err) + } + } + + document.addEventListener('mousemove', mousemove) + document.addEventListener('mouseup', mouseup) + } + + // * 进入事件 + const mouseenterHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { + e.preventDefault() + e.stopPropagation() + if (!chartEditStore.getEditCanvas.isSelect) { + chartEditStore.setTargetHoverChart(item.id) + } + } + + // * 移出事件 + const mouseleaveHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { + e.preventDefault() + e.stopPropagation() + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, false) + chartEditStore.setTargetHoverChart(undefined) + } + + return { mouseClickHandle, mousedownHandle, mouseenterHandle, mouseleaveHandle } +} + +// * 移动锚点 +export const useMousePointHandle = (e: MouseEvent, point: string, attr: PickCreateComponentType<'attr'>) => { + e.stopPropagation() + e.preventDefault() + + // 设置拖拽状态 + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, true) + const scale = chartEditStore.getEditCanvas.scale + + const itemAttrX = attr.x + const itemAttrY = attr.y + const itemAttrW = attr.w + const itemAttrH = attr.h + + // 记录点击初始位置 + const startX = e.screenX + const startY = e.screenY + + // 记录初始位置 + chartEditStore.setMousePosition(startX, startY) + + const mousemove = throttle((moveEvent: MouseEvent) => { + chartEditStore.setMousePosition(moveEvent.screenX, moveEvent.screenY) + + let currX = Math.round((moveEvent.screenX - startX) / scale) + let currY = Math.round((moveEvent.screenY - startY) / scale) + + const isTop = /t/.test(point) + const isBottom = /b/.test(point) + const isLeft = /l/.test(point) + const isRight = /r/.test(point) + + const newHeight = itemAttrH + (isTop ? -currY : isBottom ? currY : 0) + const newWidth = itemAttrW + (isLeft ? -currX : isRight ? currX : 0) + + attr.h = newHeight > 0 ? newHeight : 0 + attr.w = newWidth > 0 ? newWidth : 0 + attr.x = itemAttrX + (isLeft ? currX : 0) + attr.y = itemAttrY + (isTop ? currY : 0) + }, 50) + + const mouseup = () => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, false) + chartEditStore.setMousePosition(0, 0, 0, 0) + document.removeEventListener('mousemove', mousemove) + document.removeEventListener('mouseup', mouseup) + } + + document.addEventListener('mousemove', mousemove) + document.addEventListener('mouseup', mouseup) +} diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useLayout.hook.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useLayout.hook.ts new file mode 100644 index 0000000..1da17d5 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useLayout.hook.ts @@ -0,0 +1,29 @@ +import { onUnmounted, onMounted } from 'vue' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d' + +const chartEditStore = useChartEditStore() + +// 布局处理 +export const useLayout = () => { + onMounted(() => { + // 设置 Dom 值(ref 不生效先用 document) + chartEditStore.setEditCanvas( + EditCanvasTypeEnum.EDIT_LAYOUT_DOM, + document.getElementById('go-chart-edit-layout') + ) + chartEditStore.setEditCanvas( + EditCanvasTypeEnum.EDIT_CONTENT_DOM, + document.getElementById('go-chart-edit-content') + ) + + // 监听初始化 + const removeScale = chartEditStore.listenerScale() + + onUnmounted(() => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null) + chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null) + removeScale() + }) + }) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useStyle.hook.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useStyle.hook.ts new file mode 100644 index 0000000..14507f7 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/hooks/useStyle.hook.ts @@ -0,0 +1,65 @@ +import { PickCreateComponentType } from '@/packages/index.d' + +type AttrType = PickCreateComponentType<'attr'> + +export const useComponentStyle = (attr: AttrType, index: number) => { + if(!attr) return {} + const componentStyle = { + zIndex: index + 1, + left: `${attr.x}px`, + top: `${attr.y}px` + } + return componentStyle +} + +export const useSizeStyle = (attr: AttrType, scale?: number) => { + if(!attr) return {} + return { + width: `${scale ? scale * attr.w : attr.w}px`, + height: `${scale ? scale * attr.h : attr.h}px` + } +} + +// 锚点位置 +export const usePointStyle = ( + point: string, + index: number, + attr: PickCreateComponentType<'attr'>, + cursorResize: string[] +) => { + const { w: width, h: height } = attr + + const isTop = /t/.test(point) + const isBottom = /b/.test(point) + const isLeft = /l/.test(point) + const isRight = /r/.test(point) + + let newLeft = 0 + let newTop = 0 + + // 四个角的点 + if (point.length === 2) { + newLeft = isLeft ? 0 : width + newTop = isTop ? 0 : height + } else { + // 上下两点的点,宽度居中 + if (isTop || isBottom) { + newLeft = width / 2 + newTop = isTop ? 0 : height + } + + // 左右两边的点,高度居中 + if (isLeft || isRight) { + newLeft = isLeft ? 0 : width + newTop = Math.floor(height / 2) + } + } + + const style = { + left: `${newLeft}px`, + top: `${newTop}px`, + cursor: cursorResize[index] + '-resize' + } + + return style +} diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/index.ts b/grailed-ui-go-view/src/views/chart/ContentEdit/index.ts new file mode 100644 index 0000000..4a4766a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/index.ts @@ -0,0 +1,3 @@ +import ContentEdit from './index.vue' + +export { ContentEdit } diff --git a/grailed-ui-go-view/src/views/chart/ContentEdit/index.vue b/grailed-ui-go-view/src/views/chart/ContentEdit/index.vue new file mode 100644 index 0000000..6f25ec9 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentEdit/index.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.ts b/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.ts new file mode 100644 index 0000000..1a76146 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.ts @@ -0,0 +1,3 @@ +import HeaderLeftBtn from './index.vue' + +export { HeaderLeftBtn } diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.vue b/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.vue new file mode 100644 index 0000000..e29a59a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerLeftBtn/index.vue @@ -0,0 +1,164 @@ + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.ts b/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.ts new file mode 100644 index 0000000..d6b6deb --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.ts @@ -0,0 +1,3 @@ +import HeaderRightBtn from './index.vue' + +export { HeaderRightBtn } diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.vue b/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.vue new file mode 100644 index 0000000..9819bb2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerRightBtn/index.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.ts b/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.ts new file mode 100644 index 0000000..19b5dbc --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.ts @@ -0,0 +1,3 @@ +import HeaderTitle from './index.vue' + +export { HeaderTitle } diff --git a/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.vue b/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.vue new file mode 100644 index 0000000..e1a710a --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentHeader/headerTitle/index.vue @@ -0,0 +1,86 @@ + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.ts b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.ts new file mode 100644 index 0000000..2593932 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.ts @@ -0,0 +1,3 @@ +import LayersGroupListItem from './index.vue' + +export { LayersGroupListItem } diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue new file mode 100644 index 0000000..ac9892e --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.ts b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.ts new file mode 100644 index 0000000..f39abe9 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.ts @@ -0,0 +1,3 @@ +import LayersListItem from './index.vue' + +export { LayersListItem } diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.vue new file mode 100644 index 0000000..d77ed45 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.ts b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.ts new file mode 100644 index 0000000..220d5c2 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.ts @@ -0,0 +1,3 @@ +import LayersStatus from './index.vue' + +export { LayersStatus } diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.vue b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.vue new file mode 100644 index 0000000..a43d8aa --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/components/LayersStatus/index.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/enums.ts b/grailed-ui-go-view/src/views/chart/ContentLayers/enums.ts new file mode 100644 index 0000000..e69de29 diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/index.ts b/grailed-ui-go-view/src/views/chart/ContentLayers/index.ts new file mode 100644 index 0000000..e2e64f5 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/index.ts @@ -0,0 +1,3 @@ +import ContentLayers from './index.vue' + +export { ContentLayers } diff --git a/grailed-ui-go-view/src/views/chart/ContentLayers/index.vue b/grailed-ui-go-view/src/views/chart/ContentLayers/index.vue new file mode 100644 index 0000000..4f5895d --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLayers/index.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/chart/ContentLoad/index.ts b/grailed-ui-go-view/src/views/chart/ContentLoad/index.ts new file mode 100644 index 0000000..7e41ed3 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLoad/index.ts @@ -0,0 +1,3 @@ +import ContentLoad from './index.vue' + +export { ContentLoad } diff --git a/grailed-ui-go-view/src/views/chart/ContentLoad/index.vue b/grailed-ui-go-view/src/views/chart/ContentLoad/index.vue new file mode 100644 index 0000000..2b7f46c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/ContentLoad/index.vue @@ -0,0 +1,40 @@ + + + diff --git a/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.d.ts b/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.d.ts new file mode 100644 index 0000000..ec1276c --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.d.ts @@ -0,0 +1,11 @@ +import { MenuEnum } from '@/enums/editPageEnum' + +export interface MenuOptionsItemType { + type?: string + label?: string + key: MenuEnum | string + icon?: Function + fnHandle?: Function + disabled?: boolean + hidden?: boolean +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.ts b/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.ts new file mode 100644 index 0000000..e0aa782 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/hooks/useContextMenu.hook.ts @@ -0,0 +1,277 @@ +import { ref, nextTick, toRaw } from 'vue' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { renderIcon, loadingError } from '@/utils' +import { icon } from '@/plugins' +import { MenuOptionsItemType } from './useContextMenu.hook.d' +import { MenuEnum } from '@/enums/editPageEnum' +import cloneDeep from 'lodash/cloneDeep' + +const { + CopyIcon, + CutIcon, + ClipboardOutlineIcon, + TrashIcon, + ChevronDownIcon, + ChevronUpIcon, + LockOpenOutlineIcon, + LockClosedOutlineIcon, + EyeOutlineIcon, + EyeOffOutlineIcon +} = icon.ionicons5 +const { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon + +const chartEditStore = useChartEditStore() + +/** + * 分割线 + * @param {number} n > 2 + * @returns + */ +export const divider = (n: number = 3) => { + return { + type: 'divider', + key: `d${n}` + } +} + +// * 默认单组件选项 +export const defaultOptions: MenuOptionsItemType[] = [ + { + label: '锁定', + key: MenuEnum.LOCK, + icon: renderIcon(LockClosedOutlineIcon), + fnHandle: chartEditStore.setLock + }, + { + label: '解锁', + key: MenuEnum.UNLOCK, + icon: renderIcon(LockOpenOutlineIcon), + fnHandle: chartEditStore.setUnLock + }, + { + label: '隐藏', + key: MenuEnum.HIDE, + icon: renderIcon(EyeOffOutlineIcon), + fnHandle: chartEditStore.setHide + }, + { + label: '显示', + key: MenuEnum.SHOW, + icon: renderIcon(EyeOutlineIcon), + fnHandle: chartEditStore.setShow + }, + { + type: 'divider', + key: 'd0' + }, + { + label: '复制', + key: MenuEnum.COPY, + icon: renderIcon(CopyIcon), + fnHandle: chartEditStore.setCopy + }, + { + label: '剪切', + key: MenuEnum.CUT, + icon: renderIcon(CutIcon), + fnHandle: chartEditStore.setCut + }, + { + label: '粘贴', + key: MenuEnum.PARSE, + icon: renderIcon(ClipboardOutlineIcon), + fnHandle: chartEditStore.setParse + }, + { + type: 'divider', + key: 'd1' + }, + { + label: '置顶', + key: MenuEnum.TOP, + icon: renderIcon(UpToTopIcon), + fnHandle: chartEditStore.setTop + }, + { + label: '置底', + key: MenuEnum.BOTTOM, + icon: renderIcon(DownToBottomIcon), + fnHandle: chartEditStore.setBottom + }, + { + label: '上移', + key: MenuEnum.UP, + icon: renderIcon(ChevronUpIcon), + fnHandle: chartEditStore.setUp + }, + { + label: '下移', + key: MenuEnum.DOWN, + icon: renderIcon(ChevronDownIcon), + fnHandle: chartEditStore.setDown + }, + { + type: 'divider', + key: 'd2' + }, + { + label: '清空剪贴板', + key: MenuEnum.CLEAR, + icon: renderIcon(PaintBrushIcon), + fnHandle: chartEditStore.setRecordChart + }, + { + label: '删除', + key: MenuEnum.DELETE, + icon: renderIcon(TrashIcon), + fnHandle: chartEditStore.removeComponentList + } +] + +// * 默认多选组件选项 +export const defaultMultiSelectOptions: MenuOptionsItemType[] = [ + { + label: '创建分组', + key: MenuEnum.GROUP, + icon: renderIcon(Carbon3DSoftwareIcon), + fnHandle: chartEditStore.setGroup + }, + { + label: '解除分组', + key: MenuEnum.UN_GROUP, + icon: renderIcon(Carbon3DCursorIcon), + fnHandle: chartEditStore.setUnGroup + } +] + +// * 无数据传递拥有的选项 +const defaultNoItemKeys = [MenuEnum.PARSE, MenuEnum.CLEAR] + +/** + * * 挑选选项 + * @param options + * @param pickList + * @returns + */ +const pickOption = (options: MenuOptionsItemType[], pickList?: MenuEnum[]) => { + if (!pickList) return options + const list: MenuOptionsItemType[] = [] + pickList.forEach(e => { + list.push(...options.filter(op => op.key === e)) + }) + return list +} + +/** + * * 去除选项 + * @param options + * @param hideList + * @returns + */ +const hideOption = (options: MenuOptionsItemType[], hideList?: MenuEnum[]) => { + if (!hideList) return options + return options.filter((op: MenuOptionsItemType) => { + return hideList.findIndex((e: MenuEnum) => e !== op.key) !== -1 + }) +} + +// * 右键内容 +const menuOptions = ref([]) + +// * 右键处理 +const handleContextMenu = ( + e: MouseEvent, + // 右键对象 + targetInstance?: CreateComponentType | CreateComponentGroupType, + // 判断函数 + optionsHandle?: Function, + // 隐藏选项列表 + hideOptionsList?: MenuEnum[], + // 挑选选项列表 + pickOptionsList?: MenuEnum[] +) => { + e.stopPropagation() + e.preventDefault() + + let target = e.target + while (target instanceof SVGElement) { + target = target.parentNode + } + + chartEditStore.setTargetSelectChart(targetInstance && targetInstance.id) + + // 隐藏旧列表 + chartEditStore.setRightMenuShow(false) + + // * 多选默认选项 + if (chartEditStore.getTargetChart.selectId.length > 1) { + menuOptions.value = defaultMultiSelectOptions + } else { + // * 单选默认选项 + menuOptions.value = defaultOptions + } + + if (!targetInstance) { + menuOptions.value = pickOption(toRaw(menuOptions.value), defaultNoItemKeys) + } + if (hideOptionsList) { + menuOptions.value = hideOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], hideOptionsList) + } + if (pickOptionsList) { + menuOptions.value = pickOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], pickOptionsList) + } + if (optionsHandle) { + // 自定义函数能够拿到当前选项和所有选项 + menuOptions.value = optionsHandle( + cloneDeep(toRaw(menuOptions.value)), + [...defaultMultiSelectOptions, ...defaultOptions], + targetInstance + ) + } + nextTick().then(() => { + chartEditStore.setMousePosition(e.clientX, e.clientY) + chartEditStore.setRightMenuShow(true) + }) +} + +/** + * * 右键hook + * @param menuConfig + * @returns + */ +export const useContextMenu = () => { + // 设置默认项 + menuOptions.value = defaultOptions + + // * 失焦 + const onClickOutSide = () => { + chartEditStore.setRightMenuShow(false) + } + + // * 事件处理 + const handleMenuSelect = (key: string) => { + chartEditStore.setRightMenuShow(false) + const targetItem: MenuOptionsItemType[] = menuOptions.value.filter((e: MenuOptionsItemType) => e.key === key) + + menuOptions.value.forEach((e: MenuOptionsItemType) => { + if (e.key === key) { + if (e.fnHandle) { + e.fnHandle() + return + } + if (!targetItem) loadingError() + } + }) + } + + return { + menuOptions, + defaultOptions, + defaultMultiSelectOptions, + handleContextMenu, + onClickOutSide, + handleMenuSelect, + mousePosition: chartEditStore.getMousePosition + } +} diff --git a/grailed-ui-go-view/src/views/chart/hooks/useKeyboard.hook.ts b/grailed-ui-go-view/src/views/chart/hooks/useKeyboard.hook.ts new file mode 100644 index 0000000..9cef8c6 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/hooks/useKeyboard.hook.ts @@ -0,0 +1,251 @@ +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { useSync } from './useSync.hook' +import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum' +import throttle from 'lodash/throttle' +import debounce from 'lodash/debounce' +import keymaster from 'keymaster' +import { setKeyboardDressShow } from '@/utils' + +// Keymaster可以支持识别以下组合键: ⇧,shift,option,⌥,alt,ctrl,control,command,和⌘ +const chartEditStore = useChartEditStore() +const useSyncIns = useSync() +const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}` +const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}` +const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}` + +export const winKeyboardValue = { + [MenuEnum.ARROW_UP]: winCtrlMerge('up'), + [MenuEnum.ARROW_RIGHT]: winCtrlMerge('right'), + [MenuEnum.ARROW_DOWN]: winCtrlMerge('down'), + [MenuEnum.ARROW_LEFT]: winCtrlMerge('left'), + [MenuEnum.COPY]: winCtrlMerge('c'), + [MenuEnum.CUT]: winCtrlMerge('x'), + [MenuEnum.PARSE]: winCtrlMerge('v'), + [MenuEnum.DELETE]: 'delete', + [MenuEnum.BACK]: winCtrlMerge('z'), + [MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')), + [MenuEnum.SAVE]: winCtrlMerge('s'), + [MenuEnum.GROUP]: winCtrlMerge('g'), + [MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')), + [MenuEnum.LOCK]: winCtrlMerge('l'), + [MenuEnum.UNLOCK]: winCtrlMerge(winShiftMerge('l')), + [MenuEnum.HIDE]: winCtrlMerge('h'), + [MenuEnum.SHOW]: winCtrlMerge(winShiftMerge('h')) +} + +// 这个 Ctrl 后面还是换成了 ⌘ +const macCtrlMerge = (e: string) => `${MacKeyboard.CTRL}+${e}` +const macShiftMerge = (e: string) => `${MacKeyboard.SHIFT}+${e}` +const macAltMerge = (e: string) => `${MacKeyboard.ALT}+${e}` + +// 没有测试 macOS 系统,因为我没有😤👻 +export const macKeyboardValue = { + [MenuEnum.ARROW_UP]: macCtrlMerge('arrowup'), + [MenuEnum.ARROW_RIGHT]: macCtrlMerge('arrowright'), + [MenuEnum.ARROW_DOWN]: macCtrlMerge('arrowdown'), + [MenuEnum.ARROW_LEFT]: macCtrlMerge('arrowleft'), + [MenuEnum.COPY]: macCtrlMerge('c'), + [MenuEnum.CUT]: macCtrlMerge('x'), + [MenuEnum.PARSE]: macCtrlMerge('v'), + [MenuEnum.DELETE]: macCtrlMerge('backspace'), + [MenuEnum.BACK]: macCtrlMerge('z'), + [MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')), + [MenuEnum.SAVE]: macCtrlMerge('s'), + [MenuEnum.GROUP]: macCtrlMerge('g'), + [MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')), + [MenuEnum.LOCK]: macCtrlMerge('l'), + [MenuEnum.UNLOCK]: macCtrlMerge(macShiftMerge('l')), + [MenuEnum.HIDE]: macCtrlMerge('h'), + [MenuEnum.SHOW]: macCtrlMerge(macShiftMerge('h')) +} + +// Win 快捷键列表 +const winKeyList: Array = [ + winKeyboardValue.up, + winKeyboardValue.right, + winKeyboardValue.down, + winKeyboardValue.left, + + winKeyboardValue.delete, + winKeyboardValue.copy, + winKeyboardValue.cut, + winKeyboardValue.parse, + + winKeyboardValue.back, + winKeyboardValue.forward, + + winKeyboardValue.save, + winKeyboardValue.group, + winKeyboardValue.unGroup, + + winKeyboardValue.lock, + winKeyboardValue.unLock, + + winKeyboardValue.hide, + winKeyboardValue.show +] + +// Mac 快捷键列表 +const macKeyList: Array = [ + macKeyboardValue.up, + macKeyboardValue.right, + macKeyboardValue.down, + macKeyboardValue.left, + + macKeyboardValue.delete, + macKeyboardValue.copy, + macKeyboardValue.cut, + macKeyboardValue.parse, + + macKeyboardValue.back, + macKeyboardValue.forward, + + macKeyboardValue.save, + macKeyboardValue.group, + macKeyboardValue.unGroup, + + macKeyboardValue.lock, + macKeyboardValue.unLock, + + macKeyboardValue.hide, + macKeyboardValue.show +] + +// 处理键盘记录 +const keyRecordHandle = () => { + // 默认赋值 + window.$KeyboardActive = { + ctrl: false, + space: false + } + + document.onkeydown = (e: KeyboardEvent) => { + const { keyCode } = e + if (keyCode == 32 && e.target == document.body) e.preventDefault() + + if ([17, 32].includes(keyCode) && window.$KeyboardActive) { + setKeyboardDressShow(e.keyCode) + switch (keyCode) { + case 17: window.$KeyboardActive.ctrl = true; break + case 32: window.$KeyboardActive.space = true; break + } + } + } + + document.onkeyup = (e: KeyboardEvent) => { + const { keyCode } = e + if (keyCode == 32 && e.target == document.body) e.preventDefault() + + if ([17, 32].includes(keyCode) && window.$KeyboardActive) { + setKeyboardDressShow() + switch (keyCode) { + case 17: window.$KeyboardActive.ctrl = false; break + case 32: window.$KeyboardActive.space = false; break + } + } + } +} + +// 初始化监听事件 +export const useAddKeyboard = () => { + const throttleTime = 50 + const switchHandle = (keyboardValue: typeof winKeyboardValue, e: string) => { + switch (e) { + // ct+↑ + case keyboardValue.up: + keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_UP); return false }, throttleTime)) + break; + // ct+→ + case keyboardValue.right: + keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_RIGHT); return false }, throttleTime)) + break; + // ct+↓ + case keyboardValue.down: + keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_DOWN); return false }, throttleTime)) + break; + // ct+← + case keyboardValue.left: + keymaster(e, throttle(() => { chartEditStore.setMove(MenuEnum.ARROW_LEFT); return false }, throttleTime)) + break; + + // 删除 delete + case keyboardValue.delete: + keymaster(e, debounce(() => { chartEditStore.removeComponentList(); return false }, throttleTime)) + break; + // 复制 ct+v + case keyboardValue.copy: + keymaster(e, debounce(() => { chartEditStore.setCopy(); return false }, throttleTime)) + break; + // 剪切 ct+x + case keyboardValue.cut: + keymaster(e, debounce(() => { chartEditStore.setCut(); return false }, throttleTime)) + break; + // 粘贴 ct+v + case keyboardValue.parse: + keymaster(e, throttle(() => { chartEditStore.setParse(); return false }, throttleTime)) + break; + + // 撤回 ct+z + case keyboardValue.back: + keymaster(e, throttle(() => { chartEditStore.setBack(); return false }, throttleTime)) + break; + // 前进 ct+sh+z + case keyboardValue.forward: + keymaster(e, throttle(() => { chartEditStore.setForward(); return false }, throttleTime)) + break; + + // 创建分组 ct+g + case keyboardValue.group: + keymaster(e, throttle(() => { chartEditStore.setGroup(); return false }, throttleTime)) + break; + // 解除分组 ct+sh+g + case keyboardValue.unGroup: + keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime)) + break; + + // 锁定 ct+l + case keyboardValue.lock: + keymaster(e, throttle(() => { chartEditStore.setLock(); return false }, throttleTime)) + break; + // 解除锁定 ct+sh+l + case keyboardValue.unLock: + keymaster(e, throttle(() => { chartEditStore.setUnLock(); return false }, throttleTime)) + break; + + // 隐藏 ct+h + case keyboardValue.hide: + keymaster(e, throttle(() => { chartEditStore.setHide(); return false }, throttleTime)) + break; + // 解除隐藏 ct+sh+h + case keyboardValue.show: + keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime)) + break; + + // 保存 ct+s + case keyboardValue.save: + keymaster(e, throttle(() => { useSyncIns.dataSyncUpdate(); return false }, 200)) + break; + } + } + winKeyList.forEach((key: string) => { + switchHandle(winKeyboardValue, key) + }) + macKeyList.forEach((key: string) => { + switchHandle(macKeyboardValue, key) + }) + + keyRecordHandle() +} + +// 卸载监听事件 +export const useRemoveKeyboard = () => { + document.onkeydown = () => {}; + document.onkeyup = () => {}; + + winKeyList.forEach((key: string) => { + keymaster.unbind(key) + }) + macKeyList.forEach((key: string) => { + keymaster.unbind(key) + }) +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/chart/hooks/useSync.hook.ts b/grailed-ui-go-view/src/views/chart/hooks/useSync.hook.ts new file mode 100644 index 0000000..ddb560d --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/hooks/useSync.hook.ts @@ -0,0 +1,348 @@ +import { onUnmounted } from 'vue'; +import html2canvas from 'html2canvas' +import { getUUID, httpErrorHandle, fetchRouteParamsLocation, base64toFile, JSONStringify, JSONParse } from '@/utils' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d' +import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' +import { StylesSetting } from '@/components/Pages/ChartItemSetting' +import { useSystemStore } from '@/store/modules/systemStore/systemStore' +import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' +import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' +import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index' +import { saveInterval } from '@/settings/designSetting' +import throttle from 'lodash/throttle' +// 接口状态 +import { ResultEnum } from '@/enums/httpEnum' +// 接口 +import { saveProjectApi, fetchProjectApi, uploadFile, updateProjectApi } from '@/api/path' +// 画布枚举 +import { SyncEnum } from '@/enums/editPageEnum' +import { CreateComponentType, CreateComponentGroupType, ConfigType } from '@/packages/index.d' +import { BaseEvent, EventLife } from '@/enums/eventEnum' +import { PublicGroupConfigClass } from '@/packages/public/publicConfig' +import merge from 'lodash/merge' + +/** + * * 画布-版本升级对旧数据无法兼容的补丁 + * @param object + */ +const canvasVersionUpdatePolyfill = (object: any) => { + return object +} + +/** + * * 组件-版本升级对旧数据无法兼容的补丁 + * @param newObject + * @param sources + */ +const componentVersionUpdatePolyfill = (newObject: any, sources: any) => { + try { + // 判断是否是组件 + if (sources.id) { + // 处理事件补丁 + const hasVnodeBeforeMount = 'vnodeBeforeMount' in sources.events + const hasVnodeMounted = 'vnodeMounted' in sources.events + + if (hasVnodeBeforeMount) { + newObject.events.advancedEvents.vnodeBeforeMount = sources?.events.vnodeBeforeMount + } + if (hasVnodeMounted) { + newObject.events.advancedEvents.vnodeMounted = sources?.events.vnodeMounted + } + if (hasVnodeBeforeMount || hasVnodeMounted) { + sources.events = { + baseEvent: { + [BaseEvent.ON_CLICK]: undefined, + [BaseEvent.ON_DBL_CLICK]: undefined, + [BaseEvent.ON_MOUSE_ENTER]: undefined, + [BaseEvent.ON_MOUSE_LEAVE]: undefined + }, + advancedEvents: { + [EventLife.VNODE_MOUNTED]: undefined, + [EventLife.VNODE_BEFORE_MOUNT]: undefined + } + } + } + return newObject + } + } catch (error) { + return newObject + } +} + +/** + * * 合并处理 + * @param newObject 新的模板数据 + * @param sources 新拿到的数据 + * @returns object + */ +const componentMerge = (newObject: any, sources: any, notComponent = false) => { + // 处理组件补丁 + componentVersionUpdatePolyfill(newObject, sources) + + // 非组件不处理 + if (notComponent) return merge(newObject, sources) + // 组件排除 newObject + const option = sources.option + if (!option) return merge(newObject, sources) + + // 为 undefined 的 sources 来源对象属性将被跳过详见 https://www.lodashjs.com/docs/lodash.merge + sources.option = undefined + if (option) { + return { + ...merge(newObject, sources), + option: option + } + } +} + +// 请求处理 +export const useSync = () => { + const chartEditStore = useChartEditStore() + const chartHistoryStore = useChartHistoryStore() + const systemStore = useSystemStore() + const chartLayoutStore = useChartLayoutStore() + /** + * * 组件动态注册 + * @param projectData 项目数据 + * @param isReplace 是否替换数据 + * @returns + */ + const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => { + if (isReplace) { + // 清除列表 + chartEditStore.componentList = [] + // 清除历史记录 + chartHistoryStore.clearBackStack() + chartHistoryStore.clearForwardStack() + } + // 画布补丁处理 + projectData.editCanvasConfig = canvasVersionUpdatePolyfill(projectData.editCanvasConfig) + + // 列表组件注册 + projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => { + const intComponent = (target: CreateComponentType) => { + if (!window['$vue'].component(target.chartConfig.chartKey)) { + window['$vue'].component(target.chartConfig.chartKey, fetchChartComponent(target.chartConfig)) + window['$vue'].component(target.chartConfig.conKey, fetchConfigComponent(target.chartConfig)) + } + } + + if (e.isGroup) { + (e as CreateComponentGroupType).groupList.forEach(groupItem => { + intComponent(groupItem) + }) + } else { + intComponent(e as CreateComponentType) + } + }) + + // 创建函数-重新创建是为了处理类种方法消失的问题 + const create = async ( + _componentInstance: CreateComponentType, + callBack?: (componentInstance: CreateComponentType) => void + ) => { + // 补充 class 上的方法 + let newComponent: CreateComponentType = await createComponent(_componentInstance.chartConfig) + if (callBack) { + if (changeId) { + callBack(componentMerge(newComponent, { ..._componentInstance, id: getUUID() })) + } else { + callBack(componentMerge(newComponent, _componentInstance)) + } + } else { + if (changeId) { + chartEditStore.addComponentList( + componentMerge(newComponent, { ..._componentInstance, id: getUUID() }), + false, + true + ) + } else { + chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, true) + } + } + } + + // 数据赋值 + for (const key in projectData) { + // 组件 + if (key === ChartEditStoreEnum.COMPONENT_LIST) { + let loadIndex = 0 + const listLength = projectData[key].length; + for (const comItem of projectData[key]) { + // 设置加载数量 + let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString()) + chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, percentage) + // 判断类型 + if (comItem.isGroup) { + // 创建分组 + let groupClass = new PublicGroupConfigClass() + if (changeId) { + groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() }) + } else { + groupClass = componentMerge(groupClass, comItem) + } + + // 异步注册子应用 + const targetList: CreateComponentType[] = [] + for (const groupItem of (comItem as CreateComponentGroupType).groupList) { + await create(groupItem, e => { + targetList.push(e) + }) + } + groupClass.groupList = targetList + + // 分组插入到列表 + chartEditStore.addComponentList(groupClass, false, true) + } else { + await create(comItem as CreateComponentType) + } + } + } else { + // 非组件(顺便排除脏数据) + if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return + componentMerge(chartEditStore[key], projectData[key], true) + } + } + + // 清除数量 + chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0) + } + + /** + * * 赋值全局数据 + * @param projectData 项目数据 + * @returns + */ + const updateStoreInfo = (projectData: { + id: string, + name: string, + picUrl: string, + remark: string, + status: number + }) => { + const { id, name, remark, picUrl, status } = projectData + // ID + chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, id) + // 名称 + chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, name) + // 描述 + chartEditStore.setProjectInfo(ProjectInfoEnum.REMARKS, remark) + // 缩略图 + chartEditStore.setProjectInfo(ProjectInfoEnum.THUMBNAIL, picUrl) + // 发布 + chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, status === 0) + } + + // * 数据获取 + const dataSyncFetch = async () => { + // FIX:重新执行dataSyncFetch需清空chartEditStore.componentList,否则会导致图层重复 + // 切换语言等操作会导致重新执行 dataSyncFetch,此时pinia中并未清空chartEditStore.componentList,导致图层重复 + chartEditStore.componentList = [] + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START) + try { + const res = await fetchProjectApi({ id: fetchRouteParamsLocation() }) + if (res && res.code === ResultEnum.SUCCESS) { + if (res.data) { + updateStoreInfo(res.data) + // 更新全局数据 + if (res.data.content) { + await updateComponent(JSONParse(res.data.content)) + } + return + }else { + chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, fetchRouteParamsLocation()) + } + setTimeout(() => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS) + }, 1000) + return + } + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) + } catch (error) { + console.log(error) + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) + httpErrorHandle() + } + } + + // * 数据保存 + const dataSyncUpdate = throttle(async (updateImg = true) => { + if(!fetchRouteParamsLocation()) return + + let projectId = chartEditStore.getProjectInfo[ProjectInfoEnum.PROJECT_ID]; + if(projectId === null || projectId === ''){ + window['$message'].error('数据初未始化成功,请刷新页面!') + return + } + + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START) + + // 异常处理:缩略图上传失败不影响JSON的保存 + try { + if (updateImg) { + // 获取缩略图片 + const range = document.querySelector('.go-edit-range') as HTMLElement + // 生成图片 + const canvasImage: HTMLCanvasElement = await html2canvas(range, { + backgroundColor: null, + allowTaint: true, + useCORS: true + }) + + // 上传预览图 + let uploadParams = new FormData() + uploadParams.append('file', + base64toFile(canvasImage.toDataURL(), + `go-view/${fetchRouteParamsLocation()}_index_preview.png`)) // 名字使用 go-view 作为前缀 + const uploadRes = await uploadFile(uploadParams) + // 保存预览图 + if(uploadRes && uploadRes.code === ResultEnum.SUCCESS) { + await updateProjectApi({ + id: fetchRouteParamsLocation(), + picUrl: uploadRes.data + }) + } + } + } catch (e) { + console.log(e) + } + + // 保存数据 + const res = await saveProjectApi({ + id: projectId, + content: JSONStringify(chartEditStore.getStorageInfo || {}) + }) + + if (res && res.code === ResultEnum.SUCCESS) { + // 成功状态 + setTimeout(() => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS) + }, 1000) + return + } + // 失败状态 + chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) + }, 3000) + + // * 定时处理 + const intervalDataSyncUpdate = () => { + // 定时获取数据 + const syncTiming = setInterval(() => { + dataSyncUpdate() + }, saveInterval * 1000) + + // 销毁 + onUnmounted(() => { + clearInterval(syncTiming) + }) + } + + return { + updateComponent, + updateStoreInfo, + dataSyncFetch, + dataSyncUpdate, + intervalDataSyncUpdate + } +} diff --git a/grailed-ui-go-view/src/views/chart/index.vue b/grailed-ui-go-view/src/views/chart/index.vue new file mode 100644 index 0000000..89c60d9 --- /dev/null +++ b/grailed-ui-go-view/src/views/chart/index.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/edit/index.vue b/grailed-ui-go-view/src/views/edit/index.vue new file mode 100644 index 0000000..f59d497 --- /dev/null +++ b/grailed-ui-go-view/src/views/edit/index.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/exception/403.vue b/grailed-ui-go-view/src/views/exception/403.vue new file mode 100644 index 0000000..8f973b2 --- /dev/null +++ b/grailed-ui-go-view/src/views/exception/403.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/exception/404.vue b/grailed-ui-go-view/src/views/exception/404.vue new file mode 100644 index 0000000..d6e0a82 --- /dev/null +++ b/grailed-ui-go-view/src/views/exception/404.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/exception/500.vue b/grailed-ui-go-view/src/views/exception/500.vue new file mode 100644 index 0000000..363bb58 --- /dev/null +++ b/grailed-ui-go-view/src/views/exception/500.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/login/index.vue b/grailed-ui-go-view/src/views/login/index.vue new file mode 100644 index 0000000..a5ec9f8 --- /dev/null +++ b/grailed-ui-go-view/src/views/login/index.vue @@ -0,0 +1,432 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.ts b/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.ts new file mode 100644 index 0000000..5d5a652 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.ts @@ -0,0 +1,3 @@ +import PreviewRenderGroup from './index.vue' + +export { PreviewRenderGroup } diff --git a/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.vue b/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.vue new file mode 100644 index 0000000..e6e22d9 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/components/PreviewRenderGroup/index.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.ts b/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.ts new file mode 100644 index 0000000..5dacecd --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.ts @@ -0,0 +1,3 @@ +import PreviewRenderList from './index.vue' + +export { PreviewRenderList } diff --git a/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.vue b/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.vue new file mode 100644 index 0000000..ee5ea39 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/components/PreviewRenderList/index.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/preview/hooks/useComInstall.hook.ts b/grailed-ui-go-view/src/views/preview/hooks/useComInstall.hook.ts new file mode 100644 index 0000000..a11e8bf --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/hooks/useComInstall.hook.ts @@ -0,0 +1,36 @@ +import { ref } from 'vue' +import { ChartEditStorageType } from '../index.d' +import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' +import { fetchChartComponent } from '@/packages/index' + +export const useComInstall = (localStorageInfo: ChartEditStorageType) => { + const show = ref(false) + + // 注册组件(一开始无法获取window['$vue']) + const intervalTiming = setInterval(() => { + if (window['$vue']?.component) { + clearInterval(intervalTiming) + + const intComponent = (target: CreateComponentType) => { + if (!window['$vue'].component(target.chartConfig.chartKey)) { + window['$vue'].component(target.chartConfig.chartKey, fetchChartComponent(target.chartConfig)) + } + } + + localStorageInfo.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => { + if (e.isGroup) { + (e as CreateComponentGroupType).groupList.forEach(groupItem => { + intComponent(groupItem) + }) + } else { + intComponent(e as CreateComponentType) + } + }) + show.value = true + } + }, 200) + + return { + show + } +} diff --git a/grailed-ui-go-view/src/views/preview/hooks/useScale.hook.ts b/grailed-ui-go-view/src/views/preview/hooks/useScale.hook.ts new file mode 100644 index 0000000..202aaf0 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/hooks/useScale.hook.ts @@ -0,0 +1,87 @@ +import { ref, onMounted, onUnmounted} from 'vue' +import { usePreviewFitScale, usePreviewScrollYScale, usePreviewScrollXScale, usePreviewFullScale } from '@/hooks/index' +import type { ChartEditStorageType } from '../index.d' +import { PreviewScaleEnum } from '@/enums/styleEnum' + +export const useScale = (localStorageInfo: ChartEditStorageType) => { + + const entityRef = ref() + const previewRef = ref() + const width = ref(localStorageInfo.editCanvasConfig.width) + const height = ref(localStorageInfo.editCanvasConfig.height) + + // 屏幕适配 + onMounted(() => { + switch (localStorageInfo.editCanvasConfig.previewScaleType) { + case PreviewScaleEnum.FIT: (() => { + const { calcRate, windowResize, unWindowResize } = usePreviewFitScale( + width.value as number, + height.value as number, + previewRef.value, + ) + calcRate() + windowResize() + onUnmounted(() => { + unWindowResize() + }) + })() + break; + case PreviewScaleEnum.SCROLL_Y: (() => { + const { calcRate, windowResize, unWindowResize } = usePreviewScrollYScale( + width.value as number, + height.value as number, + previewRef.value, + (scale) => { + const dom = entityRef.value + dom.style.width = `${width.value * scale.width}px` + dom.style.height = `${height.value * scale.height}px` + } + ) + calcRate() + windowResize() + onUnmounted(() => { + unWindowResize() + }) + })() + + break; + case PreviewScaleEnum.SCROLL_X: (() => { + const { calcRate, windowResize, unWindowResize } = usePreviewScrollXScale( + width.value as number, + height.value as number, + previewRef.value, + (scale) => { + const dom = entityRef.value + dom.style.width = `${width.value * scale.width}px` + dom.style.height = `${height.value * scale.height}px` + } + ) + calcRate() + windowResize() + onUnmounted(() => { + unWindowResize() + }) + })() + + break; + case PreviewScaleEnum.FULL: (() => { + const { calcRate, windowResize, unWindowResize } = usePreviewFullScale( + width.value as number, + height.value as number, + previewRef.value, + ) + calcRate() + windowResize() + onUnmounted(() => { + unWindowResize() + }) + })() + break; + } + }) + + return { + entityRef, + previewRef + } +} diff --git a/grailed-ui-go-view/src/views/preview/hooks/useStore.hook.ts b/grailed-ui-go-view/src/views/preview/hooks/useStore.hook.ts new file mode 100644 index 0000000..06bed69 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/hooks/useStore.hook.ts @@ -0,0 +1,9 @@ +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { ChartEditStoreEnum } from '@/store/modules/chartEditStore/chartEditStore.d' +import type { ChartEditStorageType } from '../index.d' + +// store 相关 +export const useStore = (localStorageInfo: ChartEditStorageType) => { + const chartEditStore = useChartEditStore() + chartEditStore.requestGlobalConfig = localStorageInfo[ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG] +} diff --git a/grailed-ui-go-view/src/views/preview/index.d.ts b/grailed-ui-go-view/src/views/preview/index.d.ts new file mode 100644 index 0000000..0dfbe7c --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/index.d.ts @@ -0,0 +1,6 @@ +import { ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d' + +export interface ChartEditStorageType extends ChartEditStorage { + id: string, + isRelease?: boolean +} \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/preview/index.vue b/grailed-ui-go-view/src/views/preview/index.vue new file mode 100644 index 0000000..4e6bc66 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/grailed-ui-go-view/src/views/preview/suspenseIndex.vue b/grailed-ui-go-view/src/views/preview/suspenseIndex.vue new file mode 100644 index 0000000..ec10e36 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/suspenseIndex.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/preview/utils/index.ts b/grailed-ui-go-view/src/views/preview/utils/index.ts new file mode 100644 index 0000000..f0f79cf --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/utils/index.ts @@ -0,0 +1,2 @@ +export * from './style' +export * from './storage' \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/preview/utils/storage.ts b/grailed-ui-go-view/src/views/preview/utils/storage.ts new file mode 100644 index 0000000..5db0609 --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/utils/storage.ts @@ -0,0 +1,38 @@ +import { getSessionStorage, fetchRouteParamsLocation, httpErrorHandle, JSONParse } from '@/utils' +import { ResultEnum } from '@/enums/httpEnum' +import { StorageEnum } from '@/enums/storageEnum' +import { ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d' +import { fetchProjectApi } from '@/api/path' + +export interface ChartEditStorageType extends ChartEditStorage { + id: string +} + +// 根据路由 id 获取存储数据的信息 +export const getSessionStorageInfo = async () => { + const id = fetchRouteParamsLocation() + const storageList: ChartEditStorageType[] = getSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST) + + // 是否本地预览 + if (!storageList || storageList.findIndex(e => e.id === id.toString()) === -1) { + // 接口调用 + const res = await fetchProjectApi({ id: id }) + if (res && res.code === ResultEnum.SUCCESS) { + const { content, status } = res.data + if (status === 1) { + // 跳转未发布页 + return { isRelease: false } + } + return { ...JSONParse(content), id } + } else { + httpErrorHandle() + } + } else { + // 本地读取 + for (let i = 0; i < storageList.length; i++) { + if (id.toString() === storageList[i]['id']) { + return storageList[i] + } + } + } +} diff --git a/grailed-ui-go-view/src/views/preview/utils/style.ts b/grailed-ui-go-view/src/views/preview/utils/style.ts new file mode 100644 index 0000000..6cd25cb --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/utils/style.ts @@ -0,0 +1,46 @@ +import { PickCreateComponentType } from '@/packages/index.d' +import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' + +type AttrType = PickCreateComponentType<'attr'> +type StatusType = PickCreateComponentType<'status'> + +// 设置位置 +export const getComponentAttrStyle = (attr: AttrType, index: number) => { + const componentStyle = { + zIndex: index + 1, + left: `${attr.x}px`, + top: `${attr.y}px` + } + return componentStyle +} + +// 设置大小 +export const getSizeStyle = (attr: AttrType, scale?: number) => { + return { + width: `${scale ? scale * attr.w : attr.w}px`, + height: `${scale ? scale * attr.h : attr.h}px` + } +} + +// 设置状态样式 +export const getStatusStyle = (attr: StatusType) => { + return { + display: attr.hide ? 'none' : 'block' + } +} + +// 全局样式 +export const getEditCanvasConfigStyle = (canvas: EditCanvasConfigType) => { + // 背景 + const computedBackground = canvas.selectColor + ? { background: canvas.background } + : { + background: `url(${canvas.backgroundImage}) center center / cover no-repeat !important` + } + return { + position: 'relative' as const, + width: canvas.width ? `${canvas.width || 100}px` : '100%', + height: canvas.height ? `${canvas.height}px` : '100%', + ...computedBackground + } +} diff --git a/grailed-ui-go-view/src/views/preview/wrapper.vue b/grailed-ui-go-view/src/views/preview/wrapper.vue new file mode 100644 index 0000000..86abc6b --- /dev/null +++ b/grailed-ui-go-view/src/views/preview/wrapper.vue @@ -0,0 +1,25 @@ + + + diff --git a/grailed-ui-go-view/src/views/project/index.vue b/grailed-ui-go-view/src/views/project/index.vue new file mode 100644 index 0000000..535899b --- /dev/null +++ b/grailed-ui-go-view/src/views/project/index.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.ts b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.ts new file mode 100644 index 0000000..304ac60 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.ts @@ -0,0 +1,3 @@ +import ProjectItemsCard from './index.vue' + +export { ProjectItemsCard } diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.vue b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.vue new file mode 100644 index 0000000..bc79edc --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsCard/index.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useData.hook.ts b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useData.hook.ts new file mode 100644 index 0000000..aad90d1 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useData.hook.ts @@ -0,0 +1,124 @@ +import { ref, reactive } from 'vue' +import { formatDate, goDialog, httpErrorHandle } from '@/utils' +import { DialogEnum } from '@/enums/pluginEnum' +import { projectListApi, deleteProjectApi, changeProjectReleaseApi } from '@/api/path' +import { Chartype, ChartList } from '../../../index.d' +import { ResultEnum } from '@/enums/httpEnum' + +// 数据初始化 +export const useDataListInit = () => { + const loading = ref(true) + + const paginat = reactive({ + // 当前页数 + page: 1, + // 每页值 + limit: 12, + // 总数 + count: 10 + }) + + const list = ref([]) + + // 数据请求 + const fetchList = async () => { + loading.value = true + const res = await projectListApi({ + pageNo: paginat.page, + pageSize: paginat.limit + }) + if (res && res.data) { + paginat.count = res.data.count + const projects = res.data.list + list.value = projects.map(e => { + const { id, name, status, createTime, picUrl, creator } = e + return { + id: id, + title: name, + createId: creator, + time: formatDate(new Date(createTime), 'YYY-mm-dd HH:MM:SS'), + image: picUrl, + release: status === 0 + } + }) + setTimeout(() => { + loading.value = false + }, 500) + return + } + httpErrorHandle() + } + + // 修改页数 + const changePage = (_page: number) => { + paginat.page = _page + fetchList() + } + + // 修改大小 + const changeSize = (_size: number) => { + paginat.limit = _size + fetchList() + } + + // 删除处理 + const deleteHandle = (cardData: Chartype) => { + goDialog({ + type: DialogEnum.DELETE, + promise: true, + onPositiveCallback: () => + new Promise(res => { + res( + deleteProjectApi({ + id: cardData.id + }) + ) + }), + promiseResCallback: (res: any) => { + if (res.code === ResultEnum.SUCCESS) { + window['$message'].success(window['$t']('global.r_delete_success')) + fetchList() + return + } + httpErrorHandle() + } + }) + } + + // 发布处理 + const releaseHandle = async (cardData: Chartype, index: number) => { + const { id, release } = cardData + const res = await changeProjectReleaseApi({ + id: id, + // 反过来 + status: !release ? 0 : 1 + }) + if (res && res.code === ResultEnum.SUCCESS) { + list.value = [] + fetchList() + // 发布 -> 未发布 + if (release) { + window['$message'].success(window['$t']('global.r_unpublish_success')) + return + } + // 未发布 -> 发布 + window['$message'].success(window['$t']('global.r_publish_success')) + return + } + httpErrorHandle() + } + + // 立即请求 + fetchList() + + return { + loading, + paginat, + list, + fetchList, + releaseHandle, + changeSize, + changePage, + deleteHandle + } +} diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useModal.hook.ts b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useModal.hook.ts new file mode 100644 index 0000000..e28b1f9 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/hooks/useModal.hook.ts @@ -0,0 +1,42 @@ +import { ref } from 'vue' +import { ChartEnum } from '@/enums/pageEnum' +import { fetchPathByName, routerTurnByPath, openNewWindow, previewPath } from '@/utils' +import { Chartype } from '../../../index.d' +export const useModalDataInit = () => { + const modalShow = ref(false) + const modalData = ref(null) + + // 关闭 modal + const closeModal = () => { + modalShow.value = false + modalData.value = null + } + + // 缩放处理 + const resizeHandle = (cardData: Chartype) => { + if (!cardData) return + modalShow.value = true + modalData.value = cardData + } + + // 编辑处理 + const editHandle = (cardData: Chartype) => { + if (!cardData) return + const path = fetchPathByName(ChartEnum.CHART_HOME_NAME, 'href') + routerTurnByPath(path, [cardData.id], undefined, true) + } + + // 预览处理 + const previewHandle = (cardData: Chartype) => { + openNewWindow(previewPath(cardData.id)) + } + + return { + modalData, + modalShow, + closeModal, + resizeHandle, + editHandle, + previewHandle + } +} diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.ts b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.ts new file mode 100644 index 0000000..f4b5290 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.ts @@ -0,0 +1,3 @@ +import ProjectItemsList from './index.vue' + +export { ProjectItemsList } diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.vue b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.vue new file mode 100644 index 0000000..81aea4d --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsList/index.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.ts b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.ts new file mode 100644 index 0000000..d5b8a58 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.ts @@ -0,0 +1,3 @@ +import ProjectItemsModalCard from './index.vue' + +export { ProjectItemsModalCard } diff --git a/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.vue b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.vue new file mode 100644 index 0000000..1916462 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/components/ProjectItemsModalCard/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/items/index.d.ts b/grailed-ui-go-view/src/views/project/items/index.d.ts new file mode 100644 index 0000000..b0be038 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/index.d.ts @@ -0,0 +1,11 @@ +export type Chartype = { + id: number | string + title: string // 标题 + label?: string // 标签 + time: string, // 时间 + image: string, // 预览图地址 + createId: string, // 创建者 + release: boolean // false 未发布 | true 已发布 +} + +export type ChartList = Chartype[] \ No newline at end of file diff --git a/grailed-ui-go-view/src/views/project/items/index.vue b/grailed-ui-go-view/src/views/project/items/index.vue new file mode 100644 index 0000000..78b79c1 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/items/index.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.ts b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.ts new file mode 100644 index 0000000..6032c13 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.ts @@ -0,0 +1,3 @@ +import ProjectLayoutAsideFooter from './index.vue' + +export { ProjectLayoutAsideFooter } diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.vue b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.vue new file mode 100644 index 0000000..731796c --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutAsideFooter/index.vue @@ -0,0 +1,77 @@ + + + + diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.ts b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.ts new file mode 100644 index 0000000..6d5e114 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.ts @@ -0,0 +1,3 @@ +import CreateModal from './index.vue' + +export { CreateModal } diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.vue b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.vue new file mode 100644 index 0000000..2dcc5c0 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/components/CreateModal/index.vue @@ -0,0 +1,138 @@ + + + + diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.ts b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.ts new file mode 100644 index 0000000..d732e52 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.ts @@ -0,0 +1,3 @@ +import ProjectLayoutCreate from './index.vue' + +export { ProjectLayoutCreate } diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.vue b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.vue new file mode 100644 index 0000000..12f294f --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutCreate/index.vue @@ -0,0 +1,54 @@ + + diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.ts b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.ts new file mode 100644 index 0000000..d870cce --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.ts @@ -0,0 +1,3 @@ +import ProjectLayoutSider from './index.vue' + +export { ProjectLayoutSider } diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.vue b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.vue new file mode 100644 index 0000000..c7b963e --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/index.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/menu.ts b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/menu.ts new file mode 100644 index 0000000..c878f70 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/layout/components/ProjectLayoutSider/menu.ts @@ -0,0 +1,86 @@ +import { reactive, h } from 'vue' +import { renderIcon } from '@/utils' +import { RouterLink } from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' +import { MenuOption, MenuGroupOption } from 'naive-ui' +import { icon } from '@/plugins' + +const { GridIcon, TvOutlineIcon } = icon.ionicons5 +const { StoreIcon, ObjectStorageIcon, DevicesIcon } = icon.carbon +export const renderMenuLabel = (option: MenuOption | MenuGroupOption) => { + return option.label +} + +export const expandedKeys = () => ['all-project'] + +export const menuOptionsInit = () => { + const t = window['$t'] + + return reactive([ + { + key: 'divider-1', + type: 'divider', + }, + { + label: () => h('span', null, { default: () => t('project.project') }), + key: 'all-project', + icon: renderIcon(DevicesIcon), + children: [ + { + type: 'group', + label: () => h('span', null, { default: () => t('project.my') }), + key: 'my-project', + children: [ + { + label: () => + h( + RouterLink, + { + to: { + name: PageEnum.BASE_HOME_ITEMS_NAME, + }, + }, + { default: () => t('project.all_project') } + ), + key: PageEnum.BASE_HOME_ITEMS_NAME, + icon: renderIcon(TvOutlineIcon), + }, + { + label: () => + h( + RouterLink, + { + to: { + name: PageEnum.BASE_HOME_TEMPLATE_NAME, + }, + }, + { default: () => t('project.my_templete') } + ), + key: PageEnum.BASE_HOME_TEMPLATE_NAME, + icon: renderIcon(ObjectStorageIcon), + }, + ], + }, + ], + }, + + { + key: 'divider-2', + type: 'divider', + }, + { + label: () => + h( + RouterLink, + { + to: { + name: PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME, + }, + }, + { default: () => t('project.template_market') } + ), + key: PageEnum.BASE_HOME_TEMPLATE_MARKET_NAME, + icon: renderIcon(StoreIcon), + }, + ]) +} diff --git a/grailed-ui-go-view/src/views/project/mtTemplate/index.vue b/grailed-ui-go-view/src/views/project/mtTemplate/index.vue new file mode 100644 index 0000000..22ffd40 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/mtTemplate/index.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/project/templateMarket/index.vue b/grailed-ui-go-view/src/views/project/templateMarket/index.vue new file mode 100644 index 0000000..fffc9e1 --- /dev/null +++ b/grailed-ui-go-view/src/views/project/templateMarket/index.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/grailed-ui-go-view/src/views/redirect/UnPublish.vue b/grailed-ui-go-view/src/views/redirect/UnPublish.vue new file mode 100644 index 0000000..2429dd3 --- /dev/null +++ b/grailed-ui-go-view/src/views/redirect/UnPublish.vue @@ -0,0 +1,35 @@ + + + diff --git a/grailed-ui-go-view/src/views/redirect/index.vue b/grailed-ui-go-view/src/views/redirect/index.vue new file mode 100644 index 0000000..7ff0e23 --- /dev/null +++ b/grailed-ui-go-view/src/views/redirect/index.vue @@ -0,0 +1,31 @@ + + + diff --git a/grailed-ui-go-view/tsconfig.json b/grailed-ui-go-view/tsconfig.json new file mode 100644 index 0000000..07a4c65 --- /dev/null +++ b/grailed-ui-go-view/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "baseUrl": ".", + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "lib": ["es6", "ESNext", "dom"], + "types": ["vite/client"], + "paths": { + "@/*": ["src/*"], + "/#/*": ["types/*"] + }, + "noImplicitAny": true, //不允许使用any + // "strictNullChecks": true, //不允许使用null + "noImplicitThis": true //不允许往this上面挂属性 + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*"], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/grailed-ui-go-view/types/global.d.ts b/grailed-ui-go-view/types/global.d.ts new file mode 100644 index 0000000..aabfe76 --- /dev/null +++ b/grailed-ui-go-view/types/global.d.ts @@ -0,0 +1,16 @@ +interface Window { + $loading: any + $message: any + $dialog: any + // 语言 + $t: any + $vue: any + // 键盘按键记录 + $KeyboardActive?: { [T: string]: boolean } + onKeySpacePressHold?: Function + + // 编辑 JSON 的存储对象 + opener: any +} + +declare type Recordable = Record diff --git a/grailed-ui-go-view/types/shims-vue.d.ts b/grailed-ui-go-view/types/shims-vue.d.ts new file mode 100644 index 0000000..fbfc892 --- /dev/null +++ b/grailed-ui-go-view/types/shims-vue.d.ts @@ -0,0 +1,8 @@ +declare module '*.vue' { + import { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} + +declare module 'lodash/*' +declare module 'dom-helpers' \ No newline at end of file diff --git a/grailed-ui-go-view/types/vite-env.d.ts b/grailed-ui-go-view/types/vite-env.d.ts new file mode 100644 index 0000000..317bb4b --- /dev/null +++ b/grailed-ui-go-view/types/vite-env.d.ts @@ -0,0 +1,10 @@ +/// + +interface ImportMetaEnv { + // 端口 + VITE_DEV_PORT: string; + // 开发地址 + VITE_DEV_PATH: string + // 生产地址 + VITE_PRO_PATH: string +} \ No newline at end of file diff --git a/grailed-ui-go-view/vite.config.ts b/grailed-ui-go-view/vite.config.ts new file mode 100644 index 0000000..ad47cad --- /dev/null +++ b/grailed-ui-go-view/vite.config.ts @@ -0,0 +1,92 @@ +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import { resolve } from 'path' +import { OUTPUT_DIR, brotliSize, chunkSizeWarningLimit, terserOptions, rollupOptions } from './build/constant' +import viteCompression from 'vite-plugin-compression' +import { axiosPre } from './src/settings/httpSetting' +import { viteMockServe } from 'vite-plugin-mock' +import monacoEditorPlugin from 'vite-plugin-monaco-editor' + +function pathResolve(dir: string) { + return resolve(process.cwd(), '.', dir) +} + +export default ({ mode }) => defineConfig({ + base: process.env.NODE_ENV === 'production' ? './' : '/', + // 路径重定向 + resolve: { + alias: [ + { + find: /\/#\//, + replacement: pathResolve('types') + }, + { + find: '@', + replacement: pathResolve('src') + }, + { + find: 'vue-i18n', + replacement: 'vue-i18n/dist/vue-i18n.cjs.js', //解决i8n警告 + } + ], + dedupe: ['vue'] + }, + // 全局 css 注册 + css: { + preprocessorOptions: { + scss: { + javascriptEnabled: true, + additionalData: `@import "src/styles/common/style.scss";` + } + } + }, + // 开发服务器配置 + server: { + host: true, + open: true, + port: 3000, + proxy: { + [axiosPre]: { + // @ts-ignore + target: loadEnv(mode, process.cwd()).VITE_DEV_PATH, + changeOrigin: true, + ws: true, + secure: true, + } + } + }, + plugins: [ + vue(), + monacoEditorPlugin({ + languageWorkers: ['editorWorkerService', 'typescript', 'json', 'html'] + }), + viteMockServe({ + mockPath: '/src/api/mock', + // 开发打包开关 + localEnabled: true, + // 生产打包开关 + prodEnabled: true, + // 打开后,可以读取 ts 文件模块。 请注意,打开后将无法监视.js 文件 + supportTs: true, + // 监视文件更改 + watchFiles: true + }), + // 压缩 + viteCompression({ + verbose: true, + disable: false, + threshold: 10240, + algorithm: 'gzip', + ext: '.gz' + }) + ], + build: { + target: 'es2015', + outDir: OUTPUT_DIR, + // minify: 'terser', // 如果需要用terser混淆,可打开这两行 + // terserOptions: terserOptions, + rollupOptions: rollupOptions, + brotliSize: brotliSize, + chunkSizeWarningLimit: chunkSizeWarningLimit + } +}) diff --git a/grailed_app/.env b/grailed_app/.env new file mode 100644 index 0000000..e69de29 diff --git a/grailed_app/.env - 副本.da b/grailed_app/.env - 副本.da new file mode 100644 index 0000000..fb5faed --- /dev/null +++ b/grailed_app/.env - 副本.da @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='da-dk' +VITE_APP_NAME = 'LUX LAIR' +VITE_FAVICON = '/luxlair-favicon.jpg' +VITE_AES_SECRET = 'ocbiteXwSoROtzTwRAQlmJrGsG139lxp' +VITE_OUT_DIR = 'app-da' \ No newline at end of file diff --git a/grailed_app/.env.da b/grailed_app/.env.da new file mode 100644 index 0000000..e34c8a6 --- /dev/null +++ b/grailed_app/.env.da @@ -0,0 +1,10 @@ +VITE_BASE_URL='https://www.22y.fun' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='da-dk' +VITE_APP_NAME = 'LUX LAIR' +VITE_FAVICON = '/luxlair-favicon.jpg' +VITE_AES_SECRET = 'ocbiteXwSoROtzTwRAQlmJrGsG139lxp' +VITE_OUT_DIR = 'app-da' + +VITE_KF_URL='https://22y.fun' diff --git a/grailed_app/.env.dev b/grailed_app/.env.dev new file mode 100644 index 0000000..0ca4a8c --- /dev/null +++ b/grailed_app/.env.dev @@ -0,0 +1,7 @@ +VITE_BASE_URL = 'http://localhost:48080' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='en-us' +VITE_APP_NAME = 'LUX LAIR DEV' +VITE_FAVICON = '/luxlair-favicon.jpg' +VITE_AES_SECRET = '45o7f3k2G+W5/SW+jQpmUV1CZFyCJCAd' diff --git a/grailed_app/.env.in b/grailed_app/.env.in new file mode 100644 index 0000000..fde0c85 --- /dev/null +++ b/grailed_app/.env.in @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='en-us' +VITE_APP_NAME = 'Baltini' +VITE_FAVICON = '/baltini-faviocn.webp' +VITE_AES_SECRET = 'ef16WexLxsCrcbrxHclXqm3bGyRXimYy' +VITE_OUT_DIR = 'app-in' \ No newline at end of file diff --git a/grailed_app/.env.nz b/grailed_app/.env.nz new file mode 100644 index 0000000..6ca93e2 --- /dev/null +++ b/grailed_app/.env.nz @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='pt-pt' +VITE_APP_NAME = 'Luxe Collective Fashion' +VITE_FAVICON = '/luxlair-favicon.jpg' +VITE_AES_SECRET = 'RJUMtfGjpXP3LaPjqtc7bzLXg7/I7/xJ' +VITE_OUT_DIR = 'app-nz' \ No newline at end of file diff --git a/grailed_app/.env.pt b/grailed_app/.env.pt new file mode 100644 index 0000000..7ae14e8 --- /dev/null +++ b/grailed_app/.env.pt @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='pt-pt' +VITE_APP_NAME = 'Luxe Collective Fashion' +VITE_FAVICON = '/luxlair-favicon.jpg' +VITE_AES_SECRET = 'DWxvNYrqCJbZ1soxdANRjk/ECo7DnHfC' +VITE_OUT_DIR = 'app-pt' \ No newline at end of file diff --git a/grailed_app/.env.uk b/grailed_app/.env.uk new file mode 100644 index 0000000..cb39464 --- /dev/null +++ b/grailed_app/.env.uk @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='en-us' +VITE_APP_NAME = 'clickflow' +VITE_FAVICON = '/baltini-faviocn.webp' +VITE_AES_SECRET = '3k0bcWSPXH6+7fbapQQ3TziOWsux3Ak6' +VITE_OUT_DIR = 'app-uk' \ No newline at end of file diff --git a/grailed_app/.env.us b/grailed_app/.env.us new file mode 100644 index 0000000..9abef3d --- /dev/null +++ b/grailed_app/.env.us @@ -0,0 +1,8 @@ +VITE_BASE_URL = '' +VITE_API_URL = '/app-api' +TENANT_ID = 1 +VITE_DEFAULT_LANG ='en-us' +VITE_APP_NAME = 'Baltini' +VITE_FAVICON = '/baltini-faviocn.webp' +VITE_AES_SECRET = '3k0bcWSPXH6+7fbapQQ3TziOWsux3Ak6' +VITE_OUT_DIR = 'app-us' \ No newline at end of file diff --git a/grailed_app/.gitignore b/grailed_app/.gitignore new file mode 100644 index 0000000..38adffa --- /dev/null +++ b/grailed_app/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/grailed_app/.prettierignore b/grailed_app/.prettierignore new file mode 100644 index 0000000..c5292de --- /dev/null +++ b/grailed_app/.prettierignore @@ -0,0 +1,15 @@ + +# 忽略日志 +*.log +node_modules/** +dist/ +dist* +public/* +docs/* +app-* +vite.config.ts +src/types/env.d.ts +src/types/auto-components.d.ts +src/types/auto-imports.d.ts +docs/**/* +CHANGELOG \ No newline at end of file diff --git a/grailed_app/.vscode/extensions.json b/grailed_app/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/grailed_app/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/grailed_app/README.md b/grailed_app/README.md new file mode 100644 index 0000000..4a1cc60 --- /dev/null +++ b/grailed_app/README.md @@ -0,0 +1,40 @@ +# grailed_app + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. + +If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: + +1. Disable the built-in TypeScript Extension + 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette + 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` +2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` diff --git a/grailed_app/components.d.ts b/grailed_app/components.d.ts new file mode 100644 index 0000000..b27c955 --- /dev/null +++ b/grailed_app/components.d.ts @@ -0,0 +1,40 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module 'vue' { + export interface GlobalComponents { + Dialog: typeof import('./src/components/Dialog.vue')['default'] + GrailedDialog: typeof import('./src/components/GrailedDialog.vue')['default'] + GrailedHeader: typeof import('./src/components/GrailedHeader.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + Success: typeof import('./src/components/Success.vue')['default'] + SvgIcon: typeof import('./src/components/SvgIcon.vue')['default'] + TermsModal: typeof import('./src/components/TermsModal.vue')['default'] + VanButton: typeof import('vant/es')['Button'] + VanCollapse: typeof import('vant/es')['Collapse'] + VanCollapseItem: typeof import('vant/es')['CollapseItem'] + VanDialog: typeof import('vant/es')['Dialog'] + VanDivider: typeof import('vant/es')['Divider'] + VanIcon: typeof import('vant/es')['Icon'] + VanList: typeof import('vant/es')['List'] + VanLoading: typeof import('vant/es')['Loading'] + VanNavBar: typeof import('vant/es')['NavBar'] + VanNotify: typeof import('vant/es')['Notify'] + VanOverlay: typeof import('vant/es')['Overlay'] + VanPicker: typeof import('vant/es')['Picker'] + VanPopup: typeof import('vant/es')['Popup'] + VanPullRefresh: typeof import('vant/es')['PullRefresh'] + VanRate: typeof import('vant/es')['Rate'] + VanSwipe: typeof import('vant/es')['Swipe'] + VanSwipeItem: typeof import('vant/es')['SwipeItem'] + VanTab: typeof import('vant/es')['Tab'] + VanTabs: typeof import('vant/es')['Tabs'] + VanToast: typeof import('vant/es')['Toast'] + VanUploader: typeof import('vant/es')['Uploader'] + } +} diff --git a/grailed_app/env.d.ts b/grailed_app/env.d.ts new file mode 100644 index 0000000..8f6a08b --- /dev/null +++ b/grailed_app/env.d.ts @@ -0,0 +1,3 @@ +/// +VITE_BASE_URL = 'http://127.0.0.1:48080' +VITE_API_URL = '/app-api' \ No newline at end of file diff --git a/grailed_app/index.html b/grailed_app/index.html new file mode 100644 index 0000000..a985d2a --- /dev/null +++ b/grailed_app/index.html @@ -0,0 +1,13 @@ + + + + + + + + + +
+ + + diff --git a/grailed_app/package-lock.json b/grailed_app/package-lock.json new file mode 100644 index 0000000..ac18bc3 --- /dev/null +++ b/grailed_app/package-lock.json @@ -0,0 +1,9989 @@ +{ + "name": "grailed_app", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "dependencies": { + "@headlessui/vue": "^1.7.16", + "@heroicons/vue": "^2.0.18", + "@intlify/unplugin-vue-i18n": "^1.4.0", + "@tailwindcss/forms": "^0.5.6", + "@types/axios": "^0.14.0", + "@vant/auto-import-resolver": "^1.0.1", + "@vue-hero-icons/solid": "^1.7.2", + "autoprefixer": "^10.4.15", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.9", + "google-libphonenumber": "^3.2.33", + "pinia": "^2.1.6", + "postcss": "^8.4.28", + "qrcode-vue3": "^1.6.8", + "swiper": "^10.2.0", + "tailwindcss": "^3.3.3", + "terser": "^5.22.0", + "ts-node": "^10.9.1", + "unplugin-vue-components": "^0.25.2", + "vant": "^4.6.7", + "vconsole": "^3.15.1", + "vite-plugin-svg-icons": "^2.0.1", + "vue": "^3.3.4", + "vue-i18n": "9.2.2", + "vue-router": "^4.2.4", + "vue-select": "^4.0.0-beta.6", + "vue3-lottie": "^3.1.0", + "vue3-seamless-scroll": "^2.0.1", + "web-storage-cache": "^1.1.1" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.0", + "@types/node": "^20.5.7", + "@vitejs/plugin-vue": "^4.3.1", + "@vue/tsconfig": "^0.4.0", + "dotenv": "^16.3.1", + "npm-run-all": "^4.1.5", + "typescript": "~5.1.6", + "vite": "^4.4.9", + "vue-tsc": "^1.8.8" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==" + }, + "node_modules/@babel/parser": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.11.tgz", + "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@headlessui/vue": { + "version": "1.7.16", + "resolved": "https://registry.npmmirror.com/@headlessui/vue/-/vue-1.7.16.tgz", + "integrity": "sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@heroicons/vue": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/@heroicons/vue/-/vue-2.0.18.tgz", + "integrity": "sha512-BcTC9nq2TkwNSfQuqo96J7ehx4etezypc2YeTq7KsXWxrcrerhkgjLrxGRBnStN0wrXo0Gv4BInybqz5uBG6Cw==", + "peerDependencies": { + "vue": ">= 3" + } + }, + "node_modules/@intlify/bundle-utils": { + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/@intlify/bundle-utils/-/bundle-utils-7.4.0.tgz", + "integrity": "sha512-AQfjBe2HUxzyN8ignIk3WhhSuVcSuirgzOzkd17nb337rCbI4Gv/t1R60UUyIqFoFdviLb/wLcDUzTD/xXjv9w==", + "dependencies": { + "@intlify/message-compiler": "^9.4.0", + "@intlify/shared": "^9.4.0", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "magic-string": "^0.30.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dependencies": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/core-base/node_modules/@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "dependencies": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/core-base/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "dependencies": { + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/devtools-if/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.6.5", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.6.5.tgz", + "integrity": "sha512-WeJ499thIj0p7JaIO1V3JaJbqdqfBykS5R8fElFs5hNeotHtPAMBs4IiA+8/KGFkAbjJusgFefCq6ajP7F7+4Q==", + "dependencies": { + "@intlify/shared": "9.6.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@intlify/shared": { + "version": "9.6.5", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.6.5.tgz", + "integrity": "sha512-gD7Ey47Xi4h/t6P+S04ymMSoA3wVRxGqjxuIMglwRO8POki9h164Epu2N8wk/GHXM/hR6ZGcsx2HArCCENjqSQ==", + "engines": { + "node": ">= 16" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.5.0.tgz", + "integrity": "sha512-jW0MCCdwxybxcwjEfCunAcKjVoxyO3i+cnLL6v+MNGRLUHqrpELF6zQAJUhgAK2afhY7mCliy8RxTFWKdXm26w==", + "dependencies": { + "@intlify/bundle-utils": "^7.4.0", + "@intlify/shared": "^9.4.0", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } + } + }, + "node_modules/@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/vue-devtools/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.1", + "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.1.tgz", + "integrity": "sha512-RDDZFuofwkcKpl8Vpj5wFbY+H53xOtqK7ckEL1sXsbPwvKwDdjQf3LkHbtt9sxIHn9nWIEwkmCwBRZ6z5TKU2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ==", + "license": "MIT", + "dependencies": { + "axios": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vant/auto-import-resolver": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@vant/auto-import-resolver/-/auto-import-resolver-1.0.2.tgz", + "integrity": "sha512-5SYC1izl36KID+3F4pqFtYD8VFK6m1pdulft99sjSkUN4GBX9OslRnsJA0g7xS+0YrytjDuxxBk04YLYIxaYMg==" + }, + "node_modules/@vant/popperjs": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz", + "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==" + }, + "node_modules/@vant/use": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz", + "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.3.3.tgz", + "integrity": "sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.10.1.tgz", + "integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "1.10.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.10.1.tgz", + "integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.10.1.tgz", + "integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "1.10.1" + } + }, + "node_modules/@vue-hero-icons/solid": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@vue-hero-icons/solid/-/solid-1.7.2.tgz", + "integrity": "sha512-ngjgdYgdjXp8BuHmx998Kl2tAmbatJXdYO8Cut+DXo9OVGZMuVmIzIjnar4H5Wf9wFVdCuag+HazLEu9F7T3cw==", + "dependencies": { + "babel-helper-vue-jsx-merge-props": "^2.0.3" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.8.tgz", + "integrity": "sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~1.10.0", + "@volar/source-map": "~1.10.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/typescript": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/@vue/typescript/-/typescript-1.8.8.tgz", + "integrity": "sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~1.10.0", + "@vue/language-core": "1.8.8" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001524", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/core-js": { + "version": "3.33.2", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "hasInstallScript": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.503", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", + "integrity": "sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==", + "license": "ISC" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-libphonenumber": { + "version": "3.2.33", + "resolved": "https://registry.npmmirror.com/google-libphonenumber/-/google-libphonenumber-3.2.33.tgz", + "integrity": "sha512-1QKCvAlfq8zY1mviORI9lDzM3I/hwm9+h0CwYBTLq59DBbSHMd5zBOLqHZFiBLicRpwIz46Nynvbywj1XApKvA==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isobject/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lottie-web": { + "version": "5.12.2", + "resolved": "https://registry.npmmirror.com/lottie-web/-/lottie-web-5.12.2.tgz", + "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mutation-observer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz", + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qrcode-generator": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz", + "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" + }, + "node_modules/qrcode-vue3": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/qrcode-vue3/-/qrcode-vue3-1.6.8.tgz", + "integrity": "sha512-LtMnwKWi58ZqHbXBcsTF/VxDYhI6RrBIrDQw8fbDVlO8p5tJBZa7TaIaVYLY937vKO2WCEBmOKksGlpm5ccEIg==", + "dependencies": { + "qrcode-generator": "^1.4.4" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swiper": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/swiper/-/swiper-10.2.0.tgz", + "integrity": "sha512-nktQsOtBInJjr3f5DicxC8eHYGcLXDVIGPSon0QoXRaO6NjKnATCbQ8SZsD3dN1Ph1RH4EhVPwSYCcuDRFWHGQ==", + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/terser": { + "version": "5.24.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.1.tgz", + "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", + "dependencies": { + "acorn": "^8.10.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.25.2", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz", + "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==", + "dependencies": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.3", + "resolve": "^1.22.2", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vant": { + "version": "4.7.3", + "resolved": "https://registry.npmmirror.com/vant/-/vant-4.7.3.tgz", + "integrity": "sha512-nb0pXxKSOaE9CvH//KozKDivqhjE4ZRvx1b/RCWFL4H3tZ5l+HhWtwK1yJx5AkO1Pm/IYQY86yZa1tums8DfsQ==", + "dependencies": { + "@vant/popperjs": "^1.3.0", + "@vant/use": "^1.6.0", + "@vue/shared": "^3.0.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vconsole": { + "version": "3.15.1", + "resolved": "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz", + "integrity": "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-svg-icons/node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz", + "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2", + "@vue/devtools-api": "^6.2.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-select": { + "version": "4.0.0-beta.6", + "resolved": "https://registry.npmmirror.com/vue-select/-/vue-select-4.0.0-beta.6.tgz", + "integrity": "sha512-K+zrNBSpwMPhAxYLTCl56gaMrWZGgayoWCLqe5rWwkB8aUbAUh7u6sXjIR7v4ckp2WKC7zEEUY27g6h1MRsIHw==", + "peerDependencies": { + "vue": "3.x" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.8.tgz", + "integrity": "sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/language-core": "1.8.8", + "@vue/typescript": "1.8.8", + "semver": "^7.3.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue3-lottie": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/vue3-lottie/-/vue3-lottie-3.2.0.tgz", + "integrity": "sha512-PtNXbv7iD4XGmK8CXd71aLWmILIR6P6VzLMDw6ZzmDAeuJZuJ0MdOVnn50LOARgq+cOFJsn/2z+7tZh0F9T9qw==", + "dependencies": { + "lodash-es": "^4.17.21", + "lottie-web": "5.12.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.2" + } + }, + "node_modules/vue3-seamless-scroll": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vue3-seamless-scroll/-/vue3-seamless-scroll-2.0.1.tgz", + "integrity": "sha512-mI3BaDU3pjcPUhVSw3/xNKdfPBDABTi/OdZaZqKysx4cSdNfGRbVvGNDzzptBbJ5S7imv5T55l6x/SqgnxKreg==", + "dependencies": { + "throttle-debounce": "5.0.0" + } + }, + "node_modules/web-storage-cache": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/web-storage-cache/-/web-storage-cache-1.1.1.tgz", + "integrity": "sha512-D0MieGooOs8RpsrK+vnejXnvh4OOv/+lTFB35JRkJJQt+uOjPE08XpaE0QBLMTRu47B1KGT/Nq3Gbag3Orinzw==", + "license": "MIT" + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==" + }, + "@babel/parser": { + "version": "7.22.11", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.11.tgz", + "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==" + }, + "@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "optional": true + }, + "@headlessui/vue": { + "version": "1.7.16", + "resolved": "https://registry.npmmirror.com/@headlessui/vue/-/vue-1.7.16.tgz", + "integrity": "sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==", + "requires": {} + }, + "@heroicons/vue": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/@heroicons/vue/-/vue-2.0.18.tgz", + "integrity": "sha512-BcTC9nq2TkwNSfQuqo96J7ehx4etezypc2YeTq7KsXWxrcrerhkgjLrxGRBnStN0wrXo0Gv4BInybqz5uBG6Cw==", + "requires": {} + }, + "@intlify/bundle-utils": { + "version": "7.4.0", + "resolved": "https://registry.npmmirror.com/@intlify/bundle-utils/-/bundle-utils-7.4.0.tgz", + "integrity": "sha512-AQfjBe2HUxzyN8ignIk3WhhSuVcSuirgzOzkd17nb337rCbI4Gv/t1R60UUyIqFoFdviLb/wLcDUzTD/xXjv9w==", + "requires": { + "@intlify/message-compiler": "^9.4.0", + "@intlify/shared": "^9.4.0", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "magic-string": "^0.30.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + } + }, + "@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "requires": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "dependencies": { + "@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "requires": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + } + }, + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "requires": { + "@intlify/shared": "9.2.2" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@intlify/message-compiler": { + "version": "9.6.5", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.6.5.tgz", + "integrity": "sha512-WeJ499thIj0p7JaIO1V3JaJbqdqfBykS5R8fElFs5hNeotHtPAMBs4IiA+8/KGFkAbjJusgFefCq6ajP7F7+4Q==", + "requires": { + "@intlify/shared": "9.6.5", + "source-map-js": "^1.0.2" + } + }, + "@intlify/shared": { + "version": "9.6.5", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.6.5.tgz", + "integrity": "sha512-gD7Ey47Xi4h/t6P+S04ymMSoA3wVRxGqjxuIMglwRO8POki9h164Epu2N8wk/GHXM/hR6ZGcsx2HArCCENjqSQ==" + }, + "@intlify/unplugin-vue-i18n": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.5.0.tgz", + "integrity": "sha512-jW0MCCdwxybxcwjEfCunAcKjVoxyO3i+cnLL6v+MNGRLUHqrpELF6zQAJUhgAK2afhY7mCliy8RxTFWKdXm26w==", + "requires": { + "@intlify/bundle-utils": "^7.4.0", + "@intlify/shared": "^9.4.0", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + } + }, + "@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "requires": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "@tsconfig/node18": { + "version": "18.2.1", + "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-18.2.1.tgz", + "integrity": "sha512-RDDZFuofwkcKpl8Vpj5wFbY+H53xOtqK7ckEL1sXsbPwvKwDdjQf3LkHbtt9sxIHn9nWIEwkmCwBRZ6z5TKU2A==", + "dev": true + }, + "@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ==", + "requires": { + "axios": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "requires": { + "@types/node": "*" + } + }, + "@vant/auto-import-resolver": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@vant/auto-import-resolver/-/auto-import-resolver-1.0.2.tgz", + "integrity": "sha512-5SYC1izl36KID+3F4pqFtYD8VFK6m1pdulft99sjSkUN4GBX9OslRnsJA0g7xS+0YrytjDuxxBk04YLYIxaYMg==" + }, + "@vant/popperjs": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz", + "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==" + }, + "@vant/use": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz", + "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==", + "requires": {} + }, + "@vitejs/plugin-vue": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.3.3.tgz", + "integrity": "sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==", + "dev": true, + "requires": {} + }, + "@volar/language-core": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.10.1.tgz", + "integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", + "dev": true, + "requires": { + "@volar/source-map": "1.10.1" + } + }, + "@volar/source-map": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.10.1.tgz", + "integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", + "dev": true, + "requires": { + "muggle-string": "^0.3.1" + } + }, + "@volar/typescript": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.10.1.tgz", + "integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", + "dev": true, + "requires": { + "@volar/language-core": "1.10.1" + } + }, + "@vue-hero-icons/solid": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@vue-hero-icons/solid/-/solid-1.7.2.tgz", + "integrity": "sha512-ngjgdYgdjXp8BuHmx998Kl2tAmbatJXdYO8Cut+DXo9OVGZMuVmIzIjnar4H5Wf9wFVdCuag+HazLEu9F7T3cw==", + "requires": { + "babel-helper-vue-jsx-merge-props": "^2.0.3" + } + }, + "@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "requires": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "requires": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/language-core": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.8.tgz", + "integrity": "sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==", + "dev": true, + "requires": { + "@volar/language-core": "~1.10.0", + "@volar/source-map": "~1.10.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "requires": { + "@vue/shared": "3.3.4" + } + }, + "@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "requires": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "requires": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "requires": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "@vue/typescript": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/@vue/typescript/-/typescript-1.8.8.tgz", + "integrity": "sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==", + "dev": true, + "requires": { + "@volar/typescript": "~1.10.0", + "@vue/language-core": "1.8.8" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "requires": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-lite": { + "version": "1.0.30001524", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" + }, + "copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==" + }, + "core-js": { + "version": "3.33.2", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.503", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", + "integrity": "sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "google-libphonenumber": { + "version": "3.2.33", + "resolved": "https://registry.npmmirror.com/google-libphonenumber/-/google-libphonenumber-3.2.33.tgz", + "integrity": "sha512-1QKCvAlfq8zY1mviORI9lDzM3I/hwm9+h0CwYBTLq59DBbSHMd5zBOLqHZFiBLicRpwIz46Nynvbywj1XApKvA==" + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + } + } + }, + "jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==" + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "requires": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lottie-web": { + "version": "5.12.2", + "resolved": "https://registry.npmmirror.com/lottie-web/-/lottie-web-5.12.2.tgz", + "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "requires": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "mutation-observer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz", + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + } + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" + }, + "postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "requires": {} + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==" + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "qrcode-generator": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz", + "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" + }, + "qrcode-vue3": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/qrcode-vue3/-/qrcode-vue3-1.6.8.tgz", + "integrity": "sha512-LtMnwKWi58ZqHbXBcsTF/VxDYhI6RrBIrDQw8fbDVlO8p5tJBZa7TaIaVYLY937vKO2WCEBmOKksGlpm5ccEIg==", + "requires": { + "qrcode-generator": "^1.4.4" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "swiper": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/swiper/-/swiper-10.2.0.tgz", + "integrity": "sha512-nktQsOtBInJjr3f5DicxC8eHYGcLXDVIGPSon0QoXRaO6NjKnATCbQ8SZsD3dN1Ph1RH4EhVPwSYCcuDRFWHGQ==" + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "terser": { + "version": "5.24.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==" + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + }, + "ufo": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.3.1.tgz", + "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==" + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unplugin": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", + "requires": { + "acorn": "^8.10.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "unplugin-vue-components": { + "version": "0.25.2", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.25.2.tgz", + "integrity": "sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==", + "requires": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.3", + "resolve": "^1.22.2", + "unplugin": "^1.4.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + } + } + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vant": { + "version": "4.7.3", + "resolved": "https://registry.npmmirror.com/vant/-/vant-4.7.3.tgz", + "integrity": "sha512-nb0pXxKSOaE9CvH//KozKDivqhjE4ZRvx1b/RCWFL4H3tZ5l+HhWtwK1yJx5AkO1Pm/IYQY86yZa1tums8DfsQ==", + "requires": { + "@vant/popperjs": "^1.3.0", + "@vant/use": "^1.6.0", + "@vue/shared": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vconsole": { + "version": "3.15.1", + "resolved": "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz", + "integrity": "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==", + "requires": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "vite": { + "version": "4.4.9", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "requires": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "dependencies": { + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" + } + } + }, + "vue": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "requires": {} + }, + "vue-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz", + "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", + "requires": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2", + "@vue/devtools-api": "^6.2.1" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "requires": { + "@vue/devtools-api": "^6.5.0" + } + }, + "vue-select": { + "version": "4.0.0-beta.6", + "resolved": "https://registry.npmmirror.com/vue-select/-/vue-select-4.0.0-beta.6.tgz", + "integrity": "sha512-K+zrNBSpwMPhAxYLTCl56gaMrWZGgayoWCLqe5rWwkB8aUbAUh7u6sXjIR7v4ckp2WKC7zEEUY27g6h1MRsIHw==", + "requires": {} + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.8.8", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.8.tgz", + "integrity": "sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==", + "dev": true, + "requires": { + "@vue/language-core": "1.8.8", + "@vue/typescript": "1.8.8", + "semver": "^7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "vue3-lottie": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/vue3-lottie/-/vue3-lottie-3.2.0.tgz", + "integrity": "sha512-PtNXbv7iD4XGmK8CXd71aLWmILIR6P6VzLMDw6ZzmDAeuJZuJ0MdOVnn50LOARgq+cOFJsn/2z+7tZh0F9T9qw==", + "requires": { + "lodash-es": "^4.17.21", + "lottie-web": "5.12.2" + } + }, + "vue3-seamless-scroll": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vue3-seamless-scroll/-/vue3-seamless-scroll-2.0.1.tgz", + "integrity": "sha512-mI3BaDU3pjcPUhVSw3/xNKdfPBDABTi/OdZaZqKysx4cSdNfGRbVvGNDzzptBbJ5S7imv5T55l6x/SqgnxKreg==", + "requires": { + "throttle-debounce": "5.0.0" + } + }, + "web-storage-cache": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/web-storage-cache/-/web-storage-cache-1.1.1.tgz", + "integrity": "sha512-D0MieGooOs8RpsrK+vnejXnvh4OOv/+lTFB35JRkJJQt+uOjPE08XpaE0QBLMTRu47B1KGT/Nq3Gbag3Orinzw==" + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + }, + "yaml-eslint-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", + "requires": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^2.0.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/grailed_app/package.json b/grailed_app/package.json new file mode 100644 index 0000000..ab02860 --- /dev/null +++ b/grailed_app/package.json @@ -0,0 +1,62 @@ +{ + "name": "", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "vite --mode dev", + "build": "run-p type-check build-only", + "preview": "vite preview", + "build-only": "vite build", + "build:da": "vite build --mode da", + "build:us": "vite build --mode us", + "build:uk": "vite build --mode uk", + "build:pt": "vite build --mode pt", + "build:in": "vite build --mode in", + "build:nz": "vite build --mode nz", + "build:dev": "vite build --mode dev", + "build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod", + "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false" + }, + "dependencies": { + "@headlessui/vue": "^1.7.16", + "@heroicons/vue": "^2.0.18", + "@intlify/unplugin-vue-i18n": "^1.4.0", + "@tailwindcss/forms": "^0.5.6", + "@types/axios": "^0.14.0", + "@vant/auto-import-resolver": "^1.0.1", + "@vue-hero-icons/solid": "^1.7.2", + "autoprefixer": "^10.4.15", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.9", + "google-libphonenumber": "^3.2.33", + "pinia": "^2.1.6", + "postcss": "^8.4.28", + "qrcode-vue3": "^1.6.8", + "swiper": "^10.2.0", + "tailwindcss": "^3.3.3", + "terser": "^5.22.0", + "ts-node": "^10.9.1", + "unplugin-vue-components": "^0.25.2", + "vant": "^4.6.7", + "vconsole": "^3.15.1", + "vite-plugin-svg-icons": "^2.0.1", + "vue": "^3.3.4", + "vue-i18n": "9.2.2", + "vue-router": "^4.2.4", + "vue-select": "^4.0.0-beta.6", + "vue3-lottie": "^3.1.0", + "vue3-seamless-scroll": "^2.0.1", + "web-storage-cache": "^1.1.1" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.0", + "@types/node": "^20.5.7", + "@vitejs/plugin-vue": "^4.3.1", + "@vue/tsconfig": "^0.4.0", + "dotenv": "^16.3.1", + "npm-run-all": "^4.1.5", + "typescript": "~5.1.6", + "vite": "^4.4.9", + "vue-tsc": "^1.8.8" + } +} diff --git a/grailed_app/postcss.config.ts b/grailed_app/postcss.config.ts new file mode 100644 index 0000000..5a8248d --- /dev/null +++ b/grailed_app/postcss.config.ts @@ -0,0 +1,12 @@ +const config: { + plugins: { + [key: string]: any; + }; +} = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +}; + +export default config; \ No newline at end of file diff --git a/grailed_app/prettier.config.ts b/grailed_app/prettier.config.ts new file mode 100644 index 0000000..e4dbd39 --- /dev/null +++ b/grailed_app/prettier.config.ts @@ -0,0 +1,21 @@ +const config = { + semi: false, // 使用分号 + trailingComma: 'none', // 不在多行的末尾使用尾随逗号 + singleQuote: true, // 使用单引号而不是双引号 + printWidth: 100, // 一行的字符数,如果超过会进行换行,默认为80 + tabWidth: 2, // tab的宽度,默认为2 + useTabs: false, // 使用空格而不是tab + endOfLine: 'auto', // 根据系统的换行符操作。如果你是Windows用户,或者你在git中有一个特定的配置,可能会遇到与LF和CRLF相关的问题。 + vueIndentScriptAndStyle: false, + quoteProps: 'as-needed', + bracketSpacing: true, // 对象字面量的大括号间使用空格(默认true) + jsxSingleQuote: false, + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + rangeStart: 0, + }; + export default config; + \ No newline at end of file diff --git a/grailed_app/public/baltini-logo.webp b/grailed_app/public/baltini-logo.webp new file mode 100644 index 0000000..b1ff0f9 Binary files /dev/null and b/grailed_app/public/baltini-logo.webp differ diff --git a/grailed_app/public/faviocn.webp b/grailed_app/public/faviocn.webp new file mode 100644 index 0000000..733f3df Binary files /dev/null and b/grailed_app/public/faviocn.webp differ diff --git a/grailed_app/src/App.vue b/grailed_app/src/App.vue new file mode 100644 index 0000000..fe5d867 --- /dev/null +++ b/grailed_app/src/App.vue @@ -0,0 +1,5 @@ + + + diff --git a/grailed_app/src/api/auth/index.ts b/grailed_app/src/api/auth/index.ts new file mode 100644 index 0000000..89b1b11 --- /dev/null +++ b/grailed_app/src/api/auth/index.ts @@ -0,0 +1,9 @@ +import request from '@/config/axios'; + +export const signUp = (data: any) => { + return request.postOriginal({ 'url': '/member/auth/register', data}) +} + +export const signIn = (data: any) => { + return request.postOriginal({ 'url': '/member/auth/login', data}) +} \ No newline at end of file diff --git a/grailed_app/src/api/auth/type.ts b/grailed_app/src/api/auth/type.ts new file mode 100644 index 0000000..22e91fb --- /dev/null +++ b/grailed_app/src/api/auth/type.ts @@ -0,0 +1,29 @@ +export type UserLoginVO = { + username: string + password: string + captchaVerification: string + } + + export type TokenType = { + id: number // 编号 + accessToken: string // 访问令牌 + refreshToken: string // 刷新令牌 + userId: number // 用户编号 + userType: number //用户类型 + clientId: string //客户端编号 + expiresTime: number //过期时间 + } + + export type UserVO = { + id: number + username: string + nickname: string + deptId: number + email: string + mobile: string + sex: number + avatar: string + loginIp: string + loginDate: string + } + \ No newline at end of file diff --git a/grailed_app/src/api/balance/index.ts b/grailed_app/src/api/balance/index.ts new file mode 100644 index 0000000..46ca61d --- /dev/null +++ b/grailed_app/src/api/balance/index.ts @@ -0,0 +1,18 @@ +import request from '@/config/axios'; + +export const getBalanceAccount = () => { + return request.get({ 'url': '/member/balance-account/get'}) +} + + +export const getQuickRechargeAmount = () => { + return request.get({ 'url': '/member/balance-account/quick-recharge-amount'}) +} + +export const pageBalanceRecord = () => { + return request.get({ 'url': '/member/balance-record/page'}) +} + +export const setWithdrawalPassword = (data:any) => { + return request.post({ 'url': '/member/balance-account/set-withdraw-password',data}) +} \ No newline at end of file diff --git a/grailed_app/src/api/channelConfig/index.ts b/grailed_app/src/api/channelConfig/index.ts new file mode 100644 index 0000000..39bfae2 --- /dev/null +++ b/grailed_app/src/api/channelConfig/index.ts @@ -0,0 +1,14 @@ +import request from '@/config/axios'; + +export const listRechargeChannel = () => { + return request.get({ 'url': '/member/channel-config/list-recharge'}) +} + + +export const listWithdrawalChannel = () => { + return request.get({ 'url': '/member/channel-config/list-withdrawal'}) +} + +export const getChannelConfigById = (id: string) => { + return request.get({ 'url': '/member/channel-config/get?id=' + id}) +} \ No newline at end of file diff --git a/grailed_app/src/api/checkIn/index.ts b/grailed_app/src/api/checkIn/index.ts new file mode 100644 index 0000000..abb0ab1 --- /dev/null +++ b/grailed_app/src/api/checkIn/index.ts @@ -0,0 +1,9 @@ +import request from '@/config/axios'; + +export const userCheckIn = () => { + return request.postOriginal({ 'url': '/member/sign-in-record/create'}) +} + +export const getUserCheckIn = () => { + return request.get({ 'url': '/member/sign-in-record/list'}) +} \ No newline at end of file diff --git a/grailed_app/src/api/countries/index.ts b/grailed_app/src/api/countries/index.ts new file mode 100644 index 0000000..daaeed7 --- /dev/null +++ b/grailed_app/src/api/countries/index.ts @@ -0,0 +1,5 @@ +import request from '@/config/axios'; + +export const listCountry = () => { + return request.get({ 'url': '/member/countries/list'}) +} diff --git a/grailed_app/src/api/home/index.ts b/grailed_app/src/api/home/index.ts new file mode 100644 index 0000000..9eba31e --- /dev/null +++ b/grailed_app/src/api/home/index.ts @@ -0,0 +1,18 @@ +import request from '@/config/axios' + +export const listCarouse = async () => { + return await request.get({ url: '/member/content-carouse/list' }) + } + + + export const listProduct = async () => { + return await request.get({ url: '/member/product/list' }) + } + + export const listMembers = async () => { + return await request.get({ url: '/member/user/list' }) + } + + export const listMessage = async () => { + return await request.get({ url: '/member/user/list-message' }) + } \ No newline at end of file diff --git a/grailed_app/src/api/order/index.ts b/grailed_app/src/api/order/index.ts new file mode 100644 index 0000000..30e259c --- /dev/null +++ b/grailed_app/src/api/order/index.ts @@ -0,0 +1,10 @@ +import request from '@/config/axios'; + +export const pageOrder = (params: any) => { + return request.get({ 'url': '/member/task-record/page', params}) +} + + +export const submitOrder = (data: any) => { + return request.postOriginal({ 'url': '/member/task-record/submit-order', data}) +} \ No newline at end of file diff --git a/grailed_app/src/api/pages/index.ts b/grailed_app/src/api/pages/index.ts new file mode 100644 index 0000000..e34f513 --- /dev/null +++ b/grailed_app/src/api/pages/index.ts @@ -0,0 +1,5 @@ +import request from '@/config/axios' + +export const getH5Pages = async () => { + return await request.get({ url: '/member/app/config/get' }) +} \ No newline at end of file diff --git a/grailed_app/src/api/payOrder/index.ts b/grailed_app/src/api/payOrder/index.ts new file mode 100644 index 0000000..d698153 --- /dev/null +++ b/grailed_app/src/api/payOrder/index.ts @@ -0,0 +1,9 @@ +import request from '@/config/axios'; + +export const createPayOrder = (data: any) => { + return request.postOriginal({ 'url': '/member/pay-order/create', data}) +} + +export const getPayOrder = (id:string) => { + return request.get({ 'url': '/member/pay-order/get?id=' + id}) +} \ No newline at end of file diff --git a/grailed_app/src/api/service/index.ts b/grailed_app/src/api/service/index.ts new file mode 100644 index 0000000..6d79e21 --- /dev/null +++ b/grailed_app/src/api/service/index.ts @@ -0,0 +1,5 @@ +import request from '@/config/axios'; + +export const getCustomerService = () => { + return request.get({ 'url': '/member/user/service'}) +} diff --git a/grailed_app/src/api/settings/index.ts b/grailed_app/src/api/settings/index.ts new file mode 100644 index 0000000..7584db5 --- /dev/null +++ b/grailed_app/src/api/settings/index.ts @@ -0,0 +1,13 @@ +import request from '@/config/axios'; + +export const getUserExtension = () => { + return request.get({ 'url': '/member/user-extension/get'}) +} + +export const updateUserExtension = (data:any) => { + return request.put({ 'url': '/member/user-extension/update',data}) +} + +export const uploadAvatar = (data:any) => { + return request.postOriginal({url: '/infra/file/upload', data}) +} \ No newline at end of file diff --git a/grailed_app/src/api/start/index.ts b/grailed_app/src/api/start/index.ts new file mode 100644 index 0000000..e551856 --- /dev/null +++ b/grailed_app/src/api/start/index.ts @@ -0,0 +1,5 @@ +import request from '@/config/axios'; + +export const retrieveTask = () => { + return request.postOriginal({ 'url': '/member/task-record/retrieve-task'}) +} \ No newline at end of file diff --git a/grailed_app/src/api/user/index.ts b/grailed_app/src/api/user/index.ts new file mode 100644 index 0000000..c342d73 --- /dev/null +++ b/grailed_app/src/api/user/index.ts @@ -0,0 +1,22 @@ +import request from '@/config/axios'; + +export const getUserInfo = () => { + return request.get({ 'url': '/member/user/get'}) +} + +export const getUserDetails = () => { + return request.get({ 'url': '/member/user/details'}) +} + +export const getUserProfile = () => { + return request.get({ 'url': '/member/user/profile'}) +} + +export const getUserLevelInfo = () => { + return request.get({ 'url': '/member/user/level'}) +} + + +export const updateUserPassword = (data:any) => { + return request.postOriginal({ 'url': '/member/user/update-password', data}) +} \ No newline at end of file diff --git a/grailed_app/src/api/withdrawal/Index.ts b/grailed_app/src/api/withdrawal/Index.ts new file mode 100644 index 0000000..cd29073 --- /dev/null +++ b/grailed_app/src/api/withdrawal/Index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios'; + +export const checkBind = () => { + return request.getOriginal({ 'url': '/member/user-crypto/check-bind'}) +} + +export const bindCryptoAddress = (data:any) => { + return request.postOriginal({ 'url': '/member/user-crypto/create',data}) +} + + +export const createWithdrawal = (data:any) => { + return request.postOriginal({ 'url': '/member/withdrawal/create',data}) +} + + diff --git a/grailed_app/src/assets/css/main.css b/grailed_app/src/assets/css/main.css new file mode 100644 index 0000000..88216df --- /dev/null +++ b/grailed_app/src/assets/css/main.css @@ -0,0 +1,20 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.btn { + box-shadow: 0px 4px 12px 0px rgba(255, 119, 0, 0.25); + background: linear-gradient(90deg, #F70 0%, #FF4900 100%); + @apply rounded-2xl; + display: flex; +} + +.van-default-btn { + --van-button-radius: 16px; + --van-button-default-background: linear-gradient(90deg, #F70 0%, #FF4900 100%) +} + +.bg-theme { + background: #F7F8FA; +} + diff --git a/grailed_app/src/assets/icons/allow-down.svg b/grailed_app/src/assets/icons/allow-down.svg new file mode 100644 index 0000000..253505d --- /dev/null +++ b/grailed_app/src/assets/icons/allow-down.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/allow-left.svg b/grailed_app/src/assets/icons/allow-left.svg new file mode 100644 index 0000000..1bc9225 --- /dev/null +++ b/grailed_app/src/assets/icons/allow-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/angle-left-circle.svg b/grailed_app/src/assets/icons/angle-left-circle.svg new file mode 100644 index 0000000..c7fa2b7 --- /dev/null +++ b/grailed_app/src/assets/icons/angle-left-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/grailed_app/src/assets/icons/chatLess.svg b/grailed_app/src/assets/icons/chatLess.svg new file mode 100644 index 0000000..c527eaf --- /dev/null +++ b/grailed_app/src/assets/icons/chatLess.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/chevron-right.svg b/grailed_app/src/assets/icons/chevron-right.svg new file mode 100644 index 0000000..075cb41 --- /dev/null +++ b/grailed_app/src/assets/icons/chevron-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/click.svg b/grailed_app/src/assets/icons/click.svg new file mode 100644 index 0000000..1377d9f --- /dev/null +++ b/grailed_app/src/assets/icons/click.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/close.svg b/grailed_app/src/assets/icons/close.svg new file mode 100644 index 0000000..9995c70 --- /dev/null +++ b/grailed_app/src/assets/icons/close.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/copy-alt.svg b/grailed_app/src/assets/icons/copy-alt.svg new file mode 100644 index 0000000..37104a3 --- /dev/null +++ b/grailed_app/src/assets/icons/copy-alt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/grailed_app/src/assets/icons/daily/left.svg b/grailed_app/src/assets/icons/daily/left.svg new file mode 100644 index 0000000..1ac3d38 --- /dev/null +++ b/grailed_app/src/assets/icons/daily/left.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/daily/right.svg b/grailed_app/src/assets/icons/daily/right.svg new file mode 100644 index 0000000..3e58860 --- /dev/null +++ b/grailed_app/src/assets/icons/daily/right.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/dollar.svg b/grailed_app/src/assets/icons/dollar.svg new file mode 100644 index 0000000..5afa895 --- /dev/null +++ b/grailed_app/src/assets/icons/dollar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/home_selected.svg b/grailed_app/src/assets/icons/home_selected.svg new file mode 100644 index 0000000..c5c4182 --- /dev/null +++ b/grailed_app/src/assets/icons/home_selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/home_unselected.svg b/grailed_app/src/assets/icons/home_unselected.svg new file mode 100644 index 0000000..3339e20 --- /dev/null +++ b/grailed_app/src/assets/icons/home_unselected.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/keys.svg b/grailed_app/src/assets/icons/keys.svg new file mode 100644 index 0000000..0c09199 --- /dev/null +++ b/grailed_app/src/assets/icons/keys.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/lang_icon.svg b/grailed_app/src/assets/icons/lang_icon.svg new file mode 100644 index 0000000..9c1126f --- /dev/null +++ b/grailed_app/src/assets/icons/lang_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/order_selected.svg b/grailed_app/src/assets/icons/order_selected.svg new file mode 100644 index 0000000..7a09ce1 --- /dev/null +++ b/grailed_app/src/assets/icons/order_selected.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/order_unselected.svg b/grailed_app/src/assets/icons/order_unselected.svg new file mode 100644 index 0000000..35d183c --- /dev/null +++ b/grailed_app/src/assets/icons/order_unselected.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile/bell.svg b/grailed_app/src/assets/icons/profile/bell.svg new file mode 100644 index 0000000..60f07ee --- /dev/null +++ b/grailed_app/src/assets/icons/profile/bell.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile/profile-lv-0.svg b/grailed_app/src/assets/icons/profile/profile-lv-0.svg new file mode 100644 index 0000000..c0cb377 --- /dev/null +++ b/grailed_app/src/assets/icons/profile/profile-lv-0.svg @@ -0,0 +1,60 @@ + + + 编组 9备份 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LV.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile/question-mark-circle.svg b/grailed_app/src/assets/icons/profile/question-mark-circle.svg new file mode 100644 index 0000000..21e7948 --- /dev/null +++ b/grailed_app/src/assets/icons/profile/question-mark-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile/settings.svg b/grailed_app/src/assets/icons/profile/settings.svg new file mode 100644 index 0000000..a1e5569 --- /dev/null +++ b/grailed_app/src/assets/icons/profile/settings.svg @@ -0,0 +1,4 @@ + + + + diff --git a/grailed_app/src/assets/icons/profile/user-plus.svg b/grailed_app/src/assets/icons/profile/user-plus.svg new file mode 100644 index 0000000..9f9081e --- /dev/null +++ b/grailed_app/src/assets/icons/profile/user-plus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile_selected.svg b/grailed_app/src/assets/icons/profile_selected.svg new file mode 100644 index 0000000..0fbbd97 --- /dev/null +++ b/grailed_app/src/assets/icons/profile_selected.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/profile_unselected.svg b/grailed_app/src/assets/icons/profile_unselected.svg new file mode 100644 index 0000000..c7be54a --- /dev/null +++ b/grailed_app/src/assets/icons/profile_unselected.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/service_selected.svg b/grailed_app/src/assets/icons/service_selected.svg new file mode 100644 index 0000000..0f9c672 --- /dev/null +++ b/grailed_app/src/assets/icons/service_selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/service_unselected.svg b/grailed_app/src/assets/icons/service_unselected.svg new file mode 100644 index 0000000..0572186 --- /dev/null +++ b/grailed_app/src/assets/icons/service_unselected.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/about-icon.svg b/grailed_app/src/assets/icons/settings/about-icon.svg new file mode 100644 index 0000000..6828d90 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/about-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/arrow.svg b/grailed_app/src/assets/icons/settings/arrow.svg new file mode 100644 index 0000000..c17c311 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/arrow.svg @@ -0,0 +1,13 @@ + + + 编组 + + + + + + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/currency-dollar-icon.svg b/grailed_app/src/assets/icons/settings/currency-dollar-icon.svg new file mode 100644 index 0000000..401f105 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/currency-dollar-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/grailed_app/src/assets/icons/settings/globe-alt-icon.svg b/grailed_app/src/assets/icons/settings/globe-alt-icon.svg new file mode 100644 index 0000000..8c5d718 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/globe-alt-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/language-icon.svg b/grailed_app/src/assets/icons/settings/language-icon.svg new file mode 100644 index 0000000..8c5d718 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/language-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/logout-icon.svg b/grailed_app/src/assets/icons/settings/logout-icon.svg new file mode 100644 index 0000000..5ddbcba --- /dev/null +++ b/grailed_app/src/assets/icons/settings/logout-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/password-icon.svg b/grailed_app/src/assets/icons/settings/password-icon.svg new file mode 100644 index 0000000..945261b --- /dev/null +++ b/grailed_app/src/assets/icons/settings/password-icon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/settings/personal-icon.svg b/grailed_app/src/assets/icons/settings/personal-icon.svg new file mode 100644 index 0000000..a091218 --- /dev/null +++ b/grailed_app/src/assets/icons/settings/personal-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/grailed_app/src/assets/icons/settings/user-circle.svg b/grailed_app/src/assets/icons/settings/user-circle.svg new file mode 100644 index 0000000..4daea5d --- /dev/null +++ b/grailed_app/src/assets/icons/settings/user-circle.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/start_selected.svg b/grailed_app/src/assets/icons/start_selected.svg new file mode 100644 index 0000000..b5ffe32 --- /dev/null +++ b/grailed_app/src/assets/icons/start_selected.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/start_unselected.svg b/grailed_app/src/assets/icons/start_unselected.svg new file mode 100644 index 0000000..2436ebe --- /dev/null +++ b/grailed_app/src/assets/icons/start_unselected.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/vip.svg b/grailed_app/src/assets/icons/vip.svg new file mode 100644 index 0000000..ef73f01 --- /dev/null +++ b/grailed_app/src/assets/icons/vip.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/assets/icons/vip/vip0-icon.svg b/grailed_app/src/assets/icons/vip/vip0-icon.svg new file mode 100644 index 0000000..bc7d736 --- /dev/null +++ b/grailed_app/src/assets/icons/vip/vip0-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/vip/vip1-icon.svg b/grailed_app/src/assets/icons/vip/vip1-icon.svg new file mode 100644 index 0000000..6f72892 --- /dev/null +++ b/grailed_app/src/assets/icons/vip/vip1-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/vip/vip2-icon.svg b/grailed_app/src/assets/icons/vip/vip2-icon.svg new file mode 100644 index 0000000..be9b9f5 --- /dev/null +++ b/grailed_app/src/assets/icons/vip/vip2-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/vip/vip3-icon.svg b/grailed_app/src/assets/icons/vip/vip3-icon.svg new file mode 100644 index 0000000..bd1e73b --- /dev/null +++ b/grailed_app/src/assets/icons/vip/vip3-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/vip/vip4-icon.svg b/grailed_app/src/assets/icons/vip/vip4-icon.svg new file mode 100644 index 0000000..785855c --- /dev/null +++ b/grailed_app/src/assets/icons/vip/vip4-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/grailed_app/src/assets/icons/volume.svg b/grailed_app/src/assets/icons/volume.svg new file mode 100644 index 0000000..d2f839c --- /dev/null +++ b/grailed_app/src/assets/icons/volume.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/grailed_app/src/assets/imgs/avatar.jpg b/grailed_app/src/assets/imgs/avatar.jpg new file mode 100644 index 0000000..167d4f7 Binary files /dev/null and b/grailed_app/src/assets/imgs/avatar.jpg differ diff --git a/grailed_app/src/assets/imgs/customer.jpg b/grailed_app/src/assets/imgs/customer.jpg new file mode 100644 index 0000000..24eec33 Binary files /dev/null and b/grailed_app/src/assets/imgs/customer.jpg differ diff --git a/grailed_app/src/assets/imgs/daily/daily-check-bg.png b/grailed_app/src/assets/imgs/daily/daily-check-bg.png new file mode 100644 index 0000000..3f34e78 Binary files /dev/null and b/grailed_app/src/assets/imgs/daily/daily-check-bg.png differ diff --git a/grailed_app/src/assets/imgs/daily/daily-check-book.png b/grailed_app/src/assets/imgs/daily/daily-check-book.png new file mode 100644 index 0000000..e87f493 Binary files /dev/null and b/grailed_app/src/assets/imgs/daily/daily-check-book.png differ diff --git a/grailed_app/src/assets/imgs/home/aliexpress.png b/grailed_app/src/assets/imgs/home/aliexpress.png new file mode 100644 index 0000000..2002813 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/aliexpress.png differ diff --git a/grailed_app/src/assets/imgs/home/amazon.png b/grailed_app/src/assets/imgs/home/amazon.png new file mode 100644 index 0000000..11302b0 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/amazon.png differ diff --git a/grailed_app/src/assets/imgs/home/ebay.png b/grailed_app/src/assets/imgs/home/ebay.png new file mode 100644 index 0000000..20ecb7d Binary files /dev/null and b/grailed_app/src/assets/imgs/home/ebay.png differ diff --git a/grailed_app/src/assets/imgs/home/icon-about.png b/grailed_app/src/assets/imgs/home/icon-about.png new file mode 100644 index 0000000..0b6799c Binary files /dev/null and b/grailed_app/src/assets/imgs/home/icon-about.png differ diff --git a/grailed_app/src/assets/imgs/home/icon-faq.png b/grailed_app/src/assets/imgs/home/icon-faq.png new file mode 100644 index 0000000..8fca2e9 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/icon-faq.png differ diff --git a/grailed_app/src/assets/imgs/home/icon-invite.png b/grailed_app/src/assets/imgs/home/icon-invite.png new file mode 100644 index 0000000..6782051 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/icon-invite.png differ diff --git a/grailed_app/src/assets/imgs/home/icon-term.png b/grailed_app/src/assets/imgs/home/icon-term.png new file mode 100644 index 0000000..1c8c8f5 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/icon-term.png differ diff --git a/grailed_app/src/assets/imgs/home/manomano.png b/grailed_app/src/assets/imgs/home/manomano.png new file mode 100644 index 0000000..bd99f4b Binary files /dev/null and b/grailed_app/src/assets/imgs/home/manomano.png differ diff --git a/grailed_app/src/assets/imgs/home/onbuy.png b/grailed_app/src/assets/imgs/home/onbuy.png new file mode 100644 index 0000000..9b34ac9 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/onbuy.png differ diff --git a/grailed_app/src/assets/imgs/home/shopify.png b/grailed_app/src/assets/imgs/home/shopify.png new file mode 100644 index 0000000..248902b Binary files /dev/null and b/grailed_app/src/assets/imgs/home/shopify.png differ diff --git a/grailed_app/src/assets/imgs/home/tiktok.jpg b/grailed_app/src/assets/imgs/home/tiktok.jpg new file mode 100644 index 0000000..fade54d Binary files /dev/null and b/grailed_app/src/assets/imgs/home/tiktok.jpg differ diff --git a/grailed_app/src/assets/imgs/home/wish.png b/grailed_app/src/assets/imgs/home/wish.png new file mode 100644 index 0000000..f4d09ef Binary files /dev/null and b/grailed_app/src/assets/imgs/home/wish.png differ diff --git a/grailed_app/src/assets/imgs/home/zalando.png b/grailed_app/src/assets/imgs/home/zalando.png new file mode 100644 index 0000000..d50b376 Binary files /dev/null and b/grailed_app/src/assets/imgs/home/zalando.png differ diff --git a/grailed_app/src/assets/imgs/home_bg.png b/grailed_app/src/assets/imgs/home_bg.png new file mode 100644 index 0000000..e17f825 Binary files /dev/null and b/grailed_app/src/assets/imgs/home_bg.png differ diff --git a/grailed_app/src/assets/imgs/invitation_bg.png b/grailed_app/src/assets/imgs/invitation_bg.png new file mode 100644 index 0000000..2bdafe5 Binary files /dev/null and b/grailed_app/src/assets/imgs/invitation_bg.png differ diff --git a/grailed_app/src/assets/imgs/login/login-bg.png b/grailed_app/src/assets/imgs/login/login-bg.png new file mode 100644 index 0000000..fd06291 Binary files /dev/null and b/grailed_app/src/assets/imgs/login/login-bg.png differ diff --git a/grailed_app/src/assets/imgs/logo.png b/grailed_app/src/assets/imgs/logo.png new file mode 100644 index 0000000..b01f60f Binary files /dev/null and b/grailed_app/src/assets/imgs/logo.png differ diff --git a/grailed_app/src/assets/imgs/main/avatarBoy.png b/grailed_app/src/assets/imgs/main/avatarBoy.png new file mode 100644 index 0000000..7ab4ca9 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/avatarBoy.png differ diff --git a/grailed_app/src/assets/imgs/main/avatarGirl.png b/grailed_app/src/assets/imgs/main/avatarGirl.png new file mode 100644 index 0000000..2d57447 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/avatarGirl.png differ diff --git a/grailed_app/src/assets/imgs/main/home_selected.png b/grailed_app/src/assets/imgs/main/home_selected.png new file mode 100644 index 0000000..0dccbb5 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/home_selected.png differ diff --git a/grailed_app/src/assets/imgs/main/home_unselected.png b/grailed_app/src/assets/imgs/main/home_unselected.png new file mode 100644 index 0000000..bdae75c Binary files /dev/null and b/grailed_app/src/assets/imgs/main/home_unselected.png differ diff --git a/grailed_app/src/assets/imgs/main/order_selected.png b/grailed_app/src/assets/imgs/main/order_selected.png new file mode 100644 index 0000000..6edb48c Binary files /dev/null and b/grailed_app/src/assets/imgs/main/order_selected.png differ diff --git a/grailed_app/src/assets/imgs/main/order_unselected.png b/grailed_app/src/assets/imgs/main/order_unselected.png new file mode 100644 index 0000000..54be329 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/order_unselected.png differ diff --git a/grailed_app/src/assets/imgs/main/profile_selected.png b/grailed_app/src/assets/imgs/main/profile_selected.png new file mode 100644 index 0000000..fd91eeb Binary files /dev/null and b/grailed_app/src/assets/imgs/main/profile_selected.png differ diff --git a/grailed_app/src/assets/imgs/main/profile_unselected.png b/grailed_app/src/assets/imgs/main/profile_unselected.png new file mode 100644 index 0000000..0237411 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/profile_unselected.png differ diff --git a/grailed_app/src/assets/imgs/main/service_selected.png b/grailed_app/src/assets/imgs/main/service_selected.png new file mode 100644 index 0000000..53dd3f9 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/service_selected.png differ diff --git a/grailed_app/src/assets/imgs/main/service_unselected.png b/grailed_app/src/assets/imgs/main/service_unselected.png new file mode 100644 index 0000000..bc97c32 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/service_unselected.png differ diff --git a/grailed_app/src/assets/imgs/main/start_selected.png b/grailed_app/src/assets/imgs/main/start_selected.png new file mode 100644 index 0000000..eb14620 Binary files /dev/null and b/grailed_app/src/assets/imgs/main/start_selected.png differ diff --git a/grailed_app/src/assets/imgs/main/start_unselected.png b/grailed_app/src/assets/imgs/main/start_unselected.png new file mode 100644 index 0000000..d89808b Binary files /dev/null and b/grailed_app/src/assets/imgs/main/start_unselected.png differ diff --git a/grailed_app/src/assets/imgs/phone_border_bg.png b/grailed_app/src/assets/imgs/phone_border_bg.png new file mode 100644 index 0000000..6df13f5 Binary files /dev/null and b/grailed_app/src/assets/imgs/phone_border_bg.png differ diff --git a/grailed_app/src/assets/imgs/recharge.png b/grailed_app/src/assets/imgs/recharge.png new file mode 100644 index 0000000..716a37a Binary files /dev/null and b/grailed_app/src/assets/imgs/recharge.png differ diff --git a/grailed_app/src/assets/imgs/recharge/dollar-big.png b/grailed_app/src/assets/imgs/recharge/dollar-big.png new file mode 100644 index 0000000..8cdf243 Binary files /dev/null and b/grailed_app/src/assets/imgs/recharge/dollar-big.png differ diff --git a/grailed_app/src/assets/imgs/recharge/dollar-small.png b/grailed_app/src/assets/imgs/recharge/dollar-small.png new file mode 100644 index 0000000..709a917 Binary files /dev/null and b/grailed_app/src/assets/imgs/recharge/dollar-small.png differ diff --git a/grailed_app/src/assets/imgs/recharge/line.png b/grailed_app/src/assets/imgs/recharge/line.png new file mode 100644 index 0000000..a233ded Binary files /dev/null and b/grailed_app/src/assets/imgs/recharge/line.png differ diff --git a/grailed_app/src/assets/imgs/start/card-vip-bg.png b/grailed_app/src/assets/imgs/start/card-vip-bg.png new file mode 100644 index 0000000..a233ded Binary files /dev/null and b/grailed_app/src/assets/imgs/start/card-vip-bg.png differ diff --git a/grailed_app/src/assets/imgs/start/level1.png b/grailed_app/src/assets/imgs/start/level1.png new file mode 100644 index 0000000..85c643e Binary files /dev/null and b/grailed_app/src/assets/imgs/start/level1.png differ diff --git a/grailed_app/src/assets/imgs/start/level2.png b/grailed_app/src/assets/imgs/start/level2.png new file mode 100644 index 0000000..9505e39 Binary files /dev/null and b/grailed_app/src/assets/imgs/start/level2.png differ diff --git a/grailed_app/src/assets/imgs/start/level3.png b/grailed_app/src/assets/imgs/start/level3.png new file mode 100644 index 0000000..31f18be Binary files /dev/null and b/grailed_app/src/assets/imgs/start/level3.png differ diff --git a/grailed_app/src/assets/imgs/start/level4.png b/grailed_app/src/assets/imgs/start/level4.png new file mode 100644 index 0000000..a0b5a2e Binary files /dev/null and b/grailed_app/src/assets/imgs/start/level4.png differ diff --git a/grailed_app/src/assets/imgs/start/level5.png b/grailed_app/src/assets/imgs/start/level5.png new file mode 100644 index 0000000..40a1b36 Binary files /dev/null and b/grailed_app/src/assets/imgs/start/level5.png differ diff --git a/grailed_app/src/assets/imgs/sub-title-bg.png b/grailed_app/src/assets/imgs/sub-title-bg.png new file mode 100644 index 0000000..70c3272 Binary files /dev/null and b/grailed_app/src/assets/imgs/sub-title-bg.png differ diff --git a/grailed_app/src/assets/imgs/task-1.jpg b/grailed_app/src/assets/imgs/task-1.jpg new file mode 100644 index 0000000..c9d033a Binary files /dev/null and b/grailed_app/src/assets/imgs/task-1.jpg differ diff --git a/grailed_app/src/assets/imgs/whatsapp.png b/grailed_app/src/assets/imgs/whatsapp.png new file mode 100644 index 0000000..3ea0736 Binary files /dev/null and b/grailed_app/src/assets/imgs/whatsapp.png differ diff --git a/grailed_app/src/assets/imgs/withdraw.png b/grailed_app/src/assets/imgs/withdraw.png new file mode 100644 index 0000000..b3af695 Binary files /dev/null and b/grailed_app/src/assets/imgs/withdraw.png differ diff --git a/grailed_app/src/assets/logo/baltini-logo.webp b/grailed_app/src/assets/logo/baltini-logo.webp new file mode 100644 index 0000000..b1ff0f9 Binary files /dev/null and b/grailed_app/src/assets/logo/baltini-logo.webp differ diff --git a/grailed_app/src/assets/logo/luxe-logo.jpg b/grailed_app/src/assets/logo/luxe-logo.jpg new file mode 100644 index 0000000..dddeb05 Binary files /dev/null and b/grailed_app/src/assets/logo/luxe-logo.jpg differ diff --git a/grailed_app/src/assets/logo/luxlair-logo.jpg b/grailed_app/src/assets/logo/luxlair-logo.jpg new file mode 100644 index 0000000..b01f60f Binary files /dev/null and b/grailed_app/src/assets/logo/luxlair-logo.jpg differ diff --git a/grailed_app/src/assets/lottie/animation_loading.json b/grailed_app/src/assets/lottie/animation_loading.json new file mode 100644 index 0000000..44d9268 --- /dev/null +++ b/grailed_app/src/assets/lottie/animation_loading.json @@ -0,0 +1 @@ +{"nm":"Pre-comp 1","ddd":0,"h":800,"w":800,"meta":{"g":"@lottiefiles/toolkit-js 0.26.1"},"layers":[{"ty":0,"nm":"check_payment_animation","sr":1,"st":23,"op":385,"ip":227,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[321,242.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[422.875,340.062,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":642,"h":485,"refId":"comp_0","ind":1},{"ty":0,"nm":"check_payment_animation","sr":1,"st":23,"op":227,"ip":27,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[321,242.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[422.875,340.062,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":642,"h":485,"refId":"comp_0","ind":2},{"ty":4,"nm":"Shape Layer 3","sr":1,"st":350,"op":893,"ip":295,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-0.32,33.68,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[400,400,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":295},{"s":[100],"t":315}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[709.359,709.359],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"c":{"a":0,"k":[0.9686,0.9294,0.7294],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.9255,0.749],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-0.32,33.68],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":350,"op":893,"ip":27,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-0.32,33.68,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[400,400,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[709.359,709.359],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"c":{"a":0,"k":[0.9412,0.9137,0.7765],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8431,0.7961],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-0.32,33.68],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":1,"nm":"White Solid 2","sr":1,"st":0,"op":543,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[400,400,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"sc":"#ffffff","sh":800,"sw":800,"ind":5}],"v":"5.3.4","fr":60,"op":384,"ip":227,"assets":[{"nm":"","id":"comp_0","layers":[{"ty":4,"nm":"Layer 4 Outlines 25","sr":1,"st":245.333333333333,"op":292,"ip":282.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-160.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":245.333,"ti":[0,-0.16666667163372,0],"to":[0,-10.6666669845581,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":0.429},"s":[205.255,249.954,0],"t":265.333,"ti":[0,-9.59659862518311,0],"to":[0,0.05542818829417,0]},{"o":{"x":0.285,"y":0.058},"i":{"x":0.622,"y":0.959},"s":[205.255,266.814,0],"t":271.999,"ti":[0,-6.15572595596313,0],"to":[0,6.32175397872925,0]},{"o":{"x":0.33,"y":0.081},"i":{"x":0.663,"y":0.91},"s":[84.755,224.785,0],"t":277.999,"ti":[-0.29056045413017,-0.58872443437576,0],"to":[0,0.44536992907524,0]},{"o":{"x":0.268,"y":0.015},"i":{"x":0.663,"y":0.981},"s":[78.696,226.339,0],"t":278.667,"ti":[0.08333333581686,0,0],"to":[7.92828845977783,16.0640487670898,0]},{"o":{"x":0.268,"y":0.016},"i":{"x":0.663,"y":0.98},"s":[58.196,226.339,0],"t":279.333,"ti":[0.08333333581686,0,0],"to":[-0.08333333581686,0,0]},{"o":{"x":0.268,"y":0.017},"i":{"x":0.663,"y":0.979},"s":[29.196,224.339,0],"t":279.999,"ti":[0,0,0],"to":[-0.08333333581686,0,0]},{"o":{"x":0.268,"y":0.017},"i":{"x":0.663,"y":0.979},"s":[6.196,237.839,0],"t":280.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.02},"i":{"x":0.663,"y":0.975},"s":[-10.304,259.839,0],"t":281.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.023},"i":{"x":0.663,"y":0.972},"s":[-10.304,282.339,0],"t":281.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.028},"i":{"x":0.663,"y":0.965},"s":[-3.804,301.339,0],"t":282.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.071},"i":{"x":0.663,"y":0.91},"s":[8.696,311.839,0],"t":283.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.107},"i":{"x":0.663,"y":0.865},"s":[13.196,316.339,0],"t":283.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.03},"i":{"x":0.663,"y":0.962},"s":[16.196,319.339,0],"t":284.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.018},"i":{"x":0.663,"y":0.978},"s":[27.196,329.839,0],"t":285.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.03},"i":{"x":0.663,"y":0.962},"s":[46.196,347.339,0],"t":285.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.011},"i":{"x":0.663,"y":0.986},"s":[57.696,357.339,0],"t":286.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.019},"i":{"x":0.663,"y":0.977},"s":[87.196,384.339,0],"t":287.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.009},"i":{"x":0.663,"y":0.989},"s":[101.196,364.339,0],"t":287.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.011},"i":{"x":0.663,"y":0.986},"s":[131.696,321.839,0],"t":288.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.012},"i":{"x":0.663,"y":0.985},"s":[155.696,288.839,0],"t":289.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.021},"i":{"x":0.663,"y":0.974},"s":[177.696,257.339,0],"t":289.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.027},"i":{"x":0.663,"y":0.966},"s":[190.196,239.339,0],"t":290.667,"ti":[0,0,0],"to":[0,0,0]},{"s":[199.696,225.339,0],"t":291.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 4 Outlines 22","sr":1,"st":245.333333333333,"op":282.666666666667,"ip":245.333333333333,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-160.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":245.333,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.994,"y":0},"s":[205.255,294.954,0],"t":265.333,"ti":[0,0,0],"to":[0,0.05542818829417,0]},{"o":{"x":0.285,"y":0.053},"i":{"x":0.833,"y":0.833},"s":[205.255,294.814,0],"t":271.999,"ti":[0,-6.15572595596313,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.663,"y":0.91},"s":[84.755,224.785,0],"t":277.999,"ti":[-0.29056045413017,-0.58872443437576,0],"to":[0,0.44536992907524,0]},{"o":{"x":0.268,"y":0.015},"i":{"x":0.663,"y":0.981},"s":[78.696,226.339,0],"t":278.667,"ti":[0.08333333581686,0,0],"to":[7.92828845977783,16.0640487670898,0]},{"o":{"x":0.268,"y":0.016},"i":{"x":0.663,"y":0.98},"s":[58.196,226.339,0],"t":279.333,"ti":[0.08333333581686,0,0],"to":[-0.08333333581686,0,0]},{"o":{"x":0.268,"y":0.017},"i":{"x":0.663,"y":0.979},"s":[29.196,224.339,0],"t":279.999,"ti":[0,0,0],"to":[-0.08333333581686,0,0]},{"o":{"x":0.268,"y":0.017},"i":{"x":0.663,"y":0.979},"s":[6.196,237.839,0],"t":280.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.02},"i":{"x":0.663,"y":0.975},"s":[-10.304,259.839,0],"t":281.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.023},"i":{"x":0.663,"y":0.972},"s":[-10.304,282.339,0],"t":281.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.028},"i":{"x":0.663,"y":0.965},"s":[-3.804,301.339,0],"t":282.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.071},"i":{"x":0.663,"y":0.91},"s":[8.696,311.839,0],"t":283.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.107},"i":{"x":0.663,"y":0.865},"s":[13.196,316.339,0],"t":283.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.03},"i":{"x":0.663,"y":0.962},"s":[16.196,319.339,0],"t":284.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.018},"i":{"x":0.663,"y":0.978},"s":[27.196,329.839,0],"t":285.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.03},"i":{"x":0.663,"y":0.962},"s":[46.196,347.339,0],"t":285.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.011},"i":{"x":0.663,"y":0.986},"s":[57.696,357.339,0],"t":286.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.019},"i":{"x":0.663,"y":0.977},"s":[87.196,384.339,0],"t":287.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.009},"i":{"x":0.663,"y":0.989},"s":[101.196,364.339,0],"t":287.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.011},"i":{"x":0.663,"y":0.986},"s":[131.696,321.839,0],"t":288.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.012},"i":{"x":0.663,"y":0.985},"s":[155.696,288.839,0],"t":289.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.021},"i":{"x":0.663,"y":0.974},"s":[177.696,257.339,0],"t":289.999,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.268,"y":0.027},"i":{"x":0.663,"y":0.966},"s":[190.196,239.339,0],"t":290.667,"ti":[0,0,0],"to":[0,0,0]},{"s":[199.696,225.339,0],"t":291.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 4 Outlines 24","sr":1,"st":234.333333333333,"op":281.333333333333,"ip":280.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":234.333,"ti":[0,0,0],"to":[0,-10.6666669845581,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":0.811},"s":[205.255,249.954,0],"t":254.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.056,"y":0.006},"i":{"x":0.433,"y":0.997},"s":[205.255,312.505,0],"t":271.999,"ti":[0,-0.40821945667267,0],"to":[0,0,0]},{"o":{"x":0.326,"y":0.003},"i":{"x":0.66,"y":0.578},"s":[130.755,230.516,0],"t":277.999,"ti":[2.56150102615356,-1.59102714061737,0],"to":[0,0.01370741985738,0]},{"o":{"x":0.327,"y":0.193},"i":{"x":0.661,"y":0.67},"s":[123.977,233.368,0],"t":278.667,"ti":[3.36382031440735,-3.58092260360718,0],"to":[-2.66702198982239,1.656569480896,0]},{"o":{"x":0.328,"y":0.237},"i":{"x":0.661,"y":0.697},"s":[110.957,241.658,0],"t":279.333,"ti":[1.83116698265076,-6.07371520996094,0],"to":[-3.50803017616272,3.73443961143494,0]},{"o":{"x":0.328,"y":0.214},"i":{"x":0.662,"y":0.757},"s":[96.466,256.287,0],"t":279.999,"ti":[-1.94483041763306,-7.59870052337646,0],"to":[-1.64515018463135,5.45672416687012,0]},{"o":{"x":0.329,"y":0.336},"i":{"x":0.662,"y":0.652},"s":[89.73,283.81,0],"t":280.667,"ti":[-4.47444581985474,-6.74039697647095,0],"to":[1.47180926799774,5.75054693222046,0]},{"o":{"x":0.329,"y":0.335},"i":{"x":0.663,"y":0.685},"s":[99.207,301.434,0],"t":281.333,"ti":[-5.35169839859009,-5.08138418197632,0],"to":[3.35669493675232,5.05659437179565,0]},{"o":{"x":0.33,"y":0.349},"i":{"x":0.663,"y":0.698},"s":[112.413,316.879,0],"t":281.999,"ti":[-4.78884363174438,-4.17844104766846,0],"to":[3.96704339981079,3.76666831970215,0]},{"o":{"x":0.33,"y":0.334},"i":{"x":0.663,"y":0.744},"s":[125.605,329.153,0],"t":282.667,"ti":[-3.72971606254578,-3.30904006958008,0],"to":[3.41378259658813,2.97864985466003,0]},{"o":{"x":0.33,"y":0.387},"i":{"x":0.664,"y":0.801},"s":[137.342,339.962,0],"t":283.333,"ti":[-2.29979348182678,-2.09236240386963,0],"to":[2.48172068595886,2.20180630683899,0]},{"o":{"x":0.331,"y":0.271},"i":{"x":0.664,"y":0.904},"s":[144.649,347.311,0],"t":283.999,"ti":[-1.02794086933136,-1.0549943447113,0],"to":[0.90019869804382,0.81900483369827,0]},{"o":{"x":0.331,"y":0.056},"i":{"x":0.664,"y":0.626},"s":[150.019,352.586,0],"t":284.667,"ti":[-2.09155249595642,-1.60987508296967,0],"to":[2.07172846794128,2.12625241279602,0]},{"o":{"x":0.331,"y":0.186},"i":{"x":0.664,"y":0.695},"s":[159.265,361.184,0],"t":285.333,"ti":[-5.62169885635376,-0.91021633148193,0],"to":[5.59368419647217,4.30547761917114,0]},{"o":{"x":0.331,"y":0.551},"i":{"x":0.665,"y":0.286},"s":[177.103,378.372,0],"t":285.999,"ti":[-8.20918941497803,5.17926931381226,0],"to":[8.36123466491699,1.3537780046463,0]},{"o":{"x":0.331,"y":0.329},"i":{"x":0.665,"y":0.604},"s":[185.5,384.132,0],"t":286.667,"ti":[-8.30804920196533,9.35090446472168,0],"to":[7.49147129058838,-4.72645282745361,0]},{"o":{"x":0.332,"y":0.334},"i":{"x":0.665,"y":0.639},"s":[201.868,360.035,0],"t":287.333,"ti":[-8.02160263061523,10.2005262374878,0],"to":[7.30087184906006,-8.2173023223877,0]},{"o":{"x":0.332,"y":0.338},"i":{"x":0.665,"y":0.664},"s":[222.049,332.109,0],"t":287.999,"ti":[-7.65374803543091,10.0889024734497,0],"to":[7.37732362747192,-9.38124084472656,0]},{"o":{"x":0.332,"y":0.353},"i":{"x":0.665,"y":0.681},"s":[243.804,302.672,0],"t":288.667,"ti":[-6.79135990142822,9.19332218170166,0],"to":[7.09677982330322,-9.35472583770752,0]},{"o":{"x":0.332,"y":0.374},"i":{"x":0.665,"y":0.702},"s":[263.839,274.665,0],"t":289.333,"ti":[-5.4688138961792,7.58325052261353,0],"to":[6.12149000167847,-8.28653335571289,0]},{"o":{"x":0.332,"y":0.409},"i":{"x":0.666,"y":0.744},"s":[280.462,250.724,0],"t":289.999,"ti":[-3.73128199577332,5.35755014419556,0],"to":[4.42838191986084,-6.14055061340332,0]},{"o":{"x":0.332,"y":0.549},"i":{"x":0.666,"y":0.927},"s":[292.611,233.405,0],"t":290.667,"ti":[-1.41946864128113,2.52759385108948,0],"to":[1.95125246047974,-2.80170011520386,0]},{"o":{"x":0.346,"y":0.192},"i":{"x":0.728,"y":1},"s":[298.226,225.401,0],"t":291.333,"ti":[0,-0.13291814923286,0],"to":[10.2431058883667,-18.2395114898682,0]},{"s":[205.255,314.954,0],"t":314.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Layer 4 Outlines 21","sr":1,"st":234.333333333333,"op":280.666666666667,"ip":245.333333333333,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":234.333,"ti":[0,0.24155279994011,0],"to":[0,-3.41666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":0.367},"s":[205.255,293.454,0],"t":253.999,"ti":[0,0,0],"to":[0,-0.24155279994011,0]},{"o":{"x":0.056,"y":0.006},"i":{"x":0.833,"y":0.833},"s":[205.255,312.505,0],"t":271.999,"ti":[0,-0.40821945667267,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.66,"y":0.578},"s":[130.755,230.516,0],"t":277.999,"ti":[2.56150102615356,-1.59102714061737,0],"to":[0,0.01370741985738,0]},{"o":{"x":0.327,"y":0.193},"i":{"x":0.661,"y":0.67},"s":[123.977,233.368,0],"t":278.667,"ti":[3.36382031440735,-3.58092260360718,0],"to":[-2.66702198982239,1.656569480896,0]},{"o":{"x":0.328,"y":0.237},"i":{"x":0.661,"y":0.697},"s":[110.957,241.658,0],"t":279.333,"ti":[1.83116698265076,-6.07371520996094,0],"to":[-3.50803017616272,3.73443961143494,0]},{"o":{"x":0.328,"y":0.271},"i":{"x":0.662,"y":0.693},"s":[96.466,256.287,0],"t":279.999,"ti":[-1.94483041763306,-7.59870052337646,0],"to":[-1.64515018463135,5.45672416687012,0]},{"o":{"x":0.329,"y":0.279},"i":{"x":0.662,"y":0.711},"s":[92.73,278.31,0],"t":280.667,"ti":[-4.47444581985474,-6.74039697647095,0],"to":[1.47180926799774,5.75054693222046,0]},{"o":{"x":0.329,"y":0.335},"i":{"x":0.663,"y":0.685},"s":[99.207,301.434,0],"t":281.333,"ti":[-5.35169839859009,-5.08138418197632,0],"to":[3.35669493675232,5.05659437179565,0]},{"o":{"x":0.33,"y":0.349},"i":{"x":0.663,"y":0.698},"s":[112.413,316.879,0],"t":281.999,"ti":[-4.78884363174438,-4.17844104766846,0],"to":[3.96704339981079,3.76666831970215,0]},{"o":{"x":0.33,"y":0.334},"i":{"x":0.663,"y":0.744},"s":[125.605,329.153,0],"t":282.667,"ti":[-3.72971606254578,-3.30904006958008,0],"to":[3.41378259658813,2.97864985466003,0]},{"o":{"x":0.33,"y":0.387},"i":{"x":0.664,"y":0.801},"s":[137.342,339.962,0],"t":283.333,"ti":[-2.29979348182678,-2.09236240386963,0],"to":[2.48172068595886,2.20180630683899,0]},{"o":{"x":0.331,"y":0.271},"i":{"x":0.664,"y":0.904},"s":[144.649,347.311,0],"t":283.999,"ti":[-1.02794086933136,-1.0549943447113,0],"to":[0.90019869804382,0.81900483369827,0]},{"o":{"x":0.331,"y":0.056},"i":{"x":0.664,"y":0.626},"s":[150.019,352.586,0],"t":284.667,"ti":[-2.09155249595642,-1.60987508296967,0],"to":[2.07172846794128,2.12625241279602,0]},{"o":{"x":0.331,"y":0.186},"i":{"x":0.664,"y":0.695},"s":[159.265,361.184,0],"t":285.333,"ti":[-5.62169885635376,-0.91021633148193,0],"to":[5.59368419647217,4.30547761917114,0]},{"o":{"x":0.331,"y":0.551},"i":{"x":0.665,"y":0.286},"s":[177.103,378.372,0],"t":285.999,"ti":[-8.20918941497803,5.17926931381226,0],"to":[8.36123466491699,1.3537780046463,0]},{"o":{"x":0.331,"y":0.329},"i":{"x":0.665,"y":0.604},"s":[185.5,384.132,0],"t":286.667,"ti":[-8.30804920196533,9.35090446472168,0],"to":[7.49147129058838,-4.72645282745361,0]},{"o":{"x":0.332,"y":0.334},"i":{"x":0.665,"y":0.639},"s":[201.868,360.035,0],"t":287.333,"ti":[-8.02160263061523,10.2005262374878,0],"to":[7.30087184906006,-8.2173023223877,0]},{"o":{"x":0.332,"y":0.338},"i":{"x":0.665,"y":0.664},"s":[222.049,332.109,0],"t":287.999,"ti":[-7.65374803543091,10.0889024734497,0],"to":[7.37732362747192,-9.38124084472656,0]},{"o":{"x":0.332,"y":0.353},"i":{"x":0.665,"y":0.681},"s":[243.804,302.672,0],"t":288.667,"ti":[-6.79135990142822,9.19332218170166,0],"to":[7.09677982330322,-9.35472583770752,0]},{"o":{"x":0.332,"y":0.374},"i":{"x":0.665,"y":0.702},"s":[263.839,274.665,0],"t":289.333,"ti":[-5.4688138961792,7.58325052261353,0],"to":[6.12149000167847,-8.28653335571289,0]},{"o":{"x":0.332,"y":0.409},"i":{"x":0.666,"y":0.744},"s":[280.462,250.724,0],"t":289.999,"ti":[-3.73128199577332,5.35755014419556,0],"to":[4.42838191986084,-6.14055061340332,0]},{"o":{"x":0.332,"y":0.549},"i":{"x":0.666,"y":0.927},"s":[292.611,233.405,0],"t":290.667,"ti":[-1.41946864128113,2.52759385108948,0],"to":[1.95125246047974,-2.80170011520386,0]},{"o":{"x":0.346,"y":0.192},"i":{"x":0.728,"y":1},"s":[298.226,225.401,0],"t":291.333,"ti":[0,-0.13291814923286,0],"to":[10.2431058883667,-18.2395114898682,0]},{"s":[205.255,314.954,0],"t":314.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Layer 4 Outlines 23","sr":1,"st":225.333333333333,"op":282.666666666667,"ip":278,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":225.333,"ti":[0,-0.16666667163372,0],"to":[0,-10.6666669845581,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,249.954,0],"t":245.333,"ti":[0,0,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":0.429},"s":[205.255,314.954,0],"t":265.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0.171},"i":{"x":0.667,"y":0.829},"s":[205.255,298.095,0],"t":271.999,"ti":[9.57908153533936,-21.8140392303467,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0.149},"i":{"x":0.667,"y":0.494},"s":[181.255,266.095,0],"t":277.999,"ti":[-0.53821212053299,-2.51872634887695,0],"to":[-0.75234544277191,1.71328449249268,0]},{"o":{"x":0.333,"y":0.258},"i":{"x":0.667,"y":0.6},"s":[180.985,272.482,0],"t":278.667,"ti":[-2.52326774597168,-4.38565540313721,0],"to":[0.70678544044495,3.30761623382568,0]},{"s":[185.946,284.111,0],"t":279.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5},{"ty":4,"nm":"Layer 4 Outlines 20","sr":1,"st":225.333333333333,"op":278,"ip":245.333333333333,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":225.333,"ti":[0,-0.16666667163372,0],"to":[0,-3.16666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.954,0],"t":245.333,"ti":[0,0,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":0.429},"s":[205.255,314.954,0],"t":265.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0.171},"i":{"x":0.833,"y":0.833},"s":[205.255,298.095,0],"t":271.999,"ti":[9.57908153533936,-21.8140392303467,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":0.939},"s":[181.255,266.095,0],"t":277.999,"ti":[0,0,0],"to":[-9.79601573944092,22.3080539703369,0]},{"o":{"x":0.333,"y":0.049},"i":{"x":0.667,"y":0.951},"s":[279.755,385.595,0],"t":284.667,"ti":[0,0,0],"to":[0,0,0]},{"s":[394.755,225.595,0],"t":291.333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":0,"nm":"Layer 1 Outlines Comp 1","sr":1,"st":278.666666666667,"op":368,"ip":282.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[321,242.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[321,242.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[91,270.5],[102.835,257.394],[117.055,241.647],[137.221,219.316],[151.78,203.193],[165.5,188]]}],"t":282.667},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[147.5,351.5],[159.653,337.44],[174.254,320.549],[194.961,296.594],[209.912,279.298],[224,263]]}],"t":283.333},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[156,362.5],[170.298,349.314],[187.475,333.473],[211.837,311.006],[229.426,294.785],[246,279.5]]}],"t":284.001},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[159.5,365],[173.639,351.894],[190.626,336.147],[214.717,313.816],[232.11,297.693],[248.5,282.5]]}],"t":284.667},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[170.5,373],[185.274,359.973],[203.025,344.322],[228.198,322.126],[246.373,306.101],[263.5,291]]}],"t":285.333},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[209.265,377.45],[225.202,362.372],[247.804,340.988],[264.123,325.549],[279.5,311]]}],"t":286.001},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.305,386.573],[234.737,370.181],[258.041,346.935],[274.866,330.151],[279.5,311]]}],"t":286.667},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.305,386.573],[242.593,406.685],[288.228,351.256],[272.488,334.409],[279.5,311]]}],"t":287.001},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.305,386.573],[315.213,446.714],[333.86,384.885],[273.366,334.401],[279.5,311]]}],"t":288.001},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.305,386.573],[315.213,446.714],[365.61,357.385],[291.866,305.401],[279.5,311]]}],"t":288.667},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.306,386.573],[315.213,446.714],[393.36,325.635],[313.866,266.651],[279.5,311]]}],"t":289.333},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.306,386.573],[315.213,446.714],[413.61,296.885],[330.116,222.151],[279.5,311]]}],"t":290.001},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.306,386.573],[315.213,446.714],[436.36,273.385],[343.866,206.651],[279.5,311]]}],"t":290.667},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.306,386.573],[315.213,446.714],[424.683,256.649],[349.006,197.875],[279.5,311]]}],"t":291.001},{"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109,179],[57,211],[196,390],[218.306,386.573],[315.213,446.714],[461.183,185.774],[349.006,197.875],[279.5,311]]}],"t":292.000651041667}],"ix":1}}],"w":642,"h":485,"refId":"comp_1","ind":7},{"ty":4,"nm":"Layer 4 Outlines 27","sr":1,"st":233.666666666667,"op":245.333333333333,"ip":234,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":233.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,293.954,0],"t":254.001,"ti":[0,2.66666674613953,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":273.667,"ti":[0,0,0],"to":[0,-2.66666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,277.954,0],"t":294.001,"ti":[0,-6.16666650772095,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":313.666666666667}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8},{"ty":4,"nm":"Layer 4 Outlines 26","sr":1,"st":224.666666666667,"op":245.333333333333,"ip":224.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":224.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,293.954,0],"t":244.667,"ti":[0,2.75,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":264.667,"ti":[0,0,0],"to":[0,-2.75,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,277.454,0],"t":284.667,"ti":[0,-6.25,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":304.666666666667}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9},{"ty":4,"nm":"Layer 4 Outlines 14","sr":1,"st":164.666666666667,"op":245.333333333333,"ip":164.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-160.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":164.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.25,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":184.667,"ti":[0,0,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":204.667,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":224.667,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":244.666666666667}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Layer 4 Outlines 19","sr":1,"st":153.666666666667,"op":234.666666666667,"ip":153.333333333333,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":153.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.16666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.954,0],"t":174.001,"ti":[0,0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":193.667,"ti":[0,0,0],"to":[0,-0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":214.001,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":233.666666666667}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Layer 4 Outlines 18","sr":1,"st":144.666666666667,"op":225.333333333333,"ip":144.666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":144.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,293.954,0],"t":164.667,"ti":[0,-0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":184.667,"ti":[0,0,0],"to":[0,0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":204.667,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":224.666666666667}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"Layer 4 Outlines 30","sr":1,"st":84,"op":164.666666666667,"ip":84,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-160.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":84,"ti":[0,-0.16666667163372,0],"to":[0,-3.25,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":104,"ti":[0,0,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":124,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":144,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":164}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13},{"ty":4,"nm":"Layer 4 Outlines 29","sr":1,"st":73,"op":154,"ip":72.6666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":73,"ti":[0,-0.16666667163372,0],"to":[0,-3.16666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.954,0],"t":93.334,"ti":[0,0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":113,"ti":[0,0,0],"to":[0,-0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":133.334,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":153}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":14},{"ty":4,"nm":"Layer 4 Outlines 28","sr":1,"st":64,"op":144.666666666667,"ip":64,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":64,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,293.954,0],"t":84,"ti":[0,-0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":104,"ti":[0,0,0],"to":[0,0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":124,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":144}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":15},{"ty":4,"nm":"Layer 4 Outlines 33","sr":1,"st":3.33333333333333,"op":84,"ip":3.33333333333333,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-160.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":3.333,"ti":[0,-0.16666667163372,0],"to":[0,-3.25,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":23.333,"ti":[0,0,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":43.333,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":63.333,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":83.3333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":16},{"ty":4,"nm":"Layer 4 Outlines 32","sr":1,"st":-7.66666666666667,"op":73.3333333333333,"ip":-8,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.665,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":-7.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.16666674613953,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.954,0],"t":12.667,"ti":[0,0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":32.333,"ti":[0,0,0],"to":[0,-0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":52.667,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":72.3333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":17},{"ty":4,"nm":"Layer 4 Outlines 31","sr":1,"st":-16.6666666666667,"op":64,"ip":-16.6666666666667,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.335,452.918,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,313.954,0],"t":-16.667,"ti":[0,-0.16666667163372,0],"to":[0,-3.33333325386047,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,293.954,0],"t":3.333,"ti":[0,-0.08333333581686,0],"to":[0,0.16666667163372,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,314.954,0],"t":23.333,"ti":[0,0,0],"to":[0,0.08333333581686,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[205.255,294.454,0],"t":43.333,"ti":[0,-3.41666674613953,0],"to":[0,0,0]},{"s":[205.255,314.954,0],"t":63.3333333333333}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.369]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,452.632],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":18}]},{"nm":"","id":"comp_1","layers":[{"ty":4,"nm":"Layer 1 Outlines","sr":1,"st":0,"op":89.3333333333333,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[320.6,242.001,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[492.6,438.001,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-42.392,97.443],[76.476,-69.546],[20.655,-97.443],[-76.476,37.424]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[172.862,111.975],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-18.971,-59.038],[58.258,12.786],[16.337,59.038],[-58.257,-10.469]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[72.212,154.589],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.326,0],[0,17.325],[-17.324,0]],"o":[[0,17.325],[-17.324,0],[0,-17.325],[17.326,0]],"v":[[31.369,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.37]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[219.979,31.37],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.326,0],[0,17.325],[-17.324,0]],"o":[[0,17.325],[-17.324,0],[0,-17.325],[17.326,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.37]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[107.189,188.396],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 5","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.325],[17.325,0],[0,17.325],[-17.325,0]],"o":[[0,17.325],[-17.325,0],[0,-17.325],[17.325,0]],"v":[[31.37,0],[-0.001,31.37],[-31.37,0],[-0.001,-31.37]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[31.37,118.029],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1}]}]} \ No newline at end of file diff --git a/grailed_app/src/assets/lottie/animation_success.json b/grailed_app/src/assets/lottie/animation_success.json new file mode 100644 index 0000000..7f7c9de --- /dev/null +++ b/grailed_app/src/assets/lottie/animation_success.json @@ -0,0 +1 @@ +{"nm":"Gpay Tick","ddd":0,"h":1920,"w":1920,"meta":{"g":"LottieFiles AE 0.1.20","tc":"#ffffff"},"layers":[{"ty":4,"nm":"Tick","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[278.033,227.218,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[20,20,100],"t":30},{"s":[100,100,100],"t":60}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[346.916,346.917,0],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-99],"t":30},{"s":[0],"t":60}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":4},{"s":[100],"t":32}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-153.033,0.588],[-51.404,102.218],[153.032,-102.218]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[278.033,227.218],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.67,"y":0},"i":{"x":0.33,"y":1},"s":[0],"t":31},{"s":[100],"t":60}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":1,"parent":4},{"ty":4,"nm":"Glow Mask","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[346.917,346.917,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[20,20,100],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[110,110,100],"t":60},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[95,95,100],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[102,102,100],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[98,98,100],"t":100},{"s":[100,100,100],"t":110}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.506,"y":0},"i":{"x":0.783,"y":0.496},"s":[1099.01,1187.835,0],"t":0,"ti":[23.519,29.424,0],"to":[-51.058,-20.951,0]},{"o":{"x":0.337,"y":0.495},"i":{"x":0.576,"y":1},"s":[989.155,1114.015,0],"t":30,"ti":[3.563,56.649,0],"to":[-26.997,-33.775,0]},{"s":[947.01,981.835,0],"t":50}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":4},{"s":[100],"t":32}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-191.459],[191.459,0],[0,191.458],[-191.458,0]],"o":[[0,191.458],[-191.458,0],[0,-191.459],[191.459,0]],"v":[[346.667,0],[0,346.667],[-346.667,0],[0,-346.666]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1176,0.4431,0.9294],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[346.916,346.917],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Glow","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.788},"s":[56,440,0],"t":94,"ti":[-226.667,-131.333,0],"to":[226.667,131.333,0]},{"s":[1416,1228,0],"t":140}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.643},"s":[100],"t":110},{"s":[0],"t":140}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[348.655,1.947],[0,0],[35.647,880.072]],"o":[[0,0],[-8.868,-0.049],[0,0],[-3.819,-94.283]],"v":[[211.999,-440],[-480,280],[-136,648],[483.999,-312]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.7882,0.8275,0.9373],"ix":4},"r":1,"o":{"a":0,"k":30,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Background Circle (Blue)","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[346.917,346.917,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[20,20,100],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[110,110,100],"t":60},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[95,95,100],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[102,102,100],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[98,98,100],"t":100},{"s":[100,100,100],"t":110}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.506,"y":0},"i":{"x":0.783,"y":0.496},"s":[1099.01,1187.835,0],"t":0,"ti":[23.519,29.424,0],"to":[-51.058,-20.951,0]},{"o":{"x":0.337,"y":0.495},"i":{"x":0.576,"y":1},"s":[989.155,1114.015,0],"t":30,"ti":[3.563,56.649,0],"to":[-26.997,-33.775,0]},{"s":[947.01,981.835,0],"t":50}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":4},{"s":[100],"t":32}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-191.459],[191.459,0],[0,191.458],[-191.458,0]],"o":[[0,191.458],[-191.458,0],[0,-191.459],[191.459,0]],"v":[[346.667,0],[0,346.667],[-346.667,0],[0,-346.666]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[346.916,346.917],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Background(Blue)","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[346.917,346.917,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.67,"y":0},"i":{"x":0.33,"y":1},"s":[100,100,100],"t":0},{"o":{"x":0.67,"y":0},"i":{"x":0.33,"y":1},"s":[148,148,100],"t":60},{"s":[88,88,100],"t":110}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[346.917,346.917,0],"t":30,"ti":[0,0,0],"to":[0,0,0]},{"s":[346.917,346.917,0],"t":49}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[20],"t":4},{"s":[20],"t":32}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-191.459],[191.459,0],[0,191.458],[-191.458,0]],"o":[[0,191.458],[-191.458,0],[0,-191.459],[191.459,0]],"v":[[346.667,0],[0,346.667],[-346.667,0],[0,-346.666]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9922,0.3294,0.0039],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[346.916,346.917],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":4},{"ty":4,"nm":"Element 11","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[88.379,84.132,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.174,"y":0},"i":{"x":0.33,"y":1},"s":[1088.545,1185.048,0],"t":10,"ti":[34.333,-69,0],"to":[-154.333,61,0]},{"s":[774.545,1455.048,0],"t":42}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-17.539,13.457],[-12.743,-16.607],[0,0]],"o":[[-12.743,-16.608],[17.539,-13.458],[0,0],[0,0]],"v":[[-25.635,34.132],[-16.894,-20.673],[38.306,-14.931],[38.379,-14.837]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"c":{"a":0,"k":[0.6039,0.6392,0.7686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[88.378,84.131],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":4,"nm":"Element 10","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.514,41.664,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.229,"y":0},"i":{"x":0.33,"y":1},"s":[1088.113,1187.051,0],"t":10,"ti":[-71.667,-48,0],"to":[37.667,40,0]},{"s":[1314.113,1427.051,0],"t":46}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[3.281,-1.895],[0,0],[1.894,3.281],[0,0],[-3.281,1.894],[0,0],[-1.894,-3.282],[0,0]],"o":[[0,0],[-3.281,1.894],[0,0],[-1.894,-3.283],[0,0],[3.281,-1.895],[0,0],[1.894,3.281]],"v":[[28.859,29.055],[10.732,39.52],[1.361,37.009],[-31.37,-19.681],[-28.859,-29.053],[-10.732,-39.519],[-1.361,-37.008],[31.37,19.683]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.4863,0.1255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[33.514,41.664],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7},{"ty":4,"nm":"Element 9","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60.548,78.82,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.189,"y":0},"i":{"x":0.33,"y":1},"s":[1106.768,1189.936,0],"t":10,"ti":[-62.333,-30.333,0],"to":[70.333,-5.667,0]},{"s":[1420.768,1239.936,0],"t":43}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[2.886,-21.917],[20.753,2.734],[0.039,0.005]],"o":[[20.754,2.733],[-2.886,21.918],[-0.04,-0.005],[0,0]],"v":[[-12.409,-41.32],[20.162,3.615],[-22.93,38.586],[-23.048,38.571]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"c":{"a":0,"k":[0.8706,0.2471,0.2471],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60.548,78.82],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8},{"ty":4,"nm":"Element 8","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.326,47.325,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.263,"y":0},"i":{"x":0.33,"y":1},"s":[1095.413,1171.271,0],"t":10,"ti":[-98.333,51.667,0],"to":[46.333,-81.667,0]},{"s":[1397.413,873.271,0],"t":68}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-11.644,-3.948],[0,0],[-3.912,2.92],[0,0],[0.157,-12.294],[0,0],[-3.985,-2.819],[0,0],[11.74,-3.65],[0,0],[1.449,-4.662],[0,0],[7.098,10.038],[0,0],[4.882,-0.063],[0,0],[-7.354,9.853],[0,0],[1.569,4.624],[0,0]],"o":[[0,0],[4.623,1.568],[0,0],[9.854,-7.353],[0,0],[-0.062,4.882],[0,0],[10.038,7.099],[0,0],[-4.662,1.449],[0,0],[-3.649,11.74],[0,0],[-2.82,-3.986],[0,0],[-12.293,0.156],[0,0],[2.92,-3.913],[0,0],[-3.948,-11.644]],"v":[[-17.558,-36.37],[-13.481,-34.987],[0.154,-37.147],[3.606,-39.722],[27.31,-27.644],[27.255,-23.339],[33.522,-11.038],[37.038,-8.552],[32.877,17.724],[28.763,19.002],[19.003,28.764],[17.724,32.876],[-8.551,37.037],[-11.037,33.522],[-23.338,27.255],[-27.644,27.31],[-39.721,3.606],[-37.146,0.155],[-34.987,-13.481],[-36.37,-17.558]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6039,0.6392,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[47.325,47.325],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9},{"ty":4,"nm":"Element 7","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[77.856,74.774,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.229,"y":0},"i":{"x":0.33,"y":1},"s":[1086.148,1173.839,0],"t":10,"ti":[-64.333,76,0],"to":[18.333,-110,0]},{"s":[1316.148,645.839,0],"t":46}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-12.731,9.768],[-9.249,-12.055],[-0.018,-0.022]],"o":[[-9.249,-12.055],[12.73,-9.768],[0.018,0.023],[0,0]],"v":[[-18.607,24.774],[-12.262,-15.006],[27.805,-10.838],[27.857,-10.77]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"c":{"a":0,"k":[0.9294,0.4863,0.1255],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[77.856,74.774],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Element 6","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.326,47.325,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.189,"y":0},"i":{"x":0.33,"y":1},"s":[1081.471,1169.811,0],"t":10,"ti":[110,-64.333,0],"to":[-138,24.333,0]},{"s":[529.471,1363.811,0],"t":43}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-11.644,-3.948],[0,0],[-3.913,2.92],[0,0],[0.157,-12.294],[0,0],[-3.986,-2.819],[0,0],[11.74,-3.65],[0,0],[1.449,-4.662],[0,0],[7.099,10.038],[0,0],[4.881,-0.062],[0,0],[-7.353,9.853],[0,0],[1.568,4.624],[0,0]],"o":[[0,0],[4.623,1.567],[0,0],[9.853,-7.352],[0,0],[-0.063,4.882],[0,0],[10.038,7.1],[0,0],[-4.662,1.449],[0,0],[-3.649,11.741],[0,0],[-2.819,-3.987],[0,0],[-12.293,0.157],[0,0],[2.92,-3.913],[0,0],[-3.948,-11.644]],"v":[[-17.558,-36.37],[-13.481,-34.987],[0.154,-37.147],[3.605,-39.723],[27.31,-27.644],[27.255,-23.339],[33.521,-11.038],[37.037,-8.553],[32.875,17.724],[28.763,19.002],[19.003,28.764],[17.724,32.875],[-8.552,37.037],[-11.039,33.522],[-23.339,27.254],[-27.645,27.31],[-39.722,3.606],[-37.146,0.154],[-34.987,-13.481],[-36.37,-17.558]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.4863,0.1255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[47.325,47.325],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Element 5","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[30.771,30.771,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.283,"y":0},"i":{"x":0.33,"y":1},"s":[1071.297,1171.159,0],"t":10,"ti":[132.333,-35,0],"to":[-118.333,-25,0]},{"s":[517.297,1177.159,0],"t":70}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-16.856],[16.856,0],[0,16.856],[-16.857,0]],"o":[[0,16.856],[-16.857,0],[0,-16.856],[16.856,0]],"v":[[30.521,0],[0,30.521],[-30.521,0],[0,-30.521]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9804,0.7529,0.2],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[30.771,30.771],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"Element 4","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[42,25.144,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.273,"y":0},"i":{"x":0.33,"y":1},"s":[1074.624,1178.727,0],"t":10,"ti":[140.667,20.667,0],"to":[-94.667,-86.667,0]},{"s":[446.624,934.727,0],"t":69}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.829,-3.697],[0,0],[3.698,-0.828],[0,0],[0.83,3.697],[0,0],[-3.697,0.828],[0,0]],"o":[[0,0],[0.829,3.697],[0,0],[-3.697,0.828],[0,0],[-0.828,-3.697],[0,0],[3.697,-0.828]],"v":[[36.343,-18.872],[40.921,1.552],[35.727,9.747],[-28.148,24.066],[-36.344,18.872],[-40.922,-1.553],[-35.728,-9.747],[28.148,-24.066]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.4863,0.1255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[42,25.144],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13},{"ty":4,"nm":"Element 3","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.326,47.325,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.174,"y":0},"i":{"x":0.33,"y":1},"s":[1067.471,1180.071,0],"t":10,"ti":[149.667,68,0],"to":[-115.667,-176,0]},{"s":[529.471,736.071,0],"t":61}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-11.644,-3.948],[0,0],[-3.913,2.92],[0,0],[0.157,-12.294],[0,0],[-3.986,-2.819],[0,0],[11.74,-3.65],[0,0],[1.449,-4.662],[0,0],[7.099,10.038],[0,0],[4.881,-0.063],[0,0],[-7.353,9.854],[0,0],[1.568,4.624],[0,0]],"o":[[0,0],[4.623,1.568],[0,0],[9.853,-7.353],[0,0],[-0.063,4.882],[0,0],[10.038,7.099],[0,0],[-4.662,1.449],[0,0],[-3.649,11.74],[0,0],[-2.819,-3.986],[0,0],[-12.293,0.157],[0,0],[2.92,-3.912],[0,0],[-3.948,-11.644]],"v":[[-17.558,-36.37],[-13.481,-34.987],[0.154,-37.147],[3.605,-39.722],[27.31,-27.644],[27.255,-23.339],[33.521,-11.038],[37.037,-8.552],[32.875,17.724],[28.763,19.002],[19.003,28.764],[17.724,32.876],[-8.552,37.037],[-11.039,33.522],[-23.339,27.255],[-27.645,27.309],[-39.722,3.605],[-37.146,0.154],[-34.987,-13.481],[-36.37,-17.558]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2784,0.6784,0.4902],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[47.325,47.325],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":14},{"ty":4,"nm":"Element 2","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[33.515,41.664,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.292,"y":0},"i":{"x":0.33,"y":1},"s":[1098.638,1189.457,0],"t":10,"ti":[3.667,95,0],"to":[-95.667,-127,0]},{"s":[788.638,547.457,0],"t":71}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":4},{"o":{"x":0.72,"y":0},"i":{"x":0.833,"y":0.601},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[3.281,-1.895],[0,0],[1.895,3.281],[0,0],[-3.281,1.894],[0,0],[-1.895,-3.281],[0,0]],"o":[[0,0],[-3.282,1.895],[0,0],[-1.895,-3.281],[0,0],[3.281,-1.894],[0,0],[1.895,3.282]],"v":[[28.859,29.054],[10.733,39.519],[1.36,37.008],[-31.37,-19.683],[-28.859,-29.054],[-10.732,-39.52],[-1.36,-37.009],[31.37,19.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6039,0.6392,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[33.515,41.664],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":15},{"ty":4,"nm":"Element 1","sr":1,"st":0,"op":1800,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[30.771,30.771,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.252,"y":0},"i":{"x":0.33,"y":1},"s":[1087.199,1174.507,0],"t":10,"ti":[40,75.667,0],"to":[22,-151.667,0]},{"s":[1027.199,504.507,0],"t":67}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":32},{"s":[0],"t":87}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-16.856],[16.856,0],[0,16.857],[-16.857,0]],"o":[[0,16.857],[-16.857,0],[0,-16.856],[16.856,0]],"v":[[30.522,-0.001],[0,30.522],[-30.522,-0.001],[0,-30.522]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6039,0.6392,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[30.771,30.772],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":16}],"v":"5.5.7","fr":60,"op":180,"ip":0,"assets":[]} \ No newline at end of file diff --git a/grailed_app/src/components/Dialog.vue b/grailed_app/src/components/Dialog.vue new file mode 100644 index 0000000..a2f6192 --- /dev/null +++ b/grailed_app/src/components/Dialog.vue @@ -0,0 +1,98 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/components/GrailedDialog.vue b/grailed_app/src/components/GrailedDialog.vue new file mode 100644 index 0000000..69de3fc --- /dev/null +++ b/grailed_app/src/components/GrailedDialog.vue @@ -0,0 +1,95 @@ + + + + \ No newline at end of file diff --git a/grailed_app/src/components/GrailedHeader.vue b/grailed_app/src/components/GrailedHeader.vue new file mode 100644 index 0000000..4f19848 --- /dev/null +++ b/grailed_app/src/components/GrailedHeader.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/grailed_app/src/components/Success.vue b/grailed_app/src/components/Success.vue new file mode 100644 index 0000000..3847546 --- /dev/null +++ b/grailed_app/src/components/Success.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/components/SvgIcon.vue b/grailed_app/src/components/SvgIcon.vue new file mode 100644 index 0000000..a409235 --- /dev/null +++ b/grailed_app/src/components/SvgIcon.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/components/TermsModal.vue b/grailed_app/src/components/TermsModal.vue new file mode 100644 index 0000000..7450e88 --- /dev/null +++ b/grailed_app/src/components/TermsModal.vue @@ -0,0 +1,98 @@ + + + + + + \ No newline at end of file diff --git a/grailed_app/src/config/axios/config.ts b/grailed_app/src/config/axios/config.ts new file mode 100644 index 0000000..c318cbd --- /dev/null +++ b/grailed_app/src/config/axios/config.ts @@ -0,0 +1,30 @@ + +const config: { + base_url: string + result_code: number | string + request_timeout: number, + tenant_id: number + } = { + /** + * api请求基础路径 + */ + base_url: import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL, + /** + * 接口成功返回状态码 + */ + result_code: 200, + + /** + * 接口请求超时时间 + */ + request_timeout: 30000, + + /** + * 国家编号 + */ + tenant_id : import.meta.env.TENANT_ID + + } + + export { config } + \ No newline at end of file diff --git a/grailed_app/src/config/axios/errorCode.ts b/grailed_app/src/config/axios/errorCode.ts new file mode 100644 index 0000000..b1ff17a --- /dev/null +++ b/grailed_app/src/config/axios/errorCode.ts @@ -0,0 +1,7 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + default: '系统未知错误,请反馈给管理员' + } + \ No newline at end of file diff --git a/grailed_app/src/config/axios/index.ts b/grailed_app/src/config/axios/index.ts new file mode 100644 index 0000000..f99f82b --- /dev/null +++ b/grailed_app/src/config/axios/index.ts @@ -0,0 +1,56 @@ +import service from './service' + + +const request = (option: any) => { + const { url, method, params, data, headersType, responseType } = option + return service({ + url: url, + method, + params, + data, + responseType: responseType, + headers: { + 'Content-Type': headersType || 'application/json' + + } + }) +} +export default { + get: async (option: any) => { + const res = await request({ method: 'GET', ...option }) + return res.data as unknown as T + }, + getOriginal: async (option: any) => { + const res = await request({ method: 'GET', ...option }) + return res + }, + post: async (option: any) => { + const res = await request({ method: 'POST', ...option }) + return res.data as unknown as T + }, + postOriginal: async (option: any) => { + const res = await request({ method: 'POST', ...option }) + return res + }, + delete: async (option: any) => { + const res = await request({ method: 'DELETE', ...option }) + return res.data as unknown as T + }, + put: async (option: any) => { + const res = await request({ method: 'PUT', ...option }) + return res.data as unknown as T + }, + download: async (option: any) => { + const res = await request({ + method: 'GET', + responseType: 'blob', + ...option + }) + return res as unknown as Promise + }, + upload: async (option: any) => { + option.headersType = 'multipart/form-data' + const res = await request({ method: 'POST', ...option }) + return res as unknown as Promise + } +} diff --git a/grailed_app/src/config/axios/service.ts b/grailed_app/src/config/axios/service.ts new file mode 100644 index 0000000..c5cb5b5 --- /dev/null +++ b/grailed_app/src/config/axios/service.ts @@ -0,0 +1,158 @@ +import axios, { type AxiosRequestHeaders, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'; +import { config } from '@/config/axios/config' +import * as AuthUtils from '@/utils/auth' +import { useRouter } from 'vue-router'; +import { useCache } from '@/hooks/useCache'; +const { result_code, base_url, request_timeout } = config + + +// 是否显示重新登录 +export const isRelogin = { show: false } +let requestList: any[] = [] +// 是否正在刷新中 +let isRefreshToken = false +const whiteList: string[] = ['/sign-in', '/refresh-token'] + +// 创建 Axios 实例 +const instance = axios.create({ + baseURL: base_url, // 设置基本的请求 URL + timeout: request_timeout, // 设置请求超时时间(单位:毫秒) + headers: { + 'Content-Type': 'application/json', // 设置请求头部 + 'tenant-id': config.tenant_id + }, +}); + +// 设置请求拦截器 +instance.interceptors.request.use( + + (config: InternalAxiosRequestConfig) => { + // 是否需要设置 token + let isToken = (config!.headers || {}).isToken === false + whiteList.some((v) => { + if (config.url) { + config.url.indexOf(v) > -1 + return (isToken = false) + } + }) + + if (AuthUtils.getAccessToken() && !isToken) { + config.headers.Authorization = 'Bearer ' + AuthUtils.getAccessToken() // 让每个请求携带自定义token + } + const params = config.params || {} + const data = config.data || false + if (config.method?.toUpperCase() === 'POST' && (config.headers as AxiosRequestHeaders)['Content-Type'] ==='application/x-www-form-urlencoded') { + config.data = qs.stringify(data) + } + if (config.method?.toUpperCase() === 'GET' && params) { + let url = config.url + '?' + for (const propName of Object.keys(params)) { + const value = params[propName] + if (value !== void 0 && value !== null && typeof value !== 'undefined') { + if (typeof value === 'object') { + for (const val of Object.keys(value)) { + const params = propName + '[' + val + ']' + const subPart = encodeURIComponent(params) + '=' + url += subPart + encodeURIComponent(value[val]) + '&' + } + } else { + url += `${propName}=${encodeURIComponent(value)}&` + } + } + } + // 给 get 请求加上时间戳参数,避免从缓存中拿数据 + // const now = new Date().getTime() + // params = params.substring(0, url.length - 1) + `?_t=${now}` + url = url.slice(0, -1) + config.params = {} + config.url = url + } + return config; + }, + (error) => { + // 处理请求错误 + return Promise.reject(error); + } +); + +// 设置响应拦截器 +instance.interceptors.response.use( + async (response: AxiosResponse) => { + // 在接收到响应数据之前做一些处理 + const { data } = response + const config = response.config + if (!data) { + // 返回“[HTTP]请求没有返回值”; + throw new Error() + } + // 未设置状态码则默认成功状态 + const code = data.code || result_code + // 二进制数据则直接返回 + if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') { + return response.data + } + if (code === 401) { + // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 + if (!isRefreshToken) { + isRefreshToken = true + // 1. 如果获取不到刷新令牌,则只能执行登出操作 + if (!AuthUtils.getRefreshToken()) { + return handleAuthorized() + } + // 2. 进行刷新访问令牌 + try { + const refreshTokenRes = await refreshToken() + AuthUtils.setToken((await refreshTokenRes).data.data) + config.headers!.Authorization = 'Bearer ' + AuthUtils.getAccessToken() + requestList.forEach((cb: any) => { + cb() + }) + requestList = [] + return instance(config) + } catch (error) { + // 为什么需要 catch 异常呢?刷新失败时,请求因为 Promise.reject 触发异常。 + // 2.2 刷新失败,只回放队列的请求 + requestList.forEach((cb: any) => { + cb() + }) + // 提示是否要登出。即不回放当前请求!不然会形成递归 + return handleAuthorized() + } finally { + requestList = [] + isRefreshToken = false + } + } else { + // 添加到队列,等待刷新获取到新的令牌 + return new Promise((resolve) => { + requestList.push(() => { + config.headers!.Authorization = 'Bearer ' + AuthUtils.getAccessToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + resolve(instance(config)) + }) + }) + } + } + if (code === 403) { + return handleAuthorized() + } + return response.data; + }, + (error) => { + // 处理响应错误 + return Promise.reject(error); + } +); + +const refreshToken = async () => { + return await axios.post(base_url + '/member/auth/refresh-token?refreshToken=' + AuthUtils.getRefreshToken()) +} + +const handleAuthorized = () => { + const { wsCache } = useCache() + wsCache.clear() + AuthUtils.removeToken() + window.location.href = '/sign-in' + // 英文的提示信息 + return Promise.reject(new Error('Sorry, you do not have permission to access this page, please contact the administrator to apply for permission!')) +} + +export default instance; \ No newline at end of file diff --git a/grailed_app/src/hooks/useCache.ts b/grailed_app/src/hooks/useCache.ts new file mode 100644 index 0000000..6d2a931 --- /dev/null +++ b/grailed_app/src/hooks/useCache.ts @@ -0,0 +1,27 @@ +/** + * 配置浏览器本地存储的方式,可直接存储对象数组。 + */ + +import WebStorageCache from 'web-storage-cache' + +type CacheType = 'localStorage' | 'sessionStorage' + +export const CACHE_KEY = { + IS_DARK: 'isDark', + USER: 'user', + LANG: 'lang', + THEME: 'theme', + LAYOUT: 'layout', + ROLE_ROUTERS: 'roleRouters', + DICT_CACHE: 'dictCache' +} + +export const useCache = (type: CacheType = 'localStorage') => { + const wsCache: WebStorageCache = new WebStorageCache({ + storage: type + }) + + return { + wsCache + } +} diff --git a/grailed_app/src/hooks/useLogo.ts b/grailed_app/src/hooks/useLogo.ts new file mode 100644 index 0000000..3d88c3d --- /dev/null +++ b/grailed_app/src/hooks/useLogo.ts @@ -0,0 +1,22 @@ +import { ref, onMounted } from 'vue'; + + +export const useLogo = () => { + const logo = ref(); + onMounted(async () => { + let logoModule; + if (import.meta.env.MODE === 'us') { + logoModule = await import('@/assets/logo/baltini-logo.webp'); + } else if(import.meta.env.MODE === 'da') { + logoModule = await import('@/assets/logo/luxlair-logo.jpg'); + } else if (import.meta.env.MODE === 'pt') { + logoModule = await import('@/assets/logo/luxe-logo.jpg'); + }else if (import.meta.env.MODE === 'in') { + logoModule = await import('@/assets/logo/baltini-logo.webp'); + }else { + logoModule = await import('@/assets/logo/luxe-logo.jpg'); + } + logo.value = logoModule.default; + }) + return { logo } +} \ No newline at end of file diff --git a/grailed_app/src/i18n/helper.ts b/grailed_app/src/i18n/helper.ts new file mode 100644 index 0000000..335ae52 --- /dev/null +++ b/grailed_app/src/i18n/helper.ts @@ -0,0 +1,4 @@ +export const setHtmlPageLang = (locale: string) => { + document.querySelector('html')?.setAttribute('lang', locale) + } + \ No newline at end of file diff --git a/grailed_app/src/i18n/index.ts b/grailed_app/src/i18n/index.ts new file mode 100644 index 0000000..af30b0f --- /dev/null +++ b/grailed_app/src/i18n/index.ts @@ -0,0 +1,43 @@ +import { createI18n } from 'vue-i18n' +import {setHtmlPageLang} from './helper' +import {lang as en} from './lang/en-us' +import {lang as da} from './lang/da-dk' +import {lang as pt} from './lang/pt-pt' +import {lang as de} from './lang/dn-de' +import {lang as st} from './lang/st-st' +export const loadLang = () => { + const modules: Record = import.meta.glob('./lang/*.ts', { eager: true }); + const langs: Record = {}; + + for (const path in modules) { + const name = path.replace(/(\.\/lang\/|\.ts)/g, ''); + if (name == 'lang-base') { + continue + } + langs[name] = modules[path].lang; + } + return langs; +} + +export const setLang = (locale?: string) => { + if (locale) { + localStorage.setItem('lang', locale); + } + i18n.global.locale.value = locale || localStorage.getItem('lang') || ''; + setHtmlPageLang(i18n.global.locale.value) +} + +export const i18n = createI18n({ + globalInjection: true, + legacy: false, + locale: import.meta.env.VITE_DEFAULT_LANG, + fallbackLocale: import.meta.env.VITE_DEFAULT_LANG, + fallbackWarn: false, + messages: { + 'en-us': en, + 'da-dk': da, + 'pt-pt': pt, + 'dn-de': de, + 'st-st': st + } +}); diff --git a/grailed_app/src/i18n/lang/da-dk.ts b/grailed_app/src/i18n/lang/da-dk.ts new file mode 100644 index 0000000..ed7547a --- /dev/null +++ b/grailed_app/src/i18n/lang/da-dk.ts @@ -0,0 +1,366 @@ +import type { langType } from './lang-base' + +let cp_name = import.meta.env.VITE_APP_NAME; + +export const lang: langType = { + about: { + title: 'Om', + profile: 'Firma Kvalifikationer', + h_1: 'Hvorfor bruger dette program USDT som valuta?', + h_2: 'Da programmet er dedikeret til at betjene købmænd fra hele verden, har vi fastsat USDT som vores valuta for at forene valutatransaktioner, lette ledelsen og bedre beskytte folk og ejendom.', + h_3: 'Kan jeg opgradere mine opgaver når som helst?', + h_4: 'I øjeblikket er vores platform åben fra 10.00-23.00. Det anbefales ikke for agenter at øge ordre uden for arbejdstid for at undgå eventuel dårlig opførsel.', + h_5: 'Hvad sker der, hvis jeg ikke kan tilføje alle mine ordrer?', + h_6: 'Da programmet er afhængigt af positive anmeldelser fra vores agenter, er det vigtigt, at alle agenter deltager for at sikre deres placering. Straffe vil blive anvendt som relevant, og agentens medlemskab vil blive permanent afsluttet. Ikke alene hjælper din forfremmelse andre købmænd, det hjælper også med at informere vores købmænd og bidrage til produktforbedringer.', + h_7: 'Kan jeg ændre mit produktvalg?', + h_8: 'Når et produkt er blevet crawled, vil du ikke være i stand til at ændre dit produktvalg. Når du opgraderer et produkt, skal du læse alle de oplysninger, vi har angivet i Vilkår og Betingelser for at sikre, at du kan overholde alle programkrav. For eksempel kan der være kompatibilitetskrav til elektronik, der kun er kompatible med specifik software.', + h_9: 'Vores partnere har et blomstrende økosystem af alliancer, der leverer forretningsløsninger til at løse vores kunders forretnings- og teknologiudfordringer. Vi har dybe relationer på tværs af et omfattende netværk af førende teknologivirksomheder, der kan hjælpe dig med at transformere og vokse.', + h_10: 'Vores robuste økosystem hjælper partnere med at øge indtægtsvæksten, udvide markedet og geografisk rækkevidde, lette salgsprocesser og forbedre produkt- og serviceudbud.' + }, + balanceRecord: { + title: 'Saldo Optegnelser', + }, + bindCrypto: { + title: 'Bind Adresse', + enterAddress: 'Indtast adresse' + }, + channelSelect: { + title: 'Kanal Vælg', + balance: 'Balance', + t_1: 'Vælg en nyttig kanal', + }, + helpGuide: { + title: 'Hjælpeguide', + faq: 'FAQ', + q_1: 'Hvordan begynder jeg at tage opgaver?', + a_1: "Først skal du registrere en konto på vores hjemmeside. Efter registrering, klik på 'start' menuen, og klik derefter på 'Grib Ordre' knappen for at begynde at arbejde.", + q_2: "Hvornår vil jeg modtage provisionen for de opgaver, jeg har afsluttet?", + a_2: "Når din afsluttede opgave er gennemgået og bekræftet korrekt, vil provisionen blive krediteret til din konto på vores hjemmeside inden for 1 time.", + q_3: 'Hvor mange opgaver kan jeg tage på samme tid?', + a_3: "Du kan kun tage en opgave ad gangen. Antallet af opgaver, du kan fuldføre hver dag, vil blive justeret baseret på dit medlemskabsniveau og butikkens situation.", + q_4: "Hvad hvis jeg ikke kan fuldføre en opgave?", + a_4: "Hvis du ikke kan fuldføre en opgave inden for den fastsatte tid, bedes du straks kontakte vores kundeservice team. Vi vil give dig en passende løsning eller anbefaling baseret på den specifikke situation.", + q_5: 'Hvordan kan jeg opgradere mit medlemskabsniveau?', + a_5: 'Medlemskabsniveauer gives baseret på de opgaver, som kunden har fuldført. For flere detaljer, kontakt venligst kundeservice.', + }, + + home: { + cp_name: cp_name, + continue: 'Fortsæt med at udføre opgaven', + notice: { + c_t: 'Tillykke til ', + f_e: 'tjente ', + }, + taskCarouse: { + title: 'Opgave', + }, + partners: { + title: 'Vores Partnere', + }, + + introduce: { + i_f: 'Inviter Venner', + j_s: 'Lad os Tilmelde Os Nu', + c_c: 'Kopier henvisningskoden for at tilmelde dig nu', + c_l: 'Kopier invitationslink', + terms_a: 'Vilkår & Aftaler', + terms_c: 'Vilkår & Betingelser', + terms_c_1: 'Disse vilkår og betingelser gælder for din brug af dette websted, og ved at få adgang til dette websted og / eller opdatere din ordre, accepterer du at være bundet af følgende vilkår og betingelser. Hvis du ikke accepterer at være bundet af disse vilkår og betingelser, vil du ikke kunne bruge eller få adgang til dette websted.', + terms_c_2: 'Hvis du har spørgsmål om disse vilkår og betingelser, før du opdaterer din ordre, bedes du kontakte vores kundeservice team 7 dage om ugen.', + terms_c_3: 'Forklaring', + terms_c_4: 'Betingelser - disse vilkår og betingelser og specielle betingelser', + terms_c_5: 'Produkter - de produkter, der vises på dette websted for at forbedre vurderinger', + terms_c_6: 'Produktbeskrivelser - de afsnit på dette websted, der giver visse vilkår og betingelser relateret til individuelle produkter', + terms_c_7: 'Særlige betingelser - de vilkår og betingelser på produktbeskrivelsen', + terms_c_8: 'Tjenester - de agenturtjenester, vi leverer for de produkter, der bliver opdateret til gennemgang, som beskrevet i agenturaftalen', + terms_c_9: 'Agent / du - den generiske betegnelse for brugere af dette websted Personlige oplysninger', + terms_c_10: 'Oplysninger, du har givet under registrering', + terms_c_11: 'Cookies - små tekstfiler, der placeres på din computers harddisk af dette websted for at gemme oplysninger og identificere din computer', + terms_c_12: 'Aftale - agenten indeholder disse vilkår og betingelser', + terms_c_13: '1.0 Forklaring', + terms_c_14: '1.1 Alle ord efter en bestemt klausul, for eksempel, eller enhver lignende udtryk, skal fortolkes som illustrative og skal ikke begrænse betydningen af ​​de ord, beskrivelser, definitioner, sætninger eller vilkår, der går forud for disse klausuler.', + terms_c_15: '1.2 Medmindre andet er angivet, skal store bogstaver, der bruges i disse vilkår og betingelser (men ikke defineret i disse vilkår og betingelser), have den betydning, der er fastsat i agenturaftalen.', + terms_c_16: '2.0 Agentens ansvar', + terms_c_17: '2.1 Hver agent skal fuldføre mindst et sæt opgaver for at modtage en bonus fra os.', + terms_c_18: '2.2 Agenter kan nulstille deres konti én gang om dagen. Hver agent kan højst udføre to opgaver om dagen.', + terms_c_19: '2.3 Tidlig fuldførelse af opgaver er ikke tilladt, da dette vil resultere i et brud i indsamlingen af ​​salgsdata.', + terms_c_20: '2.4 Agenter har ikke tilladelse til at indsende eller offentliggøre nogen falske oplysninger på nogen form for sociale medier. Vi forbeholder os retten til at søge juridisk ansvar.', + terms_c_21: '2.5 Overholdelse af juridiske forpligtelser (opfyldelse af vores juridiske forpligtelser)', + terms_c_22: '2.6 Behandling af krav og klager og søge resolution (juridiske rettigheder og juridiske krav)', + terms_c_23: '3.0 Enhver reklame- eller digital medieagentur eller internetudbyder i forbindelse med programmet', + terms_c_24: '3.1 Ved at deltage i programmet forpligter du dig til at indsende alle sande, nøjagtige, aktuelle og komplette oplysninger. Vi forbeholder os retten til at verificere din berettigelse.', + terms_c_25: '3.2 Hvis vi ved eller har rimelig grund til at tro på tidspunktet for registrering, at du ikke er berettiget til at deltage i programmet, forbeholder vi os retten til at diskvalificere dig og vælge en alternativ produktanmelder.', + terms_c_26: '4.0 Vores ansvar', + terms_c_27: '4.1 Vi er ikke ansvarlige for tekniske fejl eller trafikpropper på internettet eller ethvert websted, eller en kombination af disse faktorer, eller for eventuelle afbrydelser eller forstyrrelser af enhver andens udstyr i forbindelse med eller som et resultat af deltagelse.', + terms_c_28: '4.2 Vi er ikke ansvarlige for eventuelle ærekrænkende materialer, krænkelse af tredjeparts immaterielle rettigheder eller andet ulovligt materiale i din indgang.', + terms_c_29: '5.0 Reklame og dine personlige data', + terms_c_30: '5.1 Med forbehold for dit samtykke kan vi bruge dit brugernavn til salgsfremmende formål og/eller i forbindelse med vores reklame-, salgsfremmende eller markedsføringsaktiviteter (som beskrevet i vores meddelelser og anmeldelser, vilkår og betingelser).', + terms_c_31: '5.1 er opmærksom på, at du er bekymret for vores brug af dine oplysninger, og vi værdsætter den tillid, du har til os for at bruge den på en omhyggelig og rimelig måde. Alle oplysninger, vi indsamler, vil være underlagt vores privatlivspolitik, som angiver, hvilke oplysninger vi indsamler, hvad vi gør med det, og de formål, for hvilke vi bruger disse data. Se vores privatlivspolitik for yderligere detaljer. Du forstår, at ved at tilmelde dig programmet, vil indsamle og bruge dine personlige oplysninger som beskrevet i privatlivspolitikken, hvilket inkluderer deling af oplysninger med leverandører, der hjælper med webstedet og kampagner.', + terms_c_32: '5.3 Som vejledt af normale omstændigheder er platformen designet til kun at matche produkter, hvis pris er lavere end agentens kontosaldo. Imidlertid kan købmænd vælge at øge rækkevidden af ​​agenter, der matches ved at betale mindst tre gange deres løn. Dette vil give agenten mulighed for at opnå pakkeopgaver prissat over kontosaldoen. Ved vellykket fuldførelse af disse opgaver vil agenter modtage', + about_us: { + title: 'Om Os', + a_1: 'Firma Kvalifikationer', + a_2: 'Hvorfor bruger dette program USDT som valuta?', + a_3: 'Da programmet er dedikeret til at betjene købmænd fra hele verden, . Vi har fast USDT som vores valuta for at forene valutatransaktioner, lette styring og bedre beskytte mennesker og ejendom.', + a_4: 'Kan jeg opgradere mine opgaver når som helst?', + a_5: 'I øjeblikket er vores platform åben fra 9:00-23:00. Det anbefales ikke for agenter at booste ordrer i ikke-arbejdstimer for at undgå enhver form for dårlig opførsel.', + a_6: 'Hvad sker der, hvis jeg ikke kan tilføje alle mine ordrer?', + a_7: 'Da programmet er afhængigt af positive anmeldelser fra vores agenter, er det vigtigt, at alle agenter deltager for at sikre deres placering. Straffe vil blive anvendt som relevant, og agentens medlemskab vil blive permanent afsluttet. Ikke kun hjælper din forfremmelse andre købmænd, det hjælper også med at informere vores købmænd og bidrage til produktforbedringer.', + a_8: 'Kan jeg ændre mit produktvalg?', + a_9: 'Når et produkt er blevet kravlet, vil du ikke være i stand til at ændre dit produktvalg. Når du opgraderer et produkt, bedes du læse alle de oplysninger, vi har angivet i Vilkår og Betingelser for at sikre, at du kan overholde alle programkrav. For eksempel kan der være kompatibilitetskrav for elektronik, der kun er kompatible med specifik software.', + a_10: cp_name + ' Partnere', + a_11: 'Vores Partnere', + a_12: cp_name + ' har et blomstrende økosystem af alliancer, der leverer forretningsløsninger til at løse vores kunders forretnings- og teknologiske udfordringer. Vi har dybe relationer på tværs af et omfattende netværk af førende teknologivirksomheder, der kan hjælpe dig med at transformere og vokse.', + a_13: 'Vores robuste økosystem hjælper partnere med at øge indtægtsvæksten, udvide marked og geografisk rækkevidde, lette salgsprocesser og forbedre produkt- og serviceudbud.', + } + } + + + }, + invitation: { + title: 'Inviter Venner', + i_c: 'Invitationskode', + link: 'Henvisningslink', + }, + language: { + title: 'Sprog', + u: 'brugernavn', + c_l: 'Skift Sprog', + l: 'Sprog', + }, + order: { + title: 'Ordre', + order_no: 'Ordrenummer', + u_p: 'Enhedspris', + o_q: 'Ordremængde', + total: 'Total', + o_c: 'Ordre Kommission', + c_t: 'Kompileringstid', + all: 'Alle', + completed: 'Fuldført', + pending: 'Afventer', + frozen: 'Frosset', + }, + + password: { + title: 'Skift Adgangskode', + old: 'Nuværende Adgangskode', + new: 'Ny Adgangskode', + confirm_p: 'Bekræft Adgangskode', + note: 'Bemærk: Adgangskodeændringer er begrænset til en gang hver 72 timer.', + not_match: 'Adgangskoderne matcher ikke.', + }, + payOrderDetail: { + title: 'Ordredetaljer', + order_no: 'Ordrenummer:', + amount: 'Beløb', + orderTime: 'Ordretid', + status: 'Status', + pay_m: 'Betalingsmetode', + network: 'Netværk', + address: 'Adresse', + referral: 'Henvisningskode', + t_s_o: 'For at Starte Ordre' + }, + + profile: { + ph_no: 'Ph No', + LV: 'LV', + i_c: 'Invitationskode', + level: 'Niveau', + dailyOrder: 'DagligOrder', + ratio: 'Forhold', + todays: 'Dagens', + creditScore: 'Kredit', + t_order: 'Ordrer', + t_order_a: 'Ordremængde', + t_commission: 'Kommission', + sign_in_reward: 'Check ind', + enter_now: 'Gå Ind Nu', + c_balance: 'Nuværende Saldo', + w_success: 'Udbetaling Lykkedes', + records: 'Optegnelser', + settings: 'Indstillinger', + i_f: 'Inviter Venner', + notification: 'Notifikation', + help_guide: 'Hjælpeguide', + }, + service: { + title: 'Kundeservice', + c_s_c: 'Kundeservicecenter', + online: 'Online Service', + o_tips: 'Hvis du har et problem, bed om kundeservice', + o_tips_1: 'Online Service :Guldflowproblem', + o_t: 'Online tid', + }, + + settings: { + title: 'Indstillinger', + d_o: 'Daglige ordrer', + d_w: 'Daglig udbetaling', + c: 'Kommission', + t_r: 'Hold Belønning', + a: 'Konto', + t_1: 'Personlige Oplysninger', + t_2: 'Skift Adgangskode', + t_3: 'Bind USDT Adresse', + t_4: 'Sprog', + t_5: 'Om Os', + }, + settingsPersonal: { + title: 'Brugeroplysninger', + profile: 'Profil', + p_1: 'Disse oplysninger vil blive vist offentligt, så vær forsigtig med, hvad du deler.', + username: 'Brugernavn', + about: 'Om', + a_1: 'Skriv et par sætninger om dig selv.', + photo: 'Foto', + change: 'ændre', + p_i: 'Personlige Oplysninger', + p_i_1: 'Brug en permanent adresse, hvor du kan modtage post.', + first_name: 'Fornavn', + last_name: 'Efternavn', + email: 'Email adresse', + country: 'Land', + street: 'Gadeadresse', + street_p: '', + city: 'By', + state: 'Stat / Provins', + postal: 'Postnummer', + save: 'Gem', + upload_error_1: 'Upload venligst et billede, der er 500x500 pixels eller mindre.', + upload_error_2: 'Upload venligst en billedfil.', + upload_error_3: 'upload af avatar mislykkedes, prøv igen senere', + }, + + signIn: { + title: 'Log ind på din konto', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Adgangskode', + remember: 'Husk Mig', + forgot: 'Glemt adgangskode?', + sign_in: 'Log Ind', + no_select_country: 'Vælg venligst din landekode', + n_a_m: 'Ikke medlem?', + s_u_n: 'Tilmeld Dig Nu!', + }, + signUp: { + title: 'Opret en ny konto', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Adgangskode', + c_p: 'Bekræft adgangskode', + i_c: 'Invitationskode', + i_green: 'Jeg er enig i ', + r_a: '《Registreringsaftale》', + sign_up: 'Tilmeld Dig', + no_select_country: 'Vælg venligst din landekode', + number_exist: 'Mobilnummeret findes allerede. Log venligst direkte ind.', + i_code_not_exist: 'Invitationskoden, du indtastede, findes ikke. Kontakt venligst din mentor.', + sign_up_success: 'Tilmelding succesfuld!', + to_sign_in: 'Til Log Ind', + }, + + start: { + title: 'Start', + daily_order: 'Daglige Ordrer', + commission_ration: 'Kommissionsforhold', + free: 'Gratis', + earned: 'Tjent Kommission', + frozen: 'Frosset Beløb', + completed_order: 'Fuldført Ordre', + available: 'Tilgængelig Saldo', + freeze_commission: 'Akkumuleret ordreprovision', + freeze_c_desc: 'Dette beløb repræsenterer din nuværende akkumulerede ordretotal. Du kan trække det ud, når opgaven er fuldført.', + g_order: 'Grib Ordre', + order_desc: 'Ordrebeskrivelse', + order_desc_1: '1.Hver konto kan matche 38 ordrer om dagen', + order_desc_2: '2.Kommissionen for at placere en ordre er ensartet og svarer til 1.00% af det samlede ordrebeløb', + order_desc_3: '3.Systemet er baseret på LBS-teknologi og matcher automatisk varer gennem cloud computing', + order_desc_5: '4.Du kan ikke annullere opgaven. Du skal først fuldføre eventuelle eksisterende uafsluttede opgaver, før du kan modtage nye.', + order_desc_6: '5.Hver konto kan matche 38 ordrer om dagen', + order_n: 'Bemærk', + order_n_1: 'Når platformen matcher ordrer for brugere, vil den indsende ordreoplysningerne til købmandens' + + 'baggrund. Hvis brugeren ikke indsender ordren inden for 30 minutter, vil ordrebeløbet blive frosset af' + + 'systemet. For at undgå regulerende systemer vil brugerkonti blive evalueret, hvilket vil direkte' + + 'påvirke brugerens næste matchtid og omdømme! Klik venligst på stop placering af ordre i tide for at undgå' + + 'timeoutfrysning.', + grabOrder: { + not_completed: 'Fuldfør venligst ordren først', + not_completed_text: 'For at tjekke ordre', + order_limit: 'Dagens ordremængde har nået den øvre grænse', + order_limit_text: 'Bekræft', + balance_not_enough: 'Saldo er ikke nok', + balance_not_enough_text: 'Top op', + no_order_available: 'Ingen ordre tilgængelig, prøv venligst igen senere', + no_order_available_text: 'Bekræft', + not_meet_start: 'opfylder ikke startbetingelse', + }, + order_details: { + title: 'Ordreopgave', + u_p: 'Enhedspris', + o_q: 'Ordremængde', + total: 'Total', + o_c: 'Ordre Kommission', + o_r: 'ordrevurdering', + c_1: 'produktet er meget godt Endelig modtaget det. produktet er meget godt Jeg er meget tilfreds med produktet og anbefaler at købe det', + c_2: 'Jeg er meget glad og tilfreds', + c_3: 'prisen er ganske rimelig', + c_4: 'Håndværket er meget godt', + c_5: 'og jeg kan godt lide det meget', + c_6: 'Det ser godt ud', + c_7: 'og min ven har købt det for anden gang.', + balance_not_enough: 'Saldo er ikke nok til at fuldføre ordren, genoplad venligst', + balance_not_enough_text: 'Top op', + order_submitted: 'Ordren er blevet indsendt', + } + }, + withdrawal: { + title: 'Udtræk', + w: 'Udtræk', + c_b: 'nuværende saldo', + s_w_a: 'vælg udtræksbeløb', + w_a: 'Tegnebogsadresse', + m_w_a: 'Ændre tegnebogsadresse', + w_p: 'Indtast din betalingskode', + enterPassword: 'Indtast adgangskode', + p_i: 'Du har en udbetalingsanmodning i gang. Vent venligst på resultatet.', + p_e: 'Betalingsadgangskode fejl', + t_n_c: "Du skal fuldføre dagens ordreopgave, før du kan modtage din løn.", + c_s_n_m:'Din kreditscore opfylder ikke betingelserne for udbetaling, øg venligst din kreditscore.', + + }, + recharge: { + title: 'Top Op', + amount_placeholder: 'vælg eller skriv her', + }, + daily: { + title: 'Daglig indtjekning', + c: 'Kontinuerlig', + a: 'Akkumulering', + r: 'Belønning (USDT)', + btn: 'Tjek ind', + task_not_compiled: 'Fuldfør venligst dagens ordreopgave først.', + }, + common: { + confirm: 'Bekræft', + cancel: 'annuller', + loosing: 'taber', + loading: 'indlæser', + no_data: 'ingen flere data', + submit: 'indsend', + waring: 'advarsel', + error: 'fejl', + insufficient: 'Utilstrækkelig', + submitted: 'Indsendt', + noResult: 'Der blev ikke fundet nogen resultater' + }, + main: { + home: 'Hjem', + order: 'Ordre', + start: 'Start', + service: 'Service', + profile: 'Profil', + } +} \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/dn-de.ts b/grailed_app/src/i18n/lang/dn-de.ts new file mode 100644 index 0000000..18b128c --- /dev/null +++ b/grailed_app/src/i18n/lang/dn-de.ts @@ -0,0 +1,355 @@ +import type { langType } from './lang-base' + +let cp_name = import.meta.env.VITE_APP_NAME; + +export const lang: langType = { + about: { + title: 'Über uns', + profile: 'Unternehmensqualifikationen', + h_1: 'Warum verwendet dieses Programm USDT als Währung?', + h_2: "Da das Programm dazu dient, Händler aus der ganzen Welt zu bedienen, haben wir USDT als unsere Währung festgelegt, um Währungstransaktionen zu vereinheitlichen, die Verwaltung zu erleichtern und Menschen und Eigentum besser zu schützen.", + h_3: 'Kann ich meine Aufgaben jederzeit aktualisieren?', + h_4: 'Derzeit ist unsere Plattform von 10.00 bis 23.00 Uhr geöffnet. Es wird nicht empfohlen, Bestellungen außerhalb der Arbeitszeiten zu beschleunigen, um Fehlverhalten zu vermeiden.', + h_5: "Was passiert, wenn ich nicht alle meine Bestellungen hinzufügen kann?", + h_6: 'Da das Programm auf positiven Bewertungen unserer Agenten beruht, ist es wichtig, dass alle Agenten teilnehmen, um ihre Platzierung sicherzustellen. Strafen werden entsprechend angewendet und die Mitgliedschaft des Agenten wird dauerhaft beendet. Ihre Förderung hilft nicht nur anderen Händlern, sondern informiert auch unsere Händler und trägt zur Produktverbesserung bei.', + h_7: 'Kann ich meine Produktauswahl ändern?', + h_8: 'Sobald ein Produkt gecrawlt wurde, können Sie Ihre Produktauswahl nicht mehr ändern. Wenn Sie ein Produkt aktualisieren, lesen Sie bitte alle Informationen, die wir in den Allgemeinen Geschäftsbedingungen festgelegt haben, um sicherzustellen, dass Sie alle Programmbedingungen erfüllen können. Es können beispielsweise Kompatibilitätsanforderungen für Elektronik bestehen, die nur mit bestimmter Software kompatibel sind.', + h_9: 'Unsere Partner verfügen über ein blühendes Ökosystem von Allianzen, die Geschäftslösungen zur Bewältigung der geschäftlichen und technologischen Herausforderungen unserer Kunden bieten. Wir haben enge Beziehungen zu einem umfangreichen Netzwerk führender Technologieunternehmen, die Ihnen bei der Transformation und dem Wachstum helfen können.', + h_10: 'Unser robustes Ökosystem hilft Partnern, das Umsatzwachstum zu steigern, den Markt- und geografischen Bereich zu erweitern, Verkaufsprozesse zu erleichtern und Produkt- und Serviceangebote zu verbessern.' + }, + balanceRecord: { + title: 'Kontostandprotokolle', + }, + bindCrypto: { + title: 'Bindungsadresse', + enterAddress: 'Adresse eingeben' + }, + channelSelect: { + title: 'Kanal auswählen', + balance: 'Kontostand', + t_1: 'Wählen Sie einen für Sie nützlichen Kanal aus', + }, + helpGuide: { + title: 'Hilfeleitfaden', + faq: 'FAQ', + q_1: 'Wie fange ich an, Aufgaben zu übernehmen?', + a_1: "Zuerst müssen Sie ein Konto auf unserer Website registrieren. Nach der Registrierung klicken Sie im Menü auf 'Start' und dann auf die Schaltfläche 'Auftrag abholen', um mit der Arbeit zu beginnen.", + q_2: "Wann erhalte ich die Provision für die von mir erledigten Aufgaben?", + a_2: "Sobald Ihre erledigte Aufgabe überprüft und als korrekt bestätigt wurde, wird die Provision innerhalb von 1 Stunde auf Ihr Konto auf unserer Website gutgeschrieben.", + q_3: 'Wie viele Aufgaben kann ich gleichzeitig übernehmen?', + a_3: "Sie können immer nur eine Aufgabe gleichzeitig übernehmen. Die Anzahl der Aufgaben, die Sie täglich erledigen können, wird je nach Ihrem Mitgliedschaftslevel und der Situation im Geschäft angepasst.", + q_4: "Was passiert, wenn ich eine Aufgabe nicht abschließen kann?", + a_4: "Wenn Sie eine Aufgabe nicht innerhalb der festgelegten Zeit abschließen können, wenden Sie sich bitte umgehend an unseren Kundenservice. Wir werden Ihnen eine geeignete Lösung oder Empfehlung basierend auf der konkreten Situation bieten.", + q_5: 'Wie kann ich meinen Mitgliedschaftslevel erhöhen?', + a_5: 'Mitgliedschaftslevel werden basierend auf den vom Kunden erledigten Aufgaben vergeben. Für weitere Details wenden Sie sich bitte an den Kundenservice.', + }, + home: { + cp_name: cp_name, + continue: 'Weiterhin Aufgaben erledigen', + notice: { + c_t: 'Herzlichen Glückwunsch an ', + f_e: 'verdient ', + }, + taskCarouse: { + title: 'Aufgabe', + }, + partners: { + title: 'Unsere Partner', + }, + introduce: { + i_f: 'Freunde einladen', + j_s: 'Lass uns jetzt beitreten', + c_c: 'Kopieren Sie den Empfehlungscode, um sich uns anzuschließen', + c_l: 'Einladungslink kopieren', + terms_a: 'Bedingungen & Vereinbarungen', + terms_c: 'Allgemeine Geschäftsbedingungen', + terms_c_1: 'Diese Allgemeinen Geschäftsbedingungen gelten für Ihre Nutzung dieser Website. Durch den Zugriff auf diese Website und/oder die Aktualisierung Ihrer Bestellung erklären Sie sich mit den folgenden Allgemeinen Geschäftsbedingungen einverstanden. Wenn Sie sich nicht an diese Allgemeinen Geschäftsbedingungen halten möchten, können Sie diese Website nicht nutzen oder darauf zugreifen.', + terms_c_2: 'Wenn Sie vor der Aktualisierung Ihrer Bestellung Fragen zu diesen Allgemeinen Geschäftsbedingungen haben, wenden Sie sich bitte an unser Kundenserviceteam, das 7 Tage die Woche für Sie da ist.', + terms_c_3: 'Erklärung', + terms_c_4: 'Bedingungen - diese Allgemeinen Geschäftsbedingungen und besondere Bedingungen', + terms_c_5: 'Produkte - die auf dieser Website gezeigten Produkte zur Verbesserung der Bewertungen', + terms_c_6: 'Produktbeschreibungen - die Abschnitte dieser Website, die bestimmte Bedingungen in Bezug auf einzelne Produkte enthalten', + terms_c_7: 'Besondere Bedingungen - die Bedingungen in der Produktbeschreibung', + terms_c_8: 'Dienstleistungen - die von uns im Rahmen der Produktaktualisierung für die Überprüfung bereitgestellten Agenturdienste gemäß der Agenturvereinbarung', + terms_c_9: 'Agent/Sie - der generische Begriff für Benutzer dieser Website', + terms_c_10: 'Von Ihnen bei der Registrierung bereitgestellte Details', + terms_c_11: 'Cookies - kleine Textdateien, die von dieser Website auf der Festplatte Ihres Computers abgelegt werden, um Informationen zu speichern und Ihren Computer zu identifizieren', + terms_c_12: 'Vereinbarung - die von diesen Allgemeinen Geschäftsbedingungen erfasste Agentur', + terms_c_13: '1.0 Erklärung', + terms_c_14: '1.1 Jede nach einem bestimmten Satz folgende Wortwahl oder ähnlicher Ausdruck ist als veranschaulichend zu verstehen und beschränkt nicht die Bedeutung der Worte, Beschreibungen, Definitionen, Phrasen oder Begriffe, die diesen Sätzen vorausgehen.', + terms_c_15: '1.1 Jede nach einem bestimmten Satz folgende Wortwahl oder ähnlicher Ausdruck ist als veranschaulichend zu verstehen und beschränkt nicht die Bedeutung der Worte, Beschreibungen, Definitionen, Phrasen oder Begriffe, die diesen Sätzen vorausgehen.', + terms_c_16: '2.0 Verantwortlichkeiten des Agenten', + terms_c_17: '2.1 Jeder Agent muss mindestens einen Satz Aufgaben abschließen, um von uns einen Bonus zu erhalten.', + terms_c_18: '2.2 Agenten können ihr Konto einmal pro Tag zurücksetzen. Jeder Agent kann maximal zwei Aufgaben pro Tag abschließen.', + terms_c_19: '2.3 Eine vorzeitige Erledigung von Aufgaben ist nicht gestattet, da dies zu einer Unterbrechung der Datenerfassung für den Verkauf führt.', + terms_c_20: '2.4 Agenten dürfen keine falschen Informationen in sozialen Medien veröffentlichen. Wir behalten uns das Recht vor, rechtliche Schritte einzuleiten.', + terms_c_21: '2.5 Einhaltung rechtlicher Verpflichtungen (Erfüllung unserer rechtlichen Verpflichtungen)', + terms_c_22: '2.6 Umgang mit Ansprüchen und Beschwerden sowie Suche nach Lösungen (Rechtsansprüche und rechtliche Ansprüche)', + terms_c_23: '3.0 Werbung oder digitale Medienagentur oder Internetdienstanbieter im Zusammenhang mit dem Programm', + terms_c_24: '3.1 Durch die Teilnahme am Programm verpflichten Sie sich, alle wahren, genauen, aktuellen und vollständigen Informationen einzureichen. Wir behalten uns das Recht vor, Ihre Berechtigung zu überprüfen.', + terms_c_25: '3.2 Wenn wir zum Zeitpunkt der Registrierung wissen oder vernünftige Gründe zu der Annahme haben, dass Sie nicht berechtigt sind, am Programm teilzunehmen, behalten wir uns das Recht vor, Sie zu disqualifizieren und einen anderen Produktprüfer auszuwählen.', + terms_c_26: '4.0 Unsere Haftung', + terms_c_27: '4.1 Wir sind nicht verantwortlich für technische Ausfälle oder Verkehrsstaus im Internet oder auf Websites oder eine Kombination dieser Faktoren oder für Unterbrechungen oder Störungen der Ausrüstung anderer Personen im Zusammenhang mit oder als Folge der Teilnahme.', + terms_c_28: '4.2 Wir sind nicht verantwortlich für diffamierendes Material, Verletzung von Rechten an geistigem Eigentum Dritter oder andere illegale Inhalte in Ihrem Beitrag.', + terms_c_29: '5.0 Werbung und Ihre persönlichen Daten', + terms_c_30: '5.1 Vorbehaltlich Ihrer Zustimmung können wir Ihren Benutzernamen zu Werbezwecken und/oder im Zusammenhang mit unseren Werbe-, Promotions- oder Marketingaktivitäten verwenden (wie in unseren Ankündigungen und Bewertungen, Allgemeinen Geschäftsbedingungen beschrieben).', + terms_c_31: '5.1 ist sich bewusst, dass Sie besorgt sind über unsere Verwendung Ihrer Informationen, und wir schätzen das Vertrauen, das Sie in uns setzen, um es sorgfältig und vernünftig zu verwenden. Alle von uns gesammelten Informationen unterliegen unserer Datenschutzrichtlinie, die festlegt, welche Informationen wir sammeln, was wir damit tun und zu welchen Zwecken wir diese Daten verwenden. Bitte beachten Sie unsere Datenschutzrichtlinie für weitere Details. Sie verstehen, dass wir durch die Teilnahme am Programm Ihre persönlichen Informationen gemäß der Datenschutzrichtlinie sammeln und verwenden werden, einschließlich der Weitergabe von Informationen an Lieferanten, die bei der Website und den Promotionen behilflich sind.', + terms_c_32: '5.3 Unter normalen Umständen ist die Plattform so konzipiert, dass sie nur Produkte abgleicht, deren Preis niedriger ist als das Kontoguthaben des Agenten. Händler können jedoch wählen, den Bereich der abgeglichenen Agenten zu erweitern, indem sie mindestens das Dreifache ihres Gehalts zahlen. Dies ermöglicht es dem Agenten, Paketaufträge zu erhalten, die über dem Kontostand liegen. Bei erfolgreicher Durchführung dieser Aufgaben erhalten die Agenten', + about_us: { + title: 'Über uns', + a_1: 'Unternehmensqualifikationen', + a_2: 'Warum verwendet dieses Programm USDT als Währung ? ', + a_3: 'Da das Programm sich der Bedienung von Händlern aus aller Welt widmet.Wir haben USDTals unsere Währung festgelegt,um Währungstransaktionen zu vereinheitlichen,die Verwaltung zu erleichtern und besser' + 'Menschen und Eigentum schützen.', + a_4: 'Kann ich meine Aufgaben jederzeit aktualisieren ? ', + a_5: 'Derzeit ist unsere Plattform von 9: 00 - 23: 00 geöffnet.Es wird nicht empfohlen,dass Agenten Bestellungen außerhalb der Arbeitszeiten erhöhen,um Fehlverhalten zu vermeiden.', + a_6: 'Was passiert,wenn ich nicht alle meine Bestellungen hinzufügen kann ? ', + a_7: 'Da das Programm auf positive Bewertungen unserer Agenten angewiesen ist,ist es wichtig,dass alle Agenten' + 'teilnehmen,um ihre Platzierung zu gewährleisten.Es werden entsprechende Strafen verhängt und die Mitgliedschaft des Agenten wird' + 'dauerhaft beendet.Ihre Promotion hilft nicht nur anderen Händlern,sondern informiert auch unsere Händler und trägt zur Verbesserung der Produkte bei.', + a_8: 'Kann ich meine Produktauswahl ändern ? ', + a_9: 'Sobald ein Produkt gecrawlt wurde,können Sie Ihre Produktauswahl nicht mehr ändern.Beim' + 'Upgrade eines Produkts lesen Sie bitte alle Informationen,die wir in den Allgemeinen Geschäftsbedingungen festgelegt haben,um sicherzustellen,dass Sie alle Programmbedingungen einhalten können.Zum Beispiel könnten' + 'Kompatibilitätsanforderungen für Elektronik bestehen,die nur mit bestimmter Software kompatibel sind.', + a_10: cp_name + ' Partners', + a_11: 'Unsere Partner', + a_12: cp_name + 'verfügt über ein florierendes Ökosystem von Allianzen,die Geschäftslösungen zur Lösung unserer' + 'geschäftlichen und technologischen Herausforderungen unserer Kunden bieten.Wir haben tiefe Beziehungen zu einem umfangreichen' + 'Netzwerk führender Technologieunternehmen,die Ihnen helfen können,sich zu transformieren und zu wachsen.', + a_13: 'Unser robustes Ökosystem hilft Partnern,das Umsatzwachstum zu steigern,den Markt und die geografische Reichweite zu erweitern,' + +'den Verkaufsprozess zu erleichtern und Produkt - und Serviceangebote zu verbessern.', + } + } + }, + invitation: { + title: 'Freunde einladen', + i_c: 'Einladungscode', + link: 'Empfehlungslink', + }, + language: { + title: 'Sprache', + u: 'Benutzername', + c_l: 'Sprache ändern', + l: 'Sprache', + }, + order: { + title: 'Bestellung', + order_no: 'Bestellung', + u_p: 'Stückpreis', + o_q: 'Bestellmenge', + total: 'Gesamt', + o_c: 'Bestellkommission', + c_t: 'Kompilierungszeit', + all: 'Alle', + completed: 'Abgeschlossen', + pending: 'Ausstehend', + frozen: 'Eingefroren', + }, + password: { + title: 'Passwort ändern', + old: 'Aktuelles Passwort', + new: 'Neues Passwort', + confirm_p: 'Passwort bestätigen', + note: 'Hinweis: Passwortänderungen sind auf einmal alle 72 Stunden begrenzt.', + not_match: 'Passwörter stimmen nicht überein.', + }, + payOrderDetail: { + title: 'Bestelldetails', + order_no: 'Bestellnummer:', + amount:'Betrag', + orderTime: 'Bestellzeit', + status:'Status', + pay_m:'Zahlungsmethode', + network:'Netzwerk', + address:'Adresse', + t_s_o:'Um die Bestellung zu starten', + referral: 'Empfehlungscode', + }, + profile: { + ph_no: 'Telefonnummer', + LV: 'LV', + i_c: 'Einladungscode', + level: 'Level', + dailyOrder: 'Tägliche Bestellung', + creditScore: 'Kredit', + ratio: 'Verhältnis', + todays: 'Heutige\'s', + t_order: 'Heutige', + t_order_a: 'Bestellbetrag', + t_commission: 'Kommission', + sign_in_reward: 'Einchecken', + enter_now: 'Jetzt betreten', + c_balance: 'Aktueller Kontostand', + w_success: 'Auszahlung erfolgreich', + records: 'Aufzeichnungen', + settings: 'Einstellungen', + i_f: 'Freunde einladen', + notification: 'Benachrichtigung', + help_guide: 'Hilfeleitfaden', + }, + service: { + title: 'Kundendienst', + c_s_c: 'Kundendienstzentrum', + online: 'Online - Service', + o_tips: 'Wenn Sie ein Problem haben,fragen Sie den Kundendienst', + o_tips_1: 'Online - Service: Problem mit dem Goldfluss', + o_t: 'Online - Zeit', + }, + settings: { + title: 'Einstellungen', + d_o: 'Tägliche Bestellungen', + d_w: 'Tägliche Auszahlung', + c: 'Kommission', + t_r: 'Team - Belohnung', + a: 'Konto', + t_1: 'Persönliche Informationen', + t_2: 'Passwort ändern', + t_3: 'USDT - Adresse binden', + t_4: 'Sprache', + t_5: 'Über uns', + }, + settingsPersonal: { + title: 'Benutzerinformationen', + profile: 'Profil', + p_1: 'Diese Informationen werden öffentlich angezeigt,also seien Sie vorsichtig,was Sie teilen.', + username: 'Benutzername', + about: 'Über', + a_1: 'Schreiben Sie ein paar Sätze über sich selbst.', + photo: 'Foto', + change: 'ändern', + p_i: 'Persönliche Informationen', + p_i_1: 'Verwenden Sie eine dauerhafte Adresse,an der Sie Post empfangen können.', + first_name: 'Vorname', + last_name: 'Nachname', + email: 'E - Mail - Adresse', + country: 'Land', + street: 'Straßenadresse', + street_p: '', + city: 'Stadt', + state: 'Bundesland / Provinz', + postal: 'Postleitzahl', + save: 'Speichern', + upload_error_1: 'Bitte laden Sie ein Bild hoch,das 500 x500 Pixel oder kleiner ist.', + upload_error_2: 'Bitte laden Sie eine Bilddatei hoch.', + upload_error_3: 'Hochladen des Avatars fehlgeschlagen,bitte versuchen Sie es später erneut', + }, + signIn: { + title: 'Melden Sie sich in Ihrem Konto an', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Passwort', + remember: 'Erinnere dich an mich', + forgot: 'Passwort vergessen ? ', + sign_in: 'Anmelden', + n_a_m: 'Noch kein Mitglied ? ', + no_select_country: 'Bitte wählen Sie die Vorwahl Ihres Landes', + s_u_n: 'Jetzt anmelden!', + }, + signUp: { + title: 'Erstellen Sie ein neues Konto', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Passwort', + c_p: 'Passwort bestätigen', + i_c: 'Einladungscode', + i_green: 'Ich stimme zu ', + r_a: '《Registrierungsvereinbarung》', + sign_up: 'Anmelden', + number_exist: 'Die Mobiltelefonnummer existiert bereits.Bitte melden Sie sich direkt an.', + no_select_country: 'Bitte wählen Sie die Vorwahl Ihres Landes', + i_code_not_exist: 'Der von Ihnen eingegebene Einladungscode existiert nicht.Bitte kontaktieren Sie Ihren Mentor.', + sign_up_success: 'Erfolgreich angemeldet!', + to_sign_in: 'Zum Anmelden', + }, + start: { + title: 'Start', + daily_order: 'Tägliche Bestellungen', + commission_ration: 'Kommissionsverhältnis', + free: 'Frei', + earned: 'Verdiente Kommission', + frozen: 'Eingefrorener Betrag', + completed_order: 'Abgeschlossene Bestellung', + available: 'Verfügbarer Saldo', + freeze_commission: 'Kumulative Auftragskommission', + freeze_c_desc: 'Dieser Betrag repräsentiert Ihre aktuelle kumulative Auftragssumme.Sie können ihn bei Aufgabenerfüllung abheben.', + g_order: 'Bestellung aufgeben', + order_desc: 'Bestellbeschreibung', + order_desc_1: '1. Jedes Konto kann pro Tag 38 Bestellungen abgleichen', + order_desc_2: '2. Die Kommission für die Aufgabe einer Bestellung ist einheitlich und entspricht 1,00 % des Gesamtbestellbetrags', + order_desc_3: '3. Das System basiert auf LBS - Technologie und gleicht Waren automatisch durch Cloud - Computing ab', + order_desc_5: '4. Sie können die Aufgabe nicht abbrechen.Sie müssen zuerst alle bestehenden unvollständigen Aufgaben abschließen,bevor Sie neue erhalten können.', + order_desc_6: '5. Jedes Konto kann pro Tag 38 Bestellungen abgleichen', + order_n: 'Hinweis', + order_n_1: 'Wenn die Plattform Bestellungen für Benutzer abgleicht,wird sie die Bestellinformationen an den Händler' + 'hintergrund.Wenn der Benutzer die Bestellung nicht innerhalb von 30 Minuten einreicht,wird der Bestellbetrag vom' + 'das System eingefroren.Um regulatorische Systeme zu vermeiden,werden Benutzerkonten bewertet,was direkt' + 'beeinflusst die nächste Abgleichszeit und den Ruf des Benutzers!Bitte klicken Sie rechtzeitig auf Bestellung stoppen,um zu vermeiden' + 'Zeitüberschreitung einfrieren.', + grabOrder: { + not_completed: 'Bitte schließen Sie zuerst die Bestellung ab', + not_completed_text: 'Bestellung prüfen', + order_limit: 'Die Bestellmenge des heutigen Tages hat das obere Limit erreicht', + order_limit_text: 'Bestätigen', + balance_not_enough: 'Saldo ist nicht ausreichend', + balance_not_enough_text: 'Aufladen', + no_order_available: 'Keine Bestellung verfügbar,bitte versuchen Sie es später erneut', + no_order_available_text: 'Bestätigen', + not_meet_start: 'erfüllt nicht die Startbedingung', + }, + + order_details: { + title: 'Bestellungsaufgabe', + u_p: 'Stückpreis', + o_q: 'Bestellmenge', + total: 'Gesamt', + o_c: 'Bestellkommission', + o_r: 'Bestellbewertung', + c_1: 'das Produkt ist sehr gut Endlich erhalten.das Produkt ist sehr gut Ich bin sehr zufrieden mit dem Produkt und empfehle es zu kaufen', + c_2: 'I am very happy and satisfied', + c_3: 'der Preis ist ziemlich vernünftig', + c_4: 'Die Verarbeitung ist sehr gut', + c_5: 'und ich mag es sehr', + c_6: 'Es sieht toll aus', + c_7: 'und mein Freund hat es zum zweiten Mal gekauft.', + balance_not_enough: 'Das Guthaben reicht nicht aus,um die Bestellung abzuschließen,bitte aufladen', + balance_not_enough_text: 'Aufladen', + order_submitted: 'Die Bestellung wurde eingereicht', + } + }, + + withdrawal: { + title: 'Auszahlung', + w: 'Auszahlung', + w_p: 'Geben Sie Ihr Zahlungspasswort ein', + c_b: 'aktueller Saldo', + s_w_a: 'Auszahlungsbetrag auswählen', + w_a: 'Wallet - Adresse', + m_w_a: 'Wallet - Adresse ändern', + enterPassword: 'Enter Password', + p_i: 'Sie haben eine Auszahlungsanforderung in Bearbeitung.Bitte warten Sie auf das Ergebnis.', + p_e: 'Zahlungspasswortfehler', + t_n_c: "Sie müssen die heutige Bestellungsaufgabe abschließen,bevor Sie Ihr Gehalt erhalten.", + c_s_n_m: 'Ihr Kreditscore erfüllt nicht die Bedingungen für eine Auszahlung,bitte erhöhen Sie Ihren Kreditscore', + }, + recharge: { + title: 'Aufladen', + amount_placeholder: 'auswählen oder hier eingeben', + }, + daily: { + title: 'Tägliches Einchecken', + c: 'Kontinuierlich', + a: 'Anhäufung', + r: 'Belohnung(USDT)', + btn: 'Einchecken', + task_not_compiled: 'Bitte schließen Sie zuerst die heutige Bestellungsaufgabe ab', + }, + common: { + confirm: 'Bestätigen', + cancel: 'Abbrechen', + loosing: 'Verlieren', + loading: 'Laden', + no_data: 'keine weiteren Daten', + submit: 'einreichen', + waring: 'Warnung', + error: 'Fehler', + insufficient: 'Unzureichend', + submitted: 'Eingereicht', + noResult: 'Keine Ergebnisse gefunden' + }, + main: { + home: 'Startseite', + order: 'Bestellung', + start: 'Start', + service: 'Service', + profile: 'Profil', + } +} \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/en-us.ts b/grailed_app/src/i18n/lang/en-us.ts new file mode 100644 index 0000000..7256fbe --- /dev/null +++ b/grailed_app/src/i18n/lang/en-us.ts @@ -0,0 +1,384 @@ +import type { langType } from './lang-base' + +let cp_name = import.meta.env.VITE_APP_NAME; + +export const lang: langType = { + about: { + title: 'About', + profile: 'Company Qualifications', + h_1: 'Why does this program use USDT as currency?', + h_2: "Since the program is dedicated to serving merchants from all over the world, . We have fixed USDT as our currency in order to unify currency transactions, facilitate management and better protect people and property.", + h_3: 'Can I upgrade my tasks at any time?', + h_4: 'Currently our platform is open from 10.00-23.00. It is not recommended for agents to boost orders during non-working hours to avoid any misconduct.', + h_5: "What happens if I can't add all my orders?", + h_6: 'Since the program relies on positive reviews from our agents, it is important that all agents participate to ensure their placement. Penalties will be applied as relevant and the agent\'s membership will be permanently terminated. Not only does your promotion help other merchants, it also helps inform our merchants and contribute to product improvements.', + h_7: 'Can I change my product selection?', + h_8: 'Once a product has been crawled, you will not be able to change your product selection. When upgrading a product, please read all the information we have set forth in the Terms and Conditions to ensure that you can comply with all program requirements. For example, there may be compatibility requirements for electronics that are only compatible with specific software.', + h_9: 'Our Partners has a thriving ecosystem of alliances that provide business solutions to solve our customers\' business and technology challenges. We have deep relationships across an extensive network of leading technology companies that can help you transform and grow.', + h_10: 'Our robust ecosystem helps partners increase revenue growth, expand market and geographic reach, facilitate sales processes, and enhance product and service offerings.' + }, + balanceRecord: { + title: 'Balance Records', + }, + bindCrypto: { + title: 'Bind Address', + enterAddress: 'Enter address' + }, + channelSelect: { + title: 'Channel Select', + balance: 'Balance', + t_1: 'Select a you useful channel', + }, + helpGuide: { + title: 'Help Guide', + faq: 'FAQ', + q_1: 'How do I start taking tasks?', + a_1: "First, you need to register an account on our website. After registration, click on the 'start' menu, and then click the 'Grab Order' button to start working.", + q_2: "When will I receive the commission for the tasks I've completed?", + a_2: "Once your completed task is reviewed and confirmed to be correct, the commission will be credited to your account on our website within 1 hour.", + q_3: 'How many tasks can I take on at the same time?', + a_3: "You can only take one task at a time. The number of tasks you can complete each day will be adjusted based on your membership level and the shop's situation.", + q_4: "What if I can't complete a task?", + a_4: "If you can't complete a task within the stipulated time, please contact our customer service team promptly. We will provide you with a suitable solution or recommendation based on the specific situation.", + q_5: 'How can I upgrade my membership level?', + a_5: 'Membership levels are granted based on the tasks completed by the customer. For more details, please contact customer service.', + }, + home: { + cp_name: cp_name, + continue: 'Continue to do the task', + notice: { + c_t: 'Congratulations to ', + f_e: 'earned ', + }, + taskCarouse: { + title: 'Task', + }, + partners: { + title: 'Our Partners', + }, + introduce: { + i_f: 'Invite Friends', + j_s: 'Let\'s Join Us Now', + c_c: 'Copy the referral code to join us now', + c_l: 'Copy invitation link', + terms_a: 'Terms & Agreements', + terms_c: 'Terms & Conditions', + terms_c_1: 'These terms and conditions apply to your use of this website and by accessing this website and/or' + + ' updating your order, you agree to be bound by the following terms and conditions. If you do not' + + 'agree to be bound by these terms and conditions, you will not be able to use or access this website.', + terms_c_2: 'If you have any questions about these terms and conditions before updating your order, please contact our customer service team 7 days a week.', + terms_c_3: 'Explanation', + terms_c_4: 'Conditions - these terms and conditions and special conditions', + terms_c_5: 'Products - the products shown on this website to improve ratings', + terms_c_6: 'Product Descriptions - the sections of this website that provide certain terms and conditions relating to individual products', + terms_c_7: 'Special Conditions - the terms and conditions on the product description', + terms_c_8: 'Services - the agency services we provide for the products being updated for review, as described in the agency agreement', + terms_c_9: 'Agent/you - the generic term for users of this website Personal information', + terms_c_10: 'Details provided by you during registration', + terms_c_11: 'Cookies - small text files placed on your computer\'s hard drive by this website to store information and identify your computer', + terms_c_12: 'Agreement - the agent containing these terms and conditions', + terms_c_13: '1.0 Explanation', + terms_c_14: '1.1 Any words following a particular clause, for example, or any similar expression, shall be construed as illustrative and shall not limit the meaning of the words, descriptions, definitions, phrases or terms preceding those clauses.', + terms_c_15: '1.2 Unless otherwise stated, capital letters used in these terms and conditions (but not defined in these terms and conditions) shall have the meaning set out in the Agency Agreement.', + terms_c_16: '2.0 Responsibilities of the Agent', + terms_c_17: '2.1 Each Agent must complete at least one set of tasks in order to receive a bonus from us.', + terms_c_18: '2.2 Agents may reset their account once per day. Each agent can complete a maximum of two tasks per day.', + terms_c_19: '2.3 Early completion of tasks is not permitted as this will result in a break in sales data collection.', + terms_c_20: '2.4 Agents are not allowed to post or publish any false information on any type of social media. We reserve the right to seek legal liability.', + terms_c_21: '2.5 Compliance with legal obligations (meeting our legal obligations)', + terms_c_22: '2.6 Dealing with claims and complaints and seeking resolution (legal rights and legal claims)', + terms_c_23: '3.0 Any advertising or digital media agency or internet service provider in connection with the Programme', + terms_c_24: '3.1 By participating in the Program, you undertake to submit all true, accurate, current and complete information. We reserve the right to verify your eligibility.', + terms_c_25: '3.2 If we know or have reasonable grounds to believe at the time of registration that you are ' + + 'not eligible to participate in the Program, we reserve the right to disqualify you and ' + + 'select an alternative product reviewer.', + terms_c_26: '4.0 Our liability', + terms_c_27: '4.1 We are not responsible for technical failures or traffic congestion on the internet or any website, or any combination of these factors, or for any interruptions or disruptions to the equipment of any other person in connection with or as a result of participation.', + terms_c_28: '4.2 We are not responsible for any defamatory material, infringement of third party' + + 'intellectual property rights or other illegal material in your entry.', + terms_c_29: '5.0 Advertising and your personal data', + terms_c_30: '5.1 Subject to your consent, we may use your username for promotional purposes and/or in connection with our advertising, promotional or marketing activities (as described in our announcements and reviews, terms and conditions).', + terms_c_31: '5.1 is aware that you are concerned about our use of your information and we appreciate the' + +' trust you place in us to use it in a careful and reasonable manner. All information we' + +'collect will be subject to our Privacy Policy which sets out what information we collect,' + +' what we do with it and the purposes for which we use that data. Please refer to our Privacy' + +'Policy for further details. You understand that by joining the programme, will collect and' + +'use your personal information as described in the Privacy Policy, which includes sharing' + +'information with suppliers who assist with the website and promotions.', + terms_c_32: '5.3 As guided by normal circumstances, the platform is designed to match only products whose' + +'price is lower than the agent\'s account balance. However, merchants may choose to increase' + +'the range of agents matched by paying at least three times their salary. This will allow the' + +'agent to obtain package assignments priced above the account balance. Upon successful' + +'completion of these tasks, agents will receive', + about_us: { + title: 'About Us', + a_1: 'Company Qualifications', + a_2: 'Why does this program use USDT as currency?', + a_3: 'Since the program is dedicated to serving merchants from all over the world, . We' + +'have fixed USDT' + +'as our currency in order to unify currency transactions, facilitate management and better' + +'protect people and property.', + a_4: 'Can I upgrade my tasks at any time?', + a_5: 'Currently our platform is open from 9:00-23:00. It is not recommended for agents to boost orders during non-working hours to avoid any misconduct.', + a_6: 'What happens if I can\'t add all my orders?', + a_7: 'Since the program relies on positive reviews from our agents, it is important that all agents' + +'participate to ensure their placement. Penalties will be applied as relevant and the agent\'s' + +'membership will be permanently terminated. Not only does your promotion help other merchants, it' + +'also helps inform our merchants and contribute to product improvements.', + a_8: 'Can I change my product selection?', + a_9: 'Once a product has been crawled, you will not be able to change your product selection. When' + +'upgrading a product, please read all the information we have set forth in the Terms and' + +'Conditions to ensure that you can comply with all program requirements. For example, there may' + +'be compatibility requirements for electronics that are only compatible with specific software.', + a_10: cp_name + ' Partners', + a_11: 'Our Partners', + a_12: cp_name + ' has a thriving ecosystem of alliances that provide business solutions to solve our' + +'customers\' business and technology challenges. We have deep relationships across an extensive' + +'network of leading technology companies that can help you transform and grow.', + a_13: 'Our robust ecosystem helps partners increase revenue growth, expand market and geographic reach,' + +'facilitate sales processes, and enhance product and service offerings.', + } + } + }, + invitation: { + title: 'Invite Friends', + i_c: 'invitation Code', + link: 'Referral link', + }, + language: { + title: 'Language', + u: 'username', + c_l: 'Change Language', + l: 'Language', + }, + order: { + title: 'Order', + order_no: 'Order No', + u_p: 'Unit Price', + o_q: 'Order quantity', + total: 'Total', + o_c: 'Order Commission', + c_t: 'Compile Time', + all: 'All', + completed: 'Completed', + pending: 'Pending', + frozen: 'Frozen', + }, + password: { + title: 'Change Password', + old: 'Current Password', + new: 'New Password', + confirm_p: 'Confirm Password', + note: 'Note: Password changes are limited to once every 72 hours.', + not_match: 'Passwords do not match.', + }, + payOrderDetail: { + title: 'Order Details', + order_no: 'Order No:', + amount:'Amount', + orderTime: 'Order Time', + status:'Status', + pay_m:'Payment Method', + network:'Network', + address:'Address', + t_s_o:'To Start Order', + referral: 'Referral Code', + }, + profile: { + ph_no: 'Ph No', + LV: 'LV', + i_c: 'invitationCode', + level: 'Level', + dailyOrder: 'DailyOrder', + creditScore: 'Credit', + ratio: 'Ratio', + todays: 'Today\'s', + t_order: 'Orders', + t_order_a: 'Order Amount', + t_commission: 'Commission', + sign_in_reward: 'Check-in', + enter_now: 'Enter Now', + c_balance: 'Current Balance', + w_success: 'Withdrawal Successful', + records: 'Records', + settings: 'Settings', + i_f: 'Invite Friends', + notification: 'Notification', + help_guide: 'Help Guide', + }, + service: { + title: 'Customer Service', + c_s_c: 'Customer service center', + online: 'Online Service', + o_tips: 'If you have a problem,ask for customer service', + o_tips_1: 'Online Service :Gold flow problem', + o_t: 'Online time', + }, + settings: { + title: 'Settings', + d_o: 'Daily orders', + d_w: 'Daily withdrawal', + c: 'Commission', + t_r: 'Team Reward', + a: 'Account', + t_1: 'Personal Information', + t_2: 'Change Password', + t_3: 'Bind USDT Address', + t_4: 'Language', + t_5: 'About Us', + }, + settingsPersonal: { + title: 'User Information', + profile: 'Profile', + p_1: 'This information will be displayed publicly so be careful what you share.', + username: 'Username', + about: 'About', + a_1: 'Write a few sentences about yourself.', + photo: 'Photo', + change: 'change', + p_i: 'Personal Information', + p_i_1: 'Use a permanent address where you can receive mail.', + first_name: 'First Name', + last_name: 'Last Name', + email: 'Email address', + country: 'Country', + street: 'Street address', + street_p: '', + city: 'City', + state: 'State / Province', + postal: 'Postal code', + save: 'Save', + upload_error_1: 'Please upload an image that is 500x500 pixels or smaller.', + upload_error_2: 'Please upload an image file.', + upload_error_3: 'upload avatar failed, please try again late', + }, + signIn: { + title: 'Sign in to your account', + p_n: 'Phone Number', + country: 'Country', + password: 'Password', + remember: 'Remember Me', + forgot: 'Forgot password?', + sign_in: 'Sign In', + n_a_m: 'Not a member?', + no_select_country: 'Please select your country\'s area code', + s_u_n: 'Sign up Now!', + }, + signUp: { + title: 'Create a new account', + p_n: 'Phone Number', + country: 'Country', + password: 'Password', + c_p: 'Confirm password', + i_c: 'Invitation Code', + i_green: 'I agree with the ', + r_a: '《Registration Agreement》', + sign_up: 'Sign Up', + number_exist: 'The mobile number already exists. Please log in directly.', + no_select_country: 'Please select your country\'s area code', + i_code_not_exist: 'The invitation code you entered does not exist. Please contact your mentor.', + sign_up_success: 'Sign up successfully!', + to_sign_in: 'To Sign In', + + }, + start: { + title: 'Start', + daily_order: 'Daily Orders', + commission_ration: 'Commission Ratio', + free: 'Free', + earned: 'Earned Commission', + frozen: 'Frozen Amount', + completed_order: 'Completed Order', + available: 'Available Balance', + freeze_commission: 'Cumulative order commission', + freeze_c_desc: 'This amount represents your current cumulative order total. You can withdraw it upon task completion.', + g_order: 'Grab Order', + order_desc: 'Order description', + order_desc_1: '1.Each account can match 38 orders per day', + order_desc_2: '2.The commission for placing an order is uniform and equals to 1.00% of the total order amount', + order_desc_3: '3.The system is based on LBS technology and automatically matches goods through cloud computing', + order_desc_5: '4.You cannot cancel the task. You must first complete any existing unfinished tasks before you can receive new ones.', + order_desc_6: '5.Each account can match 38 orders per day', + order_n: 'Notice', + order_n_1: 'When the platform matches orders for users, it will submit the order information to the merchant' + +'background. If the user does not submit the order within 30 minutes, the order amount will be frozen by' + +'the system. In order to avoid regulatory systems, user accounts will be evaluated, which will directly' + +'affect the user\'s next matching time and reputation! Please click stop placing order in time to avoid' + +'timeout freeze.', + grabOrder: { + not_completed: 'Please complete the order first', + not_completed_text: 'To Check order', + order_limit: 'Today\'s order quantity has reached the upper limit', + order_limit_text: 'Confirm', + balance_not_enough: 'Balance is not enough', + balance_not_enough_text: 'Top up', + no_order_available: 'No order available, Please try again later', + no_order_available_text: 'Confirm', + not_meet_start: 'not meet start condition', + }, + order_details: { + title: 'Order task', + u_p: 'Unit Price', + o_q: 'Order quantity', + total: 'Total', + o_c: 'Order Commission', + o_r: 'order rating', + c_1: 'the product is very good Finally received it. the product is very good I am very satisfied with the product and recommend to buy it', + c_2: 'I am very happy and satisfied', + c_3: 'the price is quite reasonable', + c_4: 'The workmanship is very good', + c_5: 'and I like it very much', + c_6: 'It looks great', + c_7: 'and my friend has bought it for the second time.', + balance_not_enough: 'Balance is not enough to complete the order, please recharge', + balance_not_enough_text: 'Top up', + order_submitted: 'The order has been submitted', + } + }, + withdrawal: { + title: 'Withdrawal', + w: 'Withdrawal', + w_p: 'Enter Your Payment Password', + c_b: 'current balance', + s_w_a: 'select Withdrawal amount', + w_a: 'Wallet Address', + m_w_a: 'Modify Wallet Address', + enterPassword: 'Enter Password', + p_i: 'you have one withdrawal request in process. Please wait for the result.', + p_e: 'Payment Password Error', + t_n_c: "You need to complete today's order task before receiving your salary.", + c_s_n_m: 'Your credit score does not meet the conditions for withdrawal, please increase your credit score', + }, + recharge: { + title: 'Top Up', + amount_placeholder: 'select or type here', + }, + daily: { + title: 'Daily Check-in', + c: 'Continuous', + a: 'Accumulation', + r: 'Reward (USDT)', + btn: 'Check-in', + task_not_compiled: 'Please complete today order task first', + }, + common: { + confirm: 'Confirm', + cancel: 'Cancel', + loosing: 'loosing', + loading: 'loading', + no_data: 'no more data', + submit: 'submit', + waring: 'waring', + error: 'error', + insufficient: 'Insufficient', + submitted: 'Submitted', + noResult: 'No results found' + }, + main: { + home: 'Home', + order: 'Order', + start: 'Start', + service: 'Service', + profile: 'Profile', + } +} \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/en-us2.ts b/grailed_app/src/i18n/lang/en-us2.ts new file mode 100644 index 0000000..18b128c --- /dev/null +++ b/grailed_app/src/i18n/lang/en-us2.ts @@ -0,0 +1,355 @@ +import type { langType } from './lang-base' + +let cp_name = import.meta.env.VITE_APP_NAME; + +export const lang: langType = { + about: { + title: 'Über uns', + profile: 'Unternehmensqualifikationen', + h_1: 'Warum verwendet dieses Programm USDT als Währung?', + h_2: "Da das Programm dazu dient, Händler aus der ganzen Welt zu bedienen, haben wir USDT als unsere Währung festgelegt, um Währungstransaktionen zu vereinheitlichen, die Verwaltung zu erleichtern und Menschen und Eigentum besser zu schützen.", + h_3: 'Kann ich meine Aufgaben jederzeit aktualisieren?', + h_4: 'Derzeit ist unsere Plattform von 10.00 bis 23.00 Uhr geöffnet. Es wird nicht empfohlen, Bestellungen außerhalb der Arbeitszeiten zu beschleunigen, um Fehlverhalten zu vermeiden.', + h_5: "Was passiert, wenn ich nicht alle meine Bestellungen hinzufügen kann?", + h_6: 'Da das Programm auf positiven Bewertungen unserer Agenten beruht, ist es wichtig, dass alle Agenten teilnehmen, um ihre Platzierung sicherzustellen. Strafen werden entsprechend angewendet und die Mitgliedschaft des Agenten wird dauerhaft beendet. Ihre Förderung hilft nicht nur anderen Händlern, sondern informiert auch unsere Händler und trägt zur Produktverbesserung bei.', + h_7: 'Kann ich meine Produktauswahl ändern?', + h_8: 'Sobald ein Produkt gecrawlt wurde, können Sie Ihre Produktauswahl nicht mehr ändern. Wenn Sie ein Produkt aktualisieren, lesen Sie bitte alle Informationen, die wir in den Allgemeinen Geschäftsbedingungen festgelegt haben, um sicherzustellen, dass Sie alle Programmbedingungen erfüllen können. Es können beispielsweise Kompatibilitätsanforderungen für Elektronik bestehen, die nur mit bestimmter Software kompatibel sind.', + h_9: 'Unsere Partner verfügen über ein blühendes Ökosystem von Allianzen, die Geschäftslösungen zur Bewältigung der geschäftlichen und technologischen Herausforderungen unserer Kunden bieten. Wir haben enge Beziehungen zu einem umfangreichen Netzwerk führender Technologieunternehmen, die Ihnen bei der Transformation und dem Wachstum helfen können.', + h_10: 'Unser robustes Ökosystem hilft Partnern, das Umsatzwachstum zu steigern, den Markt- und geografischen Bereich zu erweitern, Verkaufsprozesse zu erleichtern und Produkt- und Serviceangebote zu verbessern.' + }, + balanceRecord: { + title: 'Kontostandprotokolle', + }, + bindCrypto: { + title: 'Bindungsadresse', + enterAddress: 'Adresse eingeben' + }, + channelSelect: { + title: 'Kanal auswählen', + balance: 'Kontostand', + t_1: 'Wählen Sie einen für Sie nützlichen Kanal aus', + }, + helpGuide: { + title: 'Hilfeleitfaden', + faq: 'FAQ', + q_1: 'Wie fange ich an, Aufgaben zu übernehmen?', + a_1: "Zuerst müssen Sie ein Konto auf unserer Website registrieren. Nach der Registrierung klicken Sie im Menü auf 'Start' und dann auf die Schaltfläche 'Auftrag abholen', um mit der Arbeit zu beginnen.", + q_2: "Wann erhalte ich die Provision für die von mir erledigten Aufgaben?", + a_2: "Sobald Ihre erledigte Aufgabe überprüft und als korrekt bestätigt wurde, wird die Provision innerhalb von 1 Stunde auf Ihr Konto auf unserer Website gutgeschrieben.", + q_3: 'Wie viele Aufgaben kann ich gleichzeitig übernehmen?', + a_3: "Sie können immer nur eine Aufgabe gleichzeitig übernehmen. Die Anzahl der Aufgaben, die Sie täglich erledigen können, wird je nach Ihrem Mitgliedschaftslevel und der Situation im Geschäft angepasst.", + q_4: "Was passiert, wenn ich eine Aufgabe nicht abschließen kann?", + a_4: "Wenn Sie eine Aufgabe nicht innerhalb der festgelegten Zeit abschließen können, wenden Sie sich bitte umgehend an unseren Kundenservice. Wir werden Ihnen eine geeignete Lösung oder Empfehlung basierend auf der konkreten Situation bieten.", + q_5: 'Wie kann ich meinen Mitgliedschaftslevel erhöhen?', + a_5: 'Mitgliedschaftslevel werden basierend auf den vom Kunden erledigten Aufgaben vergeben. Für weitere Details wenden Sie sich bitte an den Kundenservice.', + }, + home: { + cp_name: cp_name, + continue: 'Weiterhin Aufgaben erledigen', + notice: { + c_t: 'Herzlichen Glückwunsch an ', + f_e: 'verdient ', + }, + taskCarouse: { + title: 'Aufgabe', + }, + partners: { + title: 'Unsere Partner', + }, + introduce: { + i_f: 'Freunde einladen', + j_s: 'Lass uns jetzt beitreten', + c_c: 'Kopieren Sie den Empfehlungscode, um sich uns anzuschließen', + c_l: 'Einladungslink kopieren', + terms_a: 'Bedingungen & Vereinbarungen', + terms_c: 'Allgemeine Geschäftsbedingungen', + terms_c_1: 'Diese Allgemeinen Geschäftsbedingungen gelten für Ihre Nutzung dieser Website. Durch den Zugriff auf diese Website und/oder die Aktualisierung Ihrer Bestellung erklären Sie sich mit den folgenden Allgemeinen Geschäftsbedingungen einverstanden. Wenn Sie sich nicht an diese Allgemeinen Geschäftsbedingungen halten möchten, können Sie diese Website nicht nutzen oder darauf zugreifen.', + terms_c_2: 'Wenn Sie vor der Aktualisierung Ihrer Bestellung Fragen zu diesen Allgemeinen Geschäftsbedingungen haben, wenden Sie sich bitte an unser Kundenserviceteam, das 7 Tage die Woche für Sie da ist.', + terms_c_3: 'Erklärung', + terms_c_4: 'Bedingungen - diese Allgemeinen Geschäftsbedingungen und besondere Bedingungen', + terms_c_5: 'Produkte - die auf dieser Website gezeigten Produkte zur Verbesserung der Bewertungen', + terms_c_6: 'Produktbeschreibungen - die Abschnitte dieser Website, die bestimmte Bedingungen in Bezug auf einzelne Produkte enthalten', + terms_c_7: 'Besondere Bedingungen - die Bedingungen in der Produktbeschreibung', + terms_c_8: 'Dienstleistungen - die von uns im Rahmen der Produktaktualisierung für die Überprüfung bereitgestellten Agenturdienste gemäß der Agenturvereinbarung', + terms_c_9: 'Agent/Sie - der generische Begriff für Benutzer dieser Website', + terms_c_10: 'Von Ihnen bei der Registrierung bereitgestellte Details', + terms_c_11: 'Cookies - kleine Textdateien, die von dieser Website auf der Festplatte Ihres Computers abgelegt werden, um Informationen zu speichern und Ihren Computer zu identifizieren', + terms_c_12: 'Vereinbarung - die von diesen Allgemeinen Geschäftsbedingungen erfasste Agentur', + terms_c_13: '1.0 Erklärung', + terms_c_14: '1.1 Jede nach einem bestimmten Satz folgende Wortwahl oder ähnlicher Ausdruck ist als veranschaulichend zu verstehen und beschränkt nicht die Bedeutung der Worte, Beschreibungen, Definitionen, Phrasen oder Begriffe, die diesen Sätzen vorausgehen.', + terms_c_15: '1.1 Jede nach einem bestimmten Satz folgende Wortwahl oder ähnlicher Ausdruck ist als veranschaulichend zu verstehen und beschränkt nicht die Bedeutung der Worte, Beschreibungen, Definitionen, Phrasen oder Begriffe, die diesen Sätzen vorausgehen.', + terms_c_16: '2.0 Verantwortlichkeiten des Agenten', + terms_c_17: '2.1 Jeder Agent muss mindestens einen Satz Aufgaben abschließen, um von uns einen Bonus zu erhalten.', + terms_c_18: '2.2 Agenten können ihr Konto einmal pro Tag zurücksetzen. Jeder Agent kann maximal zwei Aufgaben pro Tag abschließen.', + terms_c_19: '2.3 Eine vorzeitige Erledigung von Aufgaben ist nicht gestattet, da dies zu einer Unterbrechung der Datenerfassung für den Verkauf führt.', + terms_c_20: '2.4 Agenten dürfen keine falschen Informationen in sozialen Medien veröffentlichen. Wir behalten uns das Recht vor, rechtliche Schritte einzuleiten.', + terms_c_21: '2.5 Einhaltung rechtlicher Verpflichtungen (Erfüllung unserer rechtlichen Verpflichtungen)', + terms_c_22: '2.6 Umgang mit Ansprüchen und Beschwerden sowie Suche nach Lösungen (Rechtsansprüche und rechtliche Ansprüche)', + terms_c_23: '3.0 Werbung oder digitale Medienagentur oder Internetdienstanbieter im Zusammenhang mit dem Programm', + terms_c_24: '3.1 Durch die Teilnahme am Programm verpflichten Sie sich, alle wahren, genauen, aktuellen und vollständigen Informationen einzureichen. Wir behalten uns das Recht vor, Ihre Berechtigung zu überprüfen.', + terms_c_25: '3.2 Wenn wir zum Zeitpunkt der Registrierung wissen oder vernünftige Gründe zu der Annahme haben, dass Sie nicht berechtigt sind, am Programm teilzunehmen, behalten wir uns das Recht vor, Sie zu disqualifizieren und einen anderen Produktprüfer auszuwählen.', + terms_c_26: '4.0 Unsere Haftung', + terms_c_27: '4.1 Wir sind nicht verantwortlich für technische Ausfälle oder Verkehrsstaus im Internet oder auf Websites oder eine Kombination dieser Faktoren oder für Unterbrechungen oder Störungen der Ausrüstung anderer Personen im Zusammenhang mit oder als Folge der Teilnahme.', + terms_c_28: '4.2 Wir sind nicht verantwortlich für diffamierendes Material, Verletzung von Rechten an geistigem Eigentum Dritter oder andere illegale Inhalte in Ihrem Beitrag.', + terms_c_29: '5.0 Werbung und Ihre persönlichen Daten', + terms_c_30: '5.1 Vorbehaltlich Ihrer Zustimmung können wir Ihren Benutzernamen zu Werbezwecken und/oder im Zusammenhang mit unseren Werbe-, Promotions- oder Marketingaktivitäten verwenden (wie in unseren Ankündigungen und Bewertungen, Allgemeinen Geschäftsbedingungen beschrieben).', + terms_c_31: '5.1 ist sich bewusst, dass Sie besorgt sind über unsere Verwendung Ihrer Informationen, und wir schätzen das Vertrauen, das Sie in uns setzen, um es sorgfältig und vernünftig zu verwenden. Alle von uns gesammelten Informationen unterliegen unserer Datenschutzrichtlinie, die festlegt, welche Informationen wir sammeln, was wir damit tun und zu welchen Zwecken wir diese Daten verwenden. Bitte beachten Sie unsere Datenschutzrichtlinie für weitere Details. Sie verstehen, dass wir durch die Teilnahme am Programm Ihre persönlichen Informationen gemäß der Datenschutzrichtlinie sammeln und verwenden werden, einschließlich der Weitergabe von Informationen an Lieferanten, die bei der Website und den Promotionen behilflich sind.', + terms_c_32: '5.3 Unter normalen Umständen ist die Plattform so konzipiert, dass sie nur Produkte abgleicht, deren Preis niedriger ist als das Kontoguthaben des Agenten. Händler können jedoch wählen, den Bereich der abgeglichenen Agenten zu erweitern, indem sie mindestens das Dreifache ihres Gehalts zahlen. Dies ermöglicht es dem Agenten, Paketaufträge zu erhalten, die über dem Kontostand liegen. Bei erfolgreicher Durchführung dieser Aufgaben erhalten die Agenten', + about_us: { + title: 'Über uns', + a_1: 'Unternehmensqualifikationen', + a_2: 'Warum verwendet dieses Programm USDT als Währung ? ', + a_3: 'Da das Programm sich der Bedienung von Händlern aus aller Welt widmet.Wir haben USDTals unsere Währung festgelegt,um Währungstransaktionen zu vereinheitlichen,die Verwaltung zu erleichtern und besser' + 'Menschen und Eigentum schützen.', + a_4: 'Kann ich meine Aufgaben jederzeit aktualisieren ? ', + a_5: 'Derzeit ist unsere Plattform von 9: 00 - 23: 00 geöffnet.Es wird nicht empfohlen,dass Agenten Bestellungen außerhalb der Arbeitszeiten erhöhen,um Fehlverhalten zu vermeiden.', + a_6: 'Was passiert,wenn ich nicht alle meine Bestellungen hinzufügen kann ? ', + a_7: 'Da das Programm auf positive Bewertungen unserer Agenten angewiesen ist,ist es wichtig,dass alle Agenten' + 'teilnehmen,um ihre Platzierung zu gewährleisten.Es werden entsprechende Strafen verhängt und die Mitgliedschaft des Agenten wird' + 'dauerhaft beendet.Ihre Promotion hilft nicht nur anderen Händlern,sondern informiert auch unsere Händler und trägt zur Verbesserung der Produkte bei.', + a_8: 'Kann ich meine Produktauswahl ändern ? ', + a_9: 'Sobald ein Produkt gecrawlt wurde,können Sie Ihre Produktauswahl nicht mehr ändern.Beim' + 'Upgrade eines Produkts lesen Sie bitte alle Informationen,die wir in den Allgemeinen Geschäftsbedingungen festgelegt haben,um sicherzustellen,dass Sie alle Programmbedingungen einhalten können.Zum Beispiel könnten' + 'Kompatibilitätsanforderungen für Elektronik bestehen,die nur mit bestimmter Software kompatibel sind.', + a_10: cp_name + ' Partners', + a_11: 'Unsere Partner', + a_12: cp_name + 'verfügt über ein florierendes Ökosystem von Allianzen,die Geschäftslösungen zur Lösung unserer' + 'geschäftlichen und technologischen Herausforderungen unserer Kunden bieten.Wir haben tiefe Beziehungen zu einem umfangreichen' + 'Netzwerk führender Technologieunternehmen,die Ihnen helfen können,sich zu transformieren und zu wachsen.', + a_13: 'Unser robustes Ökosystem hilft Partnern,das Umsatzwachstum zu steigern,den Markt und die geografische Reichweite zu erweitern,' + +'den Verkaufsprozess zu erleichtern und Produkt - und Serviceangebote zu verbessern.', + } + } + }, + invitation: { + title: 'Freunde einladen', + i_c: 'Einladungscode', + link: 'Empfehlungslink', + }, + language: { + title: 'Sprache', + u: 'Benutzername', + c_l: 'Sprache ändern', + l: 'Sprache', + }, + order: { + title: 'Bestellung', + order_no: 'Bestellung', + u_p: 'Stückpreis', + o_q: 'Bestellmenge', + total: 'Gesamt', + o_c: 'Bestellkommission', + c_t: 'Kompilierungszeit', + all: 'Alle', + completed: 'Abgeschlossen', + pending: 'Ausstehend', + frozen: 'Eingefroren', + }, + password: { + title: 'Passwort ändern', + old: 'Aktuelles Passwort', + new: 'Neues Passwort', + confirm_p: 'Passwort bestätigen', + note: 'Hinweis: Passwortänderungen sind auf einmal alle 72 Stunden begrenzt.', + not_match: 'Passwörter stimmen nicht überein.', + }, + payOrderDetail: { + title: 'Bestelldetails', + order_no: 'Bestellnummer:', + amount:'Betrag', + orderTime: 'Bestellzeit', + status:'Status', + pay_m:'Zahlungsmethode', + network:'Netzwerk', + address:'Adresse', + t_s_o:'Um die Bestellung zu starten', + referral: 'Empfehlungscode', + }, + profile: { + ph_no: 'Telefonnummer', + LV: 'LV', + i_c: 'Einladungscode', + level: 'Level', + dailyOrder: 'Tägliche Bestellung', + creditScore: 'Kredit', + ratio: 'Verhältnis', + todays: 'Heutige\'s', + t_order: 'Heutige', + t_order_a: 'Bestellbetrag', + t_commission: 'Kommission', + sign_in_reward: 'Einchecken', + enter_now: 'Jetzt betreten', + c_balance: 'Aktueller Kontostand', + w_success: 'Auszahlung erfolgreich', + records: 'Aufzeichnungen', + settings: 'Einstellungen', + i_f: 'Freunde einladen', + notification: 'Benachrichtigung', + help_guide: 'Hilfeleitfaden', + }, + service: { + title: 'Kundendienst', + c_s_c: 'Kundendienstzentrum', + online: 'Online - Service', + o_tips: 'Wenn Sie ein Problem haben,fragen Sie den Kundendienst', + o_tips_1: 'Online - Service: Problem mit dem Goldfluss', + o_t: 'Online - Zeit', + }, + settings: { + title: 'Einstellungen', + d_o: 'Tägliche Bestellungen', + d_w: 'Tägliche Auszahlung', + c: 'Kommission', + t_r: 'Team - Belohnung', + a: 'Konto', + t_1: 'Persönliche Informationen', + t_2: 'Passwort ändern', + t_3: 'USDT - Adresse binden', + t_4: 'Sprache', + t_5: 'Über uns', + }, + settingsPersonal: { + title: 'Benutzerinformationen', + profile: 'Profil', + p_1: 'Diese Informationen werden öffentlich angezeigt,also seien Sie vorsichtig,was Sie teilen.', + username: 'Benutzername', + about: 'Über', + a_1: 'Schreiben Sie ein paar Sätze über sich selbst.', + photo: 'Foto', + change: 'ändern', + p_i: 'Persönliche Informationen', + p_i_1: 'Verwenden Sie eine dauerhafte Adresse,an der Sie Post empfangen können.', + first_name: 'Vorname', + last_name: 'Nachname', + email: 'E - Mail - Adresse', + country: 'Land', + street: 'Straßenadresse', + street_p: '', + city: 'Stadt', + state: 'Bundesland / Provinz', + postal: 'Postleitzahl', + save: 'Speichern', + upload_error_1: 'Bitte laden Sie ein Bild hoch,das 500 x500 Pixel oder kleiner ist.', + upload_error_2: 'Bitte laden Sie eine Bilddatei hoch.', + upload_error_3: 'Hochladen des Avatars fehlgeschlagen,bitte versuchen Sie es später erneut', + }, + signIn: { + title: 'Melden Sie sich in Ihrem Konto an', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Passwort', + remember: 'Erinnere dich an mich', + forgot: 'Passwort vergessen ? ', + sign_in: 'Anmelden', + n_a_m: 'Noch kein Mitglied ? ', + no_select_country: 'Bitte wählen Sie die Vorwahl Ihres Landes', + s_u_n: 'Jetzt anmelden!', + }, + signUp: { + title: 'Erstellen Sie ein neues Konto', + p_n: 'Telefonnummer', + country: 'Land', + password: 'Passwort', + c_p: 'Passwort bestätigen', + i_c: 'Einladungscode', + i_green: 'Ich stimme zu ', + r_a: '《Registrierungsvereinbarung》', + sign_up: 'Anmelden', + number_exist: 'Die Mobiltelefonnummer existiert bereits.Bitte melden Sie sich direkt an.', + no_select_country: 'Bitte wählen Sie die Vorwahl Ihres Landes', + i_code_not_exist: 'Der von Ihnen eingegebene Einladungscode existiert nicht.Bitte kontaktieren Sie Ihren Mentor.', + sign_up_success: 'Erfolgreich angemeldet!', + to_sign_in: 'Zum Anmelden', + }, + start: { + title: 'Start', + daily_order: 'Tägliche Bestellungen', + commission_ration: 'Kommissionsverhältnis', + free: 'Frei', + earned: 'Verdiente Kommission', + frozen: 'Eingefrorener Betrag', + completed_order: 'Abgeschlossene Bestellung', + available: 'Verfügbarer Saldo', + freeze_commission: 'Kumulative Auftragskommission', + freeze_c_desc: 'Dieser Betrag repräsentiert Ihre aktuelle kumulative Auftragssumme.Sie können ihn bei Aufgabenerfüllung abheben.', + g_order: 'Bestellung aufgeben', + order_desc: 'Bestellbeschreibung', + order_desc_1: '1. Jedes Konto kann pro Tag 38 Bestellungen abgleichen', + order_desc_2: '2. Die Kommission für die Aufgabe einer Bestellung ist einheitlich und entspricht 1,00 % des Gesamtbestellbetrags', + order_desc_3: '3. Das System basiert auf LBS - Technologie und gleicht Waren automatisch durch Cloud - Computing ab', + order_desc_5: '4. Sie können die Aufgabe nicht abbrechen.Sie müssen zuerst alle bestehenden unvollständigen Aufgaben abschließen,bevor Sie neue erhalten können.', + order_desc_6: '5. Jedes Konto kann pro Tag 38 Bestellungen abgleichen', + order_n: 'Hinweis', + order_n_1: 'Wenn die Plattform Bestellungen für Benutzer abgleicht,wird sie die Bestellinformationen an den Händler' + 'hintergrund.Wenn der Benutzer die Bestellung nicht innerhalb von 30 Minuten einreicht,wird der Bestellbetrag vom' + 'das System eingefroren.Um regulatorische Systeme zu vermeiden,werden Benutzerkonten bewertet,was direkt' + 'beeinflusst die nächste Abgleichszeit und den Ruf des Benutzers!Bitte klicken Sie rechtzeitig auf Bestellung stoppen,um zu vermeiden' + 'Zeitüberschreitung einfrieren.', + grabOrder: { + not_completed: 'Bitte schließen Sie zuerst die Bestellung ab', + not_completed_text: 'Bestellung prüfen', + order_limit: 'Die Bestellmenge des heutigen Tages hat das obere Limit erreicht', + order_limit_text: 'Bestätigen', + balance_not_enough: 'Saldo ist nicht ausreichend', + balance_not_enough_text: 'Aufladen', + no_order_available: 'Keine Bestellung verfügbar,bitte versuchen Sie es später erneut', + no_order_available_text: 'Bestätigen', + not_meet_start: 'erfüllt nicht die Startbedingung', + }, + + order_details: { + title: 'Bestellungsaufgabe', + u_p: 'Stückpreis', + o_q: 'Bestellmenge', + total: 'Gesamt', + o_c: 'Bestellkommission', + o_r: 'Bestellbewertung', + c_1: 'das Produkt ist sehr gut Endlich erhalten.das Produkt ist sehr gut Ich bin sehr zufrieden mit dem Produkt und empfehle es zu kaufen', + c_2: 'I am very happy and satisfied', + c_3: 'der Preis ist ziemlich vernünftig', + c_4: 'Die Verarbeitung ist sehr gut', + c_5: 'und ich mag es sehr', + c_6: 'Es sieht toll aus', + c_7: 'und mein Freund hat es zum zweiten Mal gekauft.', + balance_not_enough: 'Das Guthaben reicht nicht aus,um die Bestellung abzuschließen,bitte aufladen', + balance_not_enough_text: 'Aufladen', + order_submitted: 'Die Bestellung wurde eingereicht', + } + }, + + withdrawal: { + title: 'Auszahlung', + w: 'Auszahlung', + w_p: 'Geben Sie Ihr Zahlungspasswort ein', + c_b: 'aktueller Saldo', + s_w_a: 'Auszahlungsbetrag auswählen', + w_a: 'Wallet - Adresse', + m_w_a: 'Wallet - Adresse ändern', + enterPassword: 'Enter Password', + p_i: 'Sie haben eine Auszahlungsanforderung in Bearbeitung.Bitte warten Sie auf das Ergebnis.', + p_e: 'Zahlungspasswortfehler', + t_n_c: "Sie müssen die heutige Bestellungsaufgabe abschließen,bevor Sie Ihr Gehalt erhalten.", + c_s_n_m: 'Ihr Kreditscore erfüllt nicht die Bedingungen für eine Auszahlung,bitte erhöhen Sie Ihren Kreditscore', + }, + recharge: { + title: 'Aufladen', + amount_placeholder: 'auswählen oder hier eingeben', + }, + daily: { + title: 'Tägliches Einchecken', + c: 'Kontinuierlich', + a: 'Anhäufung', + r: 'Belohnung(USDT)', + btn: 'Einchecken', + task_not_compiled: 'Bitte schließen Sie zuerst die heutige Bestellungsaufgabe ab', + }, + common: { + confirm: 'Bestätigen', + cancel: 'Abbrechen', + loosing: 'Verlieren', + loading: 'Laden', + no_data: 'keine weiteren Daten', + submit: 'einreichen', + waring: 'Warnung', + error: 'Fehler', + insufficient: 'Unzureichend', + submitted: 'Eingereicht', + noResult: 'Keine Ergebnisse gefunden' + }, + main: { + home: 'Startseite', + order: 'Bestellung', + start: 'Start', + service: 'Service', + profile: 'Profil', + } +} \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/lang-base.ts b/grailed_app/src/i18n/lang/lang-base.ts new file mode 100644 index 0000000..bca0ab3 --- /dev/null +++ b/grailed_app/src/i18n/lang/lang-base.ts @@ -0,0 +1,353 @@ +export type langType = { + show:{ + + + }, + about: { + title: string; + profile: string; + h_1: string; + h_2: string; + h_3: string; + h_4: string; + h_5: string; + h_6: string; + h_7: string; + h_8: string; + h_9: string; + h_10: string; + }, + balanceRecord: { + title: string; + }, + bindCrypto: { + title: string; + enterAddress: string + }, + channelSelect: { + title: string; + balance: string; + t_1: string; + }, + helpGuide: { + title: string; + faq: string; + q_1: string; + a_1: string; + q_2: string; + a_2: string; + q_3: string; + a_3: string; + q_4: string; + a_4: string; + q_5: string; + a_5: string; + }, + home: { + cp_name: string; + continue: string; + notice: { + c_t: string + f_e: string + }, + taskCarouse: { + title: string; + }, + partners: { + title: string; + }, + introduce: { + i_f: string; + j_s: string; + c_c: string; + c_l: string; + terms_a: string; + terms_c: string; + terms_c_1: string + terms_c_2: string + terms_c_3: string + terms_c_4: string + terms_c_5: string + terms_c_6: string + terms_c_7: string + terms_c_8: string + terms_c_9: string + terms_c_10: string + terms_c_11: string + terms_c_12: string + terms_c_13: string + terms_c_14: string + terms_c_15: string + terms_c_16: string + terms_c_17: string + terms_c_18: string + terms_c_19: string + terms_c_20: string + terms_c_21: string + terms_c_22: string + terms_c_23: string + terms_c_24: string + terms_c_25: string + terms_c_26: string + terms_c_27: string + terms_c_28: string + terms_c_29: string + terms_c_30: string + terms_c_31: string + terms_c_32: string + about_us: { + title: string; + a_1: string; + a_2: string; + a_3: string; + a_4: string; + a_5: string; + a_6: string; + a_7: string; + a_8: string; + a_9: string; + a_10: string; + a_11: string; + a_12: string; + a_13: string; + } + } + }, + invitation: { + title: string; + i_c: string; + link: string; + }, + language: { + title: string; + u: string; + c_l: string; + l: string; + }, + order: { + title: string; + order_no: string; + u_p: string; + o_q: string; + total: string; + o_c: string; + c_t: string; + all: string; + completed: string; + pending: string; + frozen: string; + }, + password: { + title: string; + old: string; + new: string; + confirm_p: string; + note: string; + not_match: string; + }, + payOrderDetail: { + title: string; + order_no: string; + amount:string; + orderTime: string; + status:string; + pay_m:string; + network:string; + address:string; + t_s_o:string; + referral:string; + }, + profile: { + ph_no: string; + LV: string; + i_c: string; + level: string; + dailyOrder: string; + creditScore:string; + ratio: string; + todays:string; + t_order: string; + t_order_a: string; + t_commission: string; + sign_in_reward: string; + enter_now: string; + c_balance: string; + w_success: string; + records: string; + settings: string; + i_f: string; + notification: string; + help_guide: string; + }, + service: { + title: string; + c_s_c: string; + online: string; + o_tips: string; + o_tips_1: string; + o_t: string; + }, + settings: { + title: string; + d_o: string; + d_w: string; + c: string; + t_r: string; + a: string; + t_1: string; + t_2: string; + t_3: string; + t_4: string; + t_5: string; + }, + settingsPersonal: { + title: string; + profile: string; + p_1: string; + username: string; + about: string; + a_1: string; + change:string; + photo: string; + p_i: string; + p_i_1: string; + first_name: string; + last_name: string; + email: string; + country: string; + street: string; + street_p: string; + city: string; + state: string; + postal: string; + save: string; + upload_error_1: string; + upload_error_2: string; + upload_error_3: string; + }, + signIn: { + title: string; + p_n: string; + country: string; + password: string; + remember: string; + forgot: string; + sign_in: string; + no_select_country:string + n_a_m: string; + s_u_n: string; + }, + signUp: { + title: string; + p_n: string; + country: string; + password: string; + r_a:string; + c_p: string; + i_c: string; + i_code_not_exist:string; + no_select_country:string + i_green: string; + sign_up: string; + number_exist: string; + sign_up_success: string; + to_sign_in: string; + + }, + start: { + title: string; + daily_order: string; + commission_ration: string; + free: string; + earned: string; + frozen: string; + completed_order: string; + available: string; + freeze_commission:string; + freeze_c_desc:string; + g_order: string; + order_desc: string; + order_desc_1: string; + order_desc_2: string; + order_desc_3: string; + order_desc_5: string; + order_desc_6: string; + order_n: string; + order_n_1: string; + grabOrder: { + not_completed: string; + not_completed_text: string; + order_limit: string; + order_limit_text: string; + balance_not_enough: string; + balance_not_enough_text: string; + no_order_available: string; + no_order_available_text: string; + not_meet_start: string; + } + order_details: { + title: string; + u_p: string; + o_q: string; + total: string; + o_c: string; + o_r: string; + c_1: string; + c_2: string; + c_3: string; + c_4: string; + c_5: string; + c_6: string; + c_7: string; + balance_not_enough: string; + balance_not_enough_text: string; + order_submitted: string; + } + }, + withdrawal: { + title: string; + w: string; + w_p:string; + c_b: string; + s_w_a: string; + w_a: string; + enterPassword:string; + m_w_a: string; + p_i: string; + p_e: string; + t_n_c:string; + c_s_n_m:string; + }, + recharge: { + title: string; + amount_placeholder: string; + }, + common: { + confirm: string; + cancel: string; + loosing: string; + loading: string; + no_data: string; + submit: string; + waring: string; + error: string; + insufficient: string; + submitted: string; + noResult:string; + }, + daily: { + title:string, + c: string, + a: string, + r: string, + btn: string, + task_not_compiled: string, + }, + main: { + home: string; + order: string; + start: string; + service: string; + profile: string; + } + }; \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/pt-pt.ts b/grailed_app/src/i18n/lang/pt-pt.ts new file mode 100644 index 0000000..911b295 --- /dev/null +++ b/grailed_app/src/i18n/lang/pt-pt.ts @@ -0,0 +1,392 @@ +import type { langType } from './lang-base' + +let cp_name = import.meta.env.VITE_APP_NAME; + +export const lang: langType = { + about: { + title: 'Sobre', + profile: 'Qualificações da Empresa', + h_1: 'Por que este programa usa USDT como moeda?', + h_2: "Como o programa é dedicado a servir comerciantes de todo o mundo, . Nós fixamos USDT como nossa moeda para unificar transações de moeda, facilitar a gestão e melhor proteger pessoas e propriedades.", + h_3: 'Posso atualizar minhas tarefas a qualquer momento?', + h_4: 'Atualmente, nossa plataforma está aberta das 10h00 às 23h00. Não é recomendado que os agentes impulsionem pedidos fora do horário de trabalho para evitar qualquer má conduta.', + h_5: "O que acontece se eu não conseguir adicionar todos os meus pedidos?", + h_6: 'Como o programa depende de avaliações positivas de nossos agentes, é importante que todos os agentes participem para garantir sua colocação. Penalidades serão aplicadas conforme relevante e a associação do agente será terminada permanentemente. Não apenas sua promoção ajuda outros comerciantes, como também ajuda a informar nossos comerciantes e contribuir para melhorias no produto.', + h_7: 'Posso mudar minha seleção de produto?', + h_8: 'Uma vez que um produto foi rastreado, você não será capaz de mudar sua seleção de produto. Ao atualizar um produto, por favor, leia todas as informações que estabelecemos nos Termos e Condições para garantir que você possa cumprir todos os requisitos do programa. Por exemplo, pode haver requisitos de compatibilidade para eletrônicos que só são compatíveis com softwares específicos.', + h_9: 'Nossos Parceiros têm um ecossistema próspero de alianças que fornecem soluções de negócios para resolver os desafios de negócios e tecnologia de nossos clientes. Temos relações profundas em uma extensa rede de empresas de tecnologia líderes que podem ajudá-lo a transformar e crescer.', + h_10: 'Nosso robusto ecossistema ajuda os parceiros a aumentar o crescimento da receita, expandir o mercado e o alcance geográfico, facilitar os processos de vendas e melhorar os produtos e serviços oferecidos.' + }, + balanceRecord: { + title: 'Registros de Saldo', + }, + bindCrypto: { + title: 'Vincular Endereço', + enterAddress: 'Insira o endereço' + }, + channelSelect: { + title: 'Seleção de Canal', + balance: 'Saldo', + t_1: 'Selecione um canal útil', + }, + + helpGuide: { + title: 'Guia de Ajuda', + faq: 'FAQ', + q_1: 'Como começo a assumir tarefas?', + a_1: "Primeiro, você precisa registrar uma conta em nosso site. Após o registro, clique no menu 'iniciar', e então clique no botão 'Pegar Pedido' para começar a trabalhar.", + q_2: "Quando receberei a comissão pelas tarefas que concluí?", + a_2: "Uma vez que sua tarefa concluída seja revisada e confirmada como correta, a comissão será creditada em sua conta em nosso site dentro de 1 hora.", + q_3: 'Quantas tarefas posso assumir ao mesmo tempo?', + a_3: "Você só pode assumir uma tarefa de cada vez. O número de tarefas que você pode concluir cada dia será ajustado com base no seu nível de associação e na situação da loja.", + q_4: "E se eu não conseguir concluir uma tarefa?", + a_4: "Se você não conseguir concluir uma tarefa no prazo estipulado, por favor, entre em contato com nossa equipe de atendimento ao cliente prontamente. Nós lhe forneceremos uma solução ou recomendação adequada com base na situação específica.", + q_5: 'Como posso atualizar meu nível de associação?', + a_5: 'Os níveis de associação são concedidos com base nas tarefas concluídas pelo cliente. Para mais detalhes, por favor, entre em contato com o atendimento ao cliente.', + }, + + home: { + cp_name: cp_name, + continue: 'Continue a fazer a tarefa', + notice: { + c_t: 'Parabéns para ', + f_e: 'ganhou ', + }, + taskCarouse: { + title: 'Tarefa', + }, + partners: { + title: 'Nossos Parceiros', + }, + + introduce: { + i_f: 'Convide Amigos', + j_s: 'Vamos Juntar-se a Nós Agora', + c_c: 'Copie o código de referência para se juntar a nós agora', + c_l: 'Copiar link do convite', + terms_a: 'Termos & Acordos', + terms_c: 'Termos & Condições', + terms_c_1: 'Estes termos e condições aplicam-se ao seu uso deste site e ao acessar este site e/ou' + + ' atualizar o seu pedido, você concorda em estar vinculado pelos seguintes termos e condições. Se você não' + + 'concordar em estar vinculado por estes termos e condições, você não será capaz de usar ou acessar este site.', + terms_c_2: 'Se você tiver alguma dúvida sobre estes termos e condições antes de atualizar o seu pedido, por favor, entre em contato com nossa equipe de atendimento ao cliente 7 dias por semana.', + terms_c_3: 'Explicação', + terms_c_4: 'Condições - estes termos e condições e condições especiais', + terms_c_5: 'Produtos - os produtos mostrados neste site para melhorar as classificações', + terms_c_6: 'Descrições de Produtos - as seções deste site que fornecem certos termos e condições relacionados a produtos individuais', + terms_c_7: 'Condições Especiais - os termos e condições na descrição do produto', + terms_c_8: 'Serviços - os serviços de agência que fornecemos para os produtos sendo atualizados para revisão, conforme descrito no acordo de agência', + terms_c_9: 'Agente/você - o termo genérico para usuários deste site Informações pessoais', + terms_c_10: 'Detalhes fornecidos por você durante o registro', + terms_c_11: 'Cookies - pequenos arquivos de texto colocados no disco rígido do seu computador por este site para armazenar informações e identificar o seu computador', + terms_c_12: 'Acordo - o agente contendo estes termos e condições', + terms_c_13: '1.0 Explicação', + terms_c_14: '1.1 Qualquer palavra seguindo uma cláusula específica, por exemplo, ou qualquer expressão semelhante, será interpretada como ilustrativa e não limitará o significado das palavras, descrições, definições, frases ou termos que precedem essas cláusulas.', + terms_c_15: '1.2 A menos que seja declarado de outra forma, letras maiúsculas usadas nestes termos e condições (mas não definidas nestes termos e condições) terão o significado estabelecido no Acordo de Agência.', + terms_c_16: '2.0 Responsabilidades do Agente', + terms_c_17: '2.1 Cada Agente deve completar pelo menos um conjunto de tarefas para receber um bônus de nós.', + terms_c_18: '2.2 Os agentes podem redefinir sua conta uma vez por dia. Cada agente pode completar no máximo duas tarefas por dia.', + terms_c_19: '2.3 A conclusão antecipada das tarefas não é permitida, pois isso resultará em uma quebra na coleta de dados de vendas.', + terms_c_20: '2.4 Os agentes não estão autorizados a postar ou publicar qualquer informação falsa em qualquer tipo de mídia social. Reservamo-nos o direito de buscar responsabilidade legal.', + terms_c_21: '2.5 Cumprimento de obrigações legais (cumprindo nossas obrigações legais)', + terms_c_22: '2.6 Lidando com reivindicações e reclamações e buscando resolução (direitos legais e reivindicações legais)', + terms_c_23: '3.0 Qualquer agência de publicidade ou mídia digital ou provedor de serviços de internet em conexão com o Programa', + terms_c_24: '3.1 Ao participar do Programa, você se compromete a enviar todas as informações verdadeiras, precisas, atuais e completas. Reservamo-nos o direito de verificar a sua elegibilidade.', + terms_c_25: '3.2 Se soubermos ou tivermos motivos razoáveis para acreditar no momento do registro que você é ' + + 'não é elegível para participar do Programa, reservamo-nos o direito de desqualificá-lo e ' + + 'selecionar um revisor de produto alternativo.', + terms_c_26: '4.0 Nossa responsabilidade', + terms_c_27: '4.1 Não somos responsáveis por falhas técnicas ou congestionamento de tráfego na internet ou em qualquer site, ou qualquer combinação desses fatores, ou por quaisquer interrupções ou perturbações no equipamento de qualquer outra pessoa em conexão com ou como resultado da participação.', + terms_c_28: '4.2 Não somos responsáveis por qualquer material difamatório, infração de direitos de propriedade intelectual de terceiros ou outro material ilegal em sua entrada.', + terms_c_29: '5.0 Publicidade e seus dados pessoais', + terms_c_30: '5.1 Sujeito ao seu consentimento, podemos usar seu nome de usuário para fins promocionais e/ou em conexão com nossas atividades de publicidade, promoção ou marketing (conforme descrito em nossos anúncios e revisões, termos e condições).', + terms_c_31: '5.1 está ciente de que você está preocupado com o nosso uso de suas informações e nós apreciamos o' + +' confiança que você deposita em nós para usá-lo de uma maneira cuidadosa e razoável. Todas as informações que' + +'coletamos estarão sujeitas à nossa Política de Privacidade, que estabelece quais informações coletamos,' + +' o que fazemos com ela e os propósitos para os quais usamos esses dados. Por favor, consulte nossa Política' + +'de Privacidade para mais detalhes. Você entende que ao se juntar ao programa, coletará e' + +'usará suas informações pessoais conforme descrito na Política de Privacidade, que inclui compartilhar' + +'informações com fornecedores que auxiliam no site e nas promoções.', + terms_c_32: '5.3 Como orientado por circunstâncias normais, a plataforma é projetada para combinar apenas produtos cujo' + +'preço é menor que o saldo da conta do agente. No entanto, os comerciantes podem optar por aumentar' + +'o alcance dos agentes correspondidos pagando pelo menos três vezes o seu salário. Isso permitirá que o' + +'agente obtenha atribuições de pacotes com preço acima do saldo da conta. Após a conclusão bem-sucedida' + +'dessas tarefas, os agentes receberão', + about_us: { + title: 'Sobre Nós', + a_1: 'Qualificações da Empresa', + a_2: 'Por que este programa usa USDT como moeda?', + a_3: 'Como o programa é dedicado a servir comerciantes de todo o mundo, . Nós' + +'fixamos USDT' + +'como nossa moeda para unificar as transações de moeda, facilitar a gestão e proteger melhor' + +'pessoas e propriedades.', + a_4: 'Posso atualizar minhas tarefas a qualquer momento?', + a_5: 'Atualmente, nossa plataforma está aberta das 9:00 às 23:00. Não é recomendado para os agentes impulsionarem pedidos fora do horário de trabalho para evitar qualquer má conduta.', + a_6: 'O que acontece se eu não conseguir adicionar todos os meus pedidos?', + a_7: 'Como o programa depende de avaliações positivas de nossos agentes, é importante que todos os agentes' + +'participem para garantir sua colocação. Penalidades serão aplicadas conforme relevante e a associação do agente' + +'será terminada permanentemente. Não apenas sua promoção ajuda outros comerciantes, ela' + +'também ajuda a informar nossos comerciantes e contribuir para melhorias no produto.', + a_8: 'Posso mudar minha seleção de produto?', + a_9: 'Uma vez que um produto foi rastreado, você não será capaz de mudar sua seleção de produto. Quando' + +'atualizando um produto, por favor, leia todas as informações que estabelecemos nos Termos e' + +'Condições para garantir que você pode cumprir todos os requisitos do programa. Por exemplo, pode' + +'haver requisitos de compatibilidade para eletrônicos que só são compatíveis com softwares específicos.', + a_10: cp_name + ' Parceiros', + a_11: 'Nossos Parceiros', + a_12: cp_name + ' tem um ecossistema próspero de alianças que fornecem soluções de negócios para resolver nossos' + +'desafios de negócios e tecnologia dos clientes. Temos relações profundas em uma extensa' + +'rede de empresas líderes em tecnologia que podem ajudá-lo a transformar e crescer.', + a_13: 'Nosso robusto ecossistema ajuda os parceiros a aumentar o crescimento da receita, expandir o mercado e o alcance geográfico,' + +'facilitar os processos de vendas e melhorar os produtos e serviços oferecidos.', + } + } + }, + invitation: { + title: 'Convidar Amigos', + i_c: 'Código de convite', + link: 'Link de referência', + }, + language: { + title: 'Língua', + u: 'nome de usuário', + c_l: 'Mudar idioma', + l: 'Língua', + }, + order: { + title: 'Ordem', + order_no: 'Número do pedido', + u_p: 'Preço unitário', + o_q: 'Quantidade de pedido', + total: 'Total', + o_c: 'Comissão de pedido', + c_t: 'Tempo de compilação', + all: 'Todos', + completed: 'Concluído', + pending: 'Pendente', + frozen: 'Congelado', + }, + + password: { + title: 'Alterar Senha', + old: 'Senha Atual', + new: 'Nova Senha', + confirm_p: 'Confirmar Senha', + note: 'Nota: As alterações de senha são limitadas a uma vez a cada 72 horas.', + not_match: 'As senhas não correspondem.', + }, + payOrderDetail: { + title: 'Detalhes do Pedido', + order_no: 'Número do Pedido:', + amount: 'Quantidade', + orderTime: 'Tempo do Pedido', + status: 'Status', + pay_m: 'Método de Pagamento', + network: 'Rede', + address: 'Endereço', + t_s_o: 'Para Iniciar o Pedido', + referral: 'Código de indicação', + }, + + profile: { + ph_no: 'Ph No', + LV: 'LV', + i_c: 'Código de convite', + level: 'Nível', + dailyOrder: 'Pedido diário', + ratio: 'Razão', + todays: 'Hoje', + creditScore: 'Crédito', + t_order: 'Pedidos de', + t_order_a: 'Quantidade de pedidos de', + t_commission: 'Comissão de', + sign_in_reward: 'Recompensa de inscrição', + enter_now: 'Entrar agora', + c_balance: 'Saldo atual', + w_success: 'Retirada bem sucedida', + records: 'Registros', + settings: 'Configurações', + i_f: 'Convidar amigos', + notification: 'Notificação', + help_guide: 'Guia de ajuda', + }, + service: { + title: 'Atendimento ao cliente', + c_s_c: 'Centro de atendimento ao cliente', + online: 'Serviço online', + o_tips: 'Se você tiver um problema, peça ao atendimento ao cliente', + o_tips_1: 'Serviço online :Problema de fluxo de ouro', + o_t: 'Tempo online', + }, + + settings: { + title: 'Configurações', + d_o: 'Pedidos diários', + d_w: 'Retirada diária', + c: 'Comissão', + t_r: 'Recompensa da equipe', + a: 'Conta', + t_1: 'Informações pessoais', + t_2: 'Alterar senha', + t_3: 'Vincular endereço USDT', + t_4: 'Idioma', + t_5: 'Sobre nós', + }, + settingsPersonal: { + title: 'Informações do usuário', + profile: 'Perfil', + p_1: 'Essas informações serão exibidas publicamente, então tenha cuidado com o que você compartilha.', + username: 'Nome de usuário', + about: 'Sobre', + a_1: 'Escreva algumas frases sobre você.', + photo: 'Foto', + change: 'mudar', + p_i: 'Informações pessoais', + p_i_1: 'Use um endereço permanente onde você possa receber correspondência.', + first_name: 'Primeiro nome', + last_name: 'Último nome', + email: 'Endereço de email', + country: 'País', + street: 'Endereço', + street_p: '', + city: 'Cidade', + state: 'Estado / Província', + postal: 'Código postal', + save: 'Salvar', + upload_error_1: 'Por favor, faça o upload de uma imagem que tenha 500x500 pixels ou menos.', + upload_error_2: 'Por favor, faça o upload de um arquivo de imagem.', + upload_error_3: 'Falha no upload do avatar, por favor tente novamente mais tarde', + }, + + signIn: { + title: 'Faça login na sua conta', + p_n: 'Número de telefone', + country: 'País', + password: 'Senha', + remember: 'Lembrar de mim', + forgot: 'Esqueceu a senha?', + sign_in: 'Entrar', + no_select_country: 'Seleccione o código do seu país', + n_a_m: 'Não é um membro?', + s_u_n: 'Inscreva-se agora!', + }, + signUp: { + title: 'Crie uma nova conta', + p_n: 'Número de telefone', + country: 'País', + password: 'Senha', + c_p: 'Confirme a senha', + i_c: 'Código de convite', + i_green: 'Eu concordo com o ', + r_a: '《Acordo de Registro》', + sign_up: 'Inscrever-se', + no_select_country: 'Seleccione o código do seu país', + number_exist: 'O número de celular já existe. Por favor, faça login diretamente.', + i_code_not_exist: 'O código de convite que você inseriu não existe. Por favor, entre em contato com o seu mentor.', + sign_up_success: 'Inscrição bem sucedida!', + to_sign_in: 'Para entrar', + }, + + start: { + title: 'Iniciar', + daily_order: 'Pedidos diários', + commission_ration: 'Proporção de Comissão', + free: 'Grátis', + earned: 'Comissão Ganha', + frozen: 'Quantia Congelada', + completed_order: 'Pedido Concluído', + available: 'Saldo Disponível', + freeze_commission: 'Comissão acumulada de pedidos', + freeze_c_desc: 'Este valor representa o total acumulado do seu pedido atual. Você pode sacá-lo após a conclusão da tarefa.', + g_order: 'Pegar Pedido', + order_desc: 'Descrição do Pedido', + order_desc_1: '1.Cada conta pode combinar 38 pedidos por dia', + order_desc_2: '2.A comissão para fazer um pedido é uniforme e equivale a 1.00% do valor total do pedido', + order_desc_3: '3.O sistema é baseado em tecnologia LBS e combina automaticamente produtos através de computação em nuvem', + order_desc_5: '4.Você não pode cancelar a tarefa. Você deve primeiro completar quaisquer tarefas inacabadas existentes antes de poder receber novas.', + order_desc_6: '5.Cada conta pode combinar 38 pedidos por dia', + order_n: 'Nota', + order_n_1: 'Quando a plataforma combina pedidos para usuários, ela enviará as informações do pedido para o comerciante' + + 'background. Se o usuário não enviar o pedido dentro de 30 minutos, o valor do pedido será congelado por' + + 'o sistema. Para evitar sistemas regulatórios, as contas do usuário serão avaliadas, o que diretamente' + + 'afetará o próximo tempo de correspondência do usuário e reputação! Por favor, clique em parar de fazer o pedido a tempo para evitar' + + 'congelamento por tempo esgotado.', + grabOrder: { + not_completed: 'Por favor, complete o pedido primeiro', + not_completed_text: 'Para verificar o pedido', + order_limit: 'A quantidade de pedidos de hoje atingiu o limite máximo', + order_limit_text: 'Confirmar', + balance_not_enough: 'Saldo não é suficiente', + balance_not_enough_text: 'Recarregar', + no_order_available: 'Nenhum pedido disponível, por favor, tente novamente mais tarde', + no_order_available_text: 'Confirmar', + not_meet_start: 'não atende a condição de início', + }, + order_details: { + title: 'Tarefa de pedido', + u_p: 'Preço unitário', + o_q: 'Quantidade de pedido', + total: 'Total', + o_c: 'Comissão de Pedido', + o_r: 'avaliação de pedido', + c_1: 'o produto é muito bom Finalmente recebi. o produto é muito bom Estou muito satisfeito com o produto e recomendo comprar', + c_2: 'Estou muito feliz e satisfeito', + c_3: 'o preço é bastante razoável', + c_4: 'O acabamento é muito bom', + c_5: 'e eu gosto muito', + c_6: 'Parece ótimo', + c_7: 'e meu amigo já comprou pela segunda vez.', + balance_not_enough: 'Saldo não é suficiente para completar o pedido, por favor recarregue', + balance_not_enough_text: 'Recarregar', + order_submitted: 'O pedido foi enviado', + } + }, + + withdrawal: { + title: 'Saque', + w: 'Saque', + c_b: 'saldo atual', + s_w_a: 'selecione o valor do saque', + w_a: 'Endereço da Carteira', + m_w_a: 'Modificar Endereço da Carteira', + w_p: 'Digite sua senha de pagamento', + enterPassword: 'Digite a senha', + p_i: 'Você tem um pedido de saque em processo. Aguarde pelo resultado.', + p_e: 'Erro na senha de pagamento', + t_n_c: "Você precisa completar a tarefa de pedido de hoje antes de receber seu salário.", + c_s_n_m:'A sua pontuação de crédito não satisfaz as condições de levantamento, por favor aumente a sua pontuação de crédito', + }, + recharge: { + title: 'Recarregar', + amount_placeholder: 'selecione ou digite aqui', + }, + daily: { + title: 'Check-in Diário', + c: 'Contínuo', + a: 'Acumulação', + r: 'Recompensa (USDT)', + btn: 'Fazer check-in', + task_not_compiled: 'Por favor, complete a tarefa de pedido de hoje primeiro.', + }, + common: { + confirm: 'Confirmar', + cancel: 'cancelar', + loosing: 'perdendo', + loading: 'carregando', + no_data: 'não há mais dados', + submit: 'enviar', + waring: 'aviso', + error: 'erro', + insufficient: 'Insuficiente', + submitted: 'Enviado', + noResult: 'Nenhum resultado encontrado' + }, + main: { + home: 'Início', + order: 'Pedido', + start: 'Iniciar', + service: 'Serviço', + profile: 'Perfil', + } + +} \ No newline at end of file diff --git a/grailed_app/src/i18n/lang/st-st.ts b/grailed_app/src/i18n/lang/st-st.ts new file mode 100644 index 0000000..3772d40 --- /dev/null +++ b/grailed_app/src/i18n/lang/st-st.ts @@ -0,0 +1,378 @@ +import type { langType } from './lang-base' +let cp_name = import.meta.env.VITE_APP_NAME; +export const lang: langType = { +about: { + title: 'معلومات عنا', + profile: 'مؤهلات الشركة', + h_1: 'لماذا يستخدم هذا البرنامج USDT كعملة؟', + h_2: "نظرً ا لأن البرنامج مكرس لخدمة التجار من جميع أنحاء العالم، لقد حددنا USDT كعملتنا لتوحيد المعاملات النقدية وتسهيل الإدارة وحماية الأشخاص والممتلكات بشكل أفضل.", + h_3: 'هل يمكنني تحديث مهامي في أي وقت؟', + h_4: 'تفتح منصتنا حاليً ا من الساعة 10: 00 حتى الساعة 23: 00. لا يوصى بتسريع الطلبات خارج ساعات العمل لتجنب أي سلوك غير لائق.', + h_5: "ماذا يحدث إذا لم أتمكن من إضافة جميع طلباتي؟", + h_6: 'نظرً ا لأن البرنامج يعتمد على التقييمات الإيجابية من وكلائنا، فمن المهم أن يشارك جميع الوكلاء لضمان تواجدهم.سيتم تطبيق العقوبات المناسبة وسيتم إنهاء عضوية الوكيل نهائيً ا.لا تساعد ترويجك فقط التجار الآخرين، بل يساعد أيضً ا في إبلاغ تجارنا والمساهمة في تحسين المنتج.', + h_7: 'هل يمكنني تغيير اختيار المنتج الخاص بي؟', + h_8: 'بمجرد أن يتم الزحف للمنتج، لن تتمكن من تغيير اختيار المنتج الخاص بك.عند ترقية منتج، يرجى قراءة جميع المعلومات التي حددناها في الشروط والأحكام للتأكد من أنك يمكنك الامتثال لجميع متطلبات البرنامج.على سبيل المثال، قد تكون هناك متطلبات توافق للإلكترونيات التي تتوافق فقط مع برامج محددة.', + h_9: 'شركاؤنا لديهم نظام بيئي مزدهر من التحالفات التي تقدم حلولً ا تجارية لمواجهة التحديات التجارية والتكنولوجية لعملائنا.لدينا علاقات عميقة عبر شبكة واسعة من الشركات التكنولوجية الرائدة التي يمكن أن تساعدك في التحول والنمو.', + h_10: 'يساعد نظامنا البيئي القوي الشركاء على زيادة نمو الإيرادات وتوسيع السوق والوصول الجغرافي وتسهيل عمليات البيع وتحسين عروض المنتجات والخدمات.' +}, balanceRecord: { + title: 'سجلات الرصيد', +}, bindCrypto: { + title: 'عنوان الربط', + enterAddress: 'أدخل العنوان' +}, channelSelect: { + title: 'اختر القناة', + balance: 'الرصيد', + t_1: 'اختر قناة مفيدة لك', +}, + + + +helpGuide: { + title: 'دليل المساعدة', + faq: 'الأسئلة الشائعة', + q_1: 'كيف أبدأ في تنفيذ المهام؟', + a_1: "أولاً، يجب عليك إنشاء حساب على موقعنا.بعد التسجيل، انقر على' البدء' في القائمة، ثم انقر على الزر' الحصول على الطلب' لبدء العمل.", + q_2: "متى سأتلقى العمولة على المهام التي أنجزتها؟", + a_2: "بمجرد التحقق من المهمة التي أكملتها والتأكد من صحتها، سيتم اعتماد العمولة على حسابك على موقعنا خلال ساعة واحدة.", + q_3: 'كم مهمة يمكنني تنفيذها في وقت واحد؟', + a_3: "يمكنك دائمً ا تنفيذ مهمة واحدة في وقت واحد.سيتم تعديل عدد المهام التي يمكنك إنجازها يوميً ا بناءً على مستوى عضويتك والوضع التجاري.", + q_4: "ماذا يحدث إذا لم أتمكن من إكمال مهمة؟", + a_4: "إذا لم تتمكن من إكمال المهمة في الوقت المحدد، فيرجى الاتصال بخدمة العملاء لدينا على الفور.سنقدم لك حلاً مناسبً ا أو توصية بناءً على الوضع الفعلي.", + q_5: 'كيف يمكنني رفع مستوى عضويتي؟', + a_5: 'يتم منح مستويات العضوية بناءً على المهام التي ينجزها العميل.لمزيد من التفاصيل، يرجى الاتصال بخدمة العملاء.', + }, home: { + cp_name: cp_name, + continue: 'متابعة تنفيذ المهام', + notice: { + c_t: 'تهانينا لـ ', + f_e: 'كسب ', + }, + taskCarouse: { + title: 'المهمة', + }, + partners: { + title: 'شركاؤنا', + }, + + + + + +introduce: { + i_f: 'دعوة الأصدقاء', + j_s: 'لنبدأ الآن', + c_c: 'انسخ رمز الإحالة للانضمام إلينا', + c_l: 'نسخ رابط الدعوة', + terms_a: 'الشروط والاتفاقيات', + terms_c: 'الشروط والأحكام العامة', + terms_c_1: 'تنطبق هذه الشروط والأحكام العامة على استخدامك لهذا الموقع.من خلال الوصول إلى هذا الموقع و / أو تحديث طلبك، فإنك توافق على الشروط والأحكام العامة التالية.إذا كنت لا ترغب في الالتزام بهذه الشروط والأحكام العامة، فلا يمكنك استخدام هذا الموقع أو الوصول إليه.', + terms_c_2: 'إذا كان لديك أي أسئلة حول هذه الشروط والأحكام العامة قبل تحديث طلبك، فيرجى الاتصال بفريق خدمة العملاء لدينا، الذي يتواجد لخدمتك طوال أيام الأسبوع.', + terms_c_3: 'إعلان', + terms_c_4: 'الشروط - هذه الشروط والأحكام العامة والشروط الخاصة', + terms_c_5: 'المنتجات - المنتجات المعروضة على هذا الموقع لتحسين التقييمات', + terms_c_6: 'وصف المنتج - الأقسام من هذا الموقع التي تحتوي على شروط معينة بخصوص المنتجات الفردية', + terms_c_7: 'الشروط الخاصة - الشروط في وصف المنتج', + terms_c_8: 'الخدمات - خدمات الوكالة التي نقدمها في إطار تحديث المنتج للتحقق وفقً ا لاتفاقية الوكالة', + terms_c_9: 'الوكيل / أنت - المصطلح العام لمستخدمي هذا الموقع', + terms_c_10: 'التفاصيل التي قدمتها عند التسجيل', + terms_c_11: 'الكوكيز - ملفات نصية صغيرة يضعها هذا الموقع على القرص الثابت لجهاز الكمبيوتر الخاص بك لتخزين المعلومات وتحديد جهاز الكمبيوتر الخاص بك', + terms_c_12: 'الاتفاقية - الوكالة التي تغطيها هذه الشروط والأحكام العامة', + terms_c_13: '1.0 إعلان', + terms_c_14: '1.1 أي اختيار للكلمات أو تعبير مماثل يلي جملة معينة يعتبر توضيحيً ا ولا يقيد معنى الكلمات أو الوصف أو التعريفات أو العبارات أو المصطلحات التي تسبق هذه الجمل.', + + + terms_c_15: '1.1 أي اختيار للكلمات أو تعبير مماثل يلي جملة معينة يعتبر توضيحيًا ولا يقيد معنى الكلمات أو الوصف أو التعريفات أو العبارات أو المصطلحات التي تسبق هذه الجمل.', + terms_c_16: '2.0 مسؤوليات الوكيل', + terms_c_17: '2.1 يجب على كل وكيل إكمال مجموعة واحدة على الأقل من المهام للحصول على مكافأة منا.', + terms_c_18: '2.2 يمكن للوكلاء إعادة تعيين حسابهم مرة واحدة في اليوم. يمكن لكل وكيل إكمال ما يصل إلى مهمتين في اليوم.', + terms_c_19: '2.3 لا يُسمح بإكمال المهام مبكرًا ، حيث يمكن أن يؤدي ذلك إلى تعطيل جمع البيانات للبيع.', + terms_c_20: '2.4 لا يجوز للوكلاء نشر معلومات غير صحيحة على وسائل التواصل الاجتماعي. نحتفظ بالحق في اتخاذ إجراءات قانونية.', + terms_c_21: '2.5 الامتثال للالتزامات القانونية (الوفاء بالتزاماتنا القانونية)', + terms_c_22: '2.6 التعامل مع المطالبات والشكاوى والبحث عن حلول (المطالبات القانونية والمطالبات القانونية)', + terms_c_23: '3.0 الإعلان أو وكالة الوسائط الرقمية أو مزود خدمة الإنترنت المتعلق بالبرنامج', + terms_c_24: '3.1 من خلال المشاركة في البرنامج ، فإنك تلتزم بتقديم جميع المعلومات الحقيقية والدقيقة والحالية والكاملة. نحتفظ بالحق في التحقق من أهليتك.', + terms_c_25: '3.2 إذا كنا نعرف في وقت التسجيل أو لدينا أسباب معقولة للاعتقاد بأنك غير مؤهل للمشاركة في البرنامج ، فنحن نحتفظ بالحق في استبعادك واختيار مراجع منتج آخر.', + terms_c_26: '4.0 مسؤوليتنا', + terms_c_27: '4.1 نحن غير مسؤولين عن الأعطال التقنية أو الازدحام في الإنترنت أو المواقع أو أي تركيبة من هذه العوامل أو عن أي انقطاعات أو تعطل في معدات الأشخاص الآخرين المرتبطة بأو نتيجة للمشاركة.', + terms_c_28: '4.2 نحن غير مسؤولين عن المواد القذفية ، أو انتهاك حقوق الملكية الفكرية لأطراف ثالثة ، أو أي محتوى غير قانوني في مشاركتك.', + + + + + + terms_c_29: '5.0 الإعلان وبياناتك الشخصية', + terms_c_30: '5.1 بناءً على موافقتك ، يمكننا استخدام اسم المستخدم الخاص بك لأغراض الترويج و / أو في سياق أنشطتنا الترويجية والتسويقية (كما هو موضح في إعلاناتنا والتقييمات والشروط والأحكام العامة).', + terms_c_31: '5.1 أنت تدرك أنك قلق بشأن استخدامنا لمعلوماتك ، ونحن نقدر الثقة التي وضعتها فينا لاستخدامها بعناية وعقلانية. تخضع جميع المعلومات التي نجمعها لسياسة الخصوصية الخاصة بنا ، التي تحدد المعلومات التي نجمعها ، ماذا نفعل بها ولأي أغراض نستخدم هذه البيانات. يرجى الرجوع إلى سياسة الخصوصية الخاصة بنا للحصول على مزيد من التفاصيل. أنت تفهم أننا سوف نجمع ونستخدم معلوماتك الشخصية وفقًا لسياسة الخصوصية من خلال المشاركة في البرنامج ، بما في ذلك تقديم المعلومات للموردين الذين يساعدون في الموقع والترويج.', + terms_c_32: '5.3 في الظروف العادية ، تم تصميم النظام لمطابقة المنتجات فقط التي يكون سعرها أقل من رصيد حساب الوكيل. ومع ذلك ، يمكن للتجار اختيار توسيع نطاق الوكلاء المتطابقين عن طريق دفع ما لا يقل عن ثلاثة أضعاف راتبهم. هذا يتيح للوكيل الحصول على طلبات الحزم التي تتجاوز الرصيد الموجود في الحساب. عند إكمال هذه المهام بنجاح ، سيحصل الوكلاء', + + + +about_us: { + title: 'معلومات عنا', + a_1: 'مؤهلات الشركة', + a_2: 'لماذا يستخدم هذا البرنامج USDT كعملة؟', + a_3: 'نظرًا لأن البرنامج مكرس لخدمة التجار من جميع أنحاء العالم ، لقد حددنا USDT كعملتنا لتوحيد المعاملات النقدية وتسهيل الإدارة وحماية الأشخاص والممتلكات بشكل أفضل.', + a_4: 'هل يمكنني تحديث مهامي في أي وقت؟', + a_5: 'تفتح منصتنا حاليًا من الساعة 9:00 حتى الساعة 23:00. لا يوصى بأن يزيد الوكلاء على الطلبات خارج ساعات العمل لتجنب أي سلوك غير لائق.', + a_6: 'ماذا يحدث إذا لم أتمكن من إضافة جميع طلباتي؟', + a_7: 'نظرًا لأن البرنامج يعتمد على التقييمات الإيجابية من وكلائنا ، فمن المهم أن يشارك جميع الوكلاء لضمان تواجدهم. سيتم تطبيق العقوبات المناسبة وسيتم إنهاء عضوية الوكيل نهائيًا. لا تساعد ترويجك فقط التجار الآخرين ، بل يساعد أيضًا في إبلاغ تجارنا والمساهمة في تحسين المنتج.', + a_8: 'هل يمكنني تغيير اختيار المنتج الخاص بي؟', + a_9: 'بمجرد أن يتم الزحف للمنتج ، لن تتمكن من تغيير اختيار المنتج الخاص بك. عند ترقية منتج ، يرجى قراءة جميع المعلومات التي حددناها في الشروط والأحكام للتأكد من أنك يمكنك الامتثال لجميع متطلبات البرنامج. على سبيل المثال ، قد تكون هناك متطلبات توافق للإلكترونيات التي تتوافق فقط مع برامج محددة.', + a_10: cp_name + ' الشركاء', + a_11: 'شركاؤنا', + a_12: cp_name + 'لديها نظام بيئي مزدهر من التحالفات التي تقدم حلولًا تجارية لمواجهة التحديات التجارية والتكنولوجية لعملائنا. لدينا علاقات عميقة مع شبكة واسعة من الشركات التكنولوجية الرائدة التي يمكن أن تساعدك في التحول والنمو.', + a_13: 'يساعد نظامنا البيئي القوي الشركاء على زيادة نمو الإيرادات وتوسيع السوق والوصول الجغرافي وتسهيل عمليات البيع وتحسين عروض المنتجات والخدمات.' + } + } + }, + + + + +invitation: { + title: 'دعوة الأصدقاء', + i_c: 'رمز الدعوة', + link: 'رابط الدعوة', + }, + language: { + title: 'اللغة', + u: 'اسم المستخدم', + c_l: 'تغيير اللغة', + l: 'اللغة', + }, + order: { + title: 'الطلب', + order_no: 'الطلب', + u_p: 'سعر الوحدة', + o_q: 'كمية الطلب', + total: 'المجموع', + o_c: 'عمولة الطلب', + c_t: 'وقت التجميع', + all: 'الكل', + completed: 'مكتمل', + pending: 'قيد الانتظار', + frozen: 'مجمد', + }, + password: { + title: 'تغيير كلمة المرور', + old: 'كلمة المرور الحالية', + new: 'كلمة المرور الجديدة', + confirm_p: 'تأكيد كلمة المرور', + note: 'ملاحظة: يتم تقييد تغييرات كلمة المرور إلى مرة واحدة كل 72 ساعة.', + not_match: 'كلمات المرور غير متطابقة.', + }, + payOrderDetail: { + title: 'تفاصيل الطلب', + order_no: 'رقم الطلب:', + amount:'المبلغ', + orderTime: 'وقت الطلب', + status:'الحالة', + pay_m:'طريقة الدفع', + network:'الشبكة', + address:'العنوان', + t_s_o:'لبدء الطلب', + referral: 'رمز الإحالة', + }, + profile: { + ph_no: 'رقم الهاتف', + LV: 'LV', + i_c: 'رمز الدعوة', + level: 'المستوى', + dailyOrder: 'الطلب اليومي', + creditScore: 'الائتمان', + ratio: 'النسبة', + todays: 'اليوم', + t_order: 'الطلب اليومي', + t_order_a: 'مبلغ الطلب اليومي', + t_commission: 'العمولة', + sign_in_reward: 'تسجيل الدخول', + enter_now: 'أدخل الآن', + c_balance: 'رصيد الحساب الحالي', + w_success: 'نجاح السحب', + records: 'السجلات', + settings: 'الإعدادات', + i_f: 'دعوة الأصدقاء', + notification: 'الإشعار', + help_guide: 'دليل المساعدة', + }, + + + + +service: { + title: 'خدمة العملاء', + c_s_c: 'مركز خدمة العملاء', + online: 'خدمة عبر الإنترنت', + o_tips: 'إذا كان لديك مشكلة ، اسأل خدمة العملاء', + o_tips_1: 'خدمة عبر الإنترنت: مشكلة في تدفق الذهب', + o_t: 'وقت الإنترنت', + }, + settings: { + title: 'الإعدادات', + d_o: 'الطلب اليومي', + d_w: 'السحب اليومي', + c: 'العمولة', + t_r: 'مكافأة الفريق', + a: 'الحساب', + t_1: 'معلومات شخصية', + t_2: 'تغيير كلمة المرور', + t_3: 'ربط عنوان USDT', + t_4: 'اللغة', + t_5: 'معلومات عنا', + }, + settingsPersonal: { + title: 'معلومات المستخدم', + profile: 'الملف الشخصي', + p_1: 'سيتم عرض هذه المعلومات بشكل عام ، لذا كن حذرًا فيما تشاركه.', + username: 'اسم المستخدم', + about: 'حول', + a_1: 'اكتب بضع جمل عن نفسك.', + photo: 'صورة', + change: 'تغيير', + p_i: 'معلومات شخصية', + p_i_1: 'استخدم عنوانًا دائمًا يمكنك استلام البريد فيه.', + first_name: 'الاسم الأول', + last_name: 'اسم العائلة', + email: 'عنوان البريد الإلكتروني', + country: 'البلد', + street: 'عنوان الشارع', + street_p: '', + city: 'المدينة', + state: 'الولاية / المحافظة', + postal: 'الرمز البريدي', + save: 'حفظ', + upload_error_1: 'يرجى تحميل صورة بحجم 500 x 500 بكسل أو أصغر.', + upload_error_2: 'يرجى تحميل ملف صورة.', + upload_error_3: 'فشل تحميل الصورة الرمزية ، يرجى المحاولة مرة أخرى لاحقًا', + }, + signIn: { + title: 'تسجيل الدخول إلى حسابك', + p_n: 'رقم الهاتف', + country: 'البلد', + password: 'كلمة المرور', + remember: 'تذكرني', + forgot: 'نسيت كلمة المرور؟', + sign_in: 'تسجيل الدخول', + n_a_m: 'لست عضوًا بعد؟', + no_select_country: 'يرجى اختيار الرمز الدولي لبلدك', + s_u_n: 'سجل الآن!', + }, + signUp: { + title: 'إنشاء حساب جديد', + p_n: 'رقم الهاتف', + country: 'البلد', + password: 'كلمة المرور', + c_p: 'تأكيد كلمة المرور', + i_c: 'رمز الدعوة', + i_green: 'أوافق على', + r_a: '《اتفاقية التسجيل》', + sign_up: 'تسجيل', + number_exist: 'رقم الهاتف موجود بالفعل. يرجى تسجيل الدخول مباشرة.', + no_select_country: 'يرجى اختيار الرمز الدولي لبلدك', + i_code_not_exist: 'رمز الدعوة الذي أدخلته غير موجود. يرجى الاتصال بمعلمك.', + sign_up_success: 'تم التسجيل بنجاح!', + to_sign_in: 'لتسجيل الدخول', + }, + + + + +start: { + title: 'البداية', + daily_order: 'الطلب اليومي', + commission_ration: 'نسبة العمولة', + free: 'حر', + earned: 'العمولة المكتسبة', + frozen: 'المبلغ المجمد', + completed_order: 'الطلب المكتمل', + available: 'الرصيد المتاح', + freeze_commission: 'عمولة الطلب المتراكمة', + freeze_c_desc: 'هذا المبلغ يمثل مجموع طلباتك الحالية المتراكمة.يمكنك سحبه عند إكمال المهمة.', + g_order: 'إصدار الطلب', + order_desc: 'وصف الطلب', + order_desc_1: '1. يمكن لكل حساب مطابقة 38 طلبً ا في اليوم', + order_desc_2: '2. العمولة لمهمة الطلب موحدة وتعادل 1.00 % من إجمالي مبلغ الطلب', + order_desc_3: '3. يعتمد النظام على تكنولوجيا LBS ويقوم بمطابقة البضائع تلقائيً ا من خلال الحوسبة السحابية', + order_desc_5: '4. لا يمكنك إلغاء المهمة.يجب عليك أولاً إكمال جميع المهام غير المكتملة الحالية قبل الحصول على مهام جديدة.', + order_desc_6: '5. يمكن لكل حساب مطابقة 38 طلبً ا في اليوم', + order_n: 'ملاحظة', + order_n_1: 'عندما تقوم النظام بمطابقة الطلبات للمستخدمين، ستقوم بإرسال معلومات الطلب إلى خلفية التاجر.إذا لم يقدم المستخدم الطلب في غضون 30 دقيقة، سيتم تجميد مبلغ الطلب من قبل النظام.لتجنب الأنظمة التنظيمية، سيتم تقييم حسابات المستخدمين، مما يؤثر مباشرة على وقت المطابقة التالي وسمعة المستخدم!يرجى النقر فورً ا على إيقاف الطلب لتجنب تجميد الوقت الزائد.', + grabOrder: { + not_completed: 'يرجى أولاً إكمال الطلب', + not_completed_text: 'تحقق من الطلب', + order_limit: 'وصلت كمية الطلبات اليومية إلى الحد الأقصى', + order_limit_text: 'تأكيد', + balance_not_enough: 'الرصيد غير كاف لإكمال الطلب', + balance_not_enough_text: 'شحن', + no_order_available: 'لا يوجد طلب متاح، يرجى المحاولة مرة أخرى لاحقً ا', + no_order_available_text: 'تأكيد', + not_meet_start: 'لا يستوفي شرط البداية', + }, + + order_details: { + title: 'تفاصيل الطلب', + u_p: 'سعر الوحدة', + o_q: 'كمية الطلب', + total: 'المجموع', + o_c: 'عمولة الطلب', + o_r: 'تقييم الطلب', + c_1: 'المنتج جيد جدا. تم استلامه أخيرا. المنتج جيد جدا. أنا راضٍ جدا عن المنتج وأوصي بشرائه', + c_2: 'أنا سعيد جدا وراض', + c_3: 'السعر منطقي جدا', + c_4: 'التصنيع جيد جدا', + c_5: 'وأنا أحبه كثيرا', + c_6: 'يبدو رائعا', + c_7: 'وقد اشترى صديقي للمرة الثانية.', + balance_not_enough: 'الرصيد غير كاف لإكمال الطلب ، يرجى الشحن', + balance_not_enough_text: 'شحن', + order_submitted: 'تم تقديم الطلب', + } +}, + + + + + + withdrawal: { + title: 'السحب', + w: 'سحب', + w_p: 'أدخل كلمة المرور الخاصة بك للدفع', + c_b: 'الرصيد الحالي', + s_w_a: 'اختر مبلغ السحب', + w_a: 'عنوان المحفظة', + m_w_a: 'تغيير عنوان المحفظة', + enterPassword: 'أدخل كلمة المرور', + p_i: 'لديك طلب سحب قيد التقدم.يرجى الانتظار للحصول على النتيجة.', + p_e: 'خطأ في كلمة المرور الخاصة بالدفع', + t_n_c: "يجب عليك أولاً إكمال مهمة الطلب اليومية قبل الحصول على راتبك.", + c_s_n_m: 'نقاط الائتمان الخاصة بك لا تستوفي شروط السحب، يرجى زيادة نقاط الائتمان الخاصة بك', +}, recharge: { + title: 'شحن', + amount_placeholder: 'اختر أو أدخل هنا', +}, daily: { + title: 'تسجيل الدخول اليومي', + c: 'متواصل', + a: 'تراكم', + r: 'مكافأة(USDT)', + btn: 'تسجيل الدخول', + task_not_compiled: 'يرجى أولاً إكمال مهمة الطلب اليومية', +}, common: { + confirm: 'تأكيد', + cancel: 'إلغاء', + loosing: 'خسارة', + loading: 'تحميل', + no_data: 'لا توجد بيانات أخرى', + submit: 'إرسال', + waring: 'تحذير', + error: 'خطأ', + insufficient: 'غير كاف', + submitted: 'تم الإرسال', + noResult: 'لم يتم العثور على نتائج' +}, main: { + home: 'الصفحة الرئيسية', + order: 'الطلب', + start: 'بداية', + service: 'خدمة', + profile: 'الملف الشخصي', +} +} \ No newline at end of file diff --git a/grailed_app/src/main.ts b/grailed_app/src/main.ts new file mode 100644 index 0000000..181ea83 --- /dev/null +++ b/grailed_app/src/main.ts @@ -0,0 +1,19 @@ +import './assets/css/main.css'; +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import App from './App.vue' +import router from './router' +import 'virtual:svg-icons-register' +import { i18n } from './i18n'; +import { setLang } from './i18n'; +import { setupPageConfig } from './utils/pageUtils'; +setupPageConfig(); +setLang(import.meta.env.VITE_DEFAULT_LANG); +document.title = 'Loading...'; + + +const app = createApp(App); +app.use(i18n) +app.use(createPinia()) +app.use(router) +app.mount('#app') diff --git a/grailed_app/src/router/index.ts b/grailed_app/src/router/index.ts new file mode 100644 index 0000000..78190e6 --- /dev/null +++ b/grailed_app/src/router/index.ts @@ -0,0 +1,151 @@ +import { createRouter, createWebHistory } from 'vue-router' + +const router = createRouter({ + + history: createWebHistory(import.meta.env.BASE_URL), + + + routes: [ + { + path: '/', + name: 'main', + component: () => import('@/views/Main.vue'), + redirect: '/home', + children: [ + { + path: '/home', + name: 'home', + component: () => import('@/views/home/Index.vue') + }, + { + path: '/chat', + name: 'chat', + component: () => import('@/views/service/chat/Index.vue') + }, + { + path: '/order', + name: 'order', + component: () => import('@/views/order/Index.vue') + }, + { + path: '/start', + name: 'start', + component: () => import('@/views/start/Index.vue') + }, + { + path: '/service1', + name: 'service', + component: () => import('@/views/service/Index.vue') + }, + { + path: '/service', + redirect: to => { + if(localStorage.getItem("chatOpen")==="ok"){ + return 'chat' + } + return 'service1' + }, + }, + { + path: '/profile', + name: 'profile', + component: () => import('@/views/profile/Index.vue') + } + ] + }, + { + path: '/daily-check-in', + name: 'dailyCheckIn', + component: () => import('@/views/dailyCheckIn/Index.vue') + }, + { + path: '/channel-select/:scenario', + name: 'channelSelect', + component: () => import('@/views/channelSelect/Index.vue') + + }, + { + path: '/recharge/:configId', + name: 'recharge', + component: () => import('@/views/recharge/Index.vue') + }, + { + path: '/order-details/:orderId', + name: 'orderDetails', + component: () => import('@/views/payOrderDetails/Index.vue') + }, + { + path: '/withdrawal/:configId', + name: 'withdrawal', + component: () => import('@/views/withdrawal/Index.vue') + }, + { + path: '/bind-crypto/:configId', + name: 'bindCrypto', + component: () => import('@/views/bindCrypto/Index.vue') + }, + { + path: '/sign-in', + name: 'signIn', + component: () => import('@/views/signIn/Index.vue') + }, + { + path: '/sign-up', + name: 'signUp', + component: () => import('@/views/signUp/Index.vue') + }, + { + path: '/balance-record', + name: 'balanceRecord', + component: () => import('@/views/balanceRecord/Index.vue') + }, + { + path: '/settings', + name: 'settings', + component: () => import('@/views/settings/Index.vue') + }, + { + path: '/notification', + name: 'notification', + component: () => import('@/views/notification/Index.vue') + }, + { + path: '/invitation', + name: 'invitation', + component: () => import('@/views/invitation/Index.vue') + }, + { + path: '/help-guide', + name: 'helpGuide', + component: () => import('@/views/helpGuide/Index.vue') + }, + { + path: '/settings/personal', + name: 'settingsInfo', + component: () => import('@/views/settingsPersonal/Index.vue') + }, + { + path: '/settings/password', + name: 'settingsPassword', + component: () => import('@/views/password/Index.vue') + }, + { + path: '/settings/about', + name: 'about', + component: () => import('@/views/about/Index.vue') + }, + { + path: '/settings/language', + name: 'language', + component: () => import('@/views/language/Index.vue') + }, + { + path: '/wallet', + name: 'wallet', + component: () => import('@/views/wallet/Index.vue') + }, + + ] +}) + +export default router diff --git a/grailed_app/src/router/permission.ts b/grailed_app/src/router/permission.ts new file mode 100644 index 0000000..32f3307 --- /dev/null +++ b/grailed_app/src/router/permission.ts @@ -0,0 +1,22 @@ +import router from './' +import * as AuthUtils from '@/utils/auth' +// 路由不重定向白名单 +const whiteList = [ + '/sign-in', + '/social-login', + '/auth-redirect', + ] + + router.beforeEach(async (to, from, next) => { + if (AuthUtils.getAccessToken()) { + if (to.path === '/sign-in') { + next({ path: '/' }) + } + } else { + if (whiteList.indexOf(to.path) !== -1) { + next() + } else { + next(`/sign-in?redirect=${to.fullPath}`) // 否则全部重定向到登录页 + } + } + }) \ No newline at end of file diff --git a/grailed_app/src/stores/counter.ts b/grailed_app/src/stores/counter.ts new file mode 100644 index 0000000..7a72d1f --- /dev/null +++ b/grailed_app/src/stores/counter.ts @@ -0,0 +1,13 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) + diff --git a/grailed_app/src/stores/modules/locale.ts b/grailed_app/src/stores/modules/locale.ts new file mode 100644 index 0000000..e69de29 diff --git a/grailed_app/src/utils/auth.ts b/grailed_app/src/utils/auth.ts new file mode 100644 index 0000000..8e73f3b --- /dev/null +++ b/grailed_app/src/utils/auth.ts @@ -0,0 +1,42 @@ +import type { TokenType } from '@/api/auth/type' +import { useCache } from '@/hooks/useCache' + +const { wsCache } = useCache() +const AccessTokenKey = 'ACCESS_TOKEN' +const RefreshTokenKey = 'REFRESH_TOKEN' +const TenantIdKey = 'TENANT_ID' +export const getTenantId = () => { + return wsCache.get(TenantIdKey) +} + +export const setTenantId = (username: string) => { + wsCache.set(TenantIdKey, username) +} + +// 获取token +export const getAccessToken = () => { + // 此处与TokenKey相同,此写法解决初始化时Cookies中不存在TokenKey报错 + return wsCache.get(AccessTokenKey) ? wsCache.get(AccessTokenKey) : wsCache.get('ACCESS_TOKEN') + } + + // 刷新token + export const getRefreshToken = () => { + return wsCache.get(RefreshTokenKey) + } + + // 设置token + export const setToken = (token: TokenType) => { + wsCache.set(RefreshTokenKey, token.refreshToken) + wsCache.set(AccessTokenKey, token.accessToken) + } + + // 删除token + export const removeToken = () => { + wsCache.delete(AccessTokenKey) + wsCache.delete(RefreshTokenKey) + } + + /** 格式化token(jwt格式) */ + export const formatToken = (token: string): string => { + return 'Bearer ' + token + } \ No newline at end of file diff --git a/grailed_app/src/utils/formatTime.ts b/grailed_app/src/utils/formatTime.ts new file mode 100644 index 0000000..5e5c854 --- /dev/null +++ b/grailed_app/src/utils/formatTime.ts @@ -0,0 +1,223 @@ +import dayjs from 'dayjs' + +/** + * 时间日期转换 + * @param date 当前时间,new Date() 格式 + * @param format 需要转换的时间格式字符串 + * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd` + * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ" + * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW" + * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ" + * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ" + * @returns 返回拼接后的时间字符串 + */ +export function formatDate(date: Date, format?: string): string { + // 日期不存在,则返回空 + if (!date) { + return '' + } + // 日期存在,则进行格式化 + if (format === undefined) { + format = 'YYYY-MM-DD HH:mm:ss' + } + return dayjs(date).format(format) +} + +/** + * 获取当前的日期+时间 + */ +export function getNowDateTime() { + return dayjs() +} + +/** + * 获取当前日期是第几周 + * @param dateTime 当前传入的日期值 + * @returns 返回第几周数字值 + */ +export function getWeek(dateTime: Date): number { + const temptTime = new Date(dateTime.getTime()) + // 周几 + const weekday = temptTime.getDay() || 7 + // 周1+5天=周六 + temptTime.setDate(temptTime.getDate() - weekday + 1 + 5) + let firstDay = new Date(temptTime.getFullYear(), 0, 1) + const dayOfWeek = firstDay.getDay() + let spendDay = 1 + if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1 + firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay) + const d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000) + return Math.ceil(d / 7) +} + +/** + * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前` + * @param param 当前时间,new Date() 格式或者字符串时间格式 + * @param format 需要转换的时间格式字符串 + * @description param 10秒: 10 * 1000 + * @description param 1分: 60 * 1000 + * @description param 1小时: 60 * 60 * 1000 + * @description param 24小时:60 * 60 * 24 * 1000 + * @description param 3天: 60 * 60* 24 * 1000 * 3 + * @returns 返回拼接后的时间字符串 + */ +export function formatPast(param: string | Date, format = 'YYYY-mm-dd HH:MM:SS'): string { + // 传入格式处理、存储转换值 + let t: any, s: number + // 获取js 时间戳 + let time: number = new Date().getTime() + // 是否是对象 + typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param) + // 当前时间戳 - 传入时间戳 + time = Number.parseInt(`${time - t}`) + if (time < 10000) { + // 10秒内 + return '刚刚' + } else if (time < 60000 && time >= 10000) { + // 超过10秒少于1分钟内 + s = Math.floor(time / 1000) + return `${s}秒前` + } else if (time < 3600000 && time >= 60000) { + // 超过1分钟少于1小时 + s = Math.floor(time / 60000) + return `${s}分钟前` + } else if (time < 86400000 && time >= 3600000) { + // 超过1小时少于24小时 + s = Math.floor(time / 3600000) + return `${s}小时前` + } else if (time < 259200000 && time >= 86400000) { + // 超过1天少于3天内 + s = Math.floor(time / 86400000) + return `${s}天前` + } else { + // 超过3天 + const date = typeof param === 'string' || 'object' ? new Date(param) : param + return formatDate(date, format) + } +} + +/** + * 时间问候语 + * @param param 当前时间,new Date() 格式 + * @description param 调用 `formatAxis(new Date())` 输出 `上午好` + * @returns 返回拼接后的时间字符串 + */ +export function formatAxis(param: Date): string { + const hour: number = new Date(param).getHours() + if (hour < 6) return '凌晨好' + else if (hour < 9) return '早上好' + else if (hour < 12) return '上午好' + else if (hour < 14) return '中午好' + else if (hour < 17) return '下午好' + else if (hour < 19) return '傍晚好' + else if (hour < 22) return '晚上好' + else return '夜里好' +} + +/** + * 将毫秒,转换成时间字符串。例如说,xx 分钟 + * + * @param ms 毫秒 + * @returns {string} 字符串 + */ +export function formatPast2(ms) { + const day = Math.floor(ms / (24 * 60 * 60 * 1000)) + const hour = Math.floor(ms / (60 * 60 * 1000) - day * 24) + const minute = Math.floor(ms / (60 * 1000) - day * 24 * 60 - hour * 60) + const second = Math.floor(ms / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60) + if (day > 0) { + return day + '天' + hour + '小时' + minute + '分钟' + } + if (hour > 0) { + return hour + '小时' + minute + '分钟' + } + if (minute > 0) { + return minute + '分钟' + } + if (second > 0) { + return second + '秒' + } else { + return 0 + '秒' + } +} + +/** + * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD HH:mm:ss 格式 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +// @ts-ignore +export const dateFormatter = (row, column, cellValue) => { + if (!cellValue) { + return + } + return formatDate(cellValue) +} + +/** + * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD 格式 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +// @ts-ignore +export const dateFormatter2 = (row, column, cellValue) => { + if (!cellValue) { + return + } + return formatDate(cellValue, 'YYYY-MM-DD') +} + +/** + * 设置起始日期,时间为00:00:00 + * @param param 传入日期 + * @returns 带时间00:00:00的日期 + */ +export function beginOfDay(param: Date) { + return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 0, 0, 0) +} + +/** + * 设置结束日期,时间为23:59:59 + * @param param 传入日期 + * @returns 带时间23:59:59的日期 + */ +export function endOfDay(param: Date) { + return new Date(param.getFullYear(), param.getMonth(), param.getDate(), 23, 59, 59) +} + +/** + * 计算两个日期间隔天数 + * @param param1 日期1 + * @param param2 日期2 + */ +export function betweenDay(param1: Date, param2: Date) { + param1 = convertDate(param1) + param2 = convertDate(param2) + // 计算差值 + return Math.floor((param2.getTime() - param1.getTime()) / (24 * 3600 * 1000)) +} + +/** + * 日期计算 + * @param param1 日期 + * @param param2 添加的时间 + */ +export function addTime(param1: Date, param2: number) { + param1 = convertDate(param1) + return new Date(param1.getTime() + param2) +} + +/** + * 日期转换 + * @param param 日期 + */ +export function convertDate(param: Date | string) { + if (typeof param === 'string') { + return new Date(param) + } + return param +} diff --git a/grailed_app/src/utils/pageUtils.ts b/grailed_app/src/utils/pageUtils.ts new file mode 100644 index 0000000..43e5f65 --- /dev/null +++ b/grailed_app/src/utils/pageUtils.ts @@ -0,0 +1,52 @@ +import { useCache } from '@/hooks/useCache' +import axios from "@/config/axios"; + +const {wsCache} = useCache('sessionStorage') + +export interface H5Pages { + country: string + language: string + name: string + logo: string + favicon: string + title: string +} + +const defaultConfig: H5Pages = { + country: 'US', + language: 'en-us', + name: 'Baltini', + logo: '/favicon.ico', + favicon: '/favicon.webp', + title: 'Baltini App', +} + +const PAGE_CONFIG_KEY = 'pageConfig' + +export const getH5PagesConfig = (): H5Pages => { + return wsCache.get(PAGE_CONFIG_KEY); +} + +const fetchH5PagesConfig = async () => { + let res:H5Pages + try { + res = await axios.get({ url: '/member/app/config/get' }) + } catch (e) { + res = {...defaultConfig} + } + return res +} + +export const setupPageConfig = () => { + fetchH5PagesConfig().then(res => { + wsCache.set(PAGE_CONFIG_KEY, res) + // set title + document.title = res.title + // set favicon + const link = document.querySelector("link[rel*='icon']") as HTMLLinkElement || document.createElement('link') as HTMLLinkElement + link.type = 'image/x-icon' + link.rel = 'shortcut icon' + link.href = res.favicon + }) + +} \ No newline at end of file diff --git a/grailed_app/src/views/Main.vue b/grailed_app/src/views/Main.vue new file mode 100644 index 0000000..2d06e1a --- /dev/null +++ b/grailed_app/src/views/Main.vue @@ -0,0 +1,81 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/about/Index.vue b/grailed_app/src/views/about/Index.vue new file mode 100644 index 0000000..bf0db3a --- /dev/null +++ b/grailed_app/src/views/about/Index.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/balanceRecord/Index.vue b/grailed_app/src/views/balanceRecord/Index.vue new file mode 100644 index 0000000..f9aef4a --- /dev/null +++ b/grailed_app/src/views/balanceRecord/Index.vue @@ -0,0 +1,96 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/bindCrypto/Index.vue b/grailed_app/src/views/bindCrypto/Index.vue new file mode 100644 index 0000000..bb9702a --- /dev/null +++ b/grailed_app/src/views/bindCrypto/Index.vue @@ -0,0 +1,86 @@ + + + diff --git a/grailed_app/src/views/channelSelect/Index.vue b/grailed_app/src/views/channelSelect/Index.vue new file mode 100644 index 0000000..87370df --- /dev/null +++ b/grailed_app/src/views/channelSelect/Index.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/dailyCheckIn/Index.vue b/grailed_app/src/views/dailyCheckIn/Index.vue new file mode 100644 index 0000000..bf55a22 --- /dev/null +++ b/grailed_app/src/views/dailyCheckIn/Index.vue @@ -0,0 +1,174 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/helpGuide/Index.vue b/grailed_app/src/views/helpGuide/Index.vue new file mode 100644 index 0000000..17d10b3 --- /dev/null +++ b/grailed_app/src/views/helpGuide/Index.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/Index.vue b/grailed_app/src/views/home/Index.vue new file mode 100644 index 0000000..c3d96fa --- /dev/null +++ b/grailed_app/src/views/home/Index.vue @@ -0,0 +1,277 @@ + + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/components/Carousel.vue b/grailed_app/src/views/home/components/Carousel.vue new file mode 100644 index 0000000..d0968e1 --- /dev/null +++ b/grailed_app/src/views/home/components/Carousel.vue @@ -0,0 +1,25 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/components/Introduce.vue b/grailed_app/src/views/home/components/Introduce.vue new file mode 100644 index 0000000..3d0e93f --- /dev/null +++ b/grailed_app/src/views/home/components/Introduce.vue @@ -0,0 +1,234 @@ + + + + + + + diff --git a/grailed_app/src/views/home/components/MemberList.vue b/grailed_app/src/views/home/components/MemberList.vue new file mode 100644 index 0000000..f013d5f --- /dev/null +++ b/grailed_app/src/views/home/components/MemberList.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/components/Notice.vue b/grailed_app/src/views/home/components/Notice.vue new file mode 100644 index 0000000..c2a563f --- /dev/null +++ b/grailed_app/src/views/home/components/Notice.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/components/Partners.vue b/grailed_app/src/views/home/components/Partners.vue new file mode 100644 index 0000000..778f163 --- /dev/null +++ b/grailed_app/src/views/home/components/Partners.vue @@ -0,0 +1,73 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/home/components/TaskCarouse.vue b/grailed_app/src/views/home/components/TaskCarouse.vue new file mode 100644 index 0000000..bcf1195 --- /dev/null +++ b/grailed_app/src/views/home/components/TaskCarouse.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/invitation/Index.vue b/grailed_app/src/views/invitation/Index.vue new file mode 100644 index 0000000..2fd83c2 --- /dev/null +++ b/grailed_app/src/views/invitation/Index.vue @@ -0,0 +1,110 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/language/Index.vue b/grailed_app/src/views/language/Index.vue new file mode 100644 index 0000000..ee0448d --- /dev/null +++ b/grailed_app/src/views/language/Index.vue @@ -0,0 +1,69 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/notification/Index.vue b/grailed_app/src/views/notification/Index.vue new file mode 100644 index 0000000..d1d536f --- /dev/null +++ b/grailed_app/src/views/notification/Index.vue @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/grailed_app/src/views/order/Index.vue b/grailed_app/src/views/order/Index.vue new file mode 100644 index 0000000..94a156d --- /dev/null +++ b/grailed_app/src/views/order/Index.vue @@ -0,0 +1,252 @@ + + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/password/Index.vue b/grailed_app/src/views/password/Index.vue new file mode 100644 index 0000000..ae68a0d --- /dev/null +++ b/grailed_app/src/views/password/Index.vue @@ -0,0 +1,120 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/payOrderDetails/Index.vue b/grailed_app/src/views/payOrderDetails/Index.vue new file mode 100644 index 0000000..1c9ec2f --- /dev/null +++ b/grailed_app/src/views/payOrderDetails/Index.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/profile/Index.vue b/grailed_app/src/views/profile/Index.vue new file mode 100644 index 0000000..69be912 --- /dev/null +++ b/grailed_app/src/views/profile/Index.vue @@ -0,0 +1,234 @@ + + + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/recharge/Index.vue b/grailed_app/src/views/recharge/Index.vue new file mode 100644 index 0000000..5ae2900 --- /dev/null +++ b/grailed_app/src/views/recharge/Index.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/service/Index.vue b/grailed_app/src/views/service/Index.vue new file mode 100644 index 0000000..6dd375c --- /dev/null +++ b/grailed_app/src/views/service/Index.vue @@ -0,0 +1,93 @@ + + + + + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/service/chat/index.vue b/grailed_app/src/views/service/chat/index.vue new file mode 100644 index 0000000..a521c7e --- /dev/null +++ b/grailed_app/src/views/service/chat/index.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/grailed_app/src/views/settings/Index.vue b/grailed_app/src/views/settings/Index.vue new file mode 100644 index 0000000..b056b05 --- /dev/null +++ b/grailed_app/src/views/settings/Index.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/grailed_app/src/views/settingsPersonal/Index.vue b/grailed_app/src/views/settingsPersonal/Index.vue new file mode 100644 index 0000000..9824ee0 --- /dev/null +++ b/grailed_app/src/views/settingsPersonal/Index.vue @@ -0,0 +1,257 @@ + +