@ -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 # 关闭末尾空格修剪 |
@ -0,0 +1,20 @@ |
|||
# 标题 |
|||
VITE_APP_TITLE=管理系统 |
|||
|
|||
# 项目本地运行端口号 |
|||
VITE_PORT=80 |
|||
|
|||
# open 运行 npm run dev 时自动打开浏览器 |
|||
VITE_OPEN=true |
|||
|
|||
# 租户开关 |
|||
VITE_APP_TENANT_ENABLE=true |
|||
|
|||
# 验证码的开关 |
|||
VITE_APP_CAPTCHA_ENABLE=false |
|||
|
|||
|
|||
# 默认账户密码 |
|||
VITE_APP_DEFAULT_LOGIN_TENANT = 系统租户 |
|||
VITE_APP_DEFAULT_LOGIN_USERNAME = |
|||
VITE_APP_DEFAULT_LOGIN_PASSWORD = |
@ -0,0 +1,27 @@ |
|||
NODE_ENV=production |
|||
|
|||
VITE_DEV=true |
|||
|
|||
# 请求路径 |
|||
VITE_BASE_URL='http://192.168.0.129:48080' |
|||
|
|||
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 |
|||
VITE_UPLOAD_TYPE=server |
|||
|
|||
# 接口地址 |
|||
VITE_API_URL=/admin-api |
|||
|
|||
# 是否删除debugger |
|||
VITE_DROP_DEBUGGER=false |
|||
|
|||
# 是否删除console.log |
|||
VITE_DROP_CONSOLE=false |
|||
|
|||
# 是否sourcemap |
|||
VITE_SOURCEMAP=true |
|||
|
|||
# 打包路径 |
|||
VITE_BASE_PATH=/ |
|||
|
|||
# 输出路径 |
|||
VITE_OUT_DIR=dist |
@ -0,0 +1,27 @@ |
|||
NODE_ENV=production |
|||
|
|||
VITE_DEV=false |
|||
|
|||
# 请求路径 |
|||
VITE_BASE_URL='http://localhost:48080' |
|||
|
|||
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 |
|||
VITE_UPLOAD_TYPE=server |
|||
|
|||
# 接口地址 |
|||
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-prod |
@ -0,0 +1,27 @@ |
|||
NODE_ENV=production |
|||
|
|||
VITE_DEV=false |
|||
|
|||
# 请求路径 |
|||
VITE_BASE_URL='' |
|||
|
|||
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 |
|||
VITE_UPLOAD_TYPE=server |
|||
|
|||
# 接口地址 |
|||
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-test |
@ -0,0 +1,8 @@ |
|||
/build/ |
|||
/config/ |
|||
/dist/ |
|||
/*.js |
|||
/test/unit/coverage/ |
|||
/node_modules/* |
|||
/dist* |
|||
/src/main.ts |
@ -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 |
|||
} |
|||
} |
@ -0,0 +1,75 @@ |
|||
// @ts-check
|
|||
const { defineConfig } = require('eslint-define-config') |
|||
module.exports = defineConfig({ |
|||
root: true, |
|||
env: { |
|||
browser: true, |
|||
node: true, |
|||
es6: true |
|||
}, |
|||
parser: 'vue-eslint-parser', |
|||
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', |
|||
'@unocss' |
|||
], |
|||
rules: { |
|||
'vue/no-setup-props-destructure': 'off', |
|||
'vue/script-setup-uses-vars': 'error', |
|||
'vue/no-reserved-component-names': '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/require-toggle-inside-transition': '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', |
|||
'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件
|
|||
'@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
|
|||
'@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
|
|||
} |
|||
}) |
@ -0,0 +1,9 @@ |
|||
node_modules |
|||
.DS_Store |
|||
dist |
|||
dist-ssr |
|||
/dist* |
|||
pnpm-debug |
|||
auto-*.d.ts |
|||
.idea |
|||
.history |
@ -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 |
@ -0,0 +1,6 @@ |
|||
/dist/* |
|||
/public/* |
|||
public/* |
|||
/dist* |
|||
/src/types/env.d.ts |
|||
/docs/**/* |
@ -0,0 +1,18 @@ |
|||
{ |
|||
"recommendations": [ |
|||
"christian-kohler.path-intellisense", |
|||
"vscode-icons-team.vscode-icons", |
|||
"davidanson.vscode-markdownlint", |
|||
"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" |
|||
] |
|||
} |
@ -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 localhost", |
|||
"url": "http://localhost", |
|||
"webRoot": "${workspaceFolder}/src", |
|||
"sourceMaps": true |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,146 @@ |
|||
{ |
|||
"typescript.tsdk": "node_modules/typescript/lib", |
|||
"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": "esbenp.prettier-vscode" |
|||
}, |
|||
"[html]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"[css]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"[less]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"[scss]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"[markdown]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"editor.codeActionsOnSave": { |
|||
"source.fixAll.eslint": "explicit", |
|||
"source.fixAll.stylelint": "explicit" |
|||
}, |
|||
"editor.formatOnSave": true, |
|||
"[vue]": { |
|||
"editor.defaultFormatter": "esbenp.prettier-vscode" |
|||
}, |
|||
"i18n-ally.localesPaths": ["src/locales"], |
|||
"i18n-ally.keystyle": "nested", |
|||
"i18n-ally.sortKeys": true, |
|||
"i18n-ally.namespace": false, |
|||
"i18n-ally.enabledParsers": ["ts"], |
|||
"i18n-ally.sourceLanguage": "en", |
|||
"i18n-ally.displayLanguage": "zh-CN", |
|||
"i18n-ally.enabledFrameworks": ["vue", "react"], |
|||
"cSpell.words": [ |
|||
"brotli", |
|||
"browserslist", |
|||
"codemirror", |
|||
"commitlint", |
|||
"cropperjs", |
|||
"echart", |
|||
"echarts", |
|||
"esnext", |
|||
"esno", |
|||
"iconify", |
|||
"INTLIFY", |
|||
"lintstagedrc", |
|||
"logicflow", |
|||
"nprogress", |
|||
"pinia", |
|||
"pnpm", |
|||
"qrcode", |
|||
"sider", |
|||
"sortablejs", |
|||
"stylelint", |
|||
"svgs", |
|||
"unocss", |
|||
"unplugin", |
|||
"unref", |
|||
"videojs", |
|||
"VITE", |
|||
"vitejs", |
|||
"vueuse", |
|||
"wangeditor", |
|||
"xingyu", |
|||
"yudao", |
|||
"zxcvbn" |
|||
], |
|||
// 控制相关文件嵌套展示 |
|||
"explorer.fileNesting.enabled": true, |
|||
"explorer.fileNesting.expand": false, |
|||
"explorer.fileNesting.patterns": { |
|||
"*.ts": "$(capture).test.ts, $(capture).test.tsx", |
|||
"*.tsx": "$(capture).test.ts, $(capture).test.tsx", |
|||
"*.env": "$(capture).env.*", |
|||
"package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore" |
|||
}, |
|||
"terminal.integrated.scrollback": 10000, |
|||
"nuxt.isNuxtApp": false |
|||
} |
@ -0,0 +1,99 @@ |
|||
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-ng' |
|||
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({ |
|||
// 生成自定义 `auto-components.d.ts` 全局声明
|
|||
dts: 'src/types/auto-components.d.ts', |
|||
// 自定义组件的解析器
|
|||
resolvers: [ElementPlusResolver()], |
|||
globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**'] |
|||
}), |
|||
EslintPlugin({ |
|||
cache: false, |
|||
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]', |
|||
}), |
|||
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}` |
|||
}) |
|||
] |
|||
} |
@ -0,0 +1,123 @@ |
|||
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', |
|||
'@microsoft/fetch-event-source', |
|||
'markdown-it', |
|||
'markmap-view', |
|||
'markmap-lib', |
|||
'markmap-toolbar', |
|||
'highlight.js', |
|||
'element-plus', |
|||
'element-plus/es', |
|||
'element-plus/es/locale/lang/zh-cn', |
|||
'element-plus/es/locale/lang/en', |
|||
'element-plus/es/components/avatar/style/css', |
|||
'element-plus/es/components/space/style/css', |
|||
'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', |
|||
'element-plus/es/components/segmented/style/css', |
|||
'@element-plus/icons-vue', |
|||
'element-plus/es/components/footer/style/css', |
|||
'element-plus/es/components/empty/style/css', |
|||
'element-plus/es/components/mention/style/css' |
|||
] |
|||
|
|||
const exclude = ['@iconify/json'] |
|||
|
|||
export { include, exclude } |
@ -0,0 +1,143 @@ |
|||
<!doctype html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8" /> |
|||
<link rel="icon" href="/favicon.ico" /> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|||
<title>%VITE_APP_TITLE%</title> |
|||
</head> |
|||
<body> |
|||
<div id="app"> |
|||
<style> |
|||
.app-loading { |
|||
display: flex; |
|||
width: 100%; |
|||
height: 100%; |
|||
justify-content: center; |
|||
align-items: center; |
|||
flex-direction: column; |
|||
background: #f0f2f5; |
|||
} |
|||
|
|||
.app-loading .app-loading-wrap { |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
display: flex; |
|||
-webkit-transform: translate3d(-50%, -50%, 0); |
|||
transform: translate3d(-50%, -50%, 0); |
|||
justify-content: center; |
|||
align-items: center; |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.app-loading .app-loading-title { |
|||
margin-bottom: 30px; |
|||
font-size: 20px; |
|||
font-weight: bold; |
|||
text-align: center; |
|||
} |
|||
|
|||
.app-loading .app-loading-logo { |
|||
width: 100px; |
|||
margin: 0 auto 15px auto; |
|||
} |
|||
|
|||
.app-loading .app-loading-item { |
|||
position: relative; |
|||
display: inline-block; |
|||
width: 60px; |
|||
height: 60px; |
|||
vertical-align: middle; |
|||
border-radius: 50%; |
|||
} |
|||
|
|||
.app-loading .app-loading-outter { |
|||
position: absolute; |
|||
width: 100%; |
|||
height: 100%; |
|||
border: 4px solid #2d8cf0; |
|||
border-bottom: 0; |
|||
border-left-color: transparent; |
|||
border-radius: 50%; |
|||
animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite; |
|||
} |
|||
|
|||
.app-loading .app-loading-inner { |
|||
position: absolute; |
|||
top: calc(50% - 20px); |
|||
left: calc(50% - 20px); |
|||
width: 40px; |
|||
height: 40px; |
|||
border: 4px solid #87bdff; |
|||
border-right: 0; |
|||
border-top-color: transparent; |
|||
border-radius: 50%; |
|||
animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite; |
|||
} |
|||
|
|||
@-webkit-keyframes loader-outter { |
|||
0% { |
|||
-webkit-transform: rotate(0deg); |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
100% { |
|||
-webkit-transform: rotate(360deg); |
|||
transform: rotate(360deg); |
|||
} |
|||
} |
|||
|
|||
@keyframes loader-outter { |
|||
0% { |
|||
-webkit-transform: rotate(0deg); |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
100% { |
|||
-webkit-transform: rotate(360deg); |
|||
transform: rotate(360deg); |
|||
} |
|||
} |
|||
|
|||
@-webkit-keyframes loader-inner { |
|||
0% { |
|||
-webkit-transform: rotate(0deg); |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
100% { |
|||
-webkit-transform: rotate(-360deg); |
|||
transform: rotate(-360deg); |
|||
} |
|||
} |
|||
|
|||
@keyframes loader-inner { |
|||
0% { |
|||
-webkit-transform: rotate(0deg); |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
100% { |
|||
-webkit-transform: rotate(-360deg); |
|||
transform: rotate(-360deg); |
|||
} |
|||
} |
|||
</style> |
|||
<div class="app-loading"> |
|||
<div class="app-loading-wrap"> |
|||
<div class="app-loading-title"> |
|||
<img src="/logo.gif" class="app-loading-logo" alt="Logo" /> |
|||
<div class="app-loading-title">%VITE_APP_TITLE%</div> |
|||
</div> |
|||
<div class="app-loading-item"> |
|||
<div class="app-loading-outter"></div> |
|||
<div class="app-loading-inner"></div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script type="module" src="/src/main.ts"></script> |
|||
</body> |
|||
</html> |
@ -0,0 +1,155 @@ |
|||
{ |
|||
"name": "yudao-ui-admin-vue3", |
|||
"version": "2.6.1-snapshot", |
|||
"description": "基于vue3、vite4、element-plus、typesScript", |
|||
"author": "xingyu", |
|||
"private": false, |
|||
"scripts": { |
|||
"i": "pnpm install", |
|||
"dev": "vite --mode dev", |
|||
"ts:check": "vue-tsc --noEmit", |
|||
"build:local": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build", |
|||
"build:dev": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode dev", |
|||
"build:test": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode test", |
|||
"build:stage": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode stage", |
|||
"build:prod": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod", |
|||
"serve:dev": "vite preview --mode dev", |
|||
"serve:prod": "vite preview --mode prod", |
|||
"preview": "pnpm build:local && 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 \"./src/**/*.{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.2.6", |
|||
"@form-create/element-ui": "^3.2.11", |
|||
"@iconify/iconify": "^3.1.1", |
|||
"@logicflow/core": "^2.0.16", |
|||
"@microsoft/fetch-event-source": "^2.0.1", |
|||
"@videojs-player/vue": "^1.0.0", |
|||
"@vueuse/core": "^10.9.0", |
|||
"@wangeditor/editor": "^5.1.23", |
|||
"@wangeditor/editor-for-vue": "^5.1.10", |
|||
"@zxcvbn-ts/core": "^3.0.4", |
|||
"animate.css": "^4.1.1", |
|||
"axios": "1.9.0", |
|||
"benz-amr-recorder": "^1.1.5", |
|||
"bpmn-js-token-simulation": "^0.36.0", |
|||
"camunda-bpmn-moddle": "^7.0.1", |
|||
"cropperjs": "^1.6.1", |
|||
"crypto-js": "^4.2.0", |
|||
"dayjs": "^1.11.10", |
|||
"diagram-js": "^12.8.0", |
|||
"driver.js": "^1.3.1", |
|||
"echarts": "^5.5.0", |
|||
"echarts-wordcloud": "^2.1.0", |
|||
"element-plus": "2.9.1", |
|||
"fast-xml-parser": "^4.3.2", |
|||
"highlight.js": "^11.9.0", |
|||
"jsencrypt": "^3.3.2", |
|||
"lodash-es": "^4.17.21", |
|||
"markdown-it": "^14.1.0", |
|||
"markmap-common": "^0.16.0", |
|||
"markmap-lib": "^0.16.1", |
|||
"markmap-toolbar": "^0.17.0", |
|||
"markmap-view": "^0.16.0", |
|||
"min-dash": "^4.1.1", |
|||
"mitt": "^3.0.1", |
|||
"nprogress": "^0.2.0", |
|||
"pinia": "^2.1.7", |
|||
"pinia-plugin-persistedstate": "^3.2.1", |
|||
"qrcode": "^1.5.3", |
|||
"qs": "^6.12.0", |
|||
"sortablejs": "^1.15.3", |
|||
"steady-xml": "^0.1.0", |
|||
"url": "^0.11.3", |
|||
"v3-jsoneditor": "^0.0.6", |
|||
"video.js": "^7.21.5", |
|||
"vue": "3.5.12", |
|||
"vue-dompurify-html": "^4.1.4", |
|||
"vue-i18n": "9.10.2", |
|||
"vue-router": "4.4.5", |
|||
"vue-types": "^5.1.1", |
|||
"vue3-signature": "^0.2.4", |
|||
"vuedraggable": "^4.1.0", |
|||
"web-storage-cache": "^1.1.1", |
|||
"xml-js": "^1.6.11" |
|||
}, |
|||
"devDependencies": { |
|||
"@commitlint/cli": "^19.0.1", |
|||
"@commitlint/config-conventional": "^19.0.0", |
|||
"@iconify/json": "^2.2.187", |
|||
"@intlify/unplugin-vue-i18n": "^2.0.0", |
|||
"@purge-icons/generated": "^0.9.0", |
|||
"@types/lodash-es": "^4.17.12", |
|||
"@types/node": "^20.11.21", |
|||
"@types/nprogress": "^0.2.3", |
|||
"@types/qrcode": "^1.5.5", |
|||
"@types/qs": "^6.9.12", |
|||
"@typescript-eslint/eslint-plugin": "^7.1.0", |
|||
"@typescript-eslint/parser": "^7.1.0", |
|||
"@unocss/eslint-config": "^0.57.4", |
|||
"@unocss/eslint-plugin": "66.1.0-beta.5", |
|||
"@unocss/transformer-variant-group": "^0.58.5", |
|||
"@vitejs/plugin-legacy": "^5.3.1", |
|||
"@vitejs/plugin-vue": "^5.0.4", |
|||
"@vitejs/plugin-vue-jsx": "^3.1.0", |
|||
"autoprefixer": "^10.4.17", |
|||
"bpmn-js": "^17.9.2", |
|||
"bpmn-js-properties-panel": "5.23.0", |
|||
"consola": "^3.2.3", |
|||
"eslint": "^8.57.0", |
|||
"eslint-config-prettier": "^9.1.0", |
|||
"eslint-define-config": "^2.1.0", |
|||
"eslint-plugin-prettier": "^5.1.3", |
|||
"eslint-plugin-vue": "^9.22.0", |
|||
"lint-staged": "^15.2.2", |
|||
"postcss": "^8.4.35", |
|||
"postcss-html": "^1.6.0", |
|||
"postcss-scss": "^4.0.9", |
|||
"prettier": "^3.2.5", |
|||
"prettier-eslint": "^16.3.0", |
|||
"rimraf": "^5.0.5", |
|||
"rollup": "^4.12.0", |
|||
"sass": "^1.69.5", |
|||
"stylelint": "^16.2.1", |
|||
"stylelint-config-html": "^1.1.0", |
|||
"stylelint-config-recommended": "^14.0.0", |
|||
"stylelint-config-standard": "^36.0.0", |
|||
"stylelint-order": "^6.0.4", |
|||
"terser": "^5.28.1", |
|||
"typescript": "5.3.3", |
|||
"unocss": "^0.58.5", |
|||
"unplugin-auto-import": "^0.16.7", |
|||
"unplugin-element-plus": "^0.8.0", |
|||
"unplugin-vue-components": "^0.25.2", |
|||
"vite": "5.1.4", |
|||
"vite-plugin-compression": "^0.5.1", |
|||
"vite-plugin-ejs": "^1.7.0", |
|||
"vite-plugin-eslint": "^1.8.1", |
|||
"vite-plugin-progress": "^0.0.7", |
|||
"vite-plugin-purge-icons": "^0.10.0", |
|||
"vite-plugin-svg-icons-ng": "^1.3.1", |
|||
"vite-plugin-top-level-await": "^1.4.4", |
|||
"vue-eslint-parser": "^9.3.2", |
|||
"vue-tsc": "^1.8.27" |
|||
}, |
|||
"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", |
|||
"web-types": "./web-types.json", |
|||
"engines": { |
|||
"node": ">= 16.0.0", |
|||
"pnpm": ">=8.6.0" |
|||
} |
|||
} |
@ -0,0 +1,5 @@ |
|||
module.exports = { |
|||
plugins: { |
|||
autoprefixer: {} |
|||
} |
|||
} |
@ -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 |
|||
} |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 6.2 KiB |
@ -0,0 +1,57 @@ |
|||
<script lang="ts" setup> |
|||
import { isDark } from '@/utils/is' |
|||
import { useAppStore } from '@/store/modules/app' |
|||
import { useDesign } from '@/hooks/web/useDesign' |
|||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache' |
|||
import routerSearch from '@/components/RouterSearch/index.vue' |
|||
|
|||
defineOptions({ name: 'APP' }) |
|||
|
|||
const { getPrefixCls } = useDesign() |
|||
const prefixCls = getPrefixCls('app') |
|||
const appStore = useAppStore() |
|||
const currentSize = computed(() => appStore.getCurrentSize) |
|||
const greyMode = computed(() => appStore.getGreyMode) |
|||
const { wsCache } = useCache() |
|||
|
|||
// 根据浏览器当前主题设置系统主题色 |
|||
const setDefaultTheme = () => { |
|||
let isDarkTheme = wsCache.get(CACHE_KEY.IS_DARK) |
|||
if (isDarkTheme === null) { |
|||
isDarkTheme = isDark() |
|||
} |
|||
appStore.setIsDark(isDarkTheme) |
|||
} |
|||
setDefaultTheme() |
|||
</script> |
|||
<template> |
|||
<ConfigGlobal :size="currentSize"> |
|||
<RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" /> |
|||
<routerSearch /> |
|||
</ConfigGlobal> |
|||
</template> |
|||
<style lang="scss"> |
|||
$prefix-cls: #{$namespace}-app; |
|||
|
|||
.size { |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
|
|||
html, |
|||
body { |
|||
@extend .size; |
|||
|
|||
padding: 0 !important; |
|||
margin: 0; |
|||
overflow: hidden; |
|||
|
|||
#app { |
|||
@extend .size; |
|||
} |
|||
} |
|||
|
|||
.#{$prefix-cls}-grey-mode { |
|||
filter: grayscale(100%); |
|||
} |
|||
</style> |
@ -0,0 +1,53 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// BPM 流程分类 VO
|
|||
export interface CategoryVO { |
|||
id: number // 分类编号
|
|||
name: string // 分类名
|
|||
code: string // 分类标志
|
|||
status: number // 分类状态
|
|||
sort: number // 分类排序
|
|||
} |
|||
|
|||
// BPM 流程分类 API
|
|||
export const CategoryApi = { |
|||
// 查询流程分类分页
|
|||
getCategoryPage: async (params: any) => { |
|||
return await request.get({ url: `/bpm/category/page`, params }) |
|||
}, |
|||
|
|||
// 查询流程分类列表
|
|||
getCategorySimpleList: async () => { |
|||
return await request.get({ url: `/bpm/category/simple-list` }) |
|||
}, |
|||
|
|||
// 查询流程分类详情
|
|||
getCategory: async (id: number) => { |
|||
return await request.get({ url: `/bpm/category/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增流程分类
|
|||
createCategory: async (data: CategoryVO) => { |
|||
return await request.post({ url: `/bpm/category/create`, data }) |
|||
}, |
|||
|
|||
// 修改流程分类
|
|||
updateCategory: async (data: CategoryVO) => { |
|||
return await request.put({ url: `/bpm/category/update`, data }) |
|||
}, |
|||
|
|||
// 批量修改流程分类的排序
|
|||
updateCategorySortBatch: async (ids: number[]) => { |
|||
return await request.put({ |
|||
url: `/bpm/category/update-sort-batch`, |
|||
params: { |
|||
ids: ids.join(',') |
|||
} |
|||
}) |
|||
}, |
|||
|
|||
// 删除流程分类
|
|||
deleteCategory: async (id: number) => { |
|||
return await request.delete({ url: `/bpm/category/delete?id=` + id }) |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export const getProcessDefinition = async (id?: string, key?: string) => { |
|||
return await request.get({ |
|||
url: '/bpm/process-definition/get', |
|||
params: { id, key } |
|||
}) |
|||
} |
|||
|
|||
export const getProcessDefinitionPage = async (params) => { |
|||
return await request.get({ |
|||
url: '/bpm/process-definition/page', |
|||
params |
|||
}) |
|||
} |
|||
|
|||
export const getProcessDefinitionList = async (params) => { |
|||
return await request.get({ |
|||
url: '/bpm/process-definition/list', |
|||
params |
|||
}) |
|||
} |
|||
|
|||
export const getSimpleProcessDefinitionList = async () => { |
|||
return await request.get({ |
|||
url: '/bpm/process-definition/simple-list' |
|||
}) |
|||
} |
@ -0,0 +1,56 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export type FormVO = { |
|||
id: number |
|||
name: string |
|||
conf: string |
|||
fields: string[] |
|||
status: number |
|||
remark: string |
|||
createTime: string |
|||
} |
|||
|
|||
// 创建工作流的表单定义
|
|||
export const createForm = async (data: FormVO) => { |
|||
return await request.post({ |
|||
url: '/bpm/form/create', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
// 更新工作流的表单定义
|
|||
export const updateForm = async (data: FormVO) => { |
|||
return await request.put({ |
|||
url: '/bpm/form/update', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
// 删除工作流的表单定义
|
|||
export const deleteForm = async (id: number) => { |
|||
return await request.delete({ |
|||
url: '/bpm/form/delete?id=' + id |
|||
}) |
|||
} |
|||
|
|||
// 获得工作流的表单定义
|
|||
export const getForm = async (id: number) => { |
|||
return await request.get({ |
|||
url: '/bpm/form/get?id=' + id |
|||
}) |
|||
} |
|||
|
|||
// 获得工作流的表单定义分页
|
|||
export const getFormPage = async (params) => { |
|||
return await request.get({ |
|||
url: '/bpm/form/page', |
|||
params |
|||
}) |
|||
} |
|||
|
|||
// 获得动态表单的精简列表
|
|||
export const getFormSimpleList = async () => { |
|||
return await request.get({ |
|||
url: '/bpm/form/simple-list' |
|||
}) |
|||
} |
@ -0,0 +1,27 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export type LeaveVO = { |
|||
id: number |
|||
status: number |
|||
type: number |
|||
reason: string |
|||
processInstanceId: string |
|||
startTime: string |
|||
endTime: string |
|||
createTime: string |
|||
} |
|||
|
|||
// 创建请假申请
|
|||
export const createLeave = async (data: LeaveVO) => { |
|||
return await request.post({ url: '/bpm/oa/leave/create', data: data }) |
|||
} |
|||
|
|||
// 获得请假申请
|
|||
export const getLeave = async (id: number) => { |
|||
return await request.get({ url: '/bpm/oa/leave/get?id=' + id }) |
|||
} |
|||
|
|||
// 获得请假申请分页
|
|||
export const getLeavePage = async (params: PageParam) => { |
|||
return await request.get({ url: '/bpm/oa/leave/page', params }) |
|||
} |
@ -0,0 +1,78 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export type ProcessDefinitionVO = { |
|||
id: string |
|||
version: number |
|||
deploymentTIme: string |
|||
suspensionState: number |
|||
formType?: number |
|||
} |
|||
|
|||
export type ModelVO = { |
|||
id: number |
|||
formName: string |
|||
key: string |
|||
name: string |
|||
description: string |
|||
category: string |
|||
formType: number |
|||
formId: number |
|||
formCustomCreatePath: string |
|||
formCustomViewPath: string |
|||
processDefinition: ProcessDefinitionVO |
|||
status: number |
|||
remark: string |
|||
createTime: string |
|||
bpmnXml: string |
|||
} |
|||
|
|||
export const getModelList = async (name: string | undefined) => { |
|||
return await request.get({ url: '/bpm/model/list', params: { name } }) |
|||
} |
|||
|
|||
export const getModel = async (id: string) => { |
|||
return await request.get({ url: '/bpm/model/get?id=' + id }) |
|||
} |
|||
|
|||
export const updateModel = async (data: ModelVO) => { |
|||
return await request.put({ url: '/bpm/model/update', data: data }) |
|||
} |
|||
|
|||
// 批量修改流程分类的排序
|
|||
export const updateModelSortBatch = async (ids: number[]) => { |
|||
return await request.put({ |
|||
url: `/bpm/model/update-sort-batch`, |
|||
params: { |
|||
ids: ids.join(',') |
|||
} |
|||
}) |
|||
} |
|||
|
|||
export const updateModelBpmn = async (data: ModelVO) => { |
|||
return await request.put({ url: '/bpm/model/update-bpmn', data: data }) |
|||
} |
|||
|
|||
// 任务状态修改
|
|||
export const updateModelState = async (id: number, state: number) => { |
|||
const data = { |
|||
id: id, |
|||
state: state |
|||
} |
|||
return await request.put({ url: '/bpm/model/update-state', data: data }) |
|||
} |
|||
|
|||
export const createModel = async (data: ModelVO) => { |
|||
return await request.post({ url: '/bpm/model/create', data: data }) |
|||
} |
|||
|
|||
export const deleteModel = async (id: number) => { |
|||
return await request.delete({ url: '/bpm/model/delete?id=' + id }) |
|||
} |
|||
|
|||
export const deployModel = async (id: number) => { |
|||
return await request.post({ url: '/bpm/model/deploy?id=' + id }) |
|||
} |
|||
|
|||
export const cleanModel = async (id: number) => { |
|||
return await request.delete({ url: '/bpm/model/clean?id=' + id }) |
|||
} |
@ -0,0 +1,42 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// BPM 流程表达式 VO
|
|||
export interface ProcessExpressionVO { |
|||
id: number // 编号
|
|||
name: string // 表达式名字
|
|||
status: number // 表达式状态
|
|||
expression: string // 表达式
|
|||
} |
|||
|
|||
// BPM 流程表达式 API
|
|||
export const ProcessExpressionApi = { |
|||
// 查询BPM 流程表达式分页
|
|||
getProcessExpressionPage: async (params: any) => { |
|||
return await request.get({ url: `/bpm/process-expression/page`, params }) |
|||
}, |
|||
|
|||
// 查询BPM 流程表达式详情
|
|||
getProcessExpression: async (id: number) => { |
|||
return await request.get({ url: `/bpm/process-expression/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增BPM 流程表达式
|
|||
createProcessExpression: async (data: ProcessExpressionVO) => { |
|||
return await request.post({ url: `/bpm/process-expression/create`, data }) |
|||
}, |
|||
|
|||
// 修改BPM 流程表达式
|
|||
updateProcessExpression: async (data: ProcessExpressionVO) => { |
|||
return await request.put({ url: `/bpm/process-expression/update`, data }) |
|||
}, |
|||
|
|||
// 删除BPM 流程表达式
|
|||
deleteProcessExpression: async (id: number) => { |
|||
return await request.delete({ url: `/bpm/process-expression/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 导出BPM 流程表达式 Excel
|
|||
exportProcessExpression: async (params) => { |
|||
return await request.download({ url: `/bpm/process-expression/export-excel`, params }) |
|||
} |
|||
} |
@ -0,0 +1,109 @@ |
|||
import request from '@/config/axios' |
|||
import { ProcessDefinitionVO } from '@/api/bpm/model' |
|||
import { NodeType, CandidateStrategy } from '@/components/SimpleProcessDesignerV2/src/consts' |
|||
export type Task = { |
|||
id: string |
|||
name: string |
|||
} |
|||
|
|||
export type ProcessInstanceVO = { |
|||
id: number |
|||
name: string |
|||
processDefinitionId: string |
|||
category: string |
|||
result: number |
|||
tasks: Task[] |
|||
fields: string[] |
|||
status: number |
|||
remark: string |
|||
businessKey: string |
|||
createTime: string |
|||
endTime: string |
|||
processDefinition?: ProcessDefinitionVO |
|||
} |
|||
|
|||
// 用户信息
|
|||
export type User = { |
|||
id: number |
|||
nickname: string |
|||
avatar: string |
|||
} |
|||
|
|||
// 审批任务信息
|
|||
export type ApprovalTaskInfo = { |
|||
id: number |
|||
ownerUser: User |
|||
assigneeUser: User |
|||
status: number |
|||
reason: string |
|||
signPicUrl: string |
|||
} |
|||
|
|||
// 审批节点信息
|
|||
export type ApprovalNodeInfo = { |
|||
id: number |
|||
name: string |
|||
nodeType: NodeType |
|||
candidateStrategy?: CandidateStrategy |
|||
status: number |
|||
startTime?: Date |
|||
endTime?: Date |
|||
candidateUsers?: User[] |
|||
tasks: ApprovalTaskInfo[] |
|||
} |
|||
|
|||
export const getProcessInstanceMyPage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/my-page', params }) |
|||
} |
|||
|
|||
export const getProcessInstanceManagerPage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/manager-page', params }) |
|||
} |
|||
|
|||
export const createProcessInstance = async (data) => { |
|||
return await request.post({ url: '/bpm/process-instance/create', data: data }) |
|||
} |
|||
|
|||
export const cancelProcessInstanceByStartUser = async (id: number, reason: string) => { |
|||
const data = { |
|||
id: id, |
|||
reason: reason |
|||
} |
|||
return await request.delete({ url: '/bpm/process-instance/cancel-by-start-user', data: data }) |
|||
} |
|||
|
|||
export const cancelProcessInstanceByAdmin = async (id: number, reason: string) => { |
|||
const data = { |
|||
id: id, |
|||
reason: reason |
|||
} |
|||
return await request.delete({ url: '/bpm/process-instance/cancel-by-admin', data: data }) |
|||
} |
|||
|
|||
export const getProcessInstance = async (id: string) => { |
|||
return await request.get({ url: '/bpm/process-instance/get?id=' + id }) |
|||
} |
|||
|
|||
export const getProcessInstanceCopyPage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/copy/page', params }) |
|||
} |
|||
|
|||
// 获取审批详情
|
|||
export const getApprovalDetail = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/get-approval-detail', params }) |
|||
} |
|||
|
|||
// 获取下一个执行的流程节点
|
|||
export const getNextApprovalNodes = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/get-next-approval-nodes', params }) |
|||
} |
|||
|
|||
// 获取表单字段权限
|
|||
export const getFormFieldsPermission = async (params: any) => { |
|||
return await request.get({ url: '/bpm/process-instance/get-form-fields-permission', params }) |
|||
} |
|||
|
|||
// 获取流程实例的 BPMN 模型视图
|
|||
export const getProcessInstanceBpmnModelView = async (id: string) => { |
|||
return await request.get({ url: '/bpm/process-instance/get-bpmn-model-view?id=' + id }) |
|||
} |
@ -0,0 +1,40 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// BPM 流程监听器 VO
|
|||
export interface ProcessListenerVO { |
|||
id: number // 编号
|
|||
name: string // 监听器名字
|
|||
type: string // 监听器类型
|
|||
status: number // 监听器状态
|
|||
event: string // 监听事件
|
|||
valueType: string // 监听器值类型
|
|||
value: string // 监听器值
|
|||
} |
|||
|
|||
// BPM 流程监听器 API
|
|||
export const ProcessListenerApi = { |
|||
// 查询流程监听器分页
|
|||
getProcessListenerPage: async (params: any) => { |
|||
return await request.get({ url: `/bpm/process-listener/page`, params }) |
|||
}, |
|||
|
|||
// 查询流程监听器详情
|
|||
getProcessListener: async (id: number) => { |
|||
return await request.get({ url: `/bpm/process-listener/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增流程监听器
|
|||
createProcessListener: async (data: ProcessListenerVO) => { |
|||
return await request.post({ url: `/bpm/process-listener/create`, data }) |
|||
}, |
|||
|
|||
// 修改流程监听器
|
|||
updateProcessListener: async (data: ProcessListenerVO) => { |
|||
return await request.put({ url: `/bpm/process-listener/update`, data }) |
|||
}, |
|||
|
|||
// 删除流程监听器
|
|||
deleteProcessListener: async (id: number) => { |
|||
return await request.delete({ url: `/bpm/process-listener/delete?id=` + id }) |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
|
|||
export const updateBpmSimpleModel = async (data) => { |
|||
return await request.post({ |
|||
url: '/bpm/model/simple/update', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
export const getBpmSimpleModel = async (id) => { |
|||
return await request.get({ |
|||
url: '/bpm/model/simple/get?id=' + id |
|||
}) |
|||
} |
@ -0,0 +1,113 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
/** |
|||
* 任务状态枚举 |
|||
*/ |
|||
export enum TaskStatusEnum { |
|||
/** |
|||
* 未开始 |
|||
*/ |
|||
NOT_START = -1, |
|||
|
|||
/** |
|||
* 待审批 |
|||
*/ |
|||
WAIT = 0, |
|||
/** |
|||
* 审批中 |
|||
*/ |
|||
RUNNING = 1, |
|||
/** |
|||
* 审批通过 |
|||
*/ |
|||
APPROVE = 2, |
|||
|
|||
/** |
|||
* 审批不通过 |
|||
*/ |
|||
REJECT = 3, |
|||
|
|||
/** |
|||
* 已取消 |
|||
*/ |
|||
CANCEL = 4, |
|||
/** |
|||
* 已退回 |
|||
*/ |
|||
RETURN = 5, |
|||
/** |
|||
* 审批通过中 |
|||
*/ |
|||
APPROVING = 7 |
|||
} |
|||
|
|||
export const getTaskTodoPage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/task/todo-page', params }) |
|||
} |
|||
|
|||
export const getTaskDonePage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/task/done-page', params }) |
|||
} |
|||
|
|||
export const getTaskManagerPage = async (params: any) => { |
|||
return await request.get({ url: '/bpm/task/manager-page', params }) |
|||
} |
|||
|
|||
export const approveTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/approve', data }) |
|||
} |
|||
|
|||
export const rejectTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/reject', data }) |
|||
} |
|||
|
|||
export const getTaskListByProcessInstanceId = async (processInstanceId: string) => { |
|||
return await request.get({ |
|||
url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId |
|||
}) |
|||
} |
|||
|
|||
// 获取所有可退回的节点
|
|||
export const getTaskListByReturn = async (id: string) => { |
|||
return await request.get({ url: '/bpm/task/list-by-return', params: { id } }) |
|||
} |
|||
|
|||
// 退回
|
|||
export const returnTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/return', data }) |
|||
} |
|||
|
|||
// 委派
|
|||
export const delegateTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/delegate', data }) |
|||
} |
|||
|
|||
// 转派
|
|||
export const transferTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/transfer', data }) |
|||
} |
|||
|
|||
// 加签
|
|||
export const signCreateTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/create-sign', data }) |
|||
} |
|||
|
|||
// 减签
|
|||
export const signDeleteTask = async (data: any) => { |
|||
return await request.delete({ url: '/bpm/task/delete-sign', data }) |
|||
} |
|||
|
|||
// 抄送
|
|||
export const copyTask = async (data: any) => { |
|||
return await request.put({ url: '/bpm/task/copy', data }) |
|||
} |
|||
|
|||
// 获取我的待办任务
|
|||
export const myTodoTask = async (processInstanceId: string) => { |
|||
return await request.get({ url: '/bpm/task/my-todo?processInstanceId=' + processInstanceId }) |
|||
} |
|||
|
|||
// 获取减签任务列表
|
|||
export const getChildrenTaskList = async (id: string) => { |
|||
return await request.get({ url: '/bpm/task/list-by-parent-task-id?parentTaskId=' + id }) |
|||
} |
@ -0,0 +1,47 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export type UserGroupVO = { |
|||
id: number |
|||
name: string |
|||
description: string |
|||
userIds: number[] |
|||
status: number |
|||
remark: string |
|||
createTime: string |
|||
} |
|||
|
|||
// 创建用户组
|
|||
export const createUserGroup = async (data: UserGroupVO) => { |
|||
return await request.post({ |
|||
url: '/bpm/user-group/create', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
// 更新用户组
|
|||
export const updateUserGroup = async (data: UserGroupVO) => { |
|||
return await request.put({ |
|||
url: '/bpm/user-group/update', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
// 删除用户组
|
|||
export const deleteUserGroup = async (id: number) => { |
|||
return await request.delete({ url: '/bpm/user-group/delete?id=' + id }) |
|||
} |
|||
|
|||
// 获得用户组
|
|||
export const getUserGroup = async (id: number) => { |
|||
return await request.get({ url: '/bpm/user-group/get?id=' + id }) |
|||
} |
|||
|
|||
// 获得用户组分页
|
|||
export const getUserGroupPage = async (params) => { |
|||
return await request.get({ url: '/bpm/user-group/page', params }) |
|||
} |
|||
|
|||
// 获取用户组精简信息列表
|
|||
export const getUserGroupSimpleList = async (): Promise<UserGroupVO[]> => { |
|||
return await request.get({ url: '/bpm/user-group/simple-list' }) |
|||
} |
@ -0,0 +1,34 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface ApiAccessLogVO { |
|||
id: number |
|||
traceId: string |
|||
userId: number |
|||
userType: number |
|||
applicationName: string |
|||
requestMethod: string |
|||
requestParams: string |
|||
responseBody: string |
|||
requestUrl: string |
|||
userIp: string |
|||
userAgent: string |
|||
operateModule: string |
|||
operateName: string |
|||
operateType: number |
|||
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 }) |
|||
} |
@ -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 |
|||
}) |
|||
} |
@ -0,0 +1,112 @@ |
|||
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 |
|||
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 CodegenPreviewVO = { |
|||
filePath: string |
|||
code: string |
|||
} |
|||
|
|||
export type CodegenUpdateReqVO = { |
|||
table: CodegenTableVO | any |
|||
columns: CodegenColumnVO[] |
|||
} |
|||
|
|||
// 查询列表代码生成表定义
|
|||
export const getCodegenTableList = (dataSourceConfigId: number) => { |
|||
return request.get({ url: '/infra/codegen/table/list?dataSourceConfigId=' + dataSourceConfigId }) |
|||
} |
|||
|
|||
// 查询列表代码生成表定义
|
|||
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 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 }) |
|||
} |
|||
|
|||
// 预览生成代码
|
|||
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 }) |
|||
} |
|||
|
|||
// 批量删除代码生成表定义
|
|||
export const deleteCodegenTableList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/codegen/delete-list', params: { tableIds: ids.join(',') } }) |
|||
} |
@ -0,0 +1,53 @@ |
|||
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 deleteConfigList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/config/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出参数
|
|||
export const exportConfig = (params) => { |
|||
return request.download({ url: '/infra/config/export-excel', params }) |
|||
} |
@ -0,0 +1,40 @@ |
|||
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 deleteDataSourceConfigList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/data-source-config/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 查询数据源配置详情
|
|||
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' }) |
|||
} |
@ -0,0 +1,50 @@ |
|||
import request from '@/config/axios' |
|||
import type { Dayjs } from 'dayjs' |
|||
|
|||
/** 示例联系人信息 */ |
|||
export interface Demo01Contact { |
|||
id: number // 编号
|
|||
name?: string // 名字
|
|||
sex?: number // 性别
|
|||
birthday?: string | Dayjs // 出生年
|
|||
description?: string // 简介
|
|||
avatar: string // 头像
|
|||
} |
|||
|
|||
// 示例联系人 API
|
|||
export const Demo01ContactApi = { |
|||
// 查询示例联系人分页
|
|||
getDemo01ContactPage: async (params: any) => { |
|||
return await request.get({ url: `/infra/demo01-contact/page`, params }) |
|||
}, |
|||
|
|||
// 查询示例联系人详情
|
|||
getDemo01Contact: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo01-contact/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增示例联系人
|
|||
createDemo01Contact: async (data: Demo01Contact) => { |
|||
return await request.post({ url: `/infra/demo01-contact/create`, data }) |
|||
}, |
|||
|
|||
// 修改示例联系人
|
|||
updateDemo01Contact: async (data: Demo01Contact) => { |
|||
return await request.put({ url: `/infra/demo01-contact/update`, data }) |
|||
}, |
|||
|
|||
// 删除示例联系人
|
|||
deleteDemo01Contact: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo01-contact/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除示例联系人 */ |
|||
deleteDemo01ContactList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo01-contact/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 导出示例联系人 Excel
|
|||
exportDemo01Contact: async (params) => { |
|||
return await request.download({ url: `/infra/demo01-contact/export-excel`, params }) |
|||
} |
|||
} |
@ -0,0 +1,37 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface Demo02CategoryVO { |
|||
id: number |
|||
name: string |
|||
parentId: number |
|||
} |
|||
|
|||
// 查询示例分类列表
|
|||
export const getDemo02CategoryList = async () => { |
|||
return await request.get({ url: `/infra/demo02-category/list` }) |
|||
} |
|||
|
|||
// 查询示例分类详情
|
|||
export const getDemo02Category = async (id: number) => { |
|||
return await request.get({ url: `/infra/demo02-category/get?id=` + id }) |
|||
} |
|||
|
|||
// 新增示例分类
|
|||
export const createDemo02Category = async (data: Demo02CategoryVO) => { |
|||
return await request.post({ url: `/infra/demo02-category/create`, data }) |
|||
} |
|||
|
|||
// 修改示例分类
|
|||
export const updateDemo02Category = async (data: Demo02CategoryVO) => { |
|||
return await request.put({ url: `/infra/demo02-category/update`, data }) |
|||
} |
|||
|
|||
// 删除示例分类
|
|||
export const deleteDemo02Category = async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo02-category/delete?id=` + id }) |
|||
} |
|||
|
|||
// 导出示例分类 Excel
|
|||
export const exportDemo02Category = async (params) => { |
|||
return await request.download({ url: `/infra/demo02-category/export-excel`, params }) |
|||
} |
@ -0,0 +1,127 @@ |
|||
import request from '@/config/axios' |
|||
import type { Dayjs } from 'dayjs'; |
|||
|
|||
/** 学生课程信息 */ |
|||
export interface Demo03Course { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
score?: number; // 分数
|
|||
} |
|||
|
|||
/** 学生班级信息 */ |
|||
export interface Demo03Grade { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
teacher?: string; // 班主任
|
|||
} |
|||
|
|||
/** 学生信息 */ |
|||
export interface Demo03Student { |
|||
id: number; // 编号
|
|||
name?: string; // 名字
|
|||
sex?: number; // 性别
|
|||
birthday?: string | Dayjs; // 出生日期
|
|||
description?: string; // 简介
|
|||
} |
|||
|
|||
// 学生 API
|
|||
export const Demo03StudentApi = { |
|||
// 查询学生分页
|
|||
getDemo03StudentPage: async (params: any) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/page`, params }) |
|||
}, |
|||
|
|||
// 查询学生详情
|
|||
getDemo03Student: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增学生
|
|||
createDemo03Student: async (data: Demo03Student) => { |
|||
return await request.post({ url: `/infra/demo03-student-erp/create`, data }) |
|||
}, |
|||
|
|||
// 修改学生
|
|||
updateDemo03Student: async (data: Demo03Student) => { |
|||
return await request.put({ url: `/infra/demo03-student-erp/update`, data }) |
|||
}, |
|||
|
|||
// 删除学生
|
|||
deleteDemo03Student: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除学生 */ |
|||
deleteDemo03StudentList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 导出学生 Excel
|
|||
exportDemo03Student: async (params) => { |
|||
return await request.download({ url: `/infra/demo03-student-erp/export-excel`, params }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生课程) ====================
|
|||
|
|||
// 获得学生课程分页
|
|||
getDemo03CoursePage: async (params) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/demo03-course/page`, params }) |
|||
}, |
|||
// 新增学生课程
|
|||
createDemo03Course: async (data: Demo03Course) => { |
|||
return await request.post({ url: `/infra/demo03-student-erp/demo03-course/create`, data }) |
|||
}, |
|||
|
|||
// 修改学生课程
|
|||
updateDemo03Course: async (data: Demo03Course) => { |
|||
return await request.put({ url: `/infra/demo03-student-erp/demo03-course/update`, data }) |
|||
}, |
|||
|
|||
// 删除学生课程
|
|||
deleteDemo03Course: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/demo03-course/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除学生课程 */ |
|||
deleteDemo03CourseList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/demo03-course/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 获得学生课程
|
|||
getDemo03Course: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/demo03-course/get?id=` + id }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生班级) ====================
|
|||
|
|||
// 获得学生班级分页
|
|||
getDemo03GradePage: async (params) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/demo03-grade/page`, params }) |
|||
}, |
|||
// 新增学生班级
|
|||
createDemo03Grade: async (data: Demo03Grade) => { |
|||
return await request.post({ url: `/infra/demo03-student-erp/demo03-grade/create`, data }) |
|||
}, |
|||
|
|||
// 修改学生班级
|
|||
updateDemo03Grade: async (data: Demo03Grade) => { |
|||
return await request.put({ url: `/infra/demo03-student-erp/demo03-grade/update`, data }) |
|||
}, |
|||
|
|||
// 删除学生班级
|
|||
deleteDemo03Grade: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/demo03-grade/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除学生班级 */ |
|||
deleteDemo03GradeList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo03-student-erp/demo03-grade/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 获得学生班级
|
|||
getDemo03Grade: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo03-student-erp/demo03-grade/get?id=` + id }) |
|||
}, |
|||
} |
@ -0,0 +1,81 @@ |
|||
import request from '@/config/axios' |
|||
import type { Dayjs } from 'dayjs'; |
|||
|
|||
/** 学生课程信息 */ |
|||
export interface Demo03Course { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
score?: number; // 分数
|
|||
} |
|||
|
|||
/** 学生班级信息 */ |
|||
export interface Demo03Grade { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
teacher?: string; // 班主任
|
|||
} |
|||
|
|||
/** 学生信息 */ |
|||
export interface Demo03Student { |
|||
id: number; // 编号
|
|||
name?: string; // 名字
|
|||
sex?: number; // 性别
|
|||
birthday?: string | Dayjs; // 出生日期
|
|||
description?: string; // 简介
|
|||
demo03courses?: Demo03Course[] |
|||
demo03grade?: Demo03Grade |
|||
} |
|||
|
|||
// 学生 API
|
|||
export const Demo03StudentApi = { |
|||
// 查询学生分页
|
|||
getDemo03StudentPage: async (params: any) => { |
|||
return await request.get({ url: `/infra/demo03-student-inner/page`, params }) |
|||
}, |
|||
|
|||
// 查询学生详情
|
|||
getDemo03Student: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo03-student-inner/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增学生
|
|||
createDemo03Student: async (data: Demo03Student) => { |
|||
return await request.post({ url: `/infra/demo03-student-inner/create`, data }) |
|||
}, |
|||
|
|||
// 修改学生
|
|||
updateDemo03Student: async (data: Demo03Student) => { |
|||
return await request.put({ url: `/infra/demo03-student-inner/update`, data }) |
|||
}, |
|||
|
|||
// 删除学生
|
|||
deleteDemo03Student: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo03-student-inner/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除学生 */ |
|||
deleteDemo03StudentList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo03-student-inner/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 导出学生 Excel
|
|||
exportDemo03Student: async (params) => { |
|||
return await request.download({ url: `/infra/demo03-student-inner/export-excel`, params }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生课程) ====================
|
|||
|
|||
// 获得学生课程列表
|
|||
getDemo03CourseListByStudentId: async (studentId) => { |
|||
return await request.get({ url: `/infra/demo03-student-inner/demo03-course/list-by-student-id?studentId=` + studentId }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生班级) ====================
|
|||
|
|||
// 获得学生班级
|
|||
getDemo03GradeByStudentId: async (studentId) => { |
|||
return await request.get({ url: `/infra/demo03-student-inner/demo03-grade/get-by-student-id?studentId=` + studentId }) |
|||
}, |
|||
} |
@ -0,0 +1,81 @@ |
|||
import request from '@/config/axios' |
|||
import type { Dayjs } from 'dayjs'; |
|||
|
|||
/** 学生课程信息 */ |
|||
export interface Demo03Course { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
score?: number; // 分数
|
|||
} |
|||
|
|||
/** 学生班级信息 */ |
|||
export interface Demo03Grade { |
|||
id: number; // 编号
|
|||
studentId?: number; // 学生编号
|
|||
name?: string; // 名字
|
|||
teacher?: string; // 班主任
|
|||
} |
|||
|
|||
/** 学生信息 */ |
|||
export interface Demo03Student { |
|||
id: number; // 编号
|
|||
name?: string; // 名字
|
|||
sex?: number; // 性别
|
|||
birthday?: string | Dayjs; // 出生日期
|
|||
description?: string; // 简介
|
|||
demo03courses?: Demo03Course[] |
|||
demo03grade?: Demo03Grade |
|||
} |
|||
|
|||
// 学生 API
|
|||
export const Demo03StudentApi = { |
|||
// 查询学生分页
|
|||
getDemo03StudentPage: async (params: any) => { |
|||
return await request.get({ url: `/infra/demo03-student-normal/page`, params }) |
|||
}, |
|||
|
|||
// 查询学生详情
|
|||
getDemo03Student: async (id: number) => { |
|||
return await request.get({ url: `/infra/demo03-student-normal/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增学生
|
|||
createDemo03Student: async (data: Demo03Student) => { |
|||
return await request.post({ url: `/infra/demo03-student-normal/create`, data }) |
|||
}, |
|||
|
|||
// 修改学生
|
|||
updateDemo03Student: async (data: Demo03Student) => { |
|||
return await request.put({ url: `/infra/demo03-student-normal/update`, data }) |
|||
}, |
|||
|
|||
// 删除学生
|
|||
deleteDemo03Student: async (id: number) => { |
|||
return await request.delete({ url: `/infra/demo03-student-normal/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 批量删除学生 */ |
|||
deleteDemo03StudentList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/infra/demo03-student-normal/delete-list?ids=${ids.join(',')}` }) |
|||
}, |
|||
|
|||
// 导出学生 Excel
|
|||
exportDemo03Student: async (params) => { |
|||
return await request.download({ url: `/infra/demo03-student-normal/export-excel`, params }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生课程) ====================
|
|||
|
|||
// 获得学生课程列表
|
|||
getDemo03CourseListByStudentId: async (studentId) => { |
|||
return await request.get({ url: `/infra/demo03-student-normal/demo03-course/list-by-student-id?studentId=` + studentId }) |
|||
}, |
|||
|
|||
// ==================== 子表(学生班级) ====================
|
|||
|
|||
// 获得学生班级
|
|||
getDemo03GradeByStudentId: async (studentId) => { |
|||
return await request.get({ url: `/infra/demo03-student-normal/demo03-grade/get-by-student-id?studentId=` + studentId }) |
|||
}, |
|||
} |
@ -0,0 +1,46 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// 文件预签名地址 Response VO
|
|||
export interface FilePresignedUrlRespVO { |
|||
// 文件配置编号
|
|||
configId: number |
|||
// 文件上传 URL
|
|||
uploadUrl: string |
|||
// 文件 URL
|
|||
url: string |
|||
// 文件路径
|
|||
path: string |
|||
} |
|||
|
|||
// 查询文件列表
|
|||
export const getFilePage = (params: PageParam) => { |
|||
return request.get({ url: '/infra/file/page', params }) |
|||
} |
|||
|
|||
// 删除文件
|
|||
export const deleteFile = (id: number) => { |
|||
return request.delete({ url: '/infra/file/delete?id=' + id }) |
|||
} |
|||
|
|||
// 批量删除文件
|
|||
export const deleteFileList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/file/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 获取文件预签名地址
|
|||
export const getFilePresignedUrl = (name: string, directory?: string) => { |
|||
return request.get<FilePresignedUrlRespVO>({ |
|||
url: '/infra/file/presigned-url', |
|||
params: { name, directory } |
|||
}) |
|||
} |
|||
|
|||
// 创建文件
|
|||
export const createFile = (data: any) => { |
|||
return request.post({ url: '/infra/file/create', data }) |
|||
} |
|||
|
|||
// 上传文件
|
|||
export const updateFile = (data: any) => { |
|||
return request.upload({ url: '/infra/file/upload', data }) |
|||
} |
@ -0,0 +1,67 @@ |
|||
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 |
|||
enablePathStyleAccess?: boolean |
|||
domain: string |
|||
} |
|||
|
|||
export interface FileConfigVO { |
|||
id: number |
|||
name: string |
|||
storage?: number |
|||
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 deleteFileConfigList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/file-config/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 测试文件配置
|
|||
export const testFileConfig = (id: number) => { |
|||
return request.get({ url: '/infra/file-config/test?id=' + id }) |
|||
} |
@ -0,0 +1,68 @@ |
|||
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 deleteJobList = (ids: number[]) => { |
|||
return request.delete({ url: '/infra/job/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出定时任务调度
|
|||
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 }) |
|||
} |
@ -0,0 +1,34 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface JobLogVO { |
|||
id: number |
|||
jobId: number |
|||
handlerName: string |
|||
handlerParam: string |
|||
cronExpression: string |
|||
executeIndex: string |
|||
beginTime: Date |
|||
endTime: Date |
|||
duration: string |
|||
status: number |
|||
createTime: string |
|||
result: 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 |
|||
}) |
|||
} |
@ -0,0 +1,8 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
/** |
|||
* 获取redis 监控信息 |
|||
*/ |
|||
export const getCache = () => { |
|||
return request.get({ url: '/infra/redis/get-monitor-info' }) |
|||
} |
@ -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 |
|||
} |
@ -0,0 +1,169 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 设备 VO
|
|||
export interface DeviceVO { |
|||
id: number // 设备 ID,主键,自增
|
|||
deviceKey: string // 设备唯一标识符
|
|||
deviceName: string // 设备名称
|
|||
productId: number // 产品编号
|
|||
productKey: string // 产品标识
|
|||
deviceType: number // 设备类型
|
|||
nickname: string // 设备备注名称
|
|||
gatewayId: number // 网关设备 ID
|
|||
state: number // 设备状态
|
|||
onlineTime: Date // 最后上线时间
|
|||
offlineTime: Date // 最后离线时间
|
|||
activeTime: Date // 设备激活时间
|
|||
createTime: Date // 创建时间
|
|||
ip: string // 设备的 IP 地址
|
|||
firmwareVersion: string // 设备的固件版本
|
|||
deviceSecret: string // 设备密钥,用于设备认证,需安全存储
|
|||
mqttClientId: string // MQTT 客户端 ID
|
|||
mqttUsername: string // MQTT 用户名
|
|||
mqttPassword: string // MQTT 密码
|
|||
authType: string // 认证类型
|
|||
latitude: number // 设备位置的纬度
|
|||
longitude: number // 设备位置的经度
|
|||
areaId: number // 地区编码
|
|||
address: string // 设备详细地址
|
|||
serialNumber: string // 设备序列号
|
|||
config: string // 设备配置
|
|||
groupIds?: number[] // 添加分组 ID
|
|||
} |
|||
|
|||
// IoT 设备数据 VO
|
|||
export interface DeviceDataVO { |
|||
deviceId: number // 设备编号
|
|||
thinkModelFunctionId: number // 物模型编号
|
|||
productKey: string // 产品标识
|
|||
deviceName: string // 设备名称
|
|||
identifier: string // 属性标识符
|
|||
name: string // 属性名称
|
|||
dataType: string // 数据类型
|
|||
updateTime: Date // 更新时间
|
|||
value: string // 最新值
|
|||
} |
|||
|
|||
// IoT 设备数据 VO
|
|||
export interface DeviceHistoryDataVO { |
|||
time: number // 时间
|
|||
data: string // 数据
|
|||
} |
|||
|
|||
// IoT 设备状态枚举
|
|||
export enum DeviceStateEnum { |
|||
INACTIVE = 0, // 未激活
|
|||
ONLINE = 1, // 在线
|
|||
OFFLINE = 2 // 离线
|
|||
} |
|||
|
|||
// IoT 设备上行 Request VO
|
|||
export interface IotDeviceUpstreamReqVO { |
|||
id: number // 设备编号
|
|||
type: string // 消息类型
|
|||
identifier: string // 标识符
|
|||
data: any // 请求参数
|
|||
} |
|||
|
|||
// IoT 设备下行 Request VO
|
|||
export interface IotDeviceDownstreamReqVO { |
|||
id: number // 设备编号
|
|||
type: string // 消息类型
|
|||
identifier: string // 标识符
|
|||
data: any // 请求参数
|
|||
} |
|||
|
|||
// MQTT 连接参数 VO
|
|||
export interface MqttConnectionParamsVO { |
|||
mqttClientId: string // MQTT 客户端 ID
|
|||
mqttUsername: string // MQTT 用户名
|
|||
mqttPassword: string // MQTT 密码
|
|||
} |
|||
|
|||
// 设备 API
|
|||
export const DeviceApi = { |
|||
// 查询设备分页
|
|||
getDevicePage: async (params: any) => { |
|||
return await request.get({ url: `/iot/device/page`, params }) |
|||
}, |
|||
|
|||
// 查询设备详情
|
|||
getDevice: async (id: number) => { |
|||
return await request.get({ url: `/iot/device/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增设备
|
|||
createDevice: async (data: DeviceVO) => { |
|||
return await request.post({ url: `/iot/device/create`, data }) |
|||
}, |
|||
|
|||
// 修改设备
|
|||
updateDevice: async (data: DeviceVO) => { |
|||
return await request.put({ url: `/iot/device/update`, data }) |
|||
}, |
|||
|
|||
// 修改设备分组
|
|||
updateDeviceGroup: async (data: { ids: number[]; groupIds: number[] }) => { |
|||
return await request.put({ url: `/iot/device/update-group`, data }) |
|||
}, |
|||
|
|||
// 删除单个设备
|
|||
deleteDevice: async (id: number) => { |
|||
return await request.delete({ url: `/iot/device/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 删除多个设备
|
|||
deleteDeviceList: async (ids: number[]) => { |
|||
return await request.delete({ url: `/iot/device/delete-list`, params: { ids: ids.join(',') } }) |
|||
}, |
|||
|
|||
// 导出设备
|
|||
exportDeviceExcel: async (params: any) => { |
|||
return await request.download({ url: `/iot/device/export-excel`, params }) |
|||
}, |
|||
|
|||
// 获取设备数量
|
|||
getDeviceCount: async (productId: number) => { |
|||
return await request.get({ url: `/iot/device/count?productId=` + productId }) |
|||
}, |
|||
|
|||
// 获取设备的精简信息列表
|
|||
getSimpleDeviceList: async (deviceType?: number) => { |
|||
return await request.get({ url: `/iot/device/simple-list?`, params: { deviceType } }) |
|||
}, |
|||
|
|||
// 获取导入模板
|
|||
importDeviceTemplate: async () => { |
|||
return await request.download({ url: `/iot/device/get-import-template` }) |
|||
}, |
|||
|
|||
// 设备上行
|
|||
upstreamDevice: async (data: IotDeviceUpstreamReqVO) => { |
|||
return await request.post({ url: `/iot/device/upstream`, data }) |
|||
}, |
|||
|
|||
// 设备下行
|
|||
downstreamDevice: async (data: IotDeviceDownstreamReqVO) => { |
|||
return await request.post({ url: `/iot/device/downstream`, data }) |
|||
}, |
|||
|
|||
// 获取设备属性最新数据
|
|||
getLatestDeviceProperties: async (params: any) => { |
|||
return await request.get({ url: `/iot/device/property/latest`, params }) |
|||
}, |
|||
|
|||
// 获取设备属性历史数据
|
|||
getHistoryDevicePropertyPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/device/property/history-page`, params }) |
|||
}, |
|||
|
|||
// 查询设备日志分页
|
|||
getDeviceLogPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/device/log/page`, params }) |
|||
}, |
|||
|
|||
// 获取设备MQTT连接参数
|
|||
getMqttConnectionParams: async (deviceId: number) => { |
|||
return await request.get({ url: `/iot/device/mqtt-connection-params`, params: { deviceId } }) |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 设备分组 VO
|
|||
export interface DeviceGroupVO { |
|||
id: number // 分组 ID
|
|||
name: string // 分组名字
|
|||
status: number // 分组状态
|
|||
description: string // 分组描述
|
|||
deviceCount?: number // 设备数量
|
|||
} |
|||
|
|||
// IoT 设备分组 API
|
|||
export const DeviceGroupApi = { |
|||
// 查询设备分组分页
|
|||
getDeviceGroupPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/device-group/page`, params }) |
|||
}, |
|||
|
|||
// 查询设备分组详情
|
|||
getDeviceGroup: async (id: number) => { |
|||
return await request.get({ url: `/iot/device-group/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增设备分组
|
|||
createDeviceGroup: async (data: DeviceGroupVO) => { |
|||
return await request.post({ url: `/iot/device-group/create`, data }) |
|||
}, |
|||
|
|||
// 修改设备分组
|
|||
updateDeviceGroup: async (data: DeviceGroupVO) => { |
|||
return await request.put({ url: `/iot/device-group/update`, data }) |
|||
}, |
|||
|
|||
// 删除设备分组
|
|||
deleteDeviceGroup: async (id: number) => { |
|||
return await request.delete({ url: `/iot/device-group/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 获取设备分组的精简信息列表
|
|||
getSimpleDeviceGroupList: async () => { |
|||
return await request.get({ url: `/iot/device-group/simple-list` }) |
|||
} |
|||
} |
@ -0,0 +1,51 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 插件配置 VO
|
|||
export interface PluginConfigVO { |
|||
id: number // 主键ID
|
|||
pluginKey: string // 插件标识
|
|||
name: string // 插件名称
|
|||
description: string // 描述
|
|||
deployType: number // 部署方式
|
|||
fileName: string // 插件包文件名
|
|||
version: string // 插件版本
|
|||
type: number // 插件类型
|
|||
protocol: string // 设备插件协议类型
|
|||
status: number // 状态
|
|||
configSchema: string // 插件配置项描述信息
|
|||
config: string // 插件配置信息
|
|||
script: string // 插件脚本
|
|||
} |
|||
|
|||
// IoT 插件配置 API
|
|||
export const PluginConfigApi = { |
|||
// 查询插件配置分页
|
|||
getPluginConfigPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/plugin-config/page`, params }) |
|||
}, |
|||
|
|||
// 查询插件配置详情
|
|||
getPluginConfig: async (id: number) => { |
|||
return await request.get({ url: `/iot/plugin-config/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增插件配置
|
|||
createPluginConfig: async (data: PluginConfigVO) => { |
|||
return await request.post({ url: `/iot/plugin-config/create`, data }) |
|||
}, |
|||
|
|||
// 修改插件配置
|
|||
updatePluginConfig: async (data: PluginConfigVO) => { |
|||
return await request.put({ url: `/iot/plugin-config/update`, data }) |
|||
}, |
|||
|
|||
// 删除插件配置
|
|||
deletePluginConfig: async (id: number) => { |
|||
return await request.delete({ url: `/iot/plugin-config/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 修改插件状态
|
|||
updatePluginStatus: async (data: any) => { |
|||
return await request.put({ url: `/iot/plugin-config/update-status`, data }) |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 产品分类 VO
|
|||
export interface ProductCategoryVO { |
|||
id: number // 分类 ID
|
|||
name: string // 分类名字
|
|||
sort: number // 分类排序
|
|||
status: number // 分类状态
|
|||
description: string // 分类描述
|
|||
} |
|||
|
|||
// IoT 产品分类 API
|
|||
export const ProductCategoryApi = { |
|||
// 查询产品分类分页
|
|||
getProductCategoryPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/product-category/page`, params }) |
|||
}, |
|||
|
|||
// 查询产品分类详情
|
|||
getProductCategory: async (id: number) => { |
|||
return await request.get({ url: `/iot/product-category/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增产品分类
|
|||
createProductCategory: async (data: ProductCategoryVO) => { |
|||
return await request.post({ url: `/iot/product-category/create`, data }) |
|||
}, |
|||
|
|||
// 修改产品分类
|
|||
updateProductCategory: async (data: ProductCategoryVO) => { |
|||
return await request.put({ url: `/iot/product-category/update`, data }) |
|||
}, |
|||
|
|||
// 删除产品分类
|
|||
deleteProductCategory: async (id: number) => { |
|||
return await request.delete({ url: `/iot/product-category/delete?id=` + id }) |
|||
}, |
|||
|
|||
/** 获取产品分类精简列表 */ |
|||
getSimpleProductCategoryList: () => { |
|||
return request.get({ url: '/iot/product-category/simple-list' }) |
|||
} |
|||
} |
@ -0,0 +1,82 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 产品 VO
|
|||
export interface ProductVO { |
|||
id: number // 产品编号
|
|||
name: string // 产品名称
|
|||
productKey: string // 产品标识
|
|||
protocolId: number // 协议编号
|
|||
categoryId: number // 产品所属品类标识符
|
|||
categoryName?: string // 产品所属品类名称
|
|||
icon: string // 产品图标
|
|||
picUrl: string // 产品图片
|
|||
description: string // 产品描述
|
|||
validateType: number // 数据校验级别
|
|||
status: number // 产品状态
|
|||
deviceType: number // 设备类型
|
|||
netType: number // 联网方式
|
|||
protocolType: number // 接入网关协议
|
|||
dataFormat: number // 数据格式
|
|||
deviceCount: number // 设备数量
|
|||
createTime: Date // 创建时间
|
|||
} |
|||
|
|||
// IOT 数据校验级别枚举类
|
|||
export enum ValidateTypeEnum { |
|||
WEAK = 0, // 弱校验
|
|||
NONE = 1 // 免校验
|
|||
} |
|||
// IOT 产品设备类型枚举类 0: 直连设备, 1: 网关子设备, 2: 网关设备
|
|||
export enum DeviceTypeEnum { |
|||
DEVICE = 0, // 直连设备
|
|||
GATEWAY_SUB = 1, // 网关子设备
|
|||
GATEWAY = 2 // 网关设备
|
|||
} |
|||
// IOT 数据格式枚举类
|
|||
export enum DataFormatEnum { |
|||
JSON = 0, // 标准数据格式(JSON)
|
|||
CUSTOMIZE = 1 // 透传/自定义
|
|||
} |
|||
|
|||
// IoT 产品 API
|
|||
export const ProductApi = { |
|||
// 查询产品分页
|
|||
getProductPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/product/page`, params }) |
|||
}, |
|||
|
|||
// 查询产品详情
|
|||
getProduct: async (id: number) => { |
|||
return await request.get({ url: `/iot/product/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增产品
|
|||
createProduct: async (data: ProductVO) => { |
|||
return await request.post({ url: `/iot/product/create`, data }) |
|||
}, |
|||
|
|||
// 修改产品
|
|||
updateProduct: async (data: ProductVO) => { |
|||
return await request.put({ url: `/iot/product/update`, data }) |
|||
}, |
|||
|
|||
// 删除产品
|
|||
deleteProduct: async (id: number) => { |
|||
return await request.delete({ url: `/iot/product/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 导出产品 Excel
|
|||
exportProduct: async (params) => { |
|||
return await request.download({ url: `/iot/product/export-excel`, params }) |
|||
}, |
|||
|
|||
// 更新产品状态
|
|||
updateProductStatus: async (id: number, status: number) => { |
|||
return await request.put({ url: `/iot/product/update-status?id=` + id + `&status=` + status }) |
|||
}, |
|||
|
|||
// 查询产品(精简)列表
|
|||
getSimpleProductList() { |
|||
return request.get({ url: '/iot/product/simple-list' }) |
|||
} |
|||
} |
@ -0,0 +1,127 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// IoT 数据桥梁 VO
|
|||
export interface DataBridgeVO { |
|||
id?: number // 桥梁编号
|
|||
name?: string // 桥梁名称
|
|||
description?: string // 桥梁描述
|
|||
status?: number // 桥梁状态
|
|||
direction?: number // 桥梁方向
|
|||
type?: number // 桥梁类型
|
|||
config?: |
|||
| HttpConfig |
|||
| MqttConfig |
|||
| RocketMQConfig |
|||
| KafkaMQConfig |
|||
| RabbitMQConfig |
|||
| RedisStreamMQConfig // 桥梁配置
|
|||
} |
|||
|
|||
interface Config { |
|||
type: string |
|||
} |
|||
|
|||
/** HTTP 配置 */ |
|||
export interface HttpConfig extends Config { |
|||
url: string |
|||
method: string |
|||
headers: Record<string, string> |
|||
query: Record<string, string> |
|||
body: string |
|||
} |
|||
|
|||
/** MQTT 配置 */ |
|||
export interface MqttConfig extends Config { |
|||
url: string |
|||
username: string |
|||
password: string |
|||
clientId: string |
|||
topic: string |
|||
} |
|||
|
|||
/** RocketMQ 配置 */ |
|||
export interface RocketMQConfig extends Config { |
|||
nameServer: string |
|||
accessKey: string |
|||
secretKey: string |
|||
group: string |
|||
topic: string |
|||
tags: string |
|||
} |
|||
|
|||
/** Kafka 配置 */ |
|||
export interface KafkaMQConfig extends Config { |
|||
bootstrapServers: string |
|||
username: string |
|||
password: string |
|||
ssl: boolean |
|||
topic: string |
|||
} |
|||
|
|||
/** RabbitMQ 配置 */ |
|||
export interface RabbitMQConfig extends Config { |
|||
host: string |
|||
port: number |
|||
virtualHost: string |
|||
username: string |
|||
password: string |
|||
exchange: string |
|||
routingKey: string |
|||
queue: string |
|||
} |
|||
|
|||
/** Redis Stream MQ 配置 */ |
|||
export interface RedisStreamMQConfig extends Config { |
|||
host: string |
|||
port: number |
|||
password: string |
|||
database: number |
|||
topic: string |
|||
} |
|||
|
|||
/** 数据桥梁类型 */ |
|||
// TODO @puhui999:枚举用 number 可以么?
|
|||
export const IoTDataBridgeConfigType = { |
|||
HTTP: '1', |
|||
TCP: '2', |
|||
WEBSOCKET: '3', |
|||
MQTT: '10', |
|||
DATABASE: '20', |
|||
REDIS_STREAM: '21', |
|||
ROCKETMQ: '30', |
|||
RABBITMQ: '31', |
|||
KAFKA: '32' |
|||
} as const |
|||
|
|||
// 数据桥梁 API
|
|||
export const DataBridgeApi = { |
|||
// 查询数据桥梁分页
|
|||
getDataBridgePage: async (params: any) => { |
|||
return await request.get({ url: `/iot/data-bridge/page`, params }) |
|||
}, |
|||
|
|||
// 查询数据桥梁详情
|
|||
getDataBridge: async (id: number) => { |
|||
return await request.get({ url: `/iot/data-bridge/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增数据桥梁
|
|||
createDataBridge: async (data: DataBridgeVO) => { |
|||
return await request.post({ url: `/iot/data-bridge/create`, data }) |
|||
}, |
|||
|
|||
// 修改数据桥梁
|
|||
updateDataBridge: async (data: DataBridgeVO) => { |
|||
return await request.put({ url: `/iot/data-bridge/update`, data }) |
|||
}, |
|||
|
|||
// 删除数据桥梁
|
|||
deleteDataBridge: async (id: number) => { |
|||
return await request.delete({ url: `/iot/data-bridge/delete?id=` + id }) |
|||
}, |
|||
|
|||
// 导出数据桥梁 Excel
|
|||
exportDataBridge: async (params) => { |
|||
return await request.download({ url: `/iot/data-bridge/export-excel`, params }) |
|||
} |
|||
} |
@ -0,0 +1,41 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
/** IoT 统计数据类型 */ |
|||
export interface IotStatisticsSummaryRespVO { |
|||
productCategoryCount: number |
|||
productCount: number |
|||
deviceCount: number |
|||
deviceMessageCount: number |
|||
productCategoryTodayCount: number |
|||
productTodayCount: number |
|||
deviceTodayCount: number |
|||
deviceMessageTodayCount: number |
|||
deviceOnlineCount: number |
|||
deviceOfflineCount: number |
|||
deviceInactiveCount: number |
|||
productCategoryDeviceCounts: Record<string, number> |
|||
} |
|||
|
|||
/** IoT 消息统计数据类型 */ |
|||
export interface IotStatisticsDeviceMessageSummaryRespVO { |
|||
upstreamCounts: Record<number, number> |
|||
downstreamCounts: Record<number, number> |
|||
} |
|||
|
|||
// IoT 数据统计 API
|
|||
export const ProductCategoryApi = { |
|||
// 查询基础的数据统计
|
|||
getIotStatisticsSummary: async () => { |
|||
return await request.get<IotStatisticsSummaryRespVO>({ |
|||
url: `/iot/statistics/get-summary` |
|||
}) |
|||
}, |
|||
|
|||
// 查询设备上下行消息的数据统计
|
|||
getIotStatisticsDeviceMessageSummary: async (params: { startTime: number; endTime: number }) => { |
|||
return await request.get<IotStatisticsDeviceMessageSummaryRespVO>({ |
|||
url: `/iot/statistics/get-log-summary`, |
|||
params |
|||
}) |
|||
} |
|||
} |
@ -0,0 +1,88 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
/** |
|||
* IoT 产品物模型 |
|||
*/ |
|||
export interface ThingModelData { |
|||
id?: number // 物模型功能编号
|
|||
identifier?: string // 功能标识
|
|||
name?: string // 功能名称
|
|||
description?: string // 功能描述
|
|||
productId?: number // 产品编号
|
|||
productKey?: string // 产品标识
|
|||
dataType: string // 数据类型,与 dataSpecs 的 dataType 保持一致
|
|||
type: number // 功能类型
|
|||
property: ThingModelProperty // 属性
|
|||
event?: ThingModelEvent // 事件
|
|||
service?: ThingModelService // 服务
|
|||
} |
|||
|
|||
/** |
|||
* IoT 模拟设备 |
|||
*/ |
|||
// TODO @super:和 ThingModelSimulatorData 会不会好点
|
|||
export interface SimulatorData extends ThingModelData { |
|||
simulateValue?: string | number // 用于存储模拟值 TODO @super:字段使用 value 会不会好点
|
|||
} |
|||
|
|||
/** |
|||
* ThingModelProperty 类型 |
|||
*/ |
|||
export interface ThingModelProperty { |
|||
[key: string]: any |
|||
} |
|||
|
|||
/** |
|||
* ThingModelEvent 类型 |
|||
*/ |
|||
export interface ThingModelEvent { |
|||
[key: string]: any |
|||
} |
|||
|
|||
/** |
|||
* ThingModelService 类型 |
|||
*/ |
|||
export interface ThingModelService { |
|||
[key: string]: any |
|||
} |
|||
|
|||
// IoT 产品物模型 API
|
|||
export const ThingModelApi = { |
|||
// 查询产品物模型分页
|
|||
getThingModelPage: async (params: any) => { |
|||
return await request.get({ url: `/iot/thing-model/page`, params }) |
|||
}, |
|||
|
|||
// 获得产品物模型列表
|
|||
getThingModelList: async (params: any) => { |
|||
return await request.get({ url: `/iot/thing-model/list`, params }) |
|||
}, |
|||
|
|||
// 获得产品物模型
|
|||
getThingModelListByProductId: async (params: any) => { |
|||
return await request.get({ |
|||
url: `/iot/thing-model/list-by-product-id`, |
|||
params |
|||
}) |
|||
}, |
|||
|
|||
// 查询产品物模型详情
|
|||
getThingModel: async (id: number) => { |
|||
return await request.get({ url: `/iot/thing-model/get?id=` + id }) |
|||
}, |
|||
|
|||
// 新增产品物模型
|
|||
createThingModel: async (data: ThingModelData) => { |
|||
return await request.post({ url: `/iot/thing-model/create`, data }) |
|||
}, |
|||
|
|||
// 修改产品物模型
|
|||
updateThingModel: async (data: ThingModelData) => { |
|||
return await request.put({ url: `/iot/thing-model/update`, data }) |
|||
}, |
|||
|
|||
// 删除产品物模型
|
|||
deleteThingModel: async (id: number) => { |
|||
return await request.delete({ url: `/iot/thing-model/delete?id=` + id }) |
|||
} |
|||
} |
@ -0,0 +1,66 @@ |
|||
import request from '@/config/axios' |
|||
import type { RegisterVO, 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 register = (data: RegisterVO) => { |
|||
return request.post({ url: '/system/auth/register', data }) |
|||
} |
|||
|
|||
// 使用租户名,获得租户编号
|
|||
export const getTenantIdByName = (name: string) => { |
|||
return request.get({ url: '/system/tenant/get-id-by-name?name=' + name }) |
|||
} |
|||
|
|||
// 使用租户域名,获得租户信息
|
|||
export const getTenantByWebsite = (website: string) => { |
|||
return request.get({ url: '/system/tenant/get-by-website?website=' + website }) |
|||
} |
|||
|
|||
// 登出
|
|||
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 }) |
|||
} |
|||
// 获取验证图片以及 token
|
|||
export const getCode = (data: any) => { |
|||
return request.postOriginal({ url: 'system/captcha/get', data }) |
|||
} |
|||
|
|||
// 滑动或者点选验证
|
|||
export const reqCheck = (data: any) => { |
|||
return request.postOriginal({ url: 'system/captcha/check', data }) |
|||
} |
|||
|
|||
// 通过短信重置密码
|
|||
export const smsResetPassword = (data: any) => { |
|||
return request.post({ url: '/system/auth/reset-password', data }) |
|||
} |
@ -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) |
|||
} |
|||
}) |
|||
} |
@ -0,0 +1,35 @@ |
|||
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 |
|||
} |
|||
|
|||
export type RegisterVO = { |
|||
tenantName: string |
|||
username: string |
|||
password: string |
|||
captchaVerification: string |
|||
} |
@ -0,0 +1,11 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
// 获得地区树
|
|||
export const getAreaTree = async () => { |
|||
return await request.get({ url: '/system/area/tree' }) |
|||
} |
|||
|
|||
// 获得 IP 对应的地区名
|
|||
export const getAreaByIp = async (ip: string) => { |
|||
return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) |
|||
} |
@ -0,0 +1,53 @@ |
|||
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 = (): Promise<DeptVO[]> => { |
|||
return request.get({ url: '/system/dept/simple-list' }) |
|||
} |
|||
|
|||
// 查询部门列表
|
|||
export const getDeptList = (params: any) => { |
|||
return request.get({ url: '/system/dept/list', params }) |
|||
} |
|||
|
|||
// 查询部门分页
|
|||
export const getDeptPage = async (params: PageParam) => { |
|||
return await request.get({ url: '/system/dept/list', params }) |
|||
} |
|||
|
|||
// 查询部门详情
|
|||
export const getDept = (id: number) => { |
|||
return request.get({ url: '/system/dept/get?id=' + id }) |
|||
} |
|||
|
|||
// 新增部门
|
|||
export const createDept = (data: DeptVO) => { |
|||
return request.post({ url: '/system/dept/create', data }) |
|||
} |
|||
|
|||
// 修改部门
|
|||
export const updateDept = (data: DeptVO) => { |
|||
return request.put({ url: '/system/dept/update', data }) |
|||
} |
|||
|
|||
// 删除部门
|
|||
export const deleteDept = async (id: number) => { |
|||
return await request.delete({ url: '/system/dept/delete?id=' + id }) |
|||
} |
|||
|
|||
// 批量删除部门
|
|||
export const deleteDeptList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/dept/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
@ -0,0 +1,59 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface DictDataVO { |
|||
id: number |
|||
sort: number |
|||
label: string |
|||
value: string |
|||
dictType: string |
|||
status: number |
|||
colorType: string |
|||
cssClass: string |
|||
remark: string |
|||
createTime: Date |
|||
} |
|||
|
|||
// 查询字典数据(精简)列表
|
|||
export const getSimpleDictDataList = () => { |
|||
return request.get({ url: '/system/dict-data/simple-list' }) |
|||
} |
|||
|
|||
// 查询字典数据列表
|
|||
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 getDictDataByType = (dictType: string) => { |
|||
return request.get({ url: '/system/dict-data/type?type=' + dictType }) |
|||
} |
|||
|
|||
// 新增字典数据
|
|||
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 deleteDictDataList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/dict-data/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出字典数据
|
|||
export const exportDictData = (params: any) => { |
|||
return request.download({ url: '/system/dict-data/export-excel', params }) |
|||
} |
@ -0,0 +1,53 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface DictTypeVO { |
|||
id: number |
|||
name: string |
|||
type: string |
|||
status: number |
|||
remark: string |
|||
createTime: Date |
|||
} |
|||
|
|||
// 查询字典(精简)列表
|
|||
export const getSimpleDictTypeList = (): Promise<DictTypeVO[]> => { |
|||
return request.get({ url: '/system/dict-type/simple-list' }) |
|||
} |
|||
|
|||
// 查询字典列表
|
|||
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 deleteDictTypeList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/dict-type/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出字典
|
|||
export const exportDictType = (params) => { |
|||
return request.download({ |
|||
url: '/system/dict-type/export-excel', |
|||
params |
|||
}) |
|||
} |
@ -0,0 +1,25 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface LoginLogVO { |
|||
id: number |
|||
logType: number |
|||
traceId: number |
|||
userId: number |
|||
userType: number |
|||
username: string |
|||
result: number |
|||
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-excel', params }) |
|||
} |
@ -0,0 +1,47 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface MailAccountVO { |
|||
id: number |
|||
mail: string |
|||
username: string |
|||
password: string |
|||
host: string |
|||
port: number |
|||
sslEnable: boolean |
|||
starttlsEnable: 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 deleteMailAccountList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/mail-account/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 获得邮箱账号精简列表
|
|||
export const getSimpleMailAccountList = async () => { |
|||
return request.get({ url: '/system/mail-account/simple-list' }) |
|||
} |
@ -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 }) |
|||
} |
@ -0,0 +1,55 @@ |
|||
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<String, Object> |
|||
} |
|||
|
|||
// 查询邮件模版列表
|
|||
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 deleteMailTemplateList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/mail-template/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 发送邮件
|
|||
export const sendMail = (data: MailSendReqVO) => { |
|||
return request.post({ url: '/system/mail-template/send-mail', data }) |
|||
} |
@ -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/simple-list' }) |
|||
} |
|||
|
|||
// 查询菜单列表
|
|||
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 }) |
|||
} |
@ -0,0 +1,47 @@ |
|||
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 }) |
|||
} |
|||
|
|||
// 批量删除公告
|
|||
export const deleteNoticeList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/notice/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 推送公告
|
|||
export const pushNotice = (id: number) => { |
|||
return request.post({ url: '/system/notice/push?id=' + id }) |
|||
} |
@ -0,0 +1,49 @@ |
|||
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 |
|||
createTime: 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' }) |
|||
} |
@ -0,0 +1,54 @@ |
|||
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<String, Object> |
|||
} |
|||
|
|||
// 查询站内信模板列表
|
|||
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 deleteNotifyTemplateList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/notify-template/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 发送站内信
|
|||
export const sendNotify = (data: NotifySendReqVO) => { |
|||
return request.post({ url: '/system/notify-template/send-notify', data }) |
|||
} |
@ -0,0 +1,52 @@ |
|||
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 }) |
|||
} |
|||
|
|||
// 批量删除 OAuth2 客户端
|
|||
export const deleteOAuth2ClientList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/oauth2-client/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
@ -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 }) |
|||
} |
@ -0,0 +1,30 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export type OperateLogVO = { |
|||
id: number |
|||
traceId: string |
|||
userType: number |
|||
userId: number |
|||
userName: string |
|||
type: string |
|||
subType: string |
|||
bizId: number |
|||
action: string |
|||
extra: string |
|||
requestMethod: string |
|||
requestUrl: string |
|||
userIp: string |
|||
userAgent: string |
|||
creator: string |
|||
creatorName: string |
|||
createTime: Date |
|||
} |
|||
|
|||
// 查询操作日志列表
|
|||
export const getOperateLogPage = (params: PageParam) => { |
|||
return request.get({ url: '/system/operate-log/page', params }) |
|||
} |
|||
// 导出操作日志
|
|||
export const exportOperateLog = (params: any) => { |
|||
return request.download({ url: '/system/operate-log/export-excel', params }) |
|||
} |
@ -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 }) |
|||
} |
@ -0,0 +1,51 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface PostVO { |
|||
id?: number |
|||
name: string |
|||
code: string |
|||
sort: number |
|||
status: number |
|||
remark: string |
|||
createTime?: Date |
|||
} |
|||
|
|||
// 查询岗位列表
|
|||
export const getPostPage = async (params: PageParam) => { |
|||
return await request.get({ url: '/system/post/page', params }) |
|||
} |
|||
|
|||
// 获取岗位精简信息列表
|
|||
export const getSimplePostList = async (): Promise<PostVO[]> => { |
|||
return await request.get({ url: '/system/post/simple-list' }) |
|||
} |
|||
|
|||
// 查询岗位详情
|
|||
export const getPost = async (id: number) => { |
|||
return await request.get({ url: '/system/post/get?id=' + id }) |
|||
} |
|||
|
|||
// 新增岗位
|
|||
export const createPost = async (data: PostVO) => { |
|||
return await request.post({ url: '/system/post/create', data }) |
|||
} |
|||
|
|||
// 修改岗位
|
|||
export const updatePost = async (data: PostVO) => { |
|||
return await request.put({ url: '/system/post/update', data }) |
|||
} |
|||
|
|||
// 删除岗位
|
|||
export const deletePost = async (id: number) => { |
|||
return await request.delete({ url: '/system/post/delete?id=' + id }) |
|||
} |
|||
|
|||
// 批量删除岗位
|
|||
export const deletePostList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/post/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出岗位
|
|||
export const exportPost = async (params) => { |
|||
return await request.download({ url: '/system/post/export-excel', params }) |
|||
} |
@ -0,0 +1,66 @@ |
|||
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<RoleVO[]> => { |
|||
return await request.get({ url: '/system/role/simple-list' }) |
|||
} |
|||
|
|||
// 查询角色详情
|
|||
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 deleteRoleList = async (ids: number[]) => { |
|||
return await request.delete({ url: '/system/role/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出角色
|
|||
export const exportRole = (params) => { |
|||
return request.download({ |
|||
url: '/system/role/export-excel', |
|||
params |
|||
}) |
|||
} |
@ -0,0 +1,48 @@ |
|||
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/simple-list' }) |
|||
} |
|||
|
|||
// 查询短信渠道详情
|
|||
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 }) |
|||
} |
|||
|
|||
// 批量删除短信渠道
|
|||
export const deleteSmsChannelList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/sms-channel/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
@ -0,0 +1,37 @@ |
|||
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<string, object> | null |
|||
apiTemplateId: string |
|||
mobile: string |
|||
userId: number | null |
|||
userType: number | null |
|||
sendStatus: number | null |
|||
sendTime: Date | null |
|||
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 }) |
|||
} |
@ -0,0 +1,65 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface SmsTemplateVO { |
|||
id?: number |
|||
type?: number |
|||
status: number |
|||
code: string |
|||
name: string |
|||
content: string |
|||
remark: string |
|||
apiTemplateId: string |
|||
channelId?: number |
|||
channelCode?: string |
|||
params?: string[] |
|||
createTime?: Date |
|||
} |
|||
|
|||
export interface SendSmsReqVO { |
|||
mobile: string |
|||
templateCode: string |
|||
templateParams: Map<String, Object> |
|||
} |
|||
|
|||
// 查询短信模板列表
|
|||
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 deleteSmsTemplateList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/sms-template/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出短信模板
|
|||
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 }) |
|||
} |
@ -0,0 +1,72 @@ |
|||
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 getTenantList = () => { |
|||
return request.get({ url: '/system/tenant/simple-list' }) |
|||
} |
|||
|
|||
// 新增租户
|
|||
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 deleteTenantList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/tenant/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出租户
|
|||
export const exportTenant = (params: TenantExportReqVO) => { |
|||
return request.download({ url: '/system/tenant/export-excel', params }) |
|||
} |
@ -0,0 +1,48 @@ |
|||
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 deleteTenantPackageList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/tenant-package/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 获取租户套餐精简信息列表
|
|||
export const getTenantPackageList = () => { |
|||
return request.get({ url: '/system/tenant-package/simple-list' }) |
|||
} |
@ -0,0 +1,81 @@ |
|||
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 deleteUserList = (ids: number[]) => { |
|||
return request.delete({ url: '/system/user/delete-list', params: { ids: ids.join(',') } }) |
|||
} |
|||
|
|||
// 导出用户
|
|||
export const exportUser = (params: any) => { |
|||
return request.download({ url: '/system/user/export-excel', params }) |
|||
} |
|||
|
|||
// 下载用户导入模板
|
|||
export const importUserTemplate = () => { |
|||
return request.download({ url: '/system/user/get-import-template' }) |
|||
} |
|||
|
|||
// 用户密码重置
|
|||
export const resetUserPassword = (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<UserVO[]> => { |
|||
return request.get({ url: '/system/user/simple-list' }) |
|||
} |
@ -0,0 +1,57 @@ |
|||
import request from '@/config/axios' |
|||
|
|||
export interface ProfileVO { |
|||
id: number |
|||
username: string |
|||
nickname: string |
|||
dept: { |
|||
id: number |
|||
name: string |
|||
} |
|||
roles: { |
|||
id: number |
|||
name: string |
|||
}[] |
|||
posts: { |
|||
id: number |
|||
name: string |
|||
}[] |
|||
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 |
|||
avatar?: string |
|||
} |
|||
|
|||
// 查询用户个人信息
|
|||
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 |
|||
} |
|||
}) |
|||
} |
After Width: | Height: | Size: 6.2 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 7.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,856 @@ |
|||
{ |
|||
"type": "FeatureCollection", |
|||
"features": [ |
|||
{ |
|||
"type": "Feature", |
|||
"id": "710000", |
|||
"properties": { |
|||
"id": "710000", |
|||
"cp": [121.509062, 24.044332], |
|||
"name": "台湾", |
|||
"childNum": 6 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@°Ü¯Û"], |
|||
[ |
|||
"@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤNJŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ¿@ăƑ¥ĘWǬÏĶŁâ" |
|||
], |
|||
["@@\\p|WoYG¿¥Ij@¢"], |
|||
["@@
¡@V^RqBbAnTXeRz¤L«³I"], |
|||
["@@ÆEEkWqë @"], |
|||
["@@fced"], |
|||
["@@¯ɜÄèaì¯ØǓIġĽ"], |
|||
["@@çûĖëĄhòř "] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[122886, 24033]], |
|||
[[123335, 22980]], |
|||
[[122375, 24193]], |
|||
[[122518, 24117]], |
|||
[[124427, 22618]], |
|||
[[124862, 26043]], |
|||
[[126259, 26318]], |
|||
[[127671, 26683]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "130000", |
|||
"properties": { |
|||
"id": "130000", |
|||
"cp": [114.502461, 38.045474], |
|||
"name": "河北", |
|||
"childNum": 3 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@o~Z]ªrºc_ħ²G¼s`jΟnüsÂłNX_M`ǽÓnUK
Ĝēs¤©yrý§uģcJe"], |
|||
["@@U`Ts¿mÂ"], |
|||
[ |
|||
"@@oºƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiñÖ`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒQgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäìë|³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧˏf°ÐTªqs{S¯r æÝlNd®²Ğ džiGĘJ¼lr}~K¨ŸƐÌWöÆzR¤lêmĞLÎ@¡|q]SvKÑcwpÏÏĿćènĪWlĄkT}J¤~ÈTdpddʾĬBVtEÀ¢ôPĎƗè@~kü\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|ǰ
N«úmH¯âDùyŜŲIÄuШD¸dɂFOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu
{Z}Ö@U´
ʚLg®¯Oı°Ãw ^VbÉsmA
ê]]w§RRl£ȭµu¯b{ÍDěïÿȧuT£ġěŗƃĝQ¨fVƋƅna@³@ďyýIĹÊKŭfċŰóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏlTíb ØoÅbbx³^zÃͶSj®AyÂhðk`«P˵EFÛ¬Y¨Ļrõqi¼Wi°§Ð±´°^[À|ĠO@ÆxO\\ta\\tĕtû{ġȧXýĪÓjùÎRb^ÎfK[ÝděYfíÙTyuUSyŌŏů@Oi½éŅaVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MðoťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\mĆJfl@c̬¢aĦtRıÒ¾ùƀ^juųœKUFyƝ
īÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥ÍpDž¡KąÅkĝęěhq}HyÃ]¹ǧ£
Í÷¿qáµ§g¤o^á¾ZE¤i`ij{nOl»WÝĔįhgF[¿¡ßkOüš_ūiDZàUtėGyl}ÓM}jpEC~¡FtoQiHkk{Ãmï" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[119712, 40641]], [[121616, 39981]], [[116462, 37237]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "140000", |
|||
"properties": { |
|||
"id": "140000", |
|||
"cp": [111.849248, 36.857014], |
|||
"name": "山西", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ÞĩÒSra}ÁyWix±Üe´lèßÓǏokćiµVZģ¡coTS˹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£Pmc¸mQÝWďȥoÅîɡųAďä³aÏJ½¥PGąSM
EÅruµéYÓŌ_dĒCoȵ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]±cݯÑÃmQÍ~_apm
~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©bs^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs×¥ŅxÊdÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTŸʂōĖĴŞȀÆÿȄlŤĒötνî¼ĨXh|ªM¤Ðz" |
|||
], |
|||
"encodeOffsets": [[116874, 41716]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "150000", |
|||
"properties": { |
|||
"id": "150000", |
|||
"cp": [111.670801, 41.818311], |
|||
"name": "内蒙古", |
|||
"childNum": 2 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
[ |
|||
"@@¯PqFB
|S³C|kñHdiÄ¥sʼnÅ
PóÑÑE^ÅPpy_YtShQ·aHwsOnʼnÃs©iqjUSiº]ïW«gW¡ARë¥_sgÁnUI«m
]jvV¼euhwqAaW_µj
»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkŹ£k|e]olkVͼÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉv¦wĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐ禫
SÒ¥¸ëBX½HáŵÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjb£ĦS_éQZ_lwgOiýe`YYLq§IÁdz£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}
×Wu©ÅaųijƳhB{·TQqÙIķËZđ©Yc|M¡
LeVUóK_QWk_ĥ¿ãZ»X\\ĴuUèlG®ěłTĠğDŃOrÍdÆÍz]±
ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}w
VaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª
»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈ
ŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėDžjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšDž_ÃĀɗ±ąijĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC£µsKC
GS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdʼn_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋDžFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯YȵƓñǙµïċĻ|Düȭ¶¡oŽäÕG\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\İТæ^Ŋ IJȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©ȇÍq¯½YÃÔʼnÉNÑÅÝy¹NqáʅDǡËñƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌʼnŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~ǼȳÐUfdIxÿ\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmǐnǔĎȆÞǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞdžŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮЬɚwɲFjĔ²Äw°dždÀÉ_ĸdîàŎjÊêTЪŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\TתV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀϰP|ªVVªj¬ĚÒêp¬E|ŬÂc|ÀtƐK f{ĘFĒƌXƲąo½Ę\\¥o}Ûu£çkX{uĩ«āíÓUŅßŢqŤ¥lyň[oi{¦LńðFȪȖĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬
qehqsuH{¸kH¡
ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ġu¦öČ^â£ĂhĖMÈÄw\\fŦ°W ¢¾luŸDw\\̀ʉÌÛM
Ā[bÓEn}¶Vc
ês" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[129102, 52189]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "210000", |
|||
"properties": { |
|||
"id": "210000", |
|||
"cp": [123.429096, 41.796767], |
|||
"name": "辽宁", |
|||
"childNum": 16 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@L@@sa"], |
|||
["@@MnNm"], |
|||
["@@dc"], |
|||
["@@eÀC@b"], |
|||
["@@f
XwkbrÄ`qg"], |
|||
["@@^jtWQ"], |
|||
["@@~ Y]c"], |
|||
["@@G`ĔN^_¿ZÃM"], |
|||
["@@iX¶BY"], |
|||
["@@YZ"], |
|||
["@@L_{Epf"], |
|||
["@@^WqCT\\"], |
|||
["@@\\[§t|¤_"], |
|||
["@@m`n_"], |
|||
["@@Ïxnj{q_×^Giip"], |
|||
[ |
|||
"@@@é^BntaÊU]x ¯ÄPIJ°hʙK³VÕ@Y~|EvĹsǦL^pòŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSȦªVÊÏÆZÆŶ®²^ÎyÅÎcPqńĚDMħĜŁHkçvV[ij¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\ÀøíDm¦ÎbŨabaĘ\\ľã¸atÎSƐ´©v\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\ĐRZk°IS§fqŒßýáĞÙÉÖ[^¯ǤŲê´\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXmÛݺGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«zZf²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ÍOt¹·C¥GDrí@wÕKţëV·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\¿ghćO
k^ģÁFıĉĥMoEqqZûěʼn³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EżĀdQÂd^~ăÔH¦\\LKpĄVez¤NP ǹÓRÆąJSha[¦´ÂghwmBШźhI|VV|p] ¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|Əlij¥ãn·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÃA" |
|||
] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[123686, 41445]], |
|||
[[126019, 40435]], |
|||
[[124393, 40128]], |
|||
[[126117, 39963]], |
|||
[[125322, 40140]], |
|||
[[126686, 40700]], |
|||
[[126041, 40374]], |
|||
[[125584, 40168]], |
|||
[[125453, 40165]], |
|||
[[125362, 40214]], |
|||
[[125280, 40291]], |
|||
[[125774, 39997]], |
|||
[[125976, 40496]], |
|||
[[125822, 39993]], |
|||
[[125509, 40217]], |
|||
[[122731, 40949]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "220000", |
|||
"properties": { "id": "220000", "cp": [125.3245, 43.886841], "name": "吉林", "childNum": 1 }, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@pä³PClFbbÍzwBGĭZÅi»lYċ²SgkÇ£^Sqd¯R
©é£¯S\\cZ¹iűƏCuƍÓXoR}M^o£
R}oªUF
uuXHlEÅÏ©¤ÛmTþ¤D²ÄufàÀXXȱAeyYw¬dvõ´KÊ£\\rµÄlidā]|DÂVH¹Þ®ÜWnCķ W§@\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúv𼤠N°ąO¥«³[éǡű_°Õ\\ÚÊĝþâőàerR¨JYlďQ[ ÏYëЧTGztnß¡gFkMāGÁ¤ia Éȹ`\\xs¬dĆkNnuNUuP@vRY¾\\¢
GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±HÑlĢ^¤¢OðævxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TѬè¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZвCH AxiukdGgetqmcÛ£Ozy¥cE}|
¾cZ
k¿uŐã[oxGikfeäT@
SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\¹¥Yĭl¤OvLjM_a W`zļMž·\\swqÝSAqŚij¯°kRē°wx^ĐkǂÒ\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌDzÄUĞd\\iÖmÈBĤÜɲDEh LG¾ƀľ{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĀÖŠåưÎslyiē«`å§H¥Ae^§GK}iã\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`©GMehccďÏd©ÑW_ÏYƅ»
é\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ýL¡ýqT^rme\\PpZZbyuybQefµ]UhĿDCmûvaÙNSkCwncćfv~
YÇG" |
|||
], |
|||
"encodeOffsets": [[130196, 42528]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "230000", |
|||
"properties": { |
|||
"id": "230000", |
|||
"cp": [128.642464, 46.756967], |
|||
"name": "黑龙江", |
|||
"childNum": 2 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
[ |
|||
"@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝDZÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűѱĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tޏĻN_yX`biNKu
P£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇ
µf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ć
UÕ@Áijſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}
AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËܲɶGxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\kzţ¦šnņäÔVĂîά|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí
£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNͽƎÁ§čŐAēeL³àydl¦ĘVçŁpśdžĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr°oú¬Ħ
ŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E 寰WKɱ_d_}}vyõu¬ï¹ÓU±½@gÏ¿rýDg
Cdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭNJË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYR
ŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Þ]" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[134456, 44547]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "320000", |
|||
"properties": { |
|||
"id": "320000", |
|||
"cp": [119.767413, 33.041544], |
|||
"name": "江苏", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@cþÅPi`ZRu¥É\\]~°Y`µÓ^phÁbnÀşúòaĬºTÖŒbe¦¦{¸ZâćNp©Hr|^mjhSEb\\afv`sz^lkljÄtg¤D¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@ƹhågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtIJyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdfå
qm¿QûùŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yxcitğ®jű¢KOķCoy`å®VTa_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋÄÄÍīçÛɈǥ£ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK
¤½phMü`oæŀ" |
|||
], |
|||
"encodeOffsets": [[121740, 32276]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "330000", |
|||
"properties": { |
|||
"id": "330000", |
|||
"cp": [120.153576, 29.287459], |
|||
"name": "浙江", |
|||
"childNum": 45 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@E^dQ]K"], |
|||
["@@jX^j"], |
|||
["@@sfbU"], |
|||
["@@qP\\xz[ck"], |
|||
["@@R¢FX}°[s_"], |
|||
["@@Cb\\}"], |
|||
["@@e|v\\la{u"], |
|||
["@@v~u}"], |
|||
["@@QxÂF¯}"], |
|||
["@@¹nvÞs¯o"], |
|||
["@@rSkUEj"], |
|||
["@@biZP"], |
|||
["@@p[}INf"], |
|||
["@@À¿"], |
|||
["@@¹dnb
"], |
|||
["@@rSBnR"], |
|||
["@@g~h}"], |
|||
["@@FlEk"], |
|||
["@@OdPc"], |
|||
["@@v[u\\"], |
|||
["@@FjâL~wyoo~sµL\\"], |
|||
["@@¬e¹aN"], |
|||
["@@\\nÔ¡q]L³ë\\ÿ®QÖ"], |
|||
["@@ÊA©[¬"], |
|||
["@@Kxv"], |
|||
["@@@hlIk]"], |
|||
["@@pW{o||j"], |
|||
["@@Md|_mC"], |
|||
["@@¢
X£ÏylD¼XtH"], |
|||
["@@hlÜ[LykAvyfw^E¤"], |
|||
["@@fp¤MusR"], |
|||
["@@®_ma~LÁ¬Z"], |
|||
["@@iMxZ"], |
|||
["@@ZcYd"], |
|||
["@@Z~dOSo|A¿qZv"], |
|||
["@@@`EN¡v"], |
|||
["@@|TY{"], |
|||
["@@@n@m"], |
|||
["@@XWkCT\\"], |
|||
["@@ºwZRkĕWO¢"], |
|||
["@@X®±Grƪ\\ÔáXq{"], |
|||
["@@ůTG°ĄLHm°UC"], |
|||
[ |
|||
"@@¤aÜx~}dtüGæţŎíĔcŖpMËÐj碷ðĄÆMzjWKĎ¢Q¶À_ê_Bıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªÁŖHŗʼnåqûõi¨hÜ·ñt»¹ýv_[«¸mYL¯Qª
mĉÅdMgÇjcº«ę¬K´B«Âącoċ\\xKd¡gěŧ«®á[~ıxu·ÅKsËÉc¢Ù\\ĭƛëbf¹ģSĜkáƉÔĈZB{aMµfzʼnfåÂŧįƋǝÊĕġć£g³neą»@¦S®\\ßðChiqªĭiAuAµ_W¥ƣO\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ}þÙ]¡FKwsPlU[}¦Rvn`hq¬\\nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@Pú
Øz©PCÈÚDZhŖl¬â~nm¨f©iļ«mntuÖZÜÄjL®EÌFª²iÊxبIÈhhst" |
|||
], |
|||
["@@o\\VzRZ}y"], |
|||
["@@@°¡mÛGĕ¨§Ianá[ýƤjfæØLäGr"] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[125592, 31553]], |
|||
[[125785, 31436]], |
|||
[[125729, 31431]], |
|||
[[125513, 31380]], |
|||
[[125223, 30438]], |
|||
[[125115, 30114]], |
|||
[[124815, 29155]], |
|||
[[124419, 28746]], |
|||
[[124095, 28635]], |
|||
[[124005, 28609]], |
|||
[[125000, 30713]], |
|||
[[125111, 30698]], |
|||
[[125078, 30682]], |
|||
[[125150, 30684]], |
|||
[[124014, 28103]], |
|||
[[125008, 31331]], |
|||
[[125411, 31468]], |
|||
[[125329, 31479]], |
|||
[[125626, 30916]], |
|||
[[125417, 30956]], |
|||
[[125254, 30976]], |
|||
[[125199, 30997]], |
|||
[[125095, 31058]], |
|||
[[125083, 30915]], |
|||
[[124885, 31015]], |
|||
[[125218, 30798]], |
|||
[[124867, 30838]], |
|||
[[124755, 30788]], |
|||
[[124802, 30809]], |
|||
[[125267, 30657]], |
|||
[[125218, 30578]], |
|||
[[125200, 30562]], |
|||
[[124968, 30474]], |
|||
[[125167, 30396]], |
|||
[[124955, 29879]], |
|||
[[124714, 29781]], |
|||
[[124762, 29462]], |
|||
[[124325, 28754]], |
|||
[[123990, 28459]], |
|||
[[125366, 31477]], |
|||
[[125115, 30363]], |
|||
[[125369, 31139]], |
|||
[[122495, 31878]], |
|||
[[125329, 30690]], |
|||
[[125192, 30787]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "340000", |
|||
"properties": { "id": "340000", "cp": [117.283042, 31.26119], "name": "安徽", "childNum": 3 }, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@^iuLX^"], |
|||
["@@e©Ehl"], |
|||
[ |
|||
"@@°ZÆëϵmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxIJkq^³³GšµbíZ
¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjCh߸iÝbÛªCC¿mRV§¢A|t^iĠGÀtÚsd]ĮÐDE¶zAb àiödK¡~H¸íæAǿYj{ď¿À½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp
Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mvˊBÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggJǧw×jÉ©±EFËKiÛÃÕYv
sm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOjNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßF¶X®¿mw
RIÞfßoG³¾©uyHį{Ɓħ¯AFnuP
ÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEзÖdÖsƘѨ[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē
ßúLÃÃ_ÈÏ|]ÂÏFlg`ben¾¢pUh~ƴ˶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³
]u}f
ïQl{skloNdjäËzDvčoQďHI¦rbtHĔ~BmlRV_ħTLnñH±DL¼Lªl§Ťa¸ĚlK²\\RòvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóZ ň¶vHrľ\\ÊJuxAT|dmÀO[ÃÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálwKhïgA¢ųƩޤOÈm°K´" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[121722, 32278]], [[119475, 30423]], [[119168, 35472]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "350000", |
|||
"properties": { |
|||
"id": "350000", |
|||
"cp": [118.306239, 26.075302], |
|||
"name": "福建", |
|||
"childNum": 18 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@zht´]"], |
|||
["@@aj^~ĆG©O"], |
|||
["@@ed¨C}}i"], |
|||
["@@@vPGsQ"], |
|||
["@@sBzddW]Q"], |
|||
["@@S¨Q{"], |
|||
["@@NVucW"], |
|||
["@@qptBAq"], |
|||
["@@¸[mu"], |
|||
["@@Q\\pD]_"], |
|||
["@@jSwUadpF"], |
|||
["@@eXª~"], |
|||
["@@AjvFso"], |
|||
["@@fT_Çí\\v|ba¦jZÆy°"], |
|||
["@@IjJi"], |
|||
["@@wJIx«¼AoNe{M"], |
|||
["@@K±¡ÓČäeZ"], |
|||
[ |
|||
"@@k¡¹Eh~c®wBkUplÀ¡I~Māe£bN¨gZý¡a±Öcp©PhI¢Qq
ÇGj|¥U g[Ky¬ŏv@OptÉEF\\@ åA¬V{XģĐBy
cpě
¼³Ăp·¤¥ohqqÚ¡ŅLs^á§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧSW¥Qûŗ½ùěcݧSùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ
^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņIJg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀEttĸr]ðM¤ĶIJHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AΦĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F
¼ÍË»ğV`«Ip}ccÅĥZEãoP
´B@D¸m±z«Ƴ¿å³BRضWlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLʼnËĥW[ÂGIÂNxij¤D¢îĎÎB§°_JGs¥E@
¤uć
PåcuMuw¢BI¿]zG¹guĮck\\_" |
|||
] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[123250, 27563]], |
|||
[[122541, 27268]], |
|||
[[123020, 27189]], |
|||
[[122916, 27125]], |
|||
[[122887, 26845]], |
|||
[[122808, 26762]], |
|||
[[122568, 25912]], |
|||
[[122778, 26197]], |
|||
[[122515, 26757]], |
|||
[[122816, 26587]], |
|||
[[123388, 27005]], |
|||
[[122450, 26243]], |
|||
[[122578, 25962]], |
|||
[[121255, 25103]], |
|||
[[120987, 24903]], |
|||
[[122339, 25802]], |
|||
[[121042, 25093]], |
|||
[[122439, 26024]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "360000", |
|||
"properties": { |
|||
"id": "360000", |
|||
"cp": [115.592151, 27.676493], |
|||
"name": "江西", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ĢĨƐgļ¼ÂMD~ņªe^\\^§ý©j×cZبzdÒa¶lÒJìõ`oz÷@¤u޸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U ¥pĄžƦO lt¸Æ Q\\aÆ|CnÂOjtĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢûXD®
QgÄWiØPÞìºr¤džNĠ¢lĄtZoCƞÔºCxrpĠV®Ê{f_Y`_eq®Aot`@oDXfkp¨|s¬\\DÄSfè©Hn¬
^DhÆyøJhØxĢĀLÊƠPżċĄwȠ̦G®ǒĤäTŠÆ~Ħw«|TF¡nc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀWEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[r«_gmQu~¥V\\OkxtL E¢Ú^~ýêPóqoě±_Êw§ÑªåƗā¼mĉŹ¿NQ
YBąrwģcÍ¥BŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluī
BÐGsĵıN£ï^ķqss¿FūūVÕ·´Ç{éĈýÿOER_đûIċâJhŅıNȩĕB
¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤¦¯P|ÿUHvhe¥oFTuõ\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[×zkKN¶Õ»lčÓ{XSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyáV¼Ã~
`gsÙfIƋlę¹e|~udjuTlXµf`¿Jd[\\L²" |
|||
], |
|||
"encodeOffsets": [[116689, 26234]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "370000", |
|||
"properties": { |
|||
"id": "370000", |
|||
"cp": [118.000923, 36.275807], |
|||
"name": "山东", |
|||
"childNum": 13 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@Xjd]{K"], |
|||
["@@itbFHy"], |
|||
["@@HlGk"], |
|||
["@@TGy"], |
|||
["@@K¬U"], |
|||
["@@WdXc"], |
|||
["@@PtOs"], |
|||
["@@LnXhc"], |
|||
["@@ppVu]Or"], |
|||
["@@cdzAUa"], |
|||
["@@udRhnCI"], |
|||
["@@oIpR"], |
|||
[ |
|||
"@@Ľč{fzƤîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆdž¢Îo¦cvKbgr°WhmZp L]LºcUÆnżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞEzVL®öØBkŖÝĐ˹ŧ̄±ÀbÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéõė ƿ¸lµ¾Z|ZWyFY¨Mf~C¿`à_RÇzwƌfQnny´INoƬèôº|sTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lC
MrDÇ]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ïW
uøCǷë¡ąuhÛ¡^KxC`C\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\¹kxãČ×GDyäÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶GY§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGu
IZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏYI] PumŝrƿIā[xedzL¯v¯s¬ÁY
~}
ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\ebZHŖR¬ŢƱùęOÑM³FÛWp[" |
|||
] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[123806, 39303]], |
|||
[[123821, 39266]], |
|||
[[123742, 39256]], |
|||
[[123702, 39203]], |
|||
[[123649, 39066]], |
|||
[[123847, 38933]], |
|||
[[123580, 38839]], |
|||
[[123894, 37288]], |
|||
[[123043, 36624]], |
|||
[[123344, 38676]], |
|||
[[123522, 38857]], |
|||
[[123628, 38858]], |
|||
[[118260, 36742]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "410000", |
|||
"properties": { |
|||
"id": "410000", |
|||
"cp": [113.665412, 33.757975], |
|||
"name": "河南", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ýLùµP³swIÓxcŢĞð´E®ÚPtĴXØx¶@«ŕŕQGYfa[şußǩđš_X³ijÕčC]kbc¥CS¯ëÍB©÷³Si_}mYTt³xlàcČzÀD}ÂOQ³ÐTĨ¯ƗòËŖ[hłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@C\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`Ƴĕg}V¡om½faÇo³TTj¥tĠRyK{ùÓjuµ{t}uËRivGçJFjµÍyqÎàQÂFewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr
|J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ
Ť]MÛfaQpě±ǽ¾]uFu÷nčįADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzËčľ^KLiÞñ[aA²zzÌ÷D|[íijgfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÀ«ìUMhTº¨¸ǡîSÔDruÂÇZÖEvPZW~ØÐtĄE¢¦Ðy¸bô´oŬ¬²Ês~]®tªapŎJ¨Öº_Ŕ`Ŗ^Đ\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\d\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvƶN¿¢T@uC¬^ĊðÄn|lGlRjsp¢ED}Fio~ÔN~zkĘHVsDzßjŬŢ`Pûàl¢\\ÀEhİgÞē X¼Pk|m" |
|||
], |
|||
"encodeOffsets": [[118256, 37017]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "420000", |
|||
"properties": { |
|||
"id": "420000", |
|||
"cp": [113.298572, 30.684355], |
|||
"name": "湖北", |
|||
"childNum": 3 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@AB"], |
|||
["@@lskt"], |
|||
[ |
|||
"@@¾«}{ra®pîÃ\\{øCËyyB±b\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPL¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēIJ}Z³½Mŧïeyp·uk³DsѨL¶_Åuèw»¡WqÜ]\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bprf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy
¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ ÑbŇTĿ_[IčĄʿnM¦ğ\\É[T·k¹©oĕ@A¾wya¥Y\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹[WvP©whuÕyBF`RqJUw\\i¡{jEPïÿ½fć
QÑÀQ{°fLÔ~wXgītêݾĺHd³fJd]HJ²
EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼
äÌQv\\rCé¾TnkžŐÚÜa¼ÝƆ̶Ûo
d
ĔňТJqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\Ʈ±ŒdʧĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[113712, 34000]], [[115612, 30507]], [[113649, 34054]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "430000", |
|||
"properties": { "id": "430000", "cp": [111.782279, 28.09409], "name": "湖南", "childNum": 3 }, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@nFTs"], |
|||
["@@ßÅÆá½ÔXrCO
ËRïÿĩTooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚij¥Ï̾edÄ©ĸG
àGhM¤Â_U}Ċ}¢pczfþg¤ÇòAVM"], |
|||
[ |
|||
"@@©KA·³CQ±Á«³BUƑ¹AtćOwD]JiØSm¯b£ylX
HËѱH«C^õľAŧ¤É¥ïyuǙuA¢^{ÌC´¦ŷJ£^[ª¿ĕ~Ƈ
N
skóā¹¿ï]ă~÷O§@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąMąıuZmZcÒ IJβSÊDŽŶ¨ƚCÖŎªQؼrŭ«}NÏürʬmjr@ĘrTW SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`P
DiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZa
ZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶Dô
K|^ª°LX¾ŴäPα£EXd^¶IJÞÜ~u¸ǔMRhsR
e`ÄofIÔ\\Ø ićymnú¨cj ¢»GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLÄ¢dVi`p˔vŎµªÉF~Ød¢ºgİàw¸Áb[¦Zb¦z½xBĖ@ªpºlS¸Ö\\Ĕ[N¥ˀmĎăJ\\ŀ`
ňSÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnкG{p°M´wÀÒzJ²ò¨ oTçüöoÛÿñőФùTz²CȆȸǎŪƑÐc°dPÎğ˶[Ƚu¯½WM¡ÉB·rínZÒ `¨GA¾\\pēXhÃRCüWGġu
Té§ŎÑ©ò³I±³}_EÃħg®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\êYƪ¦kÝbiċƵGZ»Ěõ
ó·³vŝ£ø@pyö_ëIkѵbcѧy
×dYتiþ¨[]f]Ņ©C}ÁN»hĻħƏĩ" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[115640, 30489]], [[112543, 27312]], [[116690, 26230]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "440000", |
|||
"properties": { |
|||
"id": "440000", |
|||
"cp": [113.280637, 23.125178], |
|||
"name": "广东", |
|||
"childNum": 24 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@QdAua"], |
|||
["@@lxDLo"], |
|||
["@@sbhNLo"], |
|||
["@@Ă ā"], |
|||
["@@WltO[["], |
|||
["@@Kr]S"], |
|||
["@@eI]y"], |
|||
["@@I|Mym"], |
|||
["@@Û³LS¼Y"], |
|||
["@@nvºBëui©`¾"], |
|||
["@@zdÛJw®"], |
|||
["@@°
¯"], |
|||
["@@a yAª¸ËJIxØ@ĀHAmÃV¡ofuo"], |
|||
["@@sŗÃÔėAƁZÄ ~°ČPäh"], |
|||
["@@¶ÝÌvmĞhıQ"], |
|||
["@@HdSjǢD}war
u«ZqadYM"], |
|||
["@@el\\LqqU"], |
|||
["@@~rMo\\"], |
|||
["@@f^C"], |
|||
["@@øPªoj÷ÍÝħXČx°Q¨ıXNv"], |
|||
["@@gÇƳo[~tly"], |
|||
["@@EÆC¿"], |
|||
["@@OP"], |
|||
[ |
|||
"@@wđógĝ[³¡VÙæÅöM̳¹pÁaËýý©D©ÜJŹƕģGą¤{Ùū
ÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGO|KPȏŹãŝIŕŭŕ@Óoo¿ē±ß}
ŭIJWÈCőâUâǙIğʼn©IijE×
Á³AówXJþ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊ̲iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƂªFbwEÀ©\\
¤]ŸI®¥D³|Ë]CöAŤ¦
æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºV¸@¾ªR²ĨN]´_eavSivc}p}Đ¼ƌkJÚe th_¸ ºx±ò_xN˲@ă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIǪ`uTÅxYĒÖ¼kÖµMjJÚwn\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCI
özx¢PnÈñ @ĥÒ¦]ƞV}³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧΡÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUïmRCº
ĭ|µÕÊK½Rē ó]GªęAx»HO£|ām¡diď×YïYWªʼnOeÚtĐ«zđ¹T
āúEá²\\ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀLJğ·¿ÃOj YÇ÷Qěi" |
|||
] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[117381, 22988]], |
|||
[[116552, 22934]], |
|||
[[116790, 22617]], |
|||
[[116973, 22545]], |
|||
[[116444, 22536]], |
|||
[[116931, 22515]], |
|||
[[116496, 22490]], |
|||
[[116453, 22449]], |
|||
[[113301, 21439]], |
|||
[[118726, 21604]], |
|||
[[118709, 21486]], |
|||
[[113210, 20816]], |
|||
[[115482, 22082]], |
|||
[[113171, 21585]], |
|||
[[113199, 21590]], |
|||
[[115232, 22102]], |
|||
[[115739, 22373]], |
|||
[[115134, 22184]], |
|||
[[113056, 21175]], |
|||
[[119573, 21271]], |
|||
[[119957, 24020]], |
|||
[[115859, 22356]], |
|||
[[116561, 22649]], |
|||
[[116285, 22746]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "450000", |
|||
"properties": { "id": "450000", "cp": [108.320004, 22.82402], "name": "广西", "childNum": 2 }, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@H TQ§A"], |
|||
[ |
|||
"@@ĨʪLƊDÎĹĐCǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\la¼¤ôá`¯¹LCÆbxEræOv[H[~|aB£ÖsºdAĐzNÂðsÞÆ
Ĥªbab`ho¡³F«èVlo¤ÔRzpp®SĪº¨ÖºN
ijd`a¦¤F³ºDÎńĀìCĜº¦Ċ~nS|gźvZkCÆj°zVÈÁƔ]LÊFZg
čPkini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYIJvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucà÷gÕuíÙćĝ}FϼĹ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[B
ÑÏGáşşƇe
ăYSsFQ}BwtYğÃ@~
CÍQ ×Wj˱rÉ¥oÏ ±«ÓÂ¥kwWűmcih³K~µh¯e]lµélEģEďsmÇŧē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡y¦CezYwa[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±
dy¹T^dûÅÑŦ·PĻþÙ`K¦
¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\őDc¥ÝFyÔćcűH_hLÜêĺШc}rn`½Ì@¸¶ªVLhŒ\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡
qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ¯TbÜÈk¡ĠvàhÂƄ¢Jî¶²" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[111707, 21520]], [[107619, 25527]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "460000", |
|||
"properties": { "id": "460000", "cp": [109.83119, 19.031971], "name": "海南", "childNum": 1 }, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉƅſȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀоjNðĀÒRZdžzÐŘΰH¨Ƣb²_Ġ " |
|||
], |
|||
"encodeOffsets": [[112750, 20508]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "510000", |
|||
"properties": { |
|||
"id": "510000", |
|||
"cp": [104.065735, 30.659462], |
|||
"name": "四川", |
|||
"childNum": 2 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@LqKr"], |
|||
[ |
|||
"@@[ĻéV£_ţġñpG réÏ·~ąSfy×Í·ºſƽiÍıƣıĻmHH}siaX@iǰÁÃ×t«T¤JJJyJÈ`Ohߦ¡uËhIyCjmÿw
ZG
TiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhܸºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO½a[×]`ÃiüL¦LabbTÀåc}ÍhÆh®BHî|îºÉk¤Sy£ia©taį·Ɖ`ō¥UhO
ĝLk}©Fos´JmµlŁu
ønÑJWΪYÀïAetTŅÓGË«bo{ıwodƟ½OġܵxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌЧnÇ
¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒ
ćhG¬CMõƤąAvüVéŀ_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń
·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ
þTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©ĈtCĢɽŠȣ¦āæ·HĽîôNÔ~^¤Ɗu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞŒQìÛÐ@ĞǎRS¤Á§d
i´ezÝúØã]HqkIþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwnÆƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿQPJvÄz^Đ¹Æ¯fLà´GC²dtĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@Ŏk\\Ç´£YW}z@Z}öoû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§áCNęÎ[ĀÕĪgÖɪXøx¬½Ů¦¦[NÎLÜUÖ´òrÙŠxR^JkijnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFΤ¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xäJÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEb
ee_v¡}ìęNJē}qÉåT¯µRs¡M@}ůaa¯wvƉåZw\\Z{åû^" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[108815, 30935]], [[110617, 31811]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "520000", |
|||
"properties": { |
|||
"id": "520000", |
|||
"cp": [106.713478, 26.578343], |
|||
"name": "贵州", |
|||
"childNum": 3 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@G\\lY£in"], |
|||
["@@q|mc¯tÏVSÎ"], |
|||
[ |
|||
"@@hÑ£IsNgßHHªķÃh_¹¡ĝħń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\}G®u\\åPFqwÅaD
K°ºâ_£ùbµmÁÛĹM[q|hlaªāI}ѵ@swtwm^oµD鼊yVky°ÉûÛR
³e¥]RÕěħ[ƅåÛDpJiVÂF²I
»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`
ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[Kv
JPhèhCrĂĚÂ^Êƌ wZLĠ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾E쬬ôxÌO¢ K³ŀºäYPVgŎ¦Ŋm޼VZwVlz¤
£Tl®ctĽÚó{GAÇge~Îd¿æaSba¥KKûj®_Ä^\\ؾbP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸
`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢Æ
ÀhÂW\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Á뺰rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_Ã
ftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©
]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxŪÒ¢@£ÀEîôruńb[§nWuMÆLl¿]x}ij½" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[112158, 27383]], [[112105, 27474]], [[112095, 27476]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "530000", |
|||
"properties": { |
|||
"id": "530000", |
|||
"cp": [101.512251, 24.740609], |
|||
"name": "云南", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅF¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hWæßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈAÎô¶RäQ^Øu¬°_Èôc´¹ò¨P΢hlϦ´ĦÆ´sâÇŲPnÊD^¯°Upv}®BP̪jǬxSöwlfòªvqĸ|`HviļndĜĆhňem·FyÞqóSᝳX_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CDhMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VظE^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fǸYi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM
~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyhr@ĒÔƀÀ²º\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcIJx|ap̬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿S
rEFsÕūkóVǥʼniTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^ɱćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\lMFlư£ĜÆyHF¨µêÕ]HA
àÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹
ÅË^»f³ø}Q¡Ö˳gͱ^Ç
\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ë}ǝeďºȡȘÏíBÉ£āĘPªij¶ʼnÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZï`" |
|||
], |
|||
"encodeOffsets": [[104636, 22969]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "540000", |
|||
"properties": { "id": "540000", "cp": [89.132212, 30.860361], "name": "西藏", "childNum": 1 }, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ
£Z
UDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥cc¡ÙaSyFÖkuRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾƺcxwf]Y
´¦|QLn°adĊ
\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|٦Av¦w`ăaÝaa¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\õª@þo´xA sÂtŎKzó´ÇĊµ¢r^nĊƬ×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H
ãd«g[ؼēÀcīľġ¬cJµ
ÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIijÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k´ÓH@¹TZ¥¢į·ÌAЧ®Zc
v½Z¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK
¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉT廣TđWxq¹Zobs[ׯcĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`ܳç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSijYo|Ç[ǾµMW¢ĭiÕØ¿@Mh
pÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸c
bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®óL·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKǰ¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴ
ÀBon|H@Êx¦BpŰŌ¿fµƌA¾zLjRx¶FkĄźRzŀ~¶[´HnªVƞuĒȨƎcƽÌm¸ÁÈM¦x͊ëÀxdžBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\qRĄ©" |
|||
], |
|||
"encodeOffsets": [[90849, 37210]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "610000", |
|||
"properties": { |
|||
"id": "610000", |
|||
"cp": [108.948024, 34.263161], |
|||
"name": "陕西", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@p¢ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\ċ°s¬]jú EȌdž¬stRÆdĠİwܸôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYǠȰÌTΨÂW|fcă§uF@N¢XLRMº[ğȣſï|¥Jkc`sʼnǷY¹W@µ÷K
ãï³ÛIcñ·VȋÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅ
Y¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DدC´ʼnƒópģ}ċcEË
FéGU¥×K
§¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO
ÿEËߌĤNĔwƇÄńwĪo[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ßå¬÷m\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇϳħZ«mJ
×¾MtÝĦ£IwÄå\\Õ{OwĬ©LÙ³ÙgBƕŀrÌĢŭO¥lãyC§HÍ£ßEñX¡°ÙCgpťzb`wIvA|§hoĕ@E±iYd¥OϹS|}F@¾oAO²{tfÜ¢FǂÒW²°BĤh^Wx{@¬F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi
^MicϰÂ[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^ŵMThĠܤko¼Ŏìąǜh`[tRd²IJ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpIJÇĬJŊ¦±J«Y§@·pHµàåVKepWftsAÅqC·¬ko«pHÆuK@oHĆÛķhxenS³àǍrqƶRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSj" |
|||
], |
|||
"encodeOffsets": [[110234, 38774]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "620000", |
|||
"properties": { |
|||
"id": "620000", |
|||
"cp": [103.823557, 36.058039], |
|||
"name": "甘肃", |
|||
"childNum": 2 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@VuUv"], |
|||
[ |
|||
"@@ũEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡ĨÒ¤úSHbjÎB°aZ¢KJO[|A£Dx}NìHUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZ
sKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©IJ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬²I¥IʼnÈīoıÓÑAçÑ|«LÝcspīðÍg
të_õ\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋI
aBDR¹ȥr¯GºßK¨jWkɱOqWij\\aQ\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz
³tmEÁ´a¹cčecÇNĊãÁ\\č¯dNj]jZµkÓdaćå]ğij@ ©O{¤ĸm¢E·®«|@Xwg]A챝XǁÑdzªcwQÚŝñsÕ³ÛV_ý¥\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×nj~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSf
B¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\it^c®Rʺ¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|̰ƅ¤ĩŪU ęĄÌZÒ\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b
ð÷®üszMzÖĖQdȨýv§Tè|ªHþa¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v·À|\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØE«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ʼnĖýZso§HÑiYw[ß\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\ſčåÒʻĘm ƭÌŹöʥëQ¤µÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eıUĥ¼ªI{ΧDÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńǾV¬ufÓÉCtÓ̻
¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂKq´ï¦ºĒDzņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|DŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿ĽĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY
tÁƤyAã˾J@ǝrý@¤
rz¸oP¹ɐÚyáHĀ[Jw
cVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PĤoH{tK" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[108619, 36299]], [[108589, 36341]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "630000", |
|||
"properties": { "id": "630000", "cp": [96.778916, 35.623178], "name": "青海", "childNum": 2 }, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@InJm"], |
|||
[ |
|||
"@@CƽOŃĦsΰ~dz¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VIJ~f\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wà
x\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJð̬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u
ºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéĽG©ã¤G
uȧþRcÕĕNyyûtøï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIáI`ks£CGěUy×Cy
@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa
OÇðñęNw
œľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`
ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉij¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į´FRådČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūЩÈF£\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qĉ¶³ÈyôōLÁstB®wn±ă¥HSòė£Së@לÊăxÇN©©T±ª£IJ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃIJc·ÛLO½sç¥Ts{ă\\_»kϱq©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿΧp[ĉc¯bKmR¥{³Ze^wx¹dƽŽôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\ijŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňb̰ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\ªÚŒU\\f
¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\oäõF礻Ŷ×h¹]ClÙ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌζƶlðļATUvdTGº̼ÔsÊDÔveOg" |
|||
] |
|||
], |
|||
"encodeOffsets": [[[105308, 37219]], [[95370, 40081]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "640000", |
|||
"properties": { "id": "640000", "cp": [106.278179, 37.26637], "name": "宁夏", "childNum": 2 }, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
[ |
|||
"@@KëÀęĞ«Oęȿȕı]ʼn¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûc
Ùß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_
X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤ĢÝsuBLùtYdmVtNmtOPhRw~bd
¾qÐ\\âÙH\\bImlNZ»loqlVmGā§~QCw¤{A\\PKNY¯bFkC¥sks_Ã\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyEKzuÔ¡qQ¤xZÑ¢^ļöܾEp±âbÊÑÆ^fk¬
NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZľr°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀ˾iİbjÕ" |
|||
], |
|||
["@@mfwěwMrŢªv@G"] |
|||
], |
|||
"encodeOffsets": [[[109366, 40242]], [[108600, 36303]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "650000", |
|||
"properties": { "id": "650000", "cp": [85.617733, 40.792818], "name": "新疆", "childNum": 1 }, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@QØĔ²X¨~ǘBºjʐߨvKƔX¨vĊO÷¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX
êÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO
¦E}`cȺrĦáŖuÒª«IJπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝLjì¥Βba¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝč˾ăC
ćāƿÝɽ©DZҹđ¥³ðLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭdzLŇʻ«ƭ\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůʼnT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\śnkOw¥±T»ƷFɯàĩÞáB¹Æ
ÑUwŕĽw[mG½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KϽĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³hgËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc
¤³Xù]DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®ƝvUm©³G\\}µĿQyŹlăµEwLJQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AijŽKLh³`ñcËtW±»ÕSëüÿďDu\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁ
č|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAйn~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷Aê[ÄäI®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉvidzHQµâFùœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍE˨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\ªÑòÜìc\\üqÕ[Č¡xoÂċªbØø|¶ȴZdÆÂońéG\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|IJXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\§~D¬{vJ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàIJaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\ĜÑŚ¶ZƄ³àjĨoâȴLÊȮĐĚăÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãØ" |
|||
], |
|||
"encodeOffsets": [[88824, 50096]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "110000", |
|||
"properties": { |
|||
"id": "110000", |
|||
"cp": [116.405285, 39.904989], |
|||
"name": "北京", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ĽOÁûtŷmiÍt_H»Ĩ±d`¹{bw
Yr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\ßc±x¯oœRcfe
£o§ËgToÛJíĔóu
|wP¤XnO¢ÉŦ¯rNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwڍUd®bêņ¾jnŎGŃŶnzÚSeîĜZczî¾i]ÍQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\¥A¨ÏѨj¯X\\¯MKpA³[H
īu}}" |
|||
], |
|||
"encodeOffsets": [[120023, 41045]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "120000", |
|||
"properties": { |
|||
"id": "120000", |
|||
"cp": [117.190182, 39.125596], |
|||
"name": "天津", |
|||
"childNum": 1 |
|||
}, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": [ |
|||
"@@ŬgX§Ü«E
¶F̬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥îakS¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZŏR§òoY×Ógc
ĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~" |
|||
], |
|||
"encodeOffsets": [[120237, 41215]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "310000", |
|||
"properties": { |
|||
"id": "310000", |
|||
"cp": [121.472644, 31.231706], |
|||
"name": "上海", |
|||
"childNum": 6 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@ɧư¬EpƸÁxc"], |
|||
["@@©ª"], |
|||
["@@MA"], |
|||
["@@QpİE§ÉC¾"], |
|||
["@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÃƌÃ͎ó"], |
|||
["@@ǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@IJ`gQÚhr|ǀ^MIJvtbe´R¯Ô¬¨Yô¤r]ìƬį"] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[124702, 32062]], |
|||
[[124547, 32200]], |
|||
[[124808, 31991]], |
|||
[[124726, 32110]], |
|||
[[124903, 32376]], |
|||
[[124438, 32149]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "500000", |
|||
"properties": { |
|||
"id": "500000", |
|||
"cp": [107.304962, 29.533155], |
|||
"name": "重庆", |
|||
"childNum": 2 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
[ |
|||
"@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p
\\_ æüY|[YxƊæu°xb®
Űb@~¢NQt°¶Sæ Ê~rljĔëĚ¢~uf`faĔJåĊnÖ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈüD|s`ŋć]Ã`đMûƱ½~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƅġ^ÖÛbÙŽŏml½SêqDu[RãË»ÿw`»y¸_ĺę}÷`M¯ċfCVµqʼn÷Zgg`d½pDOÎCn^uf²ènh¼WtƏxRGg¦
pVFI±G^Ic´ecGĹÞ½sëĬhxW}KÓeXsbkF¦LØgTkïƵNï¶}Gyw\\oñ¡nmĈzj@Óc£»Wă¹Ój_m»¹·~MvÛaq»ê\\ÂoVnÓØÍ²«bq¿efE Ĝ^Q~ Évýş¤²ĮpEİ}zcĺL½¿gÅ¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u_n»_At©Þűā§IVeëY}{VPÀFA¨ąB}q@|Ou\\FmQFÝ
Mwå}]|FmÏCawu_p¯sfÙgY
DHl`{QEfNysB¦zG¸rHeN\\CvEsÐùÜ_·ÖĉsaQ¯}_UxÃđqNH¬Äd^ÝŰR¬ã°wećJE·vÝ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\¢sJnQTjPØxøK|nBzĞ»LY
FDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬Øsμ£N" |
|||
], |
|||
["@@ifjN@s"] |
|||
], |
|||
"encodeOffsets": [[[109628, 30765]], [[111725, 31320]]] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "810000", |
|||
"properties": { |
|||
"id": "810000", |
|||
"cp": [114.173355, 22.320048], |
|||
"name": "香港", |
|||
"childNum": 5 |
|||
}, |
|||
"geometry": { |
|||
"type": "MultiPolygon", |
|||
"coordinates": [ |
|||
["@@AlBk"], |
|||
["@@mn"], |
|||
["@@EpFo"], |
|||
["@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX
´AI¹
[yDU]W`çwZkmc
MpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÈc"], |
|||
["@@rMUwAS®e"] |
|||
], |
|||
"encodeOffsets": [ |
|||
[[117111, 23002]], |
|||
[[117072, 22876]], |
|||
[[117045, 22887]], |
|||
[[116975, 23082]], |
|||
[[116882, 22747]] |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"type": "Feature", |
|||
"id": "820000", |
|||
"properties": { "id": "820000", "cp": [113.54909, 22.198951], "name": "澳门", "childNum": 1 }, |
|||
"geometry": { |
|||
"type": "Polygon", |
|||
"coordinates": ["@@kÊd°å§s"], |
|||
"encodeOffsets": [[116279, 22639]] |
|||
} |
|||
} |
|||
], |
|||
"UTF8Encoding": true |
|||
} |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 608 B |