@ -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 |