diff --git a/.env b/.env index 3c5303b5b10ab5cf949ec09c1a0804287e30b189..424b022bc0040ac5d08d164b3ce54c40f017b87e 100644 --- a/.env +++ b/.env @@ -13,5 +13,8 @@ VITE_APP_TENANT_ENABLE=true # 验证码的开关 VITE_APP_CAPTCHA_ENABLE=true +# 文档地址的开关 +VITE_APP_DOCALERT_ENABLE=true + # 百度统计 VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc diff --git a/.env.base b/.env.base deleted file mode 100644 index fdb26d8501765c4bb875b5544f0fd5d85e67a2ef..0000000000000000000000000000000000000000 --- a/.env.base +++ /dev/null @@ -1,19 +0,0 @@ -# 本地开发环境 -NODE_ENV=development - -VITE_DEV=true - -# 请求路径 -VITE_BASE_URL='http://localhost:48080' - -# 上传路径 -VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' - -# 接口前缀 -VITE_API_BASEPATH=/dev-api - -# 接口地址 -VITE_API_URL=/admin-api - -# 打包路径 -VITE_BASE_PATH=/ diff --git a/.env.dev b/.env.dev index 154d88fefc73c53a17163baff68b80ca73f23f8a..689718b283d0543fa6ee5ff433607ab9239ad8c5 100644 --- a/.env.dev +++ b/.env.dev @@ -1,13 +1,16 @@ -# 开发环境 +# 开发环境:本地只启动前端项目,依赖开发环境(后端、APP) NODE_ENV=development -VITE_DEV=false +VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://localhost:48080' +VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +# VITE_BASE_URL='http://dofast.demo.huizhizao.vip:20001' +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=server # 上传路径 -VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' +VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload' # 接口前缀 VITE_API_BASEPATH=/dev-api @@ -15,9 +18,6 @@ VITE_API_BASEPATH=/dev-api # 接口地址 VITE_API_URL=/admin-api -# 打包路径 -VITE_BASE_PATH=/ - # 是否删除debugger VITE_DROP_DEBUGGER=false @@ -27,5 +27,14 @@ VITE_DROP_CONSOLE=false # 是否sourcemap VITE_SOURCEMAP=true +# 打包路径 +VITE_BASE_PATH=/ + # 输出路径 VITE_OUT_DIR=dist + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' + +# 验证码的开关 +VITE_APP_CAPTCHA_ENABLE=false diff --git a/.env.front b/.env.local similarity index 45% rename from .env.front rename to .env.local index 1629ff9f3985fff97160f895445ba221562a6f5e..3b997668eb65e43c47613e453b4dfea477a2dd6b 100644 --- a/.env.front +++ b/.env.local @@ -1,13 +1,15 @@ -# 本地开发环境 +# 本地开发环境:本地启动所有项目(前端、后端、APP)时使用,不依赖外部环境 NODE_ENV=development VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +VITE_BASE_URL='http://localhost:48080' +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 +VITE_UPLOAD_TYPE=server # 上传路径 -VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload' +VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' # 接口前缀 VITE_API_BASEPATH=/dev-api @@ -15,12 +17,6 @@ VITE_API_BASEPATH=/dev-api # 接口地址 VITE_API_URL=/admin-api -# 打包路径 -VITE_BASE_PATH=/ - -# 项目本地运行端口号, 与.vscode/launch.json配合 -VITE_PORT=80 - # 是否删除debugger VITE_DROP_DEBUGGER=false @@ -28,7 +24,13 @@ VITE_DROP_DEBUGGER=false VITE_DROP_CONSOLE=false # 是否sourcemap -VITE_SOURCEMAP=true +VITE_SOURCEMAP=false + +# 打包路径 +VITE_BASE_PATH=/ + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://localhost:3000' # 验证码的开关 VITE_APP_CAPTCHA_ENABLE=false diff --git a/.env.pro b/.env.prod similarity index 62% rename from .env.pro rename to .env.prod index 8348e02e3cd3e49afd22fb5d9a6affb57068cd30..35d729c345ad33bbf9229ae8596b6e419a5559ed 100644 --- a/.env.pro +++ b/.env.prod @@ -1,4 +1,4 @@ -# 生产环境 +# 生产环境:只在打包时使用 NODE_ENV=production VITE_DEV=false @@ -6,6 +6,8 @@ VITE_DEV=false # 请求路径 VITE_BASE_URL='http://localhost:48080' +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=server # 上传路径 VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' @@ -28,4 +30,7 @@ VITE_SOURCEMAP=false VITE_BASE_PATH=/ # 输出路径 -VITE_OUT_DIR=dist-pro +VITE_OUT_DIR=dist-prod + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' diff --git a/.env.stage b/.env.stage index d7157fbb4995e17de4bf412f9f1f722dfc4eddad..26f9516b0e9f6da221c5b32410f7cda9d8c0bb48 100644 --- a/.env.stage +++ b/.env.stage @@ -1,4 +1,4 @@ -# 生产环境 +# 预发布环境:只在打包时使用 NODE_ENV=production VITE_DEV=false @@ -6,6 +6,8 @@ VITE_DEV=false # 请求路径 VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn' +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=server # 上传路径 VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload' @@ -29,3 +31,6 @@ VITE_BASE_PATH='http://static-vue3.yudao.iocoder.cn/' # 输出路径 VITE_OUT_DIR=dist-stage + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' diff --git a/.env.static b/.env.test similarity index 63% rename from .env.static rename to .env.test index 034a7f4d0564050a59e9852507754dda628c1474..addbfb4eb4131e04323fbaeafab0c7356195c25c 100644 --- a/.env.static +++ b/.env.test @@ -1,4 +1,4 @@ -# 开发环境 +# 测试环境:只在打包时使用 NODE_ENV=production VITE_DEV=false @@ -6,6 +6,8 @@ VITE_DEV=false # 请求路径 VITE_BASE_URL='http://localhost:48080' +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=server # 上传路径 VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' @@ -28,4 +30,7 @@ VITE_SOURCEMAP=false VITE_BASE_PATH=/admin-ui-vue3/ # 输出路径 -VITE_OUT_DIR=dist-dev +VITE_OUT_DIR=dist-test + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' diff --git a/.eslintrc.js b/.eslintrc.js index 74396bfab0ccc3005cbaf565c3f5bf7d53df3a05..b28255ca0337c2a5b962b92ab66d2d8b73eeb334 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,7 +8,6 @@ module.exports = defineConfig({ es6: true }, parser: 'vue-eslint-parser', - plugins: ['vue'], parserOptions: { parser: '@typescript-eslint/parser', ecmaVersion: 2020, @@ -26,9 +25,9 @@ module.exports = defineConfig({ '@unocss' ], rules: { + 'vue/no-setup-props-destructure': 'off', 'vue/script-setup-uses-vars': 'error', 'vue/no-reserved-component-names': 'off', - 'vue/no-setup-props-destructure': 'off', '@typescript-eslint/ban-ts-ignore': 'off', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/no-explicit-any': 'off', @@ -54,6 +53,7 @@ module.exports = defineConfig({ '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', { @@ -67,6 +67,9 @@ module.exports = defineConfig({ } ], 'vue/multi-word-component-names': 'off', - 'vue/no-v-html': 'off' + 'vue/no-v-html': 'off', + 'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件 + '@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐 + '@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐 } }) diff --git "a/.image/Java\347\233\221\346\216\247.jpg" "b/.image/Java\347\233\221\346\216\247.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6ad522ab058e02cdffa9c770e846df2514d1a29b Binary files /dev/null and "b/.image/Java\347\233\221\346\216\247.jpg" differ diff --git a/.image/MySQL.jpg b/.image/MySQL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64a1940c2236f7aa41eba6aae5f7c6e69ff44453 Binary files /dev/null and b/.image/MySQL.jpg differ diff --git "a/.image/OA\350\257\267\345\201\207-\345\210\227\350\241\250.jpg" "b/.image/OA\350\257\267\345\201\207-\345\210\227\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..787bb73fadc943777a33af6aa4690160b3ab70c8 Binary files /dev/null and "b/.image/OA\350\257\267\345\201\207-\345\210\227\350\241\250.jpg" differ diff --git "a/.image/OA\350\257\267\345\201\207-\345\217\221\350\265\267.jpg" "b/.image/OA\350\257\267\345\201\207-\345\217\221\350\265\267.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1a7342d7a7662d301e8a84ea3dd699858a133609 Binary files /dev/null and "b/.image/OA\350\257\267\345\201\207-\345\217\221\350\265\267.jpg" differ diff --git "a/.image/OA\350\257\267\345\201\207-\350\257\246\346\203\205.jpg" "b/.image/OA\350\257\267\345\201\207-\350\257\246\346\203\205.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..a83e7c148f42a300775d6f0d9e84a12db470c798 Binary files /dev/null and "b/.image/OA\350\257\267\345\201\207-\350\257\246\346\203\205.jpg" differ diff --git a/.image/Redis.jpg b/.image/Redis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..956935264ab4ba383547fbc6af50b4a961d3d091 Binary files /dev/null and b/.image/Redis.jpg differ diff --git a/.image/admin-uniapp/01.png b/.image/admin-uniapp/01.png new file mode 100644 index 0000000000000000000000000000000000000000..0f65d99e35efcfbad8b4801886eb0ad445305426 Binary files /dev/null and b/.image/admin-uniapp/01.png differ diff --git a/.image/admin-uniapp/02.png b/.image/admin-uniapp/02.png new file mode 100644 index 0000000000000000000000000000000000000000..05ec781c7d9b128a53208f71f613f3e440a4f13d Binary files /dev/null and b/.image/admin-uniapp/02.png differ diff --git a/.image/admin-uniapp/03.png b/.image/admin-uniapp/03.png new file mode 100644 index 0000000000000000000000000000000000000000..f400c68840f8f7436b30270e5b23c77e1652131b Binary files /dev/null and b/.image/admin-uniapp/03.png differ diff --git a/.image/admin-uniapp/04.png b/.image/admin-uniapp/04.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d5ea072ae594ef57f3749b2bf4f1be9284d86c Binary files /dev/null and b/.image/admin-uniapp/04.png differ diff --git a/.image/admin-uniapp/05.png b/.image/admin-uniapp/05.png new file mode 100644 index 0000000000000000000000000000000000000000..1de6d8ae146a3195f5a7709e4e5637b951727083 Binary files /dev/null and b/.image/admin-uniapp/05.png differ diff --git a/.image/admin-uniapp/06.png b/.image/admin-uniapp/06.png new file mode 100644 index 0000000000000000000000000000000000000000..400ae90b1f317c29e5b3dce3fde1e8d2cfd830ed Binary files /dev/null and b/.image/admin-uniapp/06.png differ diff --git a/.image/admin-uniapp/07.png b/.image/admin-uniapp/07.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed8c0ff6e16b1bbc887058b3f6a71e6334db105 Binary files /dev/null and b/.image/admin-uniapp/07.png differ diff --git a/.image/admin-uniapp/08.png b/.image/admin-uniapp/08.png new file mode 100644 index 0000000000000000000000000000000000000000..090e64a67838e036b06c03f9c0f9325ac5298461 Binary files /dev/null and b/.image/admin-uniapp/08.png differ diff --git a/.image/admin-uniapp/09.png b/.image/admin-uniapp/09.png new file mode 100644 index 0000000000000000000000000000000000000000..f2032c8a862330a9319417c6bc6a66901eff6f28 Binary files /dev/null and b/.image/admin-uniapp/09.png differ diff --git a/.image/common/crm-feature.png b/.image/common/crm-feature.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c9670c6f75efea1fbd265dea410a60ad672cf9 Binary files /dev/null and b/.image/common/crm-feature.png differ diff --git a/.image/common/erp-feature.png b/.image/common/erp-feature.png new file mode 100644 index 0000000000000000000000000000000000000000..d30b30eed9d4e072c61ebf3bb63809b2b5593078 Binary files /dev/null and b/.image/common/erp-feature.png differ diff --git a/.image/common/mall-feature.png b/.image/common/mall-feature.png new file mode 100644 index 0000000000000000000000000000000000000000..cca05c0e69f38bdc7f80f1d23c34b31df4e7bf1b Binary files /dev/null and b/.image/common/mall-feature.png differ diff --git a/.image/common/mall-preview.png b/.image/common/mall-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f939214bf86d062edff626aef5c10d0d0f525676 Binary files /dev/null and b/.image/common/mall-preview.png differ diff --git a/.image/common/project-vs.png b/.image/common/project-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..561e092f4ad9c4907e7af0769ef8fae54c29c049 Binary files /dev/null and b/.image/common/project-vs.png differ diff --git a/.image/common/ruoyi-vue-pro-architecture.png b/.image/common/ruoyi-vue-pro-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd7d59ab6507684788633037e4874e097da5790 Binary files /dev/null and b/.image/common/ruoyi-vue-pro-architecture.png differ diff --git a/.image/common/ruoyi-vue-pro-biz.png b/.image/common/ruoyi-vue-pro-biz.png new file mode 100644 index 0000000000000000000000000000000000000000..24a385abe2ad0a8e9546ce8f90ec1383089fd867 Binary files /dev/null and b/.image/common/ruoyi-vue-pro-biz.png differ diff --git a/.image/common/yudao-cloud-architecture.png b/.image/common/yudao-cloud-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..59416d8068149b31b7ac24bc4833301504fadc82 Binary files /dev/null and b/.image/common/yudao-cloud-architecture.png differ diff --git a/.image/common/yudao-roadmap.png b/.image/common/yudao-roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..f4becc98cf0ab865c9a6ba7782ce4c676c5aef8b Binary files /dev/null and b/.image/common/yudao-roadmap.png differ diff --git "a/.image/\344\270\252\344\272\272\344\270\255\345\277\203.jpg" "b/.image/\344\270\252\344\272\272\344\270\255\345\277\203.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ce57f6e1e374cc7f7284876a2c3e9b9d351fa06a Binary files /dev/null and "b/.image/\344\270\252\344\272\272\344\270\255\345\277\203.jpg" differ diff --git "a/.image/\344\273\243\347\240\201\347\224\237\346\210\220.jpg" "b/.image/\344\273\243\347\240\201\347\224\237\346\210\220.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..751603efbdceb0e6a318781cc64f0327672c2738 Binary files /dev/null and "b/.image/\344\273\243\347\240\201\347\224\237\346\210\220.jpg" differ diff --git "a/.image/\344\273\244\347\211\214\347\256\241\347\220\206.jpg" "b/.image/\344\273\244\347\211\214\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..04abf4d21ec75f2a4c521329c16c007058c55e6b Binary files /dev/null and "b/.image/\344\273\244\347\211\214\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\256\241\346\211\271.jpg" "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\256\241\346\211\271.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..cba312a0eb6373df1f62ad48a20c092b456938d6 Binary files /dev/null and "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\256\241\346\211\271.jpg" differ diff --git "a/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\267\262\345\212\236.jpg" "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\267\262\345\212\236.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7a8d0fb172876aa1450448aa635dfaf3bfff2b16 Binary files /dev/null and "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\267\262\345\212\236.jpg" differ diff --git "a/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\276\205\345\212\236.jpg" "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\276\205\345\212\236.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..a90323fb109b32fdb907ede708a6f4df9c370705 Binary files /dev/null and "b/.image/\344\273\273\345\212\241\345\210\227\350\241\250-\345\276\205\345\212\236.jpg" differ diff --git "a/.image/\344\273\273\345\212\241\346\227\245\345\277\227.jpg" "b/.image/\344\273\273\345\212\241\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..599e50a9c08e49a8ac8115eb12fa9ce2f302a1db Binary files /dev/null and "b/.image/\344\273\273\345\212\241\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\345\225\206\346\210\267\344\277\241\346\201\257.jpg" "b/.image/\345\225\206\346\210\267\344\277\241\346\201\257.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..483eace148288de75d33c60e4fd10f7df3792df0 Binary files /dev/null and "b/.image/\345\225\206\346\210\267\344\277\241\346\201\257.jpg" differ diff --git "a/.image/\345\234\250\347\272\277\347\224\250\346\210\267.jpg" "b/.image/\345\234\250\347\272\277\347\224\250\346\210\267.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b183009b6f497df04f680bd21fc685d33f13b0f0 Binary files /dev/null and "b/.image/\345\234\250\347\272\277\347\224\250\346\210\267.jpg" differ diff --git "a/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\345\210\227\350\241\250.jpg" "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\345\210\227\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..9a45c3bd1c7e3a333994b85a97ff2bda605378dd Binary files /dev/null and "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\345\210\227\350\241\250.jpg" differ diff --git "a/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\347\274\226\350\276\221.jpg" "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\347\274\226\350\276\221.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..63298a0c14690f698dc3d93bb92fb668e1ade8c0 Binary files /dev/null and "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\347\274\226\350\276\221.jpg" differ diff --git "a/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\351\242\204\350\247\210.jpg" "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\351\242\204\350\247\210.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..501d9ea2cdd3e98ea72a49f8d126910b0d09fa5f Binary files /dev/null and "b/.image/\345\244\247\345\261\217\350\256\276\350\256\241\345\231\250-\351\242\204\350\247\210.jpg" differ diff --git "a/.image/\345\255\227\345\205\270\346\225\260\346\215\256.jpg" "b/.image/\345\255\227\345\205\270\346\225\260\346\215\256.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..8298c893f7294bf47b0b4ceb9f32bd732a09a509 Binary files /dev/null and "b/.image/\345\255\227\345\205\270\346\225\260\346\215\256.jpg" differ diff --git "a/.image/\345\255\227\345\205\270\347\261\273\345\236\213.jpg" "b/.image/\345\255\227\345\205\270\347\261\273\345\236\213.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6613392f6271d21f75b98a9e955cfa8492157680 Binary files /dev/null and "b/.image/\345\255\227\345\205\270\347\261\273\345\236\213.jpg" differ diff --git "a/.image/\345\256\232\346\227\266\344\273\273\345\212\241.jpg" "b/.image/\345\256\232\346\227\266\344\273\273\345\212\241.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..d5bbd8510648bf6d9c85530e441fb6e86f2f6a43 Binary files /dev/null and "b/.image/\345\256\232\346\227\266\344\273\273\345\212\241.jpg" differ diff --git "a/.image/\345\262\227\344\275\215\347\256\241\347\220\206.jpg" "b/.image/\345\262\227\344\275\215\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..42b64d2c62075bff5457738f7450f860ab098c58 Binary files /dev/null and "b/.image/\345\262\227\344\275\215\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\345\210\227\350\241\250.jpg" "b/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\345\210\227\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..da419a24a43ae7813d5aac6ef8d23286fe9bf015 Binary files /dev/null and "b/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\345\210\227\350\241\250.jpg" differ diff --git "a/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\347\274\226\350\276\221.jpg" "b/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\347\274\226\350\276\221.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..913cfbc810581453510119d5b20d43294af89551 Binary files /dev/null and "b/.image/\345\272\224\347\224\250\344\277\241\346\201\257-\347\274\226\350\276\221.jpg" differ diff --git "a/.image/\345\272\224\347\224\250\347\256\241\347\220\206.jpg" "b/.image/\345\272\224\347\224\250\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6e7789fca613011aaed85a14a6df35b3b140b887 Binary files /dev/null and "b/.image/\345\272\224\347\224\250\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\210\227\350\241\250.jpg" "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\210\227\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..223d17afac065c5282dc96e4b7052c03f02260aa Binary files /dev/null and "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\210\227\350\241\250.jpg" differ diff --git "a/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\217\221\350\265\267.jpg" "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\217\221\350\265\267.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7a833062bee21cef8bd776618f4fc94014646104 Binary files /dev/null and "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\345\217\221\350\265\267.jpg" differ diff --git "a/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\350\257\246\346\203\205.jpg" "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\350\257\246\346\203\205.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6a01541823c492d9a1be0f39b83d2434446484ca Binary files /dev/null and "b/.image/\346\210\221\347\232\204\346\265\201\347\250\213-\350\257\246\346\203\205.jpg" differ diff --git "a/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\345\233\276\345\275\242\346\212\245\350\241\250.jpg" "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\345\233\276\345\275\242\346\212\245\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..681b3185289d600a06876cbf91aa7b2bdf9aac38 Binary files /dev/null and "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\345\233\276\345\275\242\346\212\245\350\241\250.jpg" differ diff --git "a/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\211\223\345\215\260\350\256\276\350\256\241.jpg" "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\211\223\345\215\260\350\256\276\350\256\241.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..bb86da64ef9e4cc5a822a9859710b4bdca8d026b Binary files /dev/null and "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\211\223\345\215\260\350\256\276\350\256\241.jpg" differ diff --git "a/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\225\260\346\215\256\346\212\245\350\241\250.jpg" "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\225\260\346\215\256\346\212\245\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..9ca5b9b646db07ee9da67a2524071bd3e0ef2746 Binary files /dev/null and "b/.image/\346\212\245\350\241\250\350\256\276\350\256\241\345\231\250-\346\225\260\346\215\256\346\212\245\350\241\250.jpg" differ diff --git "a/.image/\346\223\215\344\275\234\346\227\245\345\277\227.jpg" "b/.image/\346\223\215\344\275\234\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..4a0611a34dc8f3c5be90275ea679ef91f11f144a Binary files /dev/null and "b/.image/\346\223\215\344\275\234\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\346\224\257\344\273\230\350\256\242\345\215\225.jpg" "b/.image/\346\224\257\344\273\230\350\256\242\345\215\225.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..0a56dd74d0ec1172045b1322f058e6e7ea3873fe Binary files /dev/null and "b/.image/\346\224\257\344\273\230\350\256\242\345\215\225.jpg" differ diff --git "a/.image/\346\225\217\346\204\237\350\257\215.jpg" "b/.image/\346\225\217\346\204\237\350\257\215.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..92a539747bd7754521defe1b61c05b5749eec7fe Binary files /dev/null and "b/.image/\346\225\217\346\204\237\350\257\215.jpg" differ diff --git "a/.image/\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243.jpg" "b/.image/\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..a4339d96001a76e59d8315b97c176f835d00ad97 Binary files /dev/null and "b/.image/\346\225\260\346\215\256\345\272\223\346\226\207\346\241\243.jpg" differ diff --git "a/.image/\346\226\207\344\273\266\347\256\241\347\220\206.jpg" "b/.image/\346\226\207\344\273\266\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..054b19f1e4c6eccbb8f52fdb6aeb5b95c18506f0 Binary files /dev/null and "b/.image/\346\226\207\344\273\266\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\346\226\207\344\273\266\347\256\241\347\220\2062.jpg" "b/.image/\346\226\207\344\273\266\347\256\241\347\220\2062.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b12e5c3cca55d4b5566ea70f208188113b0bb0bb Binary files /dev/null and "b/.image/\346\226\207\344\273\266\347\256\241\347\220\2062.jpg" differ diff --git "a/.image/\346\226\207\344\273\266\351\205\215\347\275\256.jpg" "b/.image/\346\226\207\344\273\266\351\205\215\347\275\256.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..e618049aeced471af6beb47b2d599408981e086e Binary files /dev/null and "b/.image/\346\226\207\344\273\266\351\205\215\347\275\256.jpg" differ diff --git "a/.image/\346\227\245\345\277\227\344\270\255\345\277\203.jpg" "b/.image/\346\227\245\345\277\227\344\270\255\345\277\203.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..27c1c6cb55c8880703cd3880aa5ec669aeb7bbb1 Binary files /dev/null and "b/.image/\346\227\245\345\277\227\344\270\255\345\277\203.jpg" differ diff --git "a/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\210\227\350\241\250.jpg" "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\210\227\350\241\250.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ffdc58405791ecb5fa568f5b735ac85d61c7d4af Binary files /dev/null and "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\210\227\350\241\250.jpg" differ diff --git "a/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\256\232\344\271\211.jpg" "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\256\232\344\271\211.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..18b316c7cc34ac307b47d45fb9b1c96c9f9064b4 Binary files /dev/null and "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\345\256\232\344\271\211.jpg" differ diff --git "a/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\350\256\276\350\256\241.jpg" "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\350\256\276\350\256\241.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..961496905ee6a46814a47f3e203a9244d9ac71da Binary files /dev/null and "b/.image/\346\265\201\347\250\213\346\250\241\345\236\213-\350\256\276\350\256\241.jpg" differ diff --git "a/.image/\346\265\201\347\250\213\350\241\250\345\215\225.jpg" "b/.image/\346\265\201\347\250\213\350\241\250\345\215\225.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..60669c148bc32e7a544daedfde464a267e9b2c0a Binary files /dev/null and "b/.image/\346\265\201\347\250\213\350\241\250\345\215\225.jpg" differ diff --git "a/.image/\347\224\237\346\210\220\346\225\210\346\236\234.jpg" "b/.image/\347\224\237\346\210\220\346\225\210\346\236\234.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..98ff2cca592c991167ca494130a77067e70cd31b Binary files /dev/null and "b/.image/\347\224\237\346\210\220\346\225\210\346\236\234.jpg" differ diff --git "a/.image/\347\224\250\346\210\267\345\210\206\347\273\204.jpg" "b/.image/\347\224\250\346\210\267\345\210\206\347\273\204.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..39af1cd19e0a876e5abf1e5f0de5d435f2939b7b Binary files /dev/null and "b/.image/\347\224\250\346\210\267\345\210\206\347\273\204.jpg" differ diff --git "a/.image/\347\224\250\346\210\267\347\256\241\347\220\206.jpg" "b/.image/\347\224\250\346\210\267\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..844604a6465a4e933324decac220d52e737509d9 Binary files /dev/null and "b/.image/\347\224\250\346\210\267\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\347\231\273\345\275\225.jpg" "b/.image/\347\231\273\345\275\225.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..b782b988c20126c370b010f872b96c46494a1ff9 Binary files /dev/null and "b/.image/\347\231\273\345\275\225.jpg" differ diff --git "a/.image/\347\231\273\345\275\225\346\227\245\345\277\227.jpg" "b/.image/\347\231\273\345\275\225\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25662d97bb5e32f554344a497215f596241271c2 Binary files /dev/null and "b/.image/\347\231\273\345\275\225\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\347\237\255\344\277\241\346\227\245\345\277\227.jpg" "b/.image/\347\237\255\344\277\241\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ada8e56db368cdd12742bb9d6ad1ce5f48553af0 Binary files /dev/null and "b/.image/\347\237\255\344\277\241\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\347\237\255\344\277\241\346\250\241\346\235\277.jpg" "b/.image/\347\237\255\344\277\241\346\250\241\346\235\277.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..09381cc51096a52f6ceb450c4f13f8fbf7750a38 Binary files /dev/null and "b/.image/\347\237\255\344\277\241\346\250\241\346\235\277.jpg" differ diff --git "a/.image/\347\237\255\344\277\241\346\270\240\351\201\223.jpg" "b/.image/\347\237\255\344\277\241\346\270\240\351\201\223.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..df3a5c39b528212206ac4018d444841ab88a9754 Binary files /dev/null and "b/.image/\347\237\255\344\277\241\346\270\240\351\201\223.jpg" differ diff --git "a/.image/\347\247\237\346\210\267\345\245\227\351\244\220.png" "b/.image/\347\247\237\346\210\267\345\245\227\351\244\220.png" new file mode 100644 index 0000000000000000000000000000000000000000..966316798cf0dd19b8286893364b07762fd39859 Binary files /dev/null and "b/.image/\347\247\237\346\210\267\345\245\227\351\244\220.png" differ diff --git "a/.image/\347\247\237\346\210\267\347\256\241\347\220\206.jpg" "b/.image/\347\247\237\346\210\267\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..647416a9fec1db5fd452f64d42319faa691f2e35 Binary files /dev/null and "b/.image/\347\247\237\346\210\267\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\347\263\273\347\273\237\346\216\245\345\217\243.jpg" "b/.image/\347\263\273\347\273\237\346\216\245\345\217\243.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6d39d42113cbc6cc53bd75148969d2ef09227d2d Binary files /dev/null and "b/.image/\347\263\273\347\273\237\346\216\245\345\217\243.jpg" differ diff --git "a/.image/\350\217\234\345\215\225\347\256\241\347\220\206.jpg" "b/.image/\350\217\234\345\215\225\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ad3b7979c005e228391b9e13862ce50fdd57c2ff Binary files /dev/null and "b/.image/\350\217\234\345\215\225\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\350\241\250\345\215\225\346\236\204\345\273\272.jpg" "b/.image/\350\241\250\345\215\225\346\236\204\345\273\272.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..81f03746604f05046da91b3508737bc9a6d508d1 Binary files /dev/null and "b/.image/\350\241\250\345\215\225\346\236\204\345\273\272.jpg" differ diff --git "a/.image/\350\247\222\350\211\262\347\256\241\347\220\206.jpg" "b/.image/\350\247\222\350\211\262\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..eed776e86707be8f7267e027b5af5fa10950a3d4 Binary files /dev/null and "b/.image/\350\247\222\350\211\262\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\350\256\277\351\227\256\346\227\245\345\277\227.jpg" "b/.image/\350\256\277\351\227\256\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ef301aad4ab4ae0331f9687140651af45afeb11a Binary files /dev/null and "b/.image/\350\256\277\351\227\256\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\351\200\200\346\254\276\350\256\242\345\215\225.jpg" "b/.image/\351\200\200\346\254\276\350\256\242\345\215\225.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..2c6c6c9eead03fcd1ca407338f2a45b1c52bcdaa Binary files /dev/null and "b/.image/\351\200\200\346\254\276\350\256\242\345\215\225.jpg" differ diff --git "a/.image/\351\200\232\347\237\245\345\205\254\345\221\212.jpg" "b/.image/\351\200\232\347\237\245\345\205\254\345\221\212.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..97bb42fe41da44237cc541af4701efbecd23ea97 Binary files /dev/null and "b/.image/\351\200\232\347\237\245\345\205\254\345\221\212.jpg" differ diff --git "a/.image/\351\203\250\351\227\250\347\256\241\347\220\206.jpg" "b/.image/\351\203\250\351\227\250\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..6eab2330c23e4e9367b956ac0a2eb01707a2aaae Binary files /dev/null and "b/.image/\351\203\250\351\227\250\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\351\205\215\347\275\256\347\256\241\347\220\206.jpg" "b/.image/\351\205\215\347\275\256\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..0abaec932e653c3316bd01b10832f02ed79cb653 Binary files /dev/null and "b/.image/\351\205\215\347\275\256\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\351\223\276\350\267\257\350\277\275\350\270\252.jpg" "b/.image/\351\223\276\350\267\257\350\277\275\350\270\252.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..12f7aa8efcb23a75153f321c128f4f1274e69579 Binary files /dev/null and "b/.image/\351\223\276\350\267\257\350\277\275\350\270\252.jpg" differ diff --git "a/.image/\351\224\231\350\257\257\346\227\245\345\277\227.jpg" "b/.image/\351\224\231\350\257\257\346\227\245\345\277\227.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..eb615ea3f88a92ea71b1239ff06bdfbbfa7be375 Binary files /dev/null and "b/.image/\351\224\231\350\257\257\346\227\245\345\277\227.jpg" differ diff --git "a/.image/\351\224\231\350\257\257\347\240\201\347\256\241\347\220\206.jpg" "b/.image/\351\224\231\350\257\257\347\240\201\347\256\241\347\220\206.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..ea91dde14b3c038d06eadd0c863384187f1ddaca Binary files /dev/null and "b/.image/\351\224\231\350\257\257\347\240\201\347\256\241\347\220\206.jpg" differ diff --git "a/.image/\351\246\226\351\241\265.jpg" "b/.image/\351\246\226\351\241\265.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..10a7fde7611d7fcaf43bcc4ee79a5f4d12e7cd69 Binary files /dev/null and "b/.image/\351\246\226\351\241\265.jpg" differ diff --git a/.vscode/launch.json b/.vscode/launch.json index ec5310268ee2aa35863460709e8f9b2141ba5156..f43edc03b0fd2c3fb5bcd95e0a5a3f475d4711c1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,12 +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": [ { - "name": "Launch debug", + "type": "msedge", "request": "launch", - "type": "chrome", + "name": "Launch Edge against localhost", "url": "http://localhost", - "webRoot": "${workspaceFolder}/src" + "webRoot": "${workspaceFolder}/src", + "sourceMaps": true } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 45156944ad08b4aea4df6227634943c14f80c37c..54be7d8c0fefc004bfc289693efd51744a709e78 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "typescript.tsdk": "./node_modules/typescript/lib", + "typescript.tsdk": "node_modules/typescript/lib", "npm.packageManager": "pnpm", "editor.tabSize": 2, "prettier.printWidth": 100, // 超过最大值换行 @@ -83,18 +83,15 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "[vue]": { - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, - "source.fixAll.stylelint": true - } + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" }, "i18n-ally.localesPaths": ["src/locales"], "i18n-ally.keystyle": "nested", "i18n-ally.sortKeys": true, - "i18n-ally.namespace": true, + "i18n-ally.namespace": false, "i18n-ally.enabledParsers": ["ts"], "i18n-ally.sourceLanguage": "en", "i18n-ally.displayLanguage": "zh-CN", @@ -105,6 +102,7 @@ "codemirror", "commitlint", "cropperjs", + "echart", "echarts", "esnext", "esno", @@ -119,10 +117,12 @@ "sider", "sortablejs", "stylelint", + "svgs", "unocss", "unplugin", "unref", "videojs", + "VITE", "vitejs", "vueuse", "wangeditor", diff --git a/README.md b/README.md index 8466bbc367556d501315e2d2e4879e5c71208ab1..f78b0cbadacbe02c91cc91e4e6139ab90487374e 100644 --- a/README.md +++ b/README.md @@ -38,15 +38,15 @@ | 框架 | 说明 | 版本 | |----------------------------------------------------------------------|------------------|--------| -| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.3.4 | -| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.4.9 | -| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.3.14 | +| [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.3.8 | +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.5.0 | +| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.4.2 | | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 5.2.2 | -| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.6 | -| [vueuse](https://vueuse.org/) | 常用工具集 | 10.4.1 | -| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.4.1 | +| [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.1.7 | +| [vueuse](https://vueuse.org/) | 常用工具集 | 10.6.1 | +| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.6.5 | | [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.2.5 | -| [unocss](https://uno.antfu.me/) | 原子 css | 0.56.1 | +| [unocss](https://uno.antfu.me/) | 原子 css | 0.57.4 | | [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.1.1 | | [wangeditor](https://www.wangeditor.com/) | 富文本编辑器 | 5.1.23 | @@ -66,6 +66,18 @@ | ESLint | 脚本代码检查 | | DotENV | env 文件高亮 | +## 🔥 后端架构 + +支持 Spring Boot、Spring Cloud 两种架构: + +① Spring Boot 单体架构: + +![架构图](/.image/common/ruoyi-vue-pro-architecture.png) + +② Spring Cloud 微服务架构: + +![架构图](/.image/common/yudao-cloud-architecture.png) + ## 内置功能 系统内置多种多种业务功能,可以用于快速你的业务系统: @@ -78,6 +90,8 @@ * 数据报表 * 商城系统 * 微信公众号 +* ERP 系统 +* CRM 系统 ### 系统功能 @@ -174,62 +188,74 @@ ps:核心功能已经实现,正在对接微信小程序中... ### 商城系统 -建设中... +![功能图](/.image/common/mall-feature.png) + +![功能图](/.image/common/mall-preview.png) + +_前端基于 crmeb uniapp 经过授权重构,优化代码实现,接入芋道快速开发平台_ + +演示地址: + +### ERP 系统 + +![功能图](/.image/common/erp-feature.png) + +演示地址: -![功能图](http://static.iocoder.cn/mall%20%E5%8A%9F%E8%83%BD%E5%9B%BE-min.png) +### CRM 系统 -![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-admin-min.gif) +![功能图](/.image/common/crm-feature.png) -![GIF 图-耐心等待](https://raw.githubusercontent.com/YunaiV/Blog/master/Mall/onemall-h5-min.gif) +演示地址: ## 🐷 演示图 ### 系统功能 -| 模块 | biu | biu | biu | -|------------|--------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------| -| 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg?imageView2/2/format/webp/w/1280) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg?imageView2/2/format/webp/w/1280) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg?imageView2/2/format/webp/w/1280) | -| 用户 & 应用 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg?imageView2/2/format/webp/w/1280) | ![令牌管理](https://static.iocoder.cn/images/ruoyi-vue-pro/令牌管理.jpg?imageView2/2/format/webp/w/1280) | ![应用管理](https://static.iocoder.cn/images/ruoyi-vue-pro/应用管理.jpg?imageView2/2/format/webp/w/1280) | -| 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg?imageView2/2/format/webp/w/1280) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - | -| 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg?imageView2/2/format/webp/w/1280) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg?imageView2/2/format/webp/w/1280) | - | -| 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg?imageView2/2/format/webp/w/1280) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg?imageView2/2/format/webp/w/1280) | - | -| 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg?imageView2/2/format/webp/w/1280) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg?imageView2/2/format/webp/w/1280) | - | -| 短信 | ![短信渠道](https://static.iocoder.cn/images/ruoyi-vue-pro/短信渠道.jpg?imageView2/2/format/webp/w/1280) | ![短信模板](https://static.iocoder.cn/images/ruoyi-vue-pro/短信模板.jpg?imageView2/2/format/webp/w/1280) | ![短信日志](https://static.iocoder.cn/images/ruoyi-vue-pro/短信日志.jpg?imageView2/2/format/webp/w/1280) | -| 字典 & 敏感词 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg?imageView2/2/format/webp/w/1280) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg?imageView2/2/format/webp/w/1280) | ![敏感词](https://static.iocoder.cn/images/ruoyi-vue-pro/敏感词.jpg?imageView2/2/format/webp/w/1280) | -| 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg?imageView2/2/format/webp/w/1280) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg?imageView2/2/format/webp/w/1280) | - | +| 模块 | biu | biu | biu | +|----------|-----------------------------|---------------------------|--------------------------| +| 登录 & 首页 | ![登录](/.image/登录.jpg) | ![首页](/.image/首页.jpg) | ![个人中心](/.image/个人中心.jpg) | +| 用户 & 应用 | ![用户管理](/.image/用户管理.jpg) | ![令牌管理](/.image/令牌管理.jpg) | ![应用管理](/.image/应用管理.jpg) | +| 租户 & 套餐 | ![租户管理](/.image/租户管理.jpg) | ![租户套餐](/.image/租户套餐.png) | - | +| 部门 & 岗位 | ![部门管理](/.image/部门管理.jpg) | ![岗位管理](/.image/岗位管理.jpg) | - | +| 菜单 & 角色 | ![菜单管理](/.image/菜单管理.jpg) | ![角色管理](/.image/角色管理.jpg) | - | +| 审计日志 | ![操作日志](/.image/操作日志.jpg) | ![登录日志](/.image/登录日志.jpg) | - | +| 短信 | ![短信渠道](/.image/短信渠道.jpg) | ![短信模板](/.image/短信模板.jpg) | ![短信日志](/.image/短信日志.jpg) | +| 字典 & 敏感词 | ![字典类型](/.image/字典类型.jpg) | ![字典数据](/.image/字典数据.jpg) | ![敏感词](/.image/敏感词.jpg) | +| 错误码 & 通知 | ![错误码管理](/.image/错误码管理.jpg) | ![通知公告](/.image/通知公告.jpg) | - | ### 工作流程 -| 模块 | biu | biu | biu | -|---------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| -| 流程模型 | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg?imageView2/2/format/webp/w/1280) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg?imageView2/2/format/webp/w/1280) | -| 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg?imageView2/2/format/webp/w/1280) | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg?imageView2/2/format/webp/w/1280) | - | -| 我的流程 | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg?imageView2/2/format/webp/w/1280) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg?imageView2/2/format/webp/w/1280) | -| 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg?imageView2/2/format/webp/w/1280) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg?imageView2/2/format/webp/w/1280) | -| OA 请假 | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg?imageView2/2/format/webp/w/1280) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg?imageView2/2/format/webp/w/1280) | +| 模块 | biu | biu | biu | +|---------|---------------------------------|---------------------------------|---------------------------------| +| 流程模型 | ![流程模型-列表](/.image/流程模型-列表.jpg) | ![流程模型-设计](/.image/流程模型-设计.jpg) | ![流程模型-定义](/.image/流程模型-定义.jpg) | +| 表单 & 分组 | ![流程表单](/.image/流程表单.jpg) | ![用户分组](/.image/用户分组.jpg) | - | +| 我的流程 | ![我的流程-列表](/.image/我的流程-列表.jpg) | ![我的流程-发起](/.image/我的流程-发起.jpg) | ![我的流程-详情](/.image/我的流程-详情.jpg) | +| 待办 & 已办 | ![任务列表-审批](/.image/任务列表-审批.jpg) | ![任务列表-待办](/.image/任务列表-待办.jpg) | ![任务列表-已办](/.image/任务列表-已办.jpg) | +| OA 请假 | ![OA请假-列表](/.image/OA请假-列表.jpg) | ![OA请假-发起](/.image/OA请假-发起.jpg) | ![OA请假-详情](/.image/OA请假-详情.jpg) | ### 基础设施 -| 模块 | biu | biu | biu | -|---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------| -| 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg?imageView2/2/format/webp/w/1280) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg?imageView2/2/format/webp/w/1280) | - | -| 文档 | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg?imageView2/2/format/webp/w/1280) | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg?imageView2/2/format/webp/w/1280) | - | -| 文件 & 配置 | ![文件配置](https://static.iocoder.cn/images/ruoyi-vue-pro/文件配置.jpg?imageView2/2/format/webp/w/1280) | ![文件管理](https://static.iocoder.cn/images/ruoyi-vue-pro/文件管理2.jpg?imageView2/2/format/webp/w/1280) | ![配置管理](https://static.iocoder.cn/images/ruoyi-vue-pro/配置管理.jpg?imageView2/2/format/webp/w/1280) | -| 定时任务 | ![定时任务](https://static.iocoder.cn/images/ruoyi-vue-pro/定时任务.jpg?imageView2/2/format/webp/w/1280) | ![任务日志](https://static.iocoder.cn/images/ruoyi-vue-pro/任务日志.jpg?imageView2/2/format/webp/w/1280) | - | -| API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg?imageView2/2/format/webp/w/1280) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg?imageView2/2/format/webp/w/1280) | - | -| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg?imageView2/2/format/webp/w/1280) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg?imageView2/2/format/webp/w/1280) | - | -| 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg?imageView2/2/format/webp/w/1280) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg?imageView2/2/format/webp/w/1280) | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg?imageView2/2/format/webp/w/1280) | +| 模块 | biu | biu | biu | +|---------------|-------------------------------|-----------------------------|---------------------------| +| 代码生成 | ![代码生成](/.image/代码生成.jpg) | ![生成效果](/.image/生成效果.jpg) | - | +| 文档 | ![系统接口](/.image/系统接口.jpg) | ![数据库文档](/.image/数据库文档.jpg) | - | +| 文件 & 配置 | ![文件配置](/.image/文件配置.jpg) | ![文件管理](/.image/文件管理2.jpg) | ![配置管理](/.image/配置管理.jpg) | +| 定时任务 | ![定时任务](/.image/定时任务.jpg) | ![任务日志](/.image/任务日志.jpg) | - | +| API 日志 | ![访问日志](/.image/访问日志.jpg) | ![错误日志](/.image/错误日志.jpg) | - | +| MySQL & Redis | ![MySQL](/.image/MySQL.jpg) | ![Redis](/.image/Redis.jpg) | - | +| 监控平台 | ![Java监控](/.image/Java监控.jpg) | ![链路追踪](/.image/链路追踪.jpg) | ![日志中心](/.image/日志中心.jpg) | ### 支付系统 -| 模块 | biu | biu | biu | -|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------| -| 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg?imageView2/2/format/webp/w/1280) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg?imageView2/2/format/webp/w/1280) | -| 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg?imageView2/2/format/webp/w/1280) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg?imageView2/2/format/webp/w/1280) | --- | +| 模块 | biu | biu | biu | +|---------|---------------------------|---------------------------------|---------------------------------| +| 商家 & 应用 | ![商户信息](/.image/商户信息.jpg) | ![应用信息-列表](/.image/应用信息-列表.jpg) | ![应用信息-编辑](/.image/应用信息-编辑.jpg) | +| 支付 & 退款 | ![支付订单](/.image/支付订单.jpg) | ![退款订单](/.image/退款订单.jpg) | --- | ### 数据报表 -| 模块 | biu | biu | biu | -|-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| -| 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) | -| 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280) | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280) | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280) | +| 模块 | biu | biu | biu | +|-------|---------------------------------|---------------------------------|---------------------------------------| +| 报表设计器 | ![数据报表](/.image/报表设计器-数据报表.jpg) | ![图形报表](/.image/报表设计器-图形报表.jpg) | ![报表设计器-打印设计](/.image/报表设计器-打印设计.jpg) | +| 大屏设计器 | ![大屏列表](/.image/大屏设计器-列表.jpg) | ![大屏预览](/.image/大屏设计器-预览.jpg) | ![大屏编辑](/.image/大屏设计器-编辑.jpg) | diff --git a/build/vite/index.ts b/build/vite/index.ts index bdda98d0540d0bef58b662c65340ad56dc498aa5..2a6f13112c1903eff8f556052110ae79e418f1a9 100644 --- a/build/vite/index.ts +++ b/build/vite/index.ts @@ -5,6 +5,7 @@ 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' @@ -17,10 +18,12 @@ import UnoCSS from 'unocss/vite' export function createVitePlugins() { const root = process.cwd() + // 路径查找 function pathResolve(dir: string) { return resolve(root, '.', dir) } + return [ Vue(), VueJsx(), @@ -59,18 +62,11 @@ export function createVitePlugins() { } }), Components({ - // 要搜索组件的目录的相对路径 - dirs: ['src/components'], - // 组件的有效文件扩展名 - extensions: ['vue', 'md'], - // 搜索子目录 - deep: true, - include: [/\.vue$/, /\.vue\?vue/], // 生成自定义 `auto-components.d.ts` 全局声明 dts: 'src/types/auto-components.d.ts', // 自定义组件的解析器 resolvers: [ElementPlusResolver()], - exclude: [/[\\/]node_modules[\\/]/] + globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**'] }), EslintPlugin({ cache: false, diff --git a/build/vite/optimize.ts b/build/vite/optimize.ts index 25b5f4ccffd6ee1dc002e7a1214accf3805d0098..2ec5d2e8fff7dea3ee412aa3b8ce910639990378 100644 --- a/build/vite/optimize.ts +++ b/build/vite/optimize.ts @@ -17,7 +17,6 @@ const include = [ 'cropperjs', 'lodash-es', 'nprogress', - 'animate.css', 'vxe-table', 'vxe-table/es/style', 'vxe-table/lib/locale/lang/zh-CN', diff --git a/package.json b/package.json index 03bc55ecad84f526cfac7d0bfb4ca0d7ee6ddd1a..54d05bbe4ea1c44fe550d73f4f28806252d20b64 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,22 @@ { "name": "yudao-ui-admin-vue3", - "version": "1.8.2-snapshot", + "version": "2.0.1-snapshot", "description": "基于vue3、vite4、element-plus、typesScript", "author": "xingyu", "private": false, "scripts": { "i": "pnpm install", - "dev": "vite --mode base", - "front": "vite --mode front", + "dev": "vite --mode local-dev", + "dev-server": "vite --mode dev", "ts:check": "vue-tsc --noEmit", - "build:pro": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode pro", - "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev", - "build:base": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode base", + "build:local-dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev", + "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode local-dev", + "build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test", "build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage", - "build:static": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode static", - "build:front": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode front", - "serve:pro": "vite preview --mode pro", + "build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod", "serve:dev": "vite preview --mode dev", - "preview": "pnpm build:base && vite preview", + "serve:prod": "vite preview --mode prod", + "preview": "pnpm build:local-dev && vite preview", "clean": "npx rimraf node_modules", "clean:cache": "npx rimraf node_modules/.cache", "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", @@ -31,105 +30,104 @@ "@form-create/element-ui": "^3.1.24", "@iconify/iconify": "^3.1.1", "@videojs-player/vue": "^1.0.0", - "@vueuse/core": "^10.4.1", + "@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.5.0", + "axios": "^1.6.7", "benz-amr-recorder": "^1.1.5", "bpmn-js-token-simulation": "^0.10.0", "camunda-bpmn-moddle": "^7.0.1", "cropperjs": "^1.6.1", - "crypto-js": "^4.1.1", + "crypto-js": "^4.2.0", "dayjs": "^1.11.10", - "diagram-js": "^12.3.0", - "echarts": "^5.4.3", + "diagram-js": "^12.8.0", + "driver.js": "^1.3.1", + "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", - "element-plus": "2.3.14", - "fast-xml-parser": "^4.3.0", - "highlight.js": "^11.8.0", - "intro.js": "^7.2.0", + "element-plus": "2.5.3", + "fast-xml-parser": "^4.3.2", + "highlight.js": "^11.9.0", "jsencrypt": "^3.3.2", "lodash-es": "^4.17.21", "min-dash": "^4.1.1", "mitt": "^3.0.1", "nprogress": "^0.2.0", - "pinia": "^2.1.6", + "pinia": "^2.1.7", + "pinia-plugin-persistedstate": "^3.2.0", "qrcode": "^1.5.3", "qs": "^6.11.2", "steady-xml": "^0.1.0", "url": "^0.11.3", "video.js": "^7.21.5", - "vue": "^3.3.4", + "vue": "3.4.20", "vue-dompurify-html": "^4.1.4", - "vue-i18n": "^9.4.1", - "vue-router": "^4.2.5", + "vue-i18n": "9.9.1", + "vue-router": "^4.3.0", "vue-types": "^5.1.1", "vuedraggable": "^4.1.0", - "vxe-table": "^4.3.11", + "vxe-table": "^4.5.21", "web-storage-cache": "^1.1.1", - "xe-utils": "^3.5.7", + "xe-utils": "^3.5.22", "xml-js": "^1.6.11" }, "devDependencies": { - "@commitlint/cli": "^17.7.1", - "@commitlint/config-conventional": "^17.7.0", - "@iconify/json": "^2.2.119", - "@intlify/unplugin-vue-i18n": "^1.2.0", + "@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/intro.js": "^5.1.1", - "@types/lodash-es": "^4.17.9", - "@types/node": "^20.6.0", - "@types/nprogress": "^0.2.0", - "@types/qrcode": "^1.5.2", - "@types/qs": "^6.9.8", - "@typescript-eslint/eslint-plugin": "^6.7.2", - "@typescript-eslint/parser": "^6.7.2", - "@unocss/transformer-variant-group": "^0.56.1", - "@unocss/eslint-config": "^0.56.1", - "@vitejs/plugin-legacy": "^4.1.1", - "@vitejs/plugin-vue": "^4.3.4", - "@vitejs/plugin-vue-jsx": "^3.0.2", - "@vue-macros/volar": "^0.14.3", - "autoprefixer": "^10.4.16", + "@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/transformer-variant-group": "^0.58.5", + "@unocss/eslint-config": "^0.57.4", + "@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": "8.9.0", "bpmn-js-properties-panel": "0.46.0", "consola": "^3.2.3", - "eslint": "^8.49.0", - "eslint-config-prettier": "^9.0.0", - "eslint-define-config": "^1.23.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-vue": "^9.17.0", - "lint-staged": "^14.0.1", - "postcss": "^8.4.30", - "postcss-html": "^1.5.0", - "postcss-scss": "^4.0.8", - "prettier": "^3.0.3", - "rimraf": "^5.0.1", - "rollup": "^3.29.2", - "sass": "^1.68.0", - "stylelint": "^15.10.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", + "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": "^13.0.0", - "stylelint-config-standard": "^34.0.0", - "stylelint-order": "^6.0.3", - "terser": "^5.20.0", - "typescript": "5.2.2", - "unocss": "^0.56.1", - "unplugin-auto-import": "^0.16.6", + "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": "4.4.9", + "vite": "5.1.4", "vite-plugin-compression": "^0.5.1", - "vite-plugin-ejs": "^1.6.4", + "vite-plugin-ejs": "^1.7.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-progress": "^0.0.7", - "vite-plugin-purge-icons": "^0.9.2", + "vite-plugin-purge-icons": "^0.10.0", "vite-plugin-svg-icons": "^2.0.1", "vite-plugin-top-level-await": "^1.3.1", - "vue-eslint-parser": "^9.3.1", - "vue-tsc": "^1.8.13" + "vue-eslint-parser": "^9.3.2", + "vue-tsc": "^1.8.27" }, "license": "MIT", "repository": { diff --git a/src/api/bpm/processInstance/index.ts b/src/api/bpm/processInstance/index.ts index d48253c3abf8ec25f499940fcc004d20b82968f2..a952bbbd81218bcbdd176cc210a9b1b7f331d869 100644 --- a/src/api/bpm/processInstance/index.ts +++ b/src/api/bpm/processInstance/index.ts @@ -4,6 +4,7 @@ export type Task = { id: string name: string } + export type ProcessInstanceVO = { id: number name: string @@ -19,6 +20,17 @@ export type ProcessInstanceVO = { endTime: string } +export type ProcessInstanceCCVO = { + type: number, + taskName: string, + taskKey: string, + processInstanceName: string, + processInstanceKey: string, + startUserId: string, + options:string [], + reason: string +} + export const getMyProcessInstancePageApi = async (params) => { return await request.get({ url: '/bpm/process-instance/my-page', params }) } @@ -38,3 +50,21 @@ export const cancelProcessInstanceApi = async (id: number, reason: string) => { export const getProcessInstanceApi = async (id: number) => { return await request.get({ url: '/bpm/process-instance/get?id=' + id }) } + +/** + * 抄送 + * @param data 抄送数据 + * @returns 是否抄送成功 + */ +export const createProcessInstanceCC = async (data) => { + return await request.post({ url: '/bpm/process-instance/cc/create', data: data }) +} + +/** + * 抄送列表 + * @param params + * @returns + */ +export const getProcessInstanceCCPage = async (params) => { + return await request.get({ url: '/bpm/process-instance/cc/my-page', params }) +} diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index d8be8025f40387f7bfb7d7e9989e7cdc3a84462d..df6d81609c66e01ba1d2d9ba49af5a9846ae4417 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -44,12 +44,12 @@ export const exportTask = async (params) => { // 获取所有可回退的节点 export const getReturnList = async (params) => { - return await request.get({ url: '/bpm/task/get-return-list', params }) + return await request.get({ url: '/bpm/task/return-list', params }) } // 回退 -export const okRollback = async (data) => { - return await request.put({ url: '/bpm/task/rollback', data }) +export const returnTask = async (data) => { + return await request.put({ url: '/bpm/task/return', data }) } /** @@ -58,3 +58,24 @@ export const okRollback = async (data) => { export const delegateTask = async (data) => { return await request.put({ url: '/bpm/task/delegate', data }) } + +/** + * 加签 + */ +export const taskAddSign = async (data) => { + return await request.put({ url: '/bpm/task/create-sign', data }) +} + +/** + * 获取减签任务列表 + */ +export const getChildrenTaskList = async (id: string) => { + return await request.get({ url: '/bpm/task/children-list?taskId=' + id }) +} + +/** + * 减签 + */ +export const taskSubSign = async (data) => { + return await request.delete({ url: '/bpm/task/delete-sign', data }) +} diff --git a/src/api/crm/business/index.ts b/src/api/crm/business/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6661765928369e126bc1ae7d85b7cfd160453eb --- /dev/null +++ b/src/api/crm/business/index.ts @@ -0,0 +1,98 @@ +import request from '@/config/axios' +import { TransferReqVO } from '@/api/crm/customer' + +export interface BusinessVO { + id: number + name: string + customerId: number + customerName?: string + followUpStatus: boolean + contactLastTime: Date + contactNextTime: Date + ownerUserId: number + ownerUserName?: string // 负责人的用户名称 + ownerUserDept?: string // 负责人的部门名称 + statusTypeId: number + statusTypeName?: string + statusId: number + statusName?: string + endStatus: number + endRemark: string + dealTime: Date + totalProductPrice: number + totalPrice: number + discountPercent: number + remark: string + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 + products?: [ + { + id: number + productId: number + productName: string + productNo: string + productUnit: number + productPrice: number + businessPrice: number + count: number + totalPrice: number + } + ] +} + +// 查询 CRM 商机列表 +export const getBusinessPage = async (params) => { + return await request.get({ url: `/crm/business/page`, params }) +} + +// 查询 CRM 商机列表,基于指定客户 +export const getBusinessPageByCustomer = async (params) => { + return await request.get({ url: `/crm/business/page-by-customer`, params }) +} + +// 查询 CRM 商机详情 +export const getBusiness = async (id: number) => { + return await request.get({ url: `/crm/business/get?id=` + id }) +} + +// 获得 CRM 商机列表(精简) +export const getSimpleBusinessList = async () => { + return await request.get({ url: `/crm/business/simple-all-list` }) +} + +// 新增 CRM 商机 +export const createBusiness = async (data: BusinessVO) => { + return await request.post({ url: `/crm/business/create`, data }) +} + +// 修改 CRM 商机 +export const updateBusiness = async (data: BusinessVO) => { + return await request.put({ url: `/crm/business/update`, data }) +} + +// 修改 CRM 商机状态 +export const updateBusinessStatus = async (data: BusinessVO) => { + return await request.put({ url: `/crm/business/update-status`, data }) +} + +// 删除 CRM 商机 +export const deleteBusiness = async (id: number) => { + return await request.delete({ url: `/crm/business/delete?id=` + id }) +} + +// 导出 CRM 商机 Excel +export const exportBusiness = async (params) => { + return await request.download({ url: `/crm/business/export-excel`, params }) +} + +// 联系人关联商机列表 +export const getBusinessPageByContact = async (params) => { + return await request.get({ url: `/crm/business/page-by-contact`, params }) +} + +// 商机转移 +export const transferBusiness = async (data: TransferReqVO) => { + return await request.put({ url: '/crm/business/transfer', data }) +} diff --git a/src/api/crm/business/status/index.ts b/src/api/crm/business/status/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cddaa5a2c245952d2894dc7d67263650459662f8 --- /dev/null +++ b/src/api/crm/business/status/index.ts @@ -0,0 +1,68 @@ +import request from '@/config/axios' + +export interface BusinessStatusTypeVO { + id: number + name: string + deptIds: number[] + statuses?: { + id: number + name: string + percent: number + } +} + +export const DEFAULT_STATUSES = [ + { + endStatus: 1, + key: '结束', + name: '赢单', + percent: 100 + }, + { + endStatus: 2, + key: '结束', + name: '输单', + percent: 0 + }, + { + endStatus: 3, + key: '结束', + name: '无效', + percent: 0 + } +] + +// 查询商机状态组列表 +export const getBusinessStatusPage = async (params: any) => { + return await request.get({ url: `/crm/business-status/page`, params }) +} + +// 新增商机状态组 +export const createBusinessStatus = async (data: BusinessStatusTypeVO) => { + return await request.post({ url: `/crm/business-status/create`, data }) +} + +// 修改商机状态组 +export const updateBusinessStatus = async (data: BusinessStatusTypeVO) => { + return await request.put({ url: `/crm/business-status/update`, data }) +} + +// 查询商机状态类型详情 +export const getBusinessStatus = async (id: number) => { + return await request.get({ url: `/crm/business-status/get?id=` + id }) +} + +// 删除商机状态 +export const deleteBusinessStatus = async (id: number) => { + return await request.delete({ url: `/crm/business-status/delete?id=` + id }) +} + +// 获得商机状态组列表 +export const getBusinessStatusTypeSimpleList = async () => { + return await request.get({ url: `/crm/business-status/type-simple-list` }) +} + +// 获得商机阶段列表 +export const getBusinessStatusSimpleList = async (typeId: number) => { + return await request.get({ url: `/crm/business-status/status-simple-list`, params: { typeId } }) +} diff --git a/src/api/crm/clue/index.ts b/src/api/crm/clue/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..170f244da0fb537a3fae740b2a5b1830cf36410e --- /dev/null +++ b/src/api/crm/clue/index.ts @@ -0,0 +1,78 @@ +import request from '@/config/axios' +import { TransferReqVO } from '@/api/crm/customer' + +export interface ClueVO { + id: number // 编号 + name: string // 线索名称 + followUpStatus: boolean // 跟进状态 + contactLastTime: Date // 最后跟进时间 + contactLastContent: string // 最后跟进内容 + contactNextTime: Date // 下次联系时间 + ownerUserId: number // 负责人的用户编号 + ownerUserName?: string // 负责人的用户名称 + ownerUserDept?: string // 负责人的部门名称 + transformStatus: boolean // 转化状态 + customerId: number // 客户编号 + customerName?: string // 客户名称 + mobile: string // 手机号 + telephone: string // 电话 + qq: string // QQ + wechat: string // wechat + email: string // email + areaId: number // 所在地 + areaName?: string // 所在地名称 + detailAddress: string // 详细地址 + industryId: number // 所属行业 + level: number // 客户等级 + source: number // 客户来源 + remark: string // 备注 + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 +} + +// 查询线索列表 +export const getCluePage = async (params: any) => { + return await request.get({ url: `/crm/clue/page`, params }) +} + +// 查询线索详情 +export const getClue = async (id: number) => { + return await request.get({ url: `/crm/clue/get?id=` + id }) +} + +// 新增线索 +export const createClue = async (data: ClueVO) => { + return await request.post({ url: `/crm/clue/create`, data }) +} + +// 修改线索 +export const updateClue = async (data: ClueVO) => { + return await request.put({ url: `/crm/clue/update`, data }) +} + +// 删除线索 +export const deleteClue = async (id: number) => { + return await request.delete({ url: `/crm/clue/delete?id=` + id }) +} + +// 导出线索 Excel +export const exportClue = async (params) => { + return await request.download({ url: `/crm/clue/export-excel`, params }) +} + +// 线索转移 +export const transferClue = async (data: TransferReqVO) => { + return await request.put({ url: '/crm/clue/transfer', data }) +} + +// 线索转化为客户 +export const transformClue = async (id: number) => { + return await request.put({ url: '/crm/clue/transform', params: { id } }) +} + +// 获得分配给我的、待跟进的线索数量 +export const getFollowClueCount = async () => { + return await request.get({ url: '/crm/clue/follow-count' }) +} diff --git a/src/api/crm/contact/index.ts b/src/api/crm/contact/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..670361947cc5631549482c588fa3a982dc9e7cf8 --- /dev/null +++ b/src/api/crm/contact/index.ts @@ -0,0 +1,113 @@ +import request from '@/config/axios' +import { TransferReqVO } from '@/api/crm/customer' + +export interface ContactVO { + id: number // 编号 + name: string // 联系人名称 + customerId: number // 客户编号 + customerName?: string // 客户名称 + contactLastTime: Date // 最后跟进时间 + contactLastContent: string // 最后跟进内容 + contactNextTime: Date // 下次联系时间 + ownerUserId: number // 负责人的用户编号 + ownerUserName?: string // 负责人的用户名称 + ownerUserDept?: string // 负责人的部门名称 + mobile: string // 手机号 + telephone: string // 电话 + qq: string // QQ + wechat: string // wechat + email: string // email + areaId: number // 所在地 + areaName?: string // 所在地名称 + detailAddress: string // 详细地址 + sex: number // 性别 + master: boolean // 是否主联系人 + post: string // 职务 + parentId: number // 上级联系人编号 + parentName?: string // 上级联系人名称 + remark: string // 备注 + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 +} + +export interface ContactBusinessReqVO { + contactId: number + businessIds: number[] +} + +export interface ContactBusiness2ReqVO { + businessId: number + contactIds: number[] +} + +// 查询 CRM 联系人列表 +export const getContactPage = async (params) => { + return await request.get({ url: `/crm/contact/page`, params }) +} + +// 查询 CRM 联系人列表,基于指定客户 +export const getContactPageByCustomer = async (params: any) => { + return await request.get({ url: `/crm/contact/page-by-customer`, params }) +} + +// 查询 CRM 联系人列表,基于指定商机 +export const getContactPageByBusiness = async (params: any) => { + return await request.get({ url: `/crm/contact/page-by-business`, params }) +} + +// 查询 CRM 联系人详情 +export const getContact = async (id: number) => { + return await request.get({ url: `/crm/contact/get?id=` + id }) +} + +// 新增 CRM 联系人 +export const createContact = async (data: ContactVO) => { + return await request.post({ url: `/crm/contact/create`, data }) +} + +// 修改 CRM 联系人 +export const updateContact = async (data: ContactVO) => { + return await request.put({ url: `/crm/contact/update`, data }) +} + +// 删除 CRM 联系人 +export const deleteContact = async (id: number) => { + return await request.delete({ url: `/crm/contact/delete?id=` + id }) +} + +// 导出 CRM 联系人 Excel +export const exportContact = async (params) => { + return await request.download({ url: `/crm/contact/export-excel`, params }) +} + +// 获得 CRM 联系人列表(精简) +export const getSimpleContactList = async () => { + return await request.get({ url: `/crm/contact/simple-all-list` }) +} + +// 批量新增联系人商机关联 +export const createContactBusinessList = async (data: ContactBusinessReqVO) => { + return await request.post({ url: `/crm/contact/create-business-list`, data }) +} + +// 批量新增联系人商机关联 +export const createContactBusinessList2 = async (data: ContactBusiness2ReqVO) => { + return await request.post({ url: `/crm/contact/create-business-list2`, data }) +} + +// 解除联系人商机关联 +export const deleteContactBusinessList = async (data: ContactBusinessReqVO) => { + return await request.delete({ url: `/crm/contact/delete-business-list`, data }) +} + +// 解除联系人商机关联 +export const deleteContactBusinessList2 = async (data: ContactBusiness2ReqVO) => { + return await request.delete({ url: `/crm/contact/delete-business-list2`, data }) +} + +// 联系人转移 +export const transferContact = async (data: TransferReqVO) => { + return await request.put({ url: '/crm/contact/transfer', data }) +} diff --git a/src/api/crm/contract/config/index.ts b/src/api/crm/contract/config/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c7ad20c3e376f0ae0c8cb58db5f08728bbc44f0 --- /dev/null +++ b/src/api/crm/contract/config/index.ts @@ -0,0 +1,16 @@ +import request from '@/config/axios' + +export interface ContractConfigVO { + notifyEnabled?: boolean + notifyDays?: number +} + +// 获取合同配置 +export const getContractConfig = async () => { + return await request.get({ url: `/crm/contract-config/get` }) +} + +// 更新合同配置 +export const saveContractConfig = async (data: ContractConfigVO) => { + return await request.put({ url: `/crm/contract-config/save`, data }) +} diff --git a/src/api/crm/contract/index.ts b/src/api/crm/contract/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..faee94953945bdb82e6d29f8b994bbb1820a6128 --- /dev/null +++ b/src/api/crm/contract/index.ts @@ -0,0 +1,114 @@ +import request from '@/config/axios' +import { TransferReqVO } from '@/api/crm/customer' + +export interface ContractVO { + id: number + name: string + no: string + customerId: number + customerName?: string + businessId: number + businessName: string + contactLastTime: Date + ownerUserId: number + ownerUserName?: string + ownerUserDeptName?: string + processInstanceId: number + auditStatus: number + orderDate: Date + startTime: Date + endTime: Date + totalProductPrice: number + discountPercent: number + totalPrice: number + totalReceivablePrice: number + signContactId: number + signContactName?: string + signUserId: number + signUserName: string + remark: string + createTime?: Date + creator: string + creatorName: string + updateTime?: Date + products?: [ + { + id: number + productId: number + productName: string + productNo: string + productUnit: number + productPrice: number + contractPrice: number + count: number + totalPrice: number + } + ] +} + +// 查询 CRM 合同列表 +export const getContractPage = async (params) => { + return await request.get({ url: `/crm/contract/page`, params }) +} + +// 查询 CRM 联系人列表,基于指定客户 +export const getContractPageByCustomer = async (params: any) => { + return await request.get({ url: `/crm/contract/page-by-customer`, params }) +} + +// 查询 CRM 联系人列表,基于指定商机 +export const getContractPageByBusiness = async (params: any) => { + return await request.get({ url: `/crm/contract/page-by-business`, params }) +} + +// 查询 CRM 合同详情 +export const getContract = async (id: number) => { + return await request.get({ url: `/crm/contract/get?id=` + id }) +} + +// 查询 CRM 合同下拉列表 +export const getContractSimpleList = async (customerId: number) => { + return await request.get({ + url: `/crm/contract/simple-list?customerId=${customerId}` + }) +} + +// 新增 CRM 合同 +export const createContract = async (data: ContractVO) => { + return await request.post({ url: `/crm/contract/create`, data }) +} + +// 修改 CRM 合同 +export const updateContract = async (data: ContractVO) => { + return await request.put({ url: `/crm/contract/update`, data }) +} + +// 删除 CRM 合同 +export const deleteContract = async (id: number) => { + return await request.delete({ url: `/crm/contract/delete?id=` + id }) +} + +// 导出 CRM 合同 Excel +export const exportContract = async (params) => { + return await request.download({ url: `/crm/contract/export-excel`, params }) +} + +// 提交审核 +export const submitContract = async (id: number) => { + return await request.put({ url: `/crm/contract/submit?id=${id}` }) +} + +// 合同转移 +export const transferContract = async (data: TransferReqVO) => { + return await request.put({ url: '/crm/contract/transfer', data }) +} + +// 获得待审核合同数量 +export const getAuditContractCount = async () => { + return await request.get({ url: '/crm/contract/audit-count' }) +} + +// 获得即将到期(提醒)的合同数量 +export const getRemindContractCount = async () => { + return await request.get({ url: '/crm/contract/remind-count' }) +} diff --git a/src/api/crm/customer/index.ts b/src/api/crm/customer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c684e98d6d737e3d5e16cbf69a8609929edcb555 --- /dev/null +++ b/src/api/crm/customer/index.ts @@ -0,0 +1,137 @@ +import request from '@/config/axios' + +export interface CustomerVO { + id: number // 编号 + name: string // 客户名称 + followUpStatus: boolean // 跟进状态 + contactLastTime: Date // 最后跟进时间 + contactLastContent: string // 最后跟进内容 + contactNextTime: Date // 下次联系时间 + ownerUserId: number // 负责人的用户编号 + ownerUserName?: string // 负责人的用户名称 + ownerUserDept?: string // 负责人的部门名称 + lockStatus?: boolean + dealStatus?: boolean + mobile: string // 手机号 + telephone: string // 电话 + qq: string // QQ + wechat: string // wechat + email: string // email + areaId: number // 所在地 + areaName?: string // 所在地名称 + detailAddress: string // 详细地址 + industryId: number // 所属行业 + level: number // 客户等级 + source: number // 客户来源 + remark: string // 备注 + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 +} + +// 查询客户列表 +export const getCustomerPage = async (params) => { + return await request.get({ url: `/crm/customer/page`, params }) +} + +// 进入公海客户提醒的客户列表 +export const getPutPoolRemindCustomerPage = async (params) => { + return await request.get({ url: `/crm/customer/put-pool-remind-page`, params }) +} + +// 获得待进入公海客户数量 +export const getPutPoolRemindCustomerCount = async () => { + return await request.get({ url: `/crm/customer/put-pool-remind-count` }) +} + +// 获得今日需联系客户数量 +export const getTodayContactCustomerCount = async () => { + return await request.get({ url: `/crm/customer/today-contact-count` }) +} + +// 获得分配给我、待跟进的线索数量的客户数量 +export const getFollowCustomerCount = async () => { + return await request.get({ url: `/crm/customer/follow-count` }) +} + +// 查询客户详情 +export const getCustomer = async (id: number) => { + return await request.get({ url: `/crm/customer/get?id=` + id }) +} + +// 新增客户 +export const createCustomer = async (data: CustomerVO) => { + return await request.post({ url: `/crm/customer/create`, data }) +} + +// 修改客户 +export const updateCustomer = async (data: CustomerVO) => { + return await request.put({ url: `/crm/customer/update`, data }) +} + +// 更新客户的成交状态 +export const updateCustomerDealStatus = async (id: number, dealStatus: boolean) => { + return await request.put({ url: `/crm/customer/update-deal-status`, params: { id, dealStatus } }) +} + +// 删除客户 +export const deleteCustomer = async (id: number) => { + return await request.delete({ url: `/crm/customer/delete?id=` + id }) +} + +// 导出客户 Excel +export const exportCustomer = async (params: any) => { + return await request.download({ url: `/crm/customer/export-excel`, params }) +} + +// 下载客户导入模板 +export const importCustomerTemplate = () => { + return request.download({ url: '/crm/customer/get-import-template' }) +} + +// 导入客户 +export const handleImport = async (formData) => { + return await request.upload({ url: `/crm/customer/import`, data: formData }) +} + +// 客户列表 +export const getCustomerSimpleList = async () => { + return await request.get({ url: `/crm/customer/simple-list` }) +} + +// ======================= 业务操作 ======================= + +export interface TransferReqVO { + id: number | undefined // 客户编号 + newOwnerUserId: number | undefined // 新负责人的用户编号 + oldOwnerPermissionLevel: number | undefined // 老负责人加入团队后的权限级别 +} + +// 客户转移 +export const transferCustomer = async (data: TransferReqVO) => { + return await request.put({ url: '/crm/customer/transfer', data }) +} + +// 锁定/解锁客户 +export const lockCustomer = async (id: number, lockStatus: boolean) => { + return await request.put({ url: `/crm/customer/lock`, data: { id, lockStatus } }) +} + +// 领取公海客户 +export const receiveCustomer = async (ids: any[]) => { + return await request.put({ url: '/crm/customer/receive', params: { ids: ids.join(',') } }) +} + +// 分配公海给对应负责人 +export const distributeCustomer = async (ids: any[], ownerUserId: number) => { + return await request.put({ + url: '/crm/customer/distribute', + data: { ids: ids, ownerUserId } + }) +} + +// 客户放入公海 +export const putCustomerPool = async (id: number) => { + return await request.put({ url: `/crm/customer/put-pool?id=${id}` }) +} diff --git a/src/api/crm/customer/limitConfig/index.ts b/src/api/crm/customer/limitConfig/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..86776326ce2e967e97f68ca5cc5a4b9528401170 --- /dev/null +++ b/src/api/crm/customer/limitConfig/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface CustomerLimitConfigVO { + id?: number + type?: number + userIds?: string + deptIds?: string + maxCount?: number + dealCountEnabled?: boolean +} + +/** + * 客户限制配置类型 + */ +export enum LimitConfType { + /** + * 拥有客户数限制 + */ + CUSTOMER_QUANTITY_LIMIT = 1, + /** + * 锁定客户数限制 + */ + CUSTOMER_LOCK_LIMIT = 2 +} + +// 查询客户限制配置列表 +export const getCustomerLimitConfigPage = async (params) => { + return await request.get({ url: `/crm/customer-limit-config/page`, params }) +} + +// 查询客户限制配置详情 +export const getCustomerLimitConfig = async (id: number) => { + return await request.get({ url: `/crm/customer-limit-config/get?id=` + id }) +} + +// 新增客户限制配置 +export const createCustomerLimitConfig = async (data: CustomerLimitConfigVO) => { + return await request.post({ url: `/crm/customer-limit-config/create`, data }) +} + +// 修改客户限制配置 +export const updateCustomerLimitConfig = async (data: CustomerLimitConfigVO) => { + return await request.put({ url: `/crm/customer-limit-config/update`, data }) +} + +// 删除客户限制配置 +export const deleteCustomerLimitConfig = async (id: number) => { + return await request.delete({ url: `/crm/customer-limit-config/delete?id=` + id }) +} diff --git a/src/api/crm/customer/poolConfig/index.ts b/src/api/crm/customer/poolConfig/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b96e61fc26317baf225eacd7ce4a57b3bd751351 --- /dev/null +++ b/src/api/crm/customer/poolConfig/index.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +export interface CustomerPoolConfigVO { + enabled?: boolean + contactExpireDays?: number + dealExpireDays?: number + notifyEnabled?: boolean + notifyDays?: number +} + +// 获取客户公海规则设置 +export const getCustomerPoolConfig = async () => { + return await request.get({ url: `/crm/customer-pool-config/get` }) +} + +// 更新客户公海规则设置 +export const saveCustomerPoolConfig = async (data: CustomerPoolConfigVO) => { + return await request.put({ url: `/crm/customer-pool-config/save`, data }) +} diff --git a/src/api/crm/followup/index.ts b/src/api/crm/followup/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..414f3f71ce9d0028820bb4a72d4ce4b9c7a81a23 --- /dev/null +++ b/src/api/crm/followup/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +// 跟进记录 VO +export interface FollowUpRecordVO { + id: number // 编号 + bizType: number // 数据类型 + bizId: number // 数据编号 + type: number // 跟进类型 + content: string // 跟进内容 + picUrls: string[] // 图片 + fileUrls: string[] // 附件 + nextTime: Date // 下次联系时间 + businessIds: number[] // 关联的商机编号数组 + businesses: { + id: number + name: string + }[] // 关联的商机数组 + contactIds: number[] // 关联的联系人编号数组 + contacts: { + id: number + name: string + }[] // 关联的联系人数组 + creator: string + creatorName?: string +} + +// 跟进记录 API +export const FollowUpRecordApi = { + // 查询跟进记录分页 + getFollowUpRecordPage: async (params: any) => { + return await request.get({ url: `/crm/follow-up-record/page`, params }) + }, + + // 新增跟进记录 + createFollowUpRecord: async (data: FollowUpRecordVO) => { + return await request.post({ url: `/crm/follow-up-record/create`, data }) + }, + + // 删除跟进记录 + deleteFollowUpRecord: async (id: number) => { + return await request.delete({ url: `/crm/follow-up-record/delete?id=` + id }) + } +} diff --git a/src/api/crm/operateLog/index.ts b/src/api/crm/operateLog/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0f25b6b205e44cd636113fa3268eabb300af60a --- /dev/null +++ b/src/api/crm/operateLog/index.ts @@ -0,0 +1,11 @@ +import request from '@/config/axios' + +export interface OperateLogVO extends PageParam { + bizType: number + bizId: number +} + +// 获得操作日志 +export const getOperateLogPage = async (params: OperateLogVO) => { + return await request.get({ url: `/crm/operate-log/page`, params }) +} diff --git a/src/api/crm/permission/index.ts b/src/api/crm/permission/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..31f9e18dad7f5e43d3fc029ff093bb61204a9982 --- /dev/null +++ b/src/api/crm/permission/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' + +export interface PermissionVO { + id?: number // 数据权限编号 + userId: number // 用户编号 + bizType: number // Crm 类型 + bizId: number // Crm 类型数据编号 + level: number // 权限级别 + deptName?: string // 部门名称 + nickname?: string // 用户昵称 + postNames?: string[] // 岗位名称数组 + createTime?: Date + ids?: number[] +} + +/** + * CRM 业务类型枚举 + * + * @author HUIHUI + */ +export enum BizTypeEnum { + CRM_CLUE = 1, // 线索 + CRM_CUSTOMER = 2, // 客户 + CRM_CONTACT = 3, // 联系人 + CRM_BUSINESS = 4, // 商机 + CRM_CONTRACT = 5, // 合同 + CRM_PRODUCT = 6, // 产品 + CRM_RECEIVABLE = 7, // 回款 + CRM_RECEIVABLE_PLAN = 8 // 回款计划 +} + +/** + * CRM 数据权限级别枚举 + */ +export enum PermissionLevelEnum { + OWNER = 1, // 负责人 + READ = 2, // 只读 + WRITE = 3 // 读写 +} + +// 获得数据权限列表(查询团队成员列表) +export const getPermissionList = async (params) => { + return await request.get({ url: `/crm/permission/list`, params }) +} + +// 创建数据权限(新增团队成员) +export const createPermission = async (data: PermissionVO) => { + return await request.post({ url: `/crm/permission/create`, data }) +} + +// 编辑数据权限(修改团队成员权限级别) +export const updatePermission = async (data) => { + return await request.put({ url: `/crm/permission/update`, data }) +} + +// 删除数据权限(删除团队成员) +export const deletePermissionBatch = async (val: number[]) => { + return await request.delete({ url: '/crm/permission/delete?ids=' + val.join(',') }) +} + +// 删除自己的数据权限(退出团队) +export const deleteSelfPermission = async (id: number) => { + return await request.delete({ url: '/crm/permission/delete-self?id=' + id }) +} diff --git a/src/api/crm/product/category/index.ts b/src/api/crm/product/category/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6341d1bca607b4887589326fa045ab2bd9cfbb43 --- /dev/null +++ b/src/api/crm/product/category/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +// TODO @zange:挪到 product 下,建个 category 包,挪进去哈; +export interface ProductCategoryVO { + id: number + name: string + parentId: number +} + +// 查询产品分类详情 +export const getProductCategory = async (id: number) => { + return await request.get({ url: `/crm/product-category/get?id=` + id }) +} + +// 新增产品分类 +export const createProductCategory = async (data: ProductCategoryVO) => { + return await request.post({ url: `/crm/product-category/create`, data }) +} + +// 修改产品分类 +export const updateProductCategory = async (data: ProductCategoryVO) => { + return await request.put({ url: `/crm/product-category/update`, data }) +} + +// 删除产品分类 +export const deleteProductCategory = async (id: number) => { + return await request.delete({ url: `/crm/product-category/delete?id=` + id }) +} + +// 产品分类列表 +export const getProductCategoryList = async (params) => { + return await request.get({ url: `/crm/product-category/list`, params }) +} diff --git a/src/api/crm/product/index.ts b/src/api/crm/product/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0c232891f027553ae68d02ae7fe37d21f03dfbb --- /dev/null +++ b/src/api/crm/product/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +export interface ProductVO { + id: number + name: string + no: string + unit: number + price: number + status: number + categoryId: number + categoryName?: string + description: string + ownerUserId: number +} + +// 查询产品列表 +export const getProductPage = async (params) => { + return await request.get({ url: `/crm/product/page`, params }) +} + +// 获得产品精简列表 +export const getProductSimpleList = async () => { + return await request.get({ url: `/crm/product/simple-list` }) +} + +// 查询产品详情 +export const getProduct = async (id: number) => { + return await request.get({ url: `/crm/product/get?id=` + id }) +} + +// 新增产品 +export const createProduct = async (data: ProductVO) => { + return await request.post({ url: `/crm/product/create`, data }) +} + +// 修改产品 +export const updateProduct = async (data: ProductVO) => { + return await request.put({ url: `/crm/product/update`, data }) +} + +// 删除产品 +export const deleteProduct = async (id: number) => { + return await request.delete({ url: `/crm/product/delete?id=` + id }) +} + +// 导出产品 Excel +export const exportProduct = async (params) => { + return await request.download({ url: `/crm/product/export-excel`, params }) +} diff --git a/src/api/crm/receivable/index.ts b/src/api/crm/receivable/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..069d6c4a70d72b472ab94d73f6db96f8ca6683df --- /dev/null +++ b/src/api/crm/receivable/index.ts @@ -0,0 +1,71 @@ +import request from '@/config/axios' + +export interface ReceivableVO { + id: number + no: string + planId: number + customerId: number + customerName?: string + contractId: number + contract?: { + no: string + totalPrice: number + } + auditStatus: number + processInstanceId: number + returnTime: Date + returnType: string + price: number + ownerUserId: number + ownerUserName?: string + remark: string + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 +} + +// 查询回款列表 +export const getReceivablePage = async (params) => { + return await request.get({ url: `/crm/receivable/page`, params }) +} + +// 查询回款列表 +export const getReceivablePageByCustomer = async (params) => { + return await request.get({ url: `/crm/receivable/page-by-customer`, params }) +} + +// 查询回款详情 +export const getReceivable = async (id: number) => { + return await request.get({ url: `/crm/receivable/get?id=` + id }) +} + +// 新增回款 +export const createReceivable = async (data: ReceivableVO) => { + return await request.post({ url: `/crm/receivable/create`, data }) +} + +// 修改回款 +export const updateReceivable = async (data: ReceivableVO) => { + return await request.put({ url: `/crm/receivable/update`, data }) +} + +// 删除回款 +export const deleteReceivable = async (id: number) => { + return await request.delete({ url: `/crm/receivable/delete?id=` + id }) +} + +// 导出回款 Excel +export const exportReceivable = async (params) => { + return await request.download({ url: `/crm/receivable/export-excel`, params }) +} + +// 提交审核 +export const submitReceivable = async (id: number) => { + return await request.put({ url: `/crm/receivable/submit?id=${id}` }) +} + +// 获得待审核回款数量 +export const getAuditReceivableCount = async () => { + return await request.get({ url: '/crm/receivable/audit-count' }) +} diff --git a/src/api/crm/receivable/plan/index.ts b/src/api/crm/receivable/plan/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e0cab4adf2193a8e0afa1939c701c549e447743 --- /dev/null +++ b/src/api/crm/receivable/plan/index.ts @@ -0,0 +1,74 @@ +import request from '@/config/axios' + +export interface ReceivablePlanVO { + id: number + period: number + receivableId: number + price: number + returnTime: Date + remindDays: number + returnType: number + remindTime: Date + customerId: number + customerName?: string + contractId: number + contractNo?: string + ownerUserId: number + ownerUserName?: string + remark: string + creator: string // 创建人 + creatorName?: string // 创建人名称 + createTime: Date // 创建时间 + updateTime: Date // 更新时间 + receivable?: { + price: number + returnTime: Date + } +} + +// 查询回款计划列表 +export const getReceivablePlanPage = async (params) => { + return await request.get({ url: `/crm/receivable-plan/page`, params }) +} + +// 查询回款计划列表 +export const getReceivablePlanPageByCustomer = async (params) => { + return await request.get({ url: `/crm/receivable-plan/page-by-customer`, params }) +} + +// 查询回款计划详情 +export const getReceivablePlan = async (id: number) => { + return await request.get({ url: `/crm/receivable-plan/get?id=` + id }) +} + +// 查询回款计划下拉数据 +export const getReceivablePlanSimpleList = async (customerId: number, contractId: number) => { + return await request.get({ + url: `/crm/receivable-plan/simple-list?customerId=${customerId}&contractId=${contractId}` + }) +} + +// 新增回款计划 +export const createReceivablePlan = async (data: ReceivablePlanVO) => { + return await request.post({ url: `/crm/receivable-plan/create`, data }) +} + +// 修改回款计划 +export const updateReceivablePlan = async (data: ReceivablePlanVO) => { + return await request.put({ url: `/crm/receivable-plan/update`, data }) +} + +// 删除回款计划 +export const deleteReceivablePlan = async (id: number) => { + return await request.delete({ url: `/crm/receivable-plan/delete?id=` + id }) +} + +// 导出回款计划 Excel +export const exportReceivablePlan = async (params) => { + return await request.download({ url: `/crm/receivable-plan/export-excel`, params }) +} + +// 获得待回款提醒数量 +export const getReceivablePlanRemindCount = async () => { + return await request.get({ url: '/crm/receivable-plan/remind-count' }) +} diff --git a/src/api/crm/statistics/rank.ts b/src/api/crm/statistics/rank.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9b355e05ca4cdd0cbb7acfc8e60bf12bcf02639 --- /dev/null +++ b/src/api/crm/statistics/rank.ts @@ -0,0 +1,67 @@ +import request from '@/config/axios' + +export interface StatisticsRankRespVO { + count: number + nickname: string + deptName: string +} + +// 排行 API +export const StatisticsRankApi = { + // 获得合同排行榜 + getContractPriceRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-contract-price-rank', + params + }) + }, + // 获得回款排行榜 + getReceivablePriceRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-receivable-price-rank', + params + }) + }, + // 签约合同排行 + getContractCountRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-contract-count-rank', + params + }) + }, + // 产品销量排行 + getProductSalesRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-product-sales-rank', + params + }) + }, + // 新增客户数排行 + getCustomerCountRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-customer-count-rank', + params + }) + }, + // 新增联系人数排行 + getContactsCountRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-contacts-count-rank', + params + }) + }, + // 跟进次数排行 + getFollowCountRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-follow-count-rank', + params + }) + }, + // 跟进客户数排行 + getFollowCustomerCountRank: (params: any) => { + return request.get({ + url: '/crm/statistics-rank/get-follow-customer-count-rank', + params + }) + } +} diff --git a/src/api/erp/finance/account/index.ts b/src/api/erp/finance/account/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a62b18077c460506fad5ce1ddd216e86232896c5 --- /dev/null +++ b/src/api/erp/finance/account/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// ERP 结算账户 VO +export interface AccountVO { + id: number // 结算账户编号 + no: string // 账户编码 + remark: string // 备注 + status: number // 开启状态 + sort: number // 排序 + defaultStatus: boolean // 是否默认 + name: string // 账户名称 +} + +// ERP 结算账户 API +export const AccountApi = { + // 查询结算账户分页 + getAccountPage: async (params: any) => { + return await request.get({ url: `/erp/account/page`, params }) + }, + + // 查询结算账户精简列表 + getAccountSimpleList: async () => { + return await request.get({ url: `/erp/account/simple-list` }) + }, + + // 查询结算账户详情 + getAccount: async (id: number) => { + return await request.get({ url: `/erp/account/get?id=` + id }) + }, + + // 新增结算账户 + createAccount: async (data: AccountVO) => { + return await request.post({ url: `/erp/account/create`, data }) + }, + + // 修改结算账户 + updateAccount: async (data: AccountVO) => { + return await request.put({ url: `/erp/account/update`, data }) + }, + + // 修改结算账户默认状态 + updateAccountDefaultStatus: async (id: number, defaultStatus: boolean) => { + return await request.put({ + url: `/erp/account/update-default-status`, + params: { + id, + defaultStatus + } + }) + }, + + // 删除结算账户 + deleteAccount: async (id: number) => { + return await request.delete({ url: `/erp/account/delete?id=` + id }) + }, + + // 导出结算账户 Excel + exportAccount: async (params: any) => { + return await request.download({ url: `/erp/account/export-excel`, params }) + } +} diff --git a/src/api/erp/finance/payment/index.ts b/src/api/erp/finance/payment/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6749db086308aa27af9f37621e5e7af828923eb --- /dev/null +++ b/src/api/erp/finance/payment/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// ERP 付款单 VO +export interface FinancePaymentVO { + id: number // 付款单编号 + no: string // 付款单号 + supplierId: number // 供应商编号 + paymentTime: Date // 付款时间 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 付款单 API +export const FinancePaymentApi = { + // 查询付款单分页 + getFinancePaymentPage: async (params: any) => { + return await request.get({ url: `/erp/finance-payment/page`, params }) + }, + + // 查询付款单详情 + getFinancePayment: async (id: number) => { + return await request.get({ url: `/erp/finance-payment/get?id=` + id }) + }, + + // 新增付款单 + createFinancePayment: async (data: FinancePaymentVO) => { + return await request.post({ url: `/erp/finance-payment/create`, data }) + }, + + // 修改付款单 + updateFinancePayment: async (data: FinancePaymentVO) => { + return await request.put({ url: `/erp/finance-payment/update`, data }) + }, + + // 更新付款单的状态 + updateFinancePaymentStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/finance-payment/update-status`, + params: { + id, + status + } + }) + }, + + // 删除付款单 + deleteFinancePayment: async (ids: number[]) => { + return await request.delete({ + url: `/erp/finance-payment/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出付款单 Excel + exportFinancePayment: async (params: any) => { + return await request.download({ url: `/erp/finance-payment/export-excel`, params }) + } +} diff --git a/src/api/erp/finance/receipt/index.ts b/src/api/erp/finance/receipt/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4de28ca778662a3b310304dcdc536706082a8d2a --- /dev/null +++ b/src/api/erp/finance/receipt/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// ERP 收款单 VO +export interface FinanceReceiptVO { + id: number // 收款单编号 + no: string // 收款单号 + customerId: number // 客户编号 + receiptTime: Date // 收款时间 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 收款单 API +export const FinanceReceiptApi = { + // 查询收款单分页 + getFinanceReceiptPage: async (params: any) => { + return await request.get({ url: `/erp/finance-receipt/page`, params }) + }, + + // 查询收款单详情 + getFinanceReceipt: async (id: number) => { + return await request.get({ url: `/erp/finance-receipt/get?id=` + id }) + }, + + // 新增收款单 + createFinanceReceipt: async (data: FinanceReceiptVO) => { + return await request.post({ url: `/erp/finance-receipt/create`, data }) + }, + + // 修改收款单 + updateFinanceReceipt: async (data: FinanceReceiptVO) => { + return await request.put({ url: `/erp/finance-receipt/update`, data }) + }, + + // 更新收款单的状态 + updateFinanceReceiptStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/finance-receipt/update-status`, + params: { + id, + status + } + }) + }, + + // 删除收款单 + deleteFinanceReceipt: async (ids: number[]) => { + return await request.delete({ + url: `/erp/finance-receipt/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出收款单 Excel + exportFinanceReceipt: async (params: any) => { + return await request.download({ url: `/erp/finance-receipt/export-excel`, params }) + } +} diff --git a/src/api/erp/product/category/index.ts b/src/api/erp/product/category/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..72f47dc9c5e04cecdbb6d8cee182fec21a1f6a0b --- /dev/null +++ b/src/api/erp/product/category/index.ts @@ -0,0 +1,49 @@ +import request from '@/config/axios' + +// ERP 产品分类 VO +export interface ProductCategoryVO { + id: number // 分类编号 + parentId: number // 父分类编号 + name: string // 分类名称 + code: string // 分类编码 + sort: number // 分类排序 + status: number // 开启状态 +} + +// ERP 产品分类 API +export const ProductCategoryApi = { + // 查询产品分类列表 + getProductCategoryList: async (params) => { + return await request.get({ url: `/erp/product-category/list`, params }) + }, + + // 查询产品分类精简列表 + getProductCategorySimpleList: async () => { + return await request.get({ url: `/erp/product-category/simple-list` }) + }, + + // 查询产品分类详情 + getProductCategory: async (id: number) => { + return await request.get({ url: `/erp/product-category/get?id=` + id }) + }, + + // 新增产品分类 + createProductCategory: async (data: ProductCategoryVO) => { + return await request.post({ url: `/erp/product-category/create`, data }) + }, + + // 修改产品分类 + updateProductCategory: async (data: ProductCategoryVO) => { + return await request.put({ url: `/erp/product-category/update`, data }) + }, + + // 删除产品分类 + deleteProductCategory: async (id: number) => { + return await request.delete({ url: `/erp/product-category/delete?id=` + id }) + }, + + // 导出产品分类 Excel + exportProductCategory: async (params) => { + return await request.download({ url: `/erp/product-category/export-excel`, params }) + } +} diff --git a/src/api/erp/product/product/index.ts b/src/api/erp/product/product/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1136282f2747b106c18388b2ff55648d62587246 --- /dev/null +++ b/src/api/erp/product/product/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +// ERP 产品 VO +export interface ProductVO { + id: number // 产品编号 + name: string // 产品名称 + barCode: string // 产品条码 + categoryId: number // 产品类型编号 + unitId: number // 单位编号 + unitName?: string // 单位名字 + status: number // 产品状态 + standard: string // 产品规格 + remark: string // 产品备注 + expiryDay: number // 保质期天数 + weight: number // 重量(kg) + purchasePrice: number // 采购价格,单位:元 + salePrice: number // 销售价格,单位:元 + minPrice: number // 最低价格,单位:元 +} + +// ERP 产品 API +export const ProductApi = { + // 查询产品分页 + getProductPage: async (params: any) => { + return await request.get({ url: `/erp/product/page`, params }) + }, + + // 查询产品精简列表 + getProductSimpleList: async () => { + return await request.get({ url: `/erp/product/simple-list` }) + }, + + // 查询产品详情 + getProduct: async (id: number) => { + return await request.get({ url: `/erp/product/get?id=` + id }) + }, + + // 新增产品 + createProduct: async (data: ProductVO) => { + return await request.post({ url: `/erp/product/create`, data }) + }, + + // 修改产品 + updateProduct: async (data: ProductVO) => { + return await request.put({ url: `/erp/product/update`, data }) + }, + + // 删除产品 + deleteProduct: async (id: number) => { + return await request.delete({ url: `/erp/product/delete?id=` + id }) + }, + + // 导出产品 Excel + exportProduct: async (params) => { + return await request.download({ url: `/erp/product/export-excel`, params }) + } +} diff --git a/src/api/erp/product/unit/index.ts b/src/api/erp/product/unit/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e1c8ac3db7d5ec2cd13bb4a0afe2a3fe884e4a6 --- /dev/null +++ b/src/api/erp/product/unit/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +// ERP 产品单位 VO +export interface ProductUnitVO { + id: number // 单位编号 + name: string // 单位名字 + status: number // 单位状态 +} + +// ERP 产品单位 API +export const ProductUnitApi = { + // 查询产品单位分页 + getProductUnitPage: async (params: any) => { + return await request.get({ url: `/erp/product-unit/page`, params }) + }, + + // 查询产品单位精简列表 + getProductUnitSimpleList: async () => { + return await request.get({ url: `/erp/product-unit/simple-list` }) + }, + + // 查询产品单位详情 + getProductUnit: async (id: number) => { + return await request.get({ url: `/erp/product-unit/get?id=` + id }) + }, + + // 新增产品单位 + createProductUnit: async (data: ProductUnitVO) => { + return await request.post({ url: `/erp/product-unit/create`, data }) + }, + + // 修改产品单位 + updateProductUnit: async (data: ProductUnitVO) => { + return await request.put({ url: `/erp/product-unit/update`, data }) + }, + + // 删除产品单位 + deleteProductUnit: async (id: number) => { + return await request.delete({ url: `/erp/product-unit/delete?id=` + id }) + }, + + // 导出产品单位 Excel + exportProductUnit: async (params) => { + return await request.download({ url: `/erp/product-unit/export-excel`, params }) + } +} diff --git a/src/api/erp/purchase/in/index.ts b/src/api/erp/purchase/in/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f94708d960954d33f9b0e94cc2eec1a40d8db30c --- /dev/null +++ b/src/api/erp/purchase/in/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' + +// ERP 采购入库 VO +export interface PurchaseInVO { + id: number // 入库工单编号 + no: string // 采购入库号 + customerId: number // 客户编号 + inTime: Date // 入库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 + outCount: number // 采购出库数量 + returnCount: number // 采购退货数量 +} + +// ERP 采购入库 API +export const PurchaseInApi = { + // 查询采购入库分页 + getPurchaseInPage: async (params: any) => { + return await request.get({ url: `/erp/purchase-in/page`, params }) + }, + + // 查询采购入库详情 + getPurchaseIn: async (id: number) => { + return await request.get({ url: `/erp/purchase-in/get?id=` + id }) + }, + + // 新增采购入库 + createPurchaseIn: async (data: PurchaseInVO) => { + return await request.post({ url: `/erp/purchase-in/create`, data }) + }, + + // 修改采购入库 + updatePurchaseIn: async (data: PurchaseInVO) => { + return await request.put({ url: `/erp/purchase-in/update`, data }) + }, + + // 更新采购入库的状态 + updatePurchaseInStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/purchase-in/update-status`, + params: { + id, + status + } + }) + }, + + // 删除采购入库 + deletePurchaseIn: async (ids: number[]) => { + return await request.delete({ + url: `/erp/purchase-in/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出采购入库 Excel + exportPurchaseIn: async (params: any) => { + return await request.download({ url: `/erp/purchase-in/export-excel`, params }) + } +} diff --git a/src/api/erp/purchase/order/index.ts b/src/api/erp/purchase/order/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ad3222fac1ce68d6f519dd95a5d2062a74abc854 --- /dev/null +++ b/src/api/erp/purchase/order/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' + +// ERP 采购订单 VO +export interface PurchaseOrderVO { + id: number // 订单工单编号 + no: string // 采购订单号 + customerId: number // 客户编号 + orderTime: Date // 订单时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 + outCount: number // 采购出库数量 + returnCount: number // 采购退货数量 +} + +// ERP 采购订单 API +export const PurchaseOrderApi = { + // 查询采购订单分页 + getPurchaseOrderPage: async (params: any) => { + return await request.get({ url: `/erp/purchase-order/page`, params }) + }, + + // 查询采购订单详情 + getPurchaseOrder: async (id: number) => { + return await request.get({ url: `/erp/purchase-order/get?id=` + id }) + }, + + // 新增采购订单 + createPurchaseOrder: async (data: PurchaseOrderVO) => { + return await request.post({ url: `/erp/purchase-order/create`, data }) + }, + + // 修改采购订单 + updatePurchaseOrder: async (data: PurchaseOrderVO) => { + return await request.put({ url: `/erp/purchase-order/update`, data }) + }, + + // 更新采购订单的状态 + updatePurchaseOrderStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/purchase-order/update-status`, + params: { + id, + status + } + }) + }, + + // 删除采购订单 + deletePurchaseOrder: async (ids: number[]) => { + return await request.delete({ + url: `/erp/purchase-order/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出采购订单 Excel + exportPurchaseOrder: async (params: any) => { + return await request.download({ url: `/erp/purchase-order/export-excel`, params }) + } +} diff --git a/src/api/erp/purchase/return/index.ts b/src/api/erp/purchase/return/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..182e04ee298f2e0c245dbcd9247f1d329ed2d619 --- /dev/null +++ b/src/api/erp/purchase/return/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// ERP 采购退货 VO +export interface PurchaseReturnVO { + id: number // 采购退货编号 + no: string // 采购退货号 + customerId: number // 客户编号 + returnTime: Date // 退货时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 采购退货 API +export const PurchaseReturnApi = { + // 查询采购退货分页 + getPurchaseReturnPage: async (params: any) => { + return await request.get({ url: `/erp/purchase-return/page`, params }) + }, + + // 查询采购退货详情 + getPurchaseReturn: async (id: number) => { + return await request.get({ url: `/erp/purchase-return/get?id=` + id }) + }, + + // 新增采购退货 + createPurchaseReturn: async (data: PurchaseReturnVO) => { + return await request.post({ url: `/erp/purchase-return/create`, data }) + }, + + // 修改采购退货 + updatePurchaseReturn: async (data: PurchaseReturnVO) => { + return await request.put({ url: `/erp/purchase-return/update`, data }) + }, + + // 更新采购退货的状态 + updatePurchaseReturnStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/purchase-return/update-status`, + params: { + id, + status + } + }) + }, + + // 删除采购退货 + deletePurchaseReturn: async (ids: number[]) => { + return await request.delete({ + url: `/erp/purchase-return/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出采购退货 Excel + exportPurchaseReturn: async (params: any) => { + return await request.download({ url: `/erp/purchase-return/export-excel`, params }) + } +} diff --git a/src/api/erp/purchase/supplier/index.ts b/src/api/erp/purchase/supplier/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..34729a5a305d17f850435bc9e4c1d917b028c184 --- /dev/null +++ b/src/api/erp/purchase/supplier/index.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' + +// ERP 供应商 VO +export interface SupplierVO { + id: number // 供应商编号 + name: string // 供应商名称 + contact: string // 联系人 + mobile: string // 手机号码 + telephone: string // 联系电话 + email: string // 电子邮箱 + fax: string // 传真 + remark: string // 备注 + status: number // 开启状态 + sort: number // 排序 + taxNo: string // 纳税人识别号 + taxPercent: number // 税率 + bankName: string // 开户行 + bankAccount: string // 开户账号 + bankAddress: string // 开户地址 +} + +// ERP 供应商 API +export const SupplierApi = { + // 查询供应商分页 + getSupplierPage: async (params: any) => { + return await request.get({ url: `/erp/supplier/page`, params }) + }, + + // 获得供应商精简列表 + getSupplierSimpleList: async () => { + return await request.get({ url: `/erp/supplier/simple-list` }) + }, + + // 查询供应商详情 + getSupplier: async (id: number) => { + return await request.get({ url: `/erp/supplier/get?id=` + id }) + }, + + // 新增供应商 + createSupplier: async (data: SupplierVO) => { + return await request.post({ url: `/erp/supplier/create`, data }) + }, + + // 修改供应商 + updateSupplier: async (data: SupplierVO) => { + return await request.put({ url: `/erp/supplier/update`, data }) + }, + + // 删除供应商 + deleteSupplier: async (id: number) => { + return await request.delete({ url: `/erp/supplier/delete?id=` + id }) + }, + + // 导出供应商 Excel + exportSupplier: async (params) => { + return await request.download({ url: `/erp/supplier/export-excel`, params }) + } +} diff --git a/src/api/erp/sale/customer/index.ts b/src/api/erp/sale/customer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3aaefb56c10cfdc5479a5f271618cce8fd9ea41d --- /dev/null +++ b/src/api/erp/sale/customer/index.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' + +// ERP 客户 VO +export interface CustomerVO { + id: number // 客户编号 + name: string // 客户名称 + contact: string // 联系人 + mobile: string // 手机号码 + telephone: string // 联系电话 + email: string // 电子邮箱 + fax: string // 传真 + remark: string // 备注 + status: number // 开启状态 + sort: number // 排序 + taxNo: string // 纳税人识别号 + taxPercent: number // 税率 + bankName: string // 开户行 + bankAccount: string // 开户账号 + bankAddress: string // 开户地址 +} + +// ERP 客户 API +export const CustomerApi = { + // 查询客户分页 + getCustomerPage: async (params: any) => { + return await request.get({ url: `/erp/customer/page`, params }) + }, + + // 查询客户精简列表 + getCustomerSimpleList: async () => { + return await request.get({ url: `/erp/customer/simple-list` }) + }, + + // 查询客户详情 + getCustomer: async (id: number) => { + return await request.get({ url: `/erp/customer/get?id=` + id }) + }, + + // 新增客户 + createCustomer: async (data: CustomerVO) => { + return await request.post({ url: `/erp/customer/create`, data }) + }, + + // 修改客户 + updateCustomer: async (data: CustomerVO) => { + return await request.put({ url: `/erp/customer/update`, data }) + }, + + // 删除客户 + deleteCustomer: async (id: number) => { + return await request.delete({ url: `/erp/customer/delete?id=` + id }) + }, + + // 导出客户 Excel + exportCustomer: async (params) => { + return await request.download({ url: `/erp/customer/export-excel`, params }) + } +} diff --git a/src/api/erp/sale/order/index.ts b/src/api/erp/sale/order/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2d2ac53e6dd1eb3c893e99bd97b2155cbf755a57 --- /dev/null +++ b/src/api/erp/sale/order/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' + +// ERP 销售订单 VO +export interface SaleOrderVO { + id: number // 订单工单编号 + no: string // 销售订单号 + customerId: number // 客户编号 + orderTime: Date // 订单时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 + outCount: number // 销售出库数量 + returnCount: number // 销售退货数量 +} + +// ERP 销售订单 API +export const SaleOrderApi = { + // 查询销售订单分页 + getSaleOrderPage: async (params: any) => { + return await request.get({ url: `/erp/sale-order/page`, params }) + }, + + // 查询销售订单详情 + getSaleOrder: async (id: number) => { + return await request.get({ url: `/erp/sale-order/get?id=` + id }) + }, + + // 新增销售订单 + createSaleOrder: async (data: SaleOrderVO) => { + return await request.post({ url: `/erp/sale-order/create`, data }) + }, + + // 修改销售订单 + updateSaleOrder: async (data: SaleOrderVO) => { + return await request.put({ url: `/erp/sale-order/update`, data }) + }, + + // 更新销售订单的状态 + updateSaleOrderStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/sale-order/update-status`, + params: { + id, + status + } + }) + }, + + // 删除销售订单 + deleteSaleOrder: async (ids: number[]) => { + return await request.delete({ + url: `/erp/sale-order/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出销售订单 Excel + exportSaleOrder: async (params: any) => { + return await request.download({ url: `/erp/sale-order/export-excel`, params }) + } +} diff --git a/src/api/erp/sale/out/index.ts b/src/api/erp/sale/out/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cbc605e75598e7ba8db22d6f2ea9a62daace0eca --- /dev/null +++ b/src/api/erp/sale/out/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// ERP 销售出库 VO +export interface SaleOutVO { + id: number // 销售出库编号 + no: string // 销售出库号 + customerId: number // 客户编号 + outTime: Date // 出库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 销售出库 API +export const SaleOutApi = { + // 查询销售出库分页 + getSaleOutPage: async (params: any) => { + return await request.get({ url: `/erp/sale-out/page`, params }) + }, + + // 查询销售出库详情 + getSaleOut: async (id: number) => { + return await request.get({ url: `/erp/sale-out/get?id=` + id }) + }, + + // 新增销售出库 + createSaleOut: async (data: SaleOutVO) => { + return await request.post({ url: `/erp/sale-out/create`, data }) + }, + + // 修改销售出库 + updateSaleOut: async (data: SaleOutVO) => { + return await request.put({ url: `/erp/sale-out/update`, data }) + }, + + // 更新销售出库的状态 + updateSaleOutStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/sale-out/update-status`, + params: { + id, + status + } + }) + }, + + // 删除销售出库 + deleteSaleOut: async (ids: number[]) => { + return await request.delete({ + url: `/erp/sale-out/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出销售出库 Excel + exportSaleOut: async (params: any) => { + return await request.download({ url: `/erp/sale-out/export-excel`, params }) + } +} diff --git a/src/api/erp/sale/return/index.ts b/src/api/erp/sale/return/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..160ac0189051f5948746367e46a1c8683a505de3 --- /dev/null +++ b/src/api/erp/sale/return/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// ERP 销售退货 VO +export interface SaleReturnVO { + id: number // 销售退货编号 + no: string // 销售退货号 + customerId: number // 客户编号 + returnTime: Date // 退货时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 销售退货 API +export const SaleReturnApi = { + // 查询销售退货分页 + getSaleReturnPage: async (params: any) => { + return await request.get({ url: `/erp/sale-return/page`, params }) + }, + + // 查询销售退货详情 + getSaleReturn: async (id: number) => { + return await request.get({ url: `/erp/sale-return/get?id=` + id }) + }, + + // 新增销售退货 + createSaleReturn: async (data: SaleReturnVO) => { + return await request.post({ url: `/erp/sale-return/create`, data }) + }, + + // 修改销售退货 + updateSaleReturn: async (data: SaleReturnVO) => { + return await request.put({ url: `/erp/sale-return/update`, data }) + }, + + // 更新销售退货的状态 + updateSaleReturnStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/sale-return/update-status`, + params: { + id, + status + } + }) + }, + + // 删除销售退货 + deleteSaleReturn: async (ids: number[]) => { + return await request.delete({ + url: `/erp/sale-return/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出销售退货 Excel + exportSaleReturn: async (params: any) => { + return await request.download({ url: `/erp/sale-return/export-excel`, params }) + } +} diff --git a/src/api/erp/statistics/purchase/index.ts b/src/api/erp/statistics/purchase/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..80d907a04cc03e73a3ab299c13ab488f8edccc91 --- /dev/null +++ b/src/api/erp/statistics/purchase/index.ts @@ -0,0 +1,28 @@ +import request from '@/config/axios' + +// ERP 采购全局统计 VO +export interface ErpPurchaseSummaryRespVO { + todayPrice: number // 今日采购金额 + yesterdayPrice: number // 昨日采购金额 + monthPrice: number // 本月采购金额 + yearPrice: number // 今年采购金额 +} + +// ERP 采购时间段统计 VO +export interface ErpPurchaseTimeSummaryRespVO { + time: string // 时间 + price: number // 采购金额 +} + +// ERP 采购统计 API +export const PurchaseStatisticsApi = { + // 获得采购统计 + getPurchaseSummary: async (): Promise => { + return await request.get({ url: `/erp/purchase-statistics/summary` }) + }, + + // 获得采购时间段统计 + getPurchaseTimeSummary: async (): Promise => { + return await request.get({ url: `/erp/purchase-statistics/time-summary` }) + } +} diff --git a/src/api/erp/statistics/sale/index.ts b/src/api/erp/statistics/sale/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..09d85007a932e03cabccc5edafa20cbcf02030ee --- /dev/null +++ b/src/api/erp/statistics/sale/index.ts @@ -0,0 +1,28 @@ +import request from '@/config/axios' + +// ERP 销售全局统计 VO +export interface ErpSaleSummaryRespVO { + todayPrice: number // 今日销售金额 + yesterdayPrice: number // 昨日销售金额 + monthPrice: number // 本月销售金额 + yearPrice: number // 今年销售金额 +} + +// ERP 销售时间段统计 VO +export interface ErpSaleTimeSummaryRespVO { + time: string // 时间 + price: number // 销售金额 +} + +// ERP 销售统计 API +export const SaleStatisticsApi = { + // 获得销售统计 + getSaleSummary: async (): Promise => { + return await request.get({ url: `/erp/sale-statistics/summary` }) + }, + + // 获得销售时间段统计 + getSaleTimeSummary: async (): Promise => { + return await request.get({ url: `/erp/sale-statistics/time-summary` }) + } +} diff --git a/src/api/erp/stock/check/index.ts b/src/api/erp/stock/check/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a3e653427338f8ab9e391656fdd1d6bc771a79c --- /dev/null +++ b/src/api/erp/stock/check/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// ERP 库存盘点单 VO +export interface StockCheckVO { + id: number // 出库编号 + no: string // 出库单号 + outTime: Date // 出库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 库存盘点单 API +export const StockCheckApi = { + // 查询库存盘点单分页 + getStockCheckPage: async (params: any) => { + return await request.get({ url: `/erp/stock-check/page`, params }) + }, + + // 查询库存盘点单详情 + getStockCheck: async (id: number) => { + return await request.get({ url: `/erp/stock-check/get?id=` + id }) + }, + + // 新增库存盘点单 + createStockCheck: async (data: StockCheckVO) => { + return await request.post({ url: `/erp/stock-check/create`, data }) + }, + + // 修改库存盘点单 + updateStockCheck: async (data: StockCheckVO) => { + return await request.put({ url: `/erp/stock-check/update`, data }) + }, + + // 更新库存盘点单的状态 + updateStockCheckStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/stock-check/update-status`, + params: { + id, + status + } + }) + }, + + // 删除库存盘点单 + deleteStockCheck: async (ids: number[]) => { + return await request.delete({ + url: `/erp/stock-check/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出库存盘点单 Excel + exportStockCheck: async (params) => { + return await request.download({ url: `/erp/stock-check/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/in/index.ts b/src/api/erp/stock/in/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..148b64f21262928afd90caa5e0cb54da43149d56 --- /dev/null +++ b/src/api/erp/stock/in/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// ERP 其它入库单 VO +export interface StockInVO { + id: number // 入库编号 + no: string // 入库单号 + supplierId: number // 供应商编号 + inTime: Date // 入库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 其它入库单 API +export const StockInApi = { + // 查询其它入库单分页 + getStockInPage: async (params: any) => { + return await request.get({ url: `/erp/stock-in/page`, params }) + }, + + // 查询其它入库单详情 + getStockIn: async (id: number) => { + return await request.get({ url: `/erp/stock-in/get?id=` + id }) + }, + + // 新增其它入库单 + createStockIn: async (data: StockInVO) => { + return await request.post({ url: `/erp/stock-in/create`, data }) + }, + + // 修改其它入库单 + updateStockIn: async (data: StockInVO) => { + return await request.put({ url: `/erp/stock-in/update`, data }) + }, + + // 更新其它入库单的状态 + updateStockInStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/stock-in/update-status`, + params: { + id, + status + } + }) + }, + + // 删除其它入库单 + deleteStockIn: async (ids: number[]) => { + return await request.delete({ + url: `/erp/stock-in/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出其它入库单 Excel + exportStockIn: async (params) => { + return await request.download({ url: `/erp/stock-in/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/move/index.ts b/src/api/erp/stock/move/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..398568e0df6273092981e197cfc6bc529dc06f16 --- /dev/null +++ b/src/api/erp/stock/move/index.ts @@ -0,0 +1,61 @@ +import request from '@/config/axios' + +// ERP 库存调度单 VO +export interface StockMoveVO { + id: number // 出库编号 + no: string // 出库单号 + outTime: Date // 出库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 库存调度单 API +export const StockMoveApi = { + // 查询库存调度单分页 + getStockMovePage: async (params: any) => { + return await request.get({ url: `/erp/stock-move/page`, params }) + }, + + // 查询库存调度单详情 + getStockMove: async (id: number) => { + return await request.get({ url: `/erp/stock-move/get?id=` + id }) + }, + + // 新增库存调度单 + createStockMove: async (data: StockMoveVO) => { + return await request.post({ url: `/erp/stock-move/create`, data }) + }, + + // 修改库存调度单 + updateStockMove: async (data: StockMoveVO) => { + return await request.put({ url: `/erp/stock-move/update`, data }) + }, + + // 更新库存调度单的状态 + updateStockMoveStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/stock-move/update-status`, + params: { + id, + status + } + }) + }, + + // 删除库存调度单 + deleteStockMove: async (ids: number[]) => { + return await request.delete({ + url: `/erp/stock-move/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出库存调度单 Excel + exportStockMove: async (params) => { + return await request.download({ url: `/erp/stock-move/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/out/index.ts b/src/api/erp/stock/out/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0f40d3450bbd262ad9e0bed3aa89aa8253e2ddf --- /dev/null +++ b/src/api/erp/stock/out/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// ERP 其它出库单 VO +export interface StockOutVO { + id: number // 出库编号 + no: string // 出库单号 + customerId: number // 客户编号 + outTime: Date // 出库时间 + totalCount: number // 合计数量 + totalPrice: number // 合计金额,单位:元 + status: number // 状态 + remark: string // 备注 +} + +// ERP 其它出库单 API +export const StockOutApi = { + // 查询其它出库单分页 + getStockOutPage: async (params: any) => { + return await request.get({ url: `/erp/stock-out/page`, params }) + }, + + // 查询其它出库单详情 + getStockOut: async (id: number) => { + return await request.get({ url: `/erp/stock-out/get?id=` + id }) + }, + + // 新增其它出库单 + createStockOut: async (data: StockOutVO) => { + return await request.post({ url: `/erp/stock-out/create`, data }) + }, + + // 修改其它出库单 + updateStockOut: async (data: StockOutVO) => { + return await request.put({ url: `/erp/stock-out/update`, data }) + }, + + // 更新其它出库单的状态 + updateStockOutStatus: async (id: number, status: number) => { + return await request.put({ + url: `/erp/stock-out/update-status`, + params: { + id, + status + } + }) + }, + + // 删除其它出库单 + deleteStockOut: async (ids: number[]) => { + return await request.delete({ + url: `/erp/stock-out/delete`, + params: { + ids: ids.join(',') + } + }) + }, + + // 导出其它出库单 Excel + exportStockOut: async (params) => { + return await request.download({ url: `/erp/stock-out/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/record/index.ts b/src/api/erp/stock/record/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a758eb49cc3cb388c76460590615c1c4f9effa55 --- /dev/null +++ b/src/api/erp/stock/record/index.ts @@ -0,0 +1,32 @@ +import request from '@/config/axios' + +// ERP 产品库存明细 VO +export interface StockRecordVO { + id: number // 编号 + productId: number // 产品编号 + warehouseId: number // 仓库编号 + count: number // 出入库数量 + totalCount: number // 总库存量 + bizType: number // 业务类型 + bizId: number // 业务编号 + bizItemId: number // 业务项编号 + bizNo: string // 业务单号 +} + +// ERP 产品库存明细 API +export const StockRecordApi = { + // 查询产品库存明细分页 + getStockRecordPage: async (params: any) => { + return await request.get({ url: `/erp/stock-record/page`, params }) + }, + + // 查询产品库存明细详情 + getStockRecord: async (id: number) => { + return await request.get({ url: `/erp/stock-record/get?id=` + id }) + }, + + // 导出产品库存明细 Excel + exportStockRecord: async (params) => { + return await request.download({ url: `/erp/stock-record/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/stock/index.ts b/src/api/erp/stock/stock/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4de86fb1fed31d7418ff63ba500a31d18518ba35 --- /dev/null +++ b/src/api/erp/stock/stock/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +// ERP 产品库存 VO +export interface StockVO { + // 编号 + id: number + // 产品编号 + productId: number + // 仓库编号 + warehouseId: number + // 库存数量 + count: number +} + +// ERP 产品库存 API +export const StockApi = { + // 查询产品库存分页 + getStockPage: async (params: any) => { + return await request.get({ url: `/erp/stock/page`, params }) + }, + + // 查询产品库存详情 + getStock: async (id: number) => { + return await request.get({ url: `/erp/stock/get?id=` + id }) + }, + + // 查询产品库存详情 + getStock2: async (productId: number, warehouseId: number) => { + return await request.get({ url: `/erp/stock/get`, params: { productId, warehouseId } }) + }, + + // 获得产品库存数量 + getStockCount: async (productId: number) => { + return await request.get({ url: `/erp/stock/get-count`, params: { productId } }) + }, + + // 导出产品库存 Excel + exportStock: async (params) => { + return await request.download({ url: `/erp/stock/export-excel`, params }) + } +} diff --git a/src/api/erp/stock/warehouse/index.ts b/src/api/erp/stock/warehouse/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..598824bf38bd3a30f59ea7b60c103d3fa672de68 --- /dev/null +++ b/src/api/erp/stock/warehouse/index.ts @@ -0,0 +1,64 @@ +import request from '@/config/axios' + +// ERP 仓库 VO +export interface WarehouseVO { + id: number // 仓库编号 + name: string // 仓库名称 + address: string // 仓库地址 + sort: number // 排序 + remark: string // 备注 + principal: string // 负责人 + warehousePrice: number // 仓储费,单位:元 + truckagePrice: number // 搬运费,单位:元 + status: number // 开启状态 + defaultStatus: boolean // 是否默认 +} + +// ERP 仓库 API +export const WarehouseApi = { + // 查询仓库分页 + getWarehousePage: async (params: any) => { + return await request.get({ url: `/erp/warehouse/page`, params }) + }, + + // 查询仓库精简列表 + getWarehouseSimpleList: async () => { + return await request.get({ url: `/erp/warehouse/simple-list` }) + }, + + // 查询仓库详情 + getWarehouse: async (id: number) => { + return await request.get({ url: `/erp/warehouse/get?id=` + id }) + }, + + // 新增仓库 + createWarehouse: async (data: WarehouseVO) => { + return await request.post({ url: `/erp/warehouse/create`, data }) + }, + + // 修改仓库 + updateWarehouse: async (data: WarehouseVO) => { + return await request.put({ url: `/erp/warehouse/update`, data }) + }, + + // 修改仓库默认状态 + updateWarehouseDefaultStatus: async (id: number, defaultStatus: boolean) => { + return await request.put({ + url: `/erp/warehouse/update-default-status`, + params: { + id, + defaultStatus + } + }) + }, + + // 删除仓库 + deleteWarehouse: async (id: number) => { + return await request.delete({ url: `/erp/warehouse/delete?id=` + id }) + }, + + // 导出仓库 Excel + exportWarehouse: async (params) => { + return await request.download({ url: `/erp/warehouse/export-excel`, params }) + } +} diff --git a/src/api/infra/codegen/index.ts b/src/api/infra/codegen/index.ts index 54f00ff0e35597eb15f4415be657ea45eeb73371..d4add25e590ff44defdb89f3b7d6f002dafe4fb4 100644 --- a/src/api/infra/codegen/index.ts +++ b/src/api/infra/codegen/index.ts @@ -1,6 +1,11 @@ import request from '@/config/axios' import type { CodegenUpdateReqVO, CodegenCreateListReqVO } from './types' +// 查询列表代码生成表定义 +export const getCodegenTableList = (dataSourceConfigId: number) => { + return request.get({ url: '/infra/codegen/table/list?dataSourceConfigId=' + dataSourceConfigId }) +} + // 查询列表代码生成表定义 export const getCodegenTablePageApi = (params) => { return request.get({ url: '/infra/codegen/table/page', params }) @@ -26,11 +31,6 @@ export const syncCodegenFromDBApi = (id: number) => { return request.put({ url: '/infra/codegen/sync-from-db?tableId=' + id }) } -// 基于 SQL 建表语句,同步数据库的表和字段定义 -export const syncCodegenFromSQLApi = (id: number, sql: string) => { - return request.put({ url: '/infra/codegen/sync-from-sql?tableId=' + id + '&sql=' + sql }) -} - // 预览生成代码 export const previewCodegenApi = (id: number) => { return request.get({ url: '/infra/codegen/preview?tableId=' + id }) diff --git a/src/api/infra/codegen/types.ts b/src/api/infra/codegen/types.ts index be6a66edecd64adeccd0a2c35140321e5e4aa2fc..df2f93d8a360848581ab8fd54f1a9a16b3cec61c 100644 --- a/src/api/infra/codegen/types.ts +++ b/src/api/infra/codegen/types.ts @@ -26,7 +26,7 @@ export type CodegenColumnVO = { columnComment: string nullable: number primaryKey: number - autoIncrement: string + autoIncrement: boolean ordinalPosition: number javaType: string javaField: string diff --git a/src/api/infra/dataSourceConfig/index.ts b/src/api/infra/dataSourceConfig/index.ts index c0f9f6249bdd2b054abced129a1ad9c0a30ca26b..70a03eaffb06b6ae182124e1e69e9b51dc4dc2fa 100644 --- a/src/api/infra/dataSourceConfig/index.ts +++ b/src/api/infra/dataSourceConfig/index.ts @@ -1,22 +1,12 @@ import request from '@/config/axios' export interface DataSourceConfigVO { - id: number + id: number | undefined name: string url: string username: string password: string - createTime: Date -} - -// 查询数据源配置列表 -export const getDataSourceConfigListApi = () => { - return request.get({ url: '/infra/data-source-config/list' }) -} - -// 查询数据源配置详情 -export const getDataSourceConfigApi = (id: number) => { - return request.get({ url: '/infra/data-source-config/get?id=' + id }) + createTime?: Date } // 新增数据源配置 @@ -33,3 +23,13 @@ export const updateDataSourceConfigApi = (data: DataSourceConfigVO) => { export const deleteDataSourceConfigApi = (id: number) => { return request.delete({ url: '/infra/data-source-config/delete?id=' + id }) } + +// 查询数据源配置列表 +export const getDataSourceConfigListApi = () => { + return request.get({ url: '/infra/data-source-config/list' }) +} + +// 查询数据源配置详情 +export const getDataSourceConfigApi = (id: number) => { + return request.get({ url: '/infra/data-source-config/get?id=' + id }) +} diff --git a/src/api/infra/demo/demo01/index.ts b/src/api/infra/demo/demo01/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e34a05d1055137cb04f832727cc0a63ff7f05870 --- /dev/null +++ b/src/api/infra/demo/demo01/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface Demo01ContactVO { + id: number + name: string + sex: number + birthday: Date + description: string + avatar: string +} + +// 查询示例联系人分页 +export const getDemo01ContactPage = async (params) => { + return await request.get({ url: `/infra/demo01-contact/page`, params }) +} + +// 查询示例联系人详情 +export const getDemo01Contact = async (id: number) => { + return await request.get({ url: `/infra/demo01-contact/get?id=` + id }) +} + +// 新增示例联系人 +export const createDemo01Contact = async (data: Demo01ContactVO) => { + return await request.post({ url: `/infra/demo01-contact/create`, data }) +} + +// 修改示例联系人 +export const updateDemo01Contact = async (data: Demo01ContactVO) => { + return await request.put({ url: `/infra/demo01-contact/update`, data }) +} + +// 删除示例联系人 +export const deleteDemo01Contact = async (id: number) => { + return await request.delete({ url: `/infra/demo01-contact/delete?id=` + id }) +} + +// 导出示例联系人 Excel +export const exportDemo01Contact = async (params) => { + return await request.download({ url: `/infra/demo01-contact/export-excel`, params }) +} diff --git a/src/api/infra/demo/demo02/index.ts b/src/api/infra/demo/demo02/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..30e168634f0de8cd780b51adaa301b5a7b1a7a3c --- /dev/null +++ b/src/api/infra/demo/demo02/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface Demo02CategoryVO { + id: number + name: string + parentId: number +} + +// 查询示例分类列表 +export const getDemo02CategoryList = async (params) => { + return await request.get({ url: `/infra/demo02-category/list`, params }) +} + +// 查询示例分类详情 +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 }) +} diff --git a/src/api/infra/demo/demo03/erp/index.ts b/src/api/infra/demo/demo03/erp/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2ab5398187da4dbc16b93fafa569e9e50e75a7f --- /dev/null +++ b/src/api/infra/demo/demo03/erp/index.ts @@ -0,0 +1,91 @@ +import request from '@/config/axios' + +export interface Demo03StudentVO { + id: number + name: string + sex: number + birthday: Date + description: string +} + +// 查询学生分页 +export const getDemo03StudentPage = async (params) => { + return await request.get({ url: `/infra/demo03-student/page`, params }) +} + +// 查询学生详情 +export const getDemo03Student = async (id: number) => { + return await request.get({ url: `/infra/demo03-student/get?id=` + id }) +} + +// 新增学生 +export const createDemo03Student = async (data: Demo03StudentVO) => { + return await request.post({ url: `/infra/demo03-student/create`, data }) +} + +// 修改学生 +export const updateDemo03Student = async (data: Demo03StudentVO) => { + return await request.put({ url: `/infra/demo03-student/update`, data }) +} + +// 删除学生 +export const deleteDemo03Student = async (id: number) => { + return await request.delete({ url: `/infra/demo03-student/delete?id=` + id }) +} + +// 导出学生 Excel +export const exportDemo03Student = async (params) => { + return await request.download({ url: `/infra/demo03-student/export-excel`, params }) +} + +// ==================== 子表(学生课程) ==================== + +// 获得学生课程分页 +export const getDemo03CoursePage = async (params) => { + return await request.get({ url: `/infra/demo03-student/demo03-course/page`, params }) +} +// 新增学生课程 +export const createDemo03Course = async (data) => { + return await request.post({ url: `/infra/demo03-student/demo03-course/create`, data }) +} + +// 修改学生课程 +export const updateDemo03Course = async (data) => { + return await request.put({ url: `/infra/demo03-student/demo03-course/update`, data }) +} + +// 删除学生课程 +export const deleteDemo03Course = async (id: number) => { + return await request.delete({ url: `/infra/demo03-student/demo03-course/delete?id=` + id }) +} + +// 获得学生课程 +export const getDemo03Course = async (id: number) => { + return await request.get({ url: `/infra/demo03-student/demo03-course/get?id=` + id }) +} + +// ==================== 子表(学生班级) ==================== + +// 获得学生班级分页 +export const getDemo03GradePage = async (params) => { + return await request.get({ url: `/infra/demo03-student/demo03-grade/page`, params }) +} +// 新增学生班级 +export const createDemo03Grade = async (data) => { + return await request.post({ url: `/infra/demo03-student/demo03-grade/create`, data }) +} + +// 修改学生班级 +export const updateDemo03Grade = async (data) => { + return await request.put({ url: `/infra/demo03-student/demo03-grade/update`, data }) +} + +// 删除学生班级 +export const deleteDemo03Grade = async (id: number) => { + return await request.delete({ url: `/infra/demo03-student/demo03-grade/delete?id=` + id }) +} + +// 获得学生班级 +export const getDemo03Grade = async (id: number) => { + return await request.get({ url: `/infra/demo03-student/demo03-grade/get?id=` + id }) +} diff --git a/src/api/infra/demo/demo03/inner/index.ts b/src/api/infra/demo/demo03/inner/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e3663078f2dd4b33d426402f232363b26c157fd8 --- /dev/null +++ b/src/api/infra/demo/demo03/inner/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface Demo03StudentVO { + id: number + name: string + sex: number + birthday: Date + description: string +} + +// 查询学生分页 +export const getDemo03StudentPage = async (params) => { + return await request.get({ url: `/infra/demo03-student/page`, params }) +} + +// 查询学生详情 +export const getDemo03Student = async (id: number) => { + return await request.get({ url: `/infra/demo03-student/get?id=` + id }) +} + +// 新增学生 +export const createDemo03Student = async (data: Demo03StudentVO) => { + return await request.post({ url: `/infra/demo03-student/create`, data }) +} + +// 修改学生 +export const updateDemo03Student = async (data: Demo03StudentVO) => { + return await request.put({ url: `/infra/demo03-student/update`, data }) +} + +// 删除学生 +export const deleteDemo03Student = async (id: number) => { + return await request.delete({ url: `/infra/demo03-student/delete?id=` + id }) +} + +// 导出学生 Excel +export const exportDemo03Student = async (params) => { + return await request.download({ url: `/infra/demo03-student/export-excel`, params }) +} + +// ==================== 子表(学生课程) ==================== + +// 获得学生课程列表 +export const getDemo03CourseListByStudentId = async (studentId) => { + return await request.get({ + url: `/infra/demo03-student/demo03-course/list-by-student-id?studentId=` + studentId + }) +} + +// ==================== 子表(学生班级) ==================== + +// 获得学生班级 +export const getDemo03GradeByStudentId = async (studentId) => { + return await request.get({ + url: `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=` + studentId + }) +} diff --git a/src/api/infra/demo/demo03/normal/index.ts b/src/api/infra/demo/demo03/normal/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e3663078f2dd4b33d426402f232363b26c157fd8 --- /dev/null +++ b/src/api/infra/demo/demo03/normal/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +export interface Demo03StudentVO { + id: number + name: string + sex: number + birthday: Date + description: string +} + +// 查询学生分页 +export const getDemo03StudentPage = async (params) => { + return await request.get({ url: `/infra/demo03-student/page`, params }) +} + +// 查询学生详情 +export const getDemo03Student = async (id: number) => { + return await request.get({ url: `/infra/demo03-student/get?id=` + id }) +} + +// 新增学生 +export const createDemo03Student = async (data: Demo03StudentVO) => { + return await request.post({ url: `/infra/demo03-student/create`, data }) +} + +// 修改学生 +export const updateDemo03Student = async (data: Demo03StudentVO) => { + return await request.put({ url: `/infra/demo03-student/update`, data }) +} + +// 删除学生 +export const deleteDemo03Student = async (id: number) => { + return await request.delete({ url: `/infra/demo03-student/delete?id=` + id }) +} + +// 导出学生 Excel +export const exportDemo03Student = async (params) => { + return await request.download({ url: `/infra/demo03-student/export-excel`, params }) +} + +// ==================== 子表(学生课程) ==================== + +// 获得学生课程列表 +export const getDemo03CourseListByStudentId = async (studentId) => { + return await request.get({ + url: `/infra/demo03-student/demo03-course/list-by-student-id?studentId=` + studentId + }) +} + +// ==================== 子表(学生班级) ==================== + +// 获得学生班级 +export const getDemo03GradeByStudentId = async (studentId) => { + return await request.get({ + url: `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=` + studentId + }) +} diff --git a/src/api/infra/file/index.ts b/src/api/infra/file/index.ts index f64bc0d69b25afb9648d82277d3c04b984c35e92..0e1b2e7c83ae7b9996b73f1759cf29665b48babb 100644 --- a/src/api/infra/file/index.ts +++ b/src/api/infra/file/index.ts @@ -6,6 +6,16 @@ export interface FilePageReqVO extends PageParam { createTime?: Date[] } +// 文件预签名地址 Response VO +export interface FilePresignedUrlRespVO { + // 文件配置编号 + configId: number + // 文件上传 URL + uploadUrl: string + // 文件 URL + url: string +} + // 查询文件列表 export const getFilePage = (params: FilePageReqVO) => { return request.get({ url: '/infra/file/page', params }) @@ -15,3 +25,21 @@ export const getFilePage = (params: FilePageReqVO) => { export const deleteFile = (id: number) => { return request.delete({ url: '/infra/file/delete?id=' + id }) } + +// 获取文件预签名地址 +export const getFilePresignedUrl = (path: string) => { + return request.get({ + url: '/infra/file/presigned-url', + params: { path } + }) +} + +// 创建文件 +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 }) +} diff --git a/src/api/infra/fileConfig/index.ts b/src/api/infra/fileConfig/index.ts index 9a4f625c19eaf320cc0f0c8700585cd5ed9ac490..baf17b392cc49086f7cf959e853e7bbb61140c6c 100644 --- a/src/api/infra/fileConfig/index.ts +++ b/src/api/infra/fileConfig/index.ts @@ -13,10 +13,11 @@ export interface FileClientConfig { accessSecret?: string domain: string } + export interface FileConfigVO { id: number name: string - storage: any + storage?: number master: boolean visible: boolean config: FileClientConfig diff --git a/src/api/infra/jobLog/index.ts b/src/api/infra/jobLog/index.ts index 84b74fbdea81a1a5689552bd00b589b542cb47f6..db523d949eb2386e6b27ddec165022e014c7bad8 100644 --- a/src/api/infra/jobLog/index.ts +++ b/src/api/infra/jobLog/index.ts @@ -7,8 +7,8 @@ export interface JobLogVO { handlerParam: string cronExpression: string executeIndex: string - beginTime: string - endTime: string + beginTime: Date + endTime: Date duration: string status: number createTime: string diff --git a/src/api/infra/redis/index.ts b/src/api/infra/redis/index.ts index 1214a1daba21c5bfbcce0c75d4f9381f00321044..d41e4bb54027c195aef75ebbea0746c8d1b77cf7 100644 --- a/src/api/infra/redis/index.ts +++ b/src/api/infra/redis/index.ts @@ -6,36 +6,3 @@ import request from '@/config/axios' export const getCacheApi = () => { return request.get({ url: '/infra/redis/get-monitor-info' }) } -// 获取模块 -export const getKeyDefineListApi = () => { - return request.get({ url: '/infra/redis/get-key-define-list' }) -} -/** - * 获取redis key列表 - */ -export const getKeyListApi = (keyTemplate: string) => { - return request.get({ - url: '/infra/redis/get-key-list', - params: { - keyTemplate - } - }) -} -// 获取缓存内容 -export const getKeyValueApi = (key: string) => { - return request.get({ url: '/infra/redis/get-key-value?key=' + key }) -} - -// 根据键名删除缓存 -export const deleteKeyApi = (key: string) => { - return request.delete({ url: '/infra/redis/delete-key?key=' + key }) -} - -export const deleteKeysApi = (keyTemplate: string) => { - return request.delete({ - url: '/infra/redis/delete-keys?', - params: { - keyTemplate - } - }) -} diff --git a/src/api/infra/redis/types.ts b/src/api/infra/redis/types.ts index 2342e54387d626a61be4750481cf206dd26f0da3..548bfe9673fd3cc8b0113030bf47048068f73944 100644 --- a/src/api/infra/redis/types.ts +++ b/src/api/infra/redis/types.ts @@ -174,12 +174,3 @@ export interface RedisCommandStatsVO { calls: number usec: number } - -export interface RedisKeyInfo { - keyTemplate: string - keyType: string - valueType: string - timeoutType: number - timeout: number - memo: string -} diff --git a/src/api/login/index.ts b/src/api/login/index.ts index 6ab3edc5d132986489447a3f7fc5862ed7d0c820..d503d73a529e62390f78bd4f59abd0edf90a8c59 100644 --- a/src/api/login/index.ts +++ b/src/api/login/index.ts @@ -27,6 +27,11 @@ export const getTenantIdByNameApi = (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 loginOutApi = () => { return request.post({ url: '/system/auth/logout' }) @@ -47,6 +52,18 @@ export const smsLoginApi = (data: SmsLoginVO) => { return request.post({ url: '/system/auth/sms-login', data }) } +// 社交快捷登录,使用 code 授权码 +export function socialLogin(type: string, code: string, state: string) { + return request.post({ + url: '/system/auth/social-login', + data: { + type, + code, + state + } + }) +} + // 社交授权的跳转 export const socialAuthRedirectApi = (type: number, redirectUri: string) => { return request.get({ diff --git a/src/api/login/types.ts b/src/api/login/types.ts index b2173f72687cbe17222d520c0c8fbe3790bcd3c8..fff8122587862dbf42e812b585ef62f7f277993e 100644 --- a/src/api/login/types.ts +++ b/src/api/login/types.ts @@ -2,6 +2,9 @@ export type UserLoginVO = { username: string password: string captchaVerification: string + socialType?: string + socialCode?: string + socialState?: string } export type TokenType = { diff --git a/src/api/mall/market/banner/index.ts b/src/api/mall/market/banner/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee65024cb5260c62ea1a7e53c139eee45c45d729 --- /dev/null +++ b/src/api/mall/market/banner/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface BannerVO { + id: number + title: string + picUrl: string + status: number + url: string + position: number + sort: number + memo: string +} + +// 查询Banner管理列表 +export const getBannerPage = async (params) => { + return await request.get({ url: `/promotion/banner/page`, params }) +} + +// 查询Banner管理详情 +export const getBanner = async (id: number) => { + return await request.get({ url: `/promotion/banner/get?id=` + id }) +} + +// 新增Banner管理 +export const createBanner = async (data: BannerVO) => { + return await request.post({ url: `/promotion/banner/create`, data }) +} + +// 修改Banner管理 +export const updateBanner = async (data: BannerVO) => { + return await request.put({ url: `/promotion/banner/update`, data }) +} + +// 删除Banner管理 +export const deleteBanner = async (id: number) => { + return await request.delete({ url: `/promotion/banner/delete?id=` + id }) +} diff --git a/src/api/mall/product/category.ts b/src/api/mall/product/category.ts index 8158fc0f1c6cb607e4788718f6bd84215d59b7bc..7e80b76a31cdde5d8c76c375e1b05345a5ff041d 100644 --- a/src/api/mall/product/category.ts +++ b/src/api/mall/product/category.ts @@ -20,10 +20,6 @@ export interface CategoryVO { * 移动端分类图 */ picUrl: string - /** - * PC 端分类图 - */ - bigPicUrl?: string /** * 分类排序 */ diff --git a/src/api/mall/product/favorite.ts b/src/api/mall/product/favorite.ts new file mode 100644 index 0000000000000000000000000000000000000000..3834eed0785a45c8d34b26306e4be9cfcd2eb180 --- /dev/null +++ b/src/api/mall/product/favorite.ts @@ -0,0 +1,12 @@ +import request from '@/config/axios' + +export interface Favorite { + id?: number + userId?: string // 用户编号 + spuId?: number | null // 商品 SPU 编号 +} + +// 获得 ProductFavorite 列表 +export const getFavoritePage = (params: PageParam) => { + return request.get({ url: '/product/favorite/page', params }) +} diff --git a/src/api/mall/product/property.ts b/src/api/mall/product/property.ts index ac8bac59e28179ccfbf84d8bc48c803b745e3d3b..44dc663f0ca39c8c09d73e61f7337a3dc178a607 100644 --- a/src/api/mall/product/property.ts +++ b/src/api/mall/product/property.ts @@ -65,16 +65,6 @@ export const getPropertyPage = (params: PageParam) => { return request.get({ url: '/product/property/page', params }) } -// 获得属性项列表 -export const getPropertyList = (params: any) => { - return request.get({ url: '/product/property/list', params }) -} - -// 获得属性项列表 -export const getPropertyListAndValue = (data: any) => { - return request.post({ url: '/product/property/get-value-list', data }) -} - // ------------------------ 属性值 ------------------- // 获得属性值分页 diff --git a/src/api/mall/product/spu.ts b/src/api/mall/product/spu.ts index 6c476b8c7932b951b48fbea9adc23c6c979fa787..eee632d5365de0cbb33992bbb9a61b3cc9af19e2 100644 --- a/src/api/mall/product/spu.ts +++ b/src/api/mall/product/spu.ts @@ -20,22 +20,28 @@ export interface Sku { stock?: number // 库存 weight?: number // 商品重量,单位:kg 千克 volume?: number // 商品体积,单位:m^3 平米 - firstBrokerageRecord?: number | string // 一级分销的佣金 - secondBrokerageRecord?: number | string // 二级分销的佣金 + firstBrokeragePrice?: number | string // 一级分销的佣金 + secondBrokeragePrice?: number | string // 二级分销的佣金 salesCount?: number // 商品销量 } +export interface GiveCouponTemplate { + id?: number + name?: string // 优惠券名称 +} + export interface Spu { id?: number name?: string // 商品名称 - categoryId?: number | null // 商品分类 + categoryId?: number // 商品分类 keyword?: string // 关键字 - unit?: number | null // 单位 + unit?: number | undefined // 单位 picUrl?: string // 商品封面图 sliderPicUrls?: string[] // 商品轮播图 introduction?: string // 商品简介 - deliveryTemplateId?: number | null // 运费模版 - brandId?: number | null // 商品品牌编号 + deliveryTypes?: number[] // 配送方式 + deliveryTemplateId?: number | undefined // 运费模版 + brandId?: number // 商品品牌编号 specType?: boolean // 商品规格 subCommissionType?: boolean // 分销类型 skus?: Sku[] // sku数组 @@ -43,11 +49,6 @@ export interface Spu { sort?: number // 商品排序 giveIntegral?: number // 赠送积分 virtualSalesCount?: number // 虚拟销量 - recommendHot?: boolean // 是否热卖 - recommendBenefit?: boolean // 是否优惠 - recommendBest?: boolean // 是否精品 - recommendNew?: boolean // 是否新品 - recommendGood?: boolean // 是否优品 price?: number // 商品价格 salesCount?: number // 商品销量 marketPrice?: number // 市场价 @@ -104,5 +105,5 @@ export const exportSpu = async (params) => { // 获得商品 SPU 精简列表 export const getSpuSimpleList = async () => { - return request.get({ url: '/product/spu/get-simple-list' }) + return request.get({ url: '/product/spu/list-all-simple' }) } diff --git a/src/api/mall/promotion/article/index.ts b/src/api/mall/promotion/article/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9184c7af90594094baac5b7fc040feafa10daea1 --- /dev/null +++ b/src/api/mall/promotion/article/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +export interface ArticleVO { + id: number + categoryId: number + title: string + author: string + picUrl: string + introduction: string + browseCount: string + sort: number + status: number + spuId: number + recommendHot: boolean + recommendBanner: boolean + content: string +} + +// 查询文章管理列表 +export const getArticlePage = async (params: any) => { + return await request.get({ url: `/promotion/article/page`, params }) +} + +// 查询文章管理详情 +export const getArticle = async (id: number) => { + return await request.get({ url: `/promotion/article/get?id=` + id }) +} + +// 新增文章管理 +export const createArticle = async (data: ArticleVO) => { + return await request.post({ url: `/promotion/article/create`, data }) +} + +// 修改文章管理 +export const updateArticle = async (data: ArticleVO) => { + return await request.put({ url: `/promotion/article/update`, data }) +} + +// 删除文章管理 +export const deleteArticle = async (id: number) => { + return await request.delete({ url: `/promotion/article/delete?id=` + id }) +} diff --git a/src/api/mall/promotion/articleCategory/index.ts b/src/api/mall/promotion/articleCategory/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..47f5e934db3e7164cc3344662200f65b14d843d5 --- /dev/null +++ b/src/api/mall/promotion/articleCategory/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface ArticleCategoryVO { + id: number + name: string + picUrl: string + status: number + sort: number +} + +// 查询文章分类列表 +export const getArticleCategoryPage = async (params) => { + return await request.get({ url: `/promotion/article-category/page`, params }) +} + +// 查询文章分类精简信息列表 +export const getSimpleArticleCategoryList = async () => { + return await request.get({ url: `/promotion/article-category/list-all-simple` }) +} + +// 查询文章分类详情 +export const getArticleCategory = async (id: number) => { + return await request.get({ url: `/promotion/article-category/get?id=` + id }) +} + +// 新增文章分类 +export const createArticleCategory = async (data: ArticleCategoryVO) => { + return await request.post({ url: `/promotion/article-category/create`, data }) +} + +// 修改文章分类 +export const updateArticleCategory = async (data: ArticleCategoryVO) => { + return await request.put({ url: `/promotion/article-category/update`, data }) +} + +// 删除文章分类 +export const deleteArticleCategory = async (id: number) => { + return await request.delete({ url: `/promotion/article-category/delete?id=` + id }) +} diff --git a/src/api/mall/promotion/bargain/bargainActivity.ts b/src/api/mall/promotion/bargain/bargainActivity.ts index 1e5d5f7842979191e731189919963bad65e4a433..9ad219accde374885277f1d9ddf5bd841d3d1b81 100644 --- a/src/api/mall/promotion/bargain/bargainActivity.ts +++ b/src/api/mall/promotion/bargain/bargainActivity.ts @@ -7,17 +7,16 @@ export interface BargainActivityVO { startTime?: Date endTime?: Date status?: number - userSize?: number // 达到该人数,才能砍到低价 + helpMaxCount?: number // 达到该人数,才能砍到低价 bargainCount?: number // 最大帮砍次数 totalLimitCount?: number // 最大购买次数 spuId: number skuId: number bargainFirstPrice: number // 砍价起始价格,单位分 - bargainPrice: number // 砍价底价 + bargainMinPrice: number // 砍价底价 stock: number // 活动库存 randomMinPrice?: number // 用户每次砍价的最小金额,单位:分 randomMaxPrice?: number // 用户每次砍价的最大金额,单位:分 - successCount?: number // 砍价成功数量 } // 砍价活动所需属性。选择的商品和属性的时候使用方便使用活动的通用封装 @@ -25,7 +24,7 @@ export interface BargainProductVO { spuId: number skuId: number bargainFirstPrice: number // 砍价起始价格,单位分 - bargainPrice: number // 砍价底价 + bargainMinPrice: number // 砍价底价 stock: number // 活动库存 } @@ -58,6 +57,11 @@ export const updateBargainActivity = async (data: BargainActivityVO) => { return await request.put({ url: '/promotion/bargain-activity/update', data }) } +// 关闭砍价活动 +export const closeBargainActivity = async (id: number) => { + return await request.put({ url: '/promotion/bargain-activity/close?id=' + id }) +} + // 删除砍价活动 export const deleteBargainActivity = async (id: number) => { return await request.delete({ url: '/promotion/bargain-activity/delete?id=' + id }) diff --git a/src/api/mall/promotion/bargain/bargainHelp.ts b/src/api/mall/promotion/bargain/bargainHelp.ts new file mode 100644 index 0000000000000000000000000000000000000000..4308ae6614e29065df15b7b93440955f188b4e96 --- /dev/null +++ b/src/api/mall/promotion/bargain/bargainHelp.ts @@ -0,0 +1,14 @@ +import request from '@/config/axios' + +export interface BargainHelpVO { + id: number + record: number + userId: number + reducePrice: number + endTime: Date +} + +// 查询砍价记录列表 +export const getBargainHelpPage = async (params) => { + return await request.get({ url: `/promotion/bargain-help/page`, params }) +} diff --git a/src/api/mall/promotion/bargain/bargainRecord.ts b/src/api/mall/promotion/bargain/bargainRecord.ts new file mode 100644 index 0000000000000000000000000000000000000000..f90b78455db2ba3ae739bb485aa25e745fa0c36e --- /dev/null +++ b/src/api/mall/promotion/bargain/bargainRecord.ts @@ -0,0 +1,19 @@ +import request from '@/config/axios' + +export interface BargainRecordVO { + id: number + activityId: number + userId: number + spuId: number + skuId: number + bargainFirstPrice: number + bargainPrice: number + status: number + orderId: number + endTime: Date +} + +// 查询砍价记录列表 +export const getBargainRecordPage = async (params) => { + return await request.get({ url: `/promotion/bargain-record/page`, params }) +} diff --git a/src/api/mall/promotion/combination/combinationActivity.ts b/src/api/mall/promotion/combination/combinationActivity.ts index f89264e48b1e3fe428f1f4529b4bc87521bf2d8e..062db5c25cdd78a1d1972ce2a72cfe8b439ee03c 100644 --- a/src/api/mall/promotion/combination/combinationActivity.ts +++ b/src/api/mall/promotion/combination/combinationActivity.ts @@ -55,6 +55,11 @@ export const updateCombinationActivity = async (data: CombinationActivityVO) => return await request.put({ url: '/promotion/combination-activity/update', data }) } +// 关闭拼团活动 +export const closeCombinationActivity = async (id: number) => { + return await request.put({ url: '/promotion/combination-activity/close?id=' + id }) +} + // 删除拼团活动 export const deleteCombinationActivity = async (id: number) => { return await request.delete({ url: '/promotion/combination-activity/delete?id=' + id }) diff --git a/src/api/mall/promotion/combination/combinationRecord.ts b/src/api/mall/promotion/combination/combinationRecord.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2b7d75fd7943158ed99316eebc1a54b111ad4b5 --- /dev/null +++ b/src/api/mall/promotion/combination/combinationRecord.ts @@ -0,0 +1,28 @@ +import request from '@/config/axios' + +export interface CombinationRecordVO { + id: number // 拼团记录编号 + activityId: number // 拼团活动编号 + nickname: string // 用户昵称 + avatar: string // 用户头像 + headId: number // 团长编号 + expireTime: string // 过期时间 + userSize: number // 可参团人数 + userCount: number // 已参团人数 + status: number // 拼团状态 + spuName: string // 商品名字 + picUrl: string // 商品图片 + virtualGroup: boolean // 是否虚拟成团 + startTime: string // 开始时间 (订单付款后开始的时间) + endTime: string // 结束时间(成团时间/失败时间) +} + +// 查询拼团记录列表 +export const getCombinationRecordPage = async (params: any) => { + return await request.get({ url: '/promotion/combination-record/page', params }) +} + +// 获得拼团记录的概要信息 +export const getCombinationRecordSummary = async () => { + return await request.get({ url: '/promotion/combination-record/get-summary' }) +} diff --git a/src/api/mall/promotion/coupon/couponTemplate.ts b/src/api/mall/promotion/coupon/couponTemplate.ts index 243e22eede700418f90a50409ab9e921a581420f..50ae226cd3a6a0b6d5aa67ed9aa3fde15fe6688e 100755 --- a/src/api/mall/promotion/coupon/couponTemplate.ts +++ b/src/api/mall/promotion/coupon/couponTemplate.ts @@ -73,6 +73,13 @@ export function getCouponTemplatePage(params: PageParam) { }) } +// 获得优惠劵模板分页 +export function getCouponTemplateList(ids: number[]) { + return request.get({ + url: `/promotion/coupon-template/list?ids=${ids}` + }) +} + // 导出优惠劵模板 Excel export function exportCouponTemplateExcel(params: PageParam) { return request.get({ diff --git a/src/api/mall/promotion/discount/discountActivity.ts b/src/api/mall/promotion/discount/discountActivity.ts new file mode 100644 index 0000000000000000000000000000000000000000..e755c1bd851b948cb5053a43ac7c4ba0b1f857ca --- /dev/null +++ b/src/api/mall/promotion/discount/discountActivity.ts @@ -0,0 +1,60 @@ +import request from '@/config/axios' +import { Sku, Spu } from '@/api/mall/product/spu' + +export interface DiscountActivityVO { + id?: number + spuId?: number + name?: string + status?: number + remark?: string + startTime?: Date + endTime?: Date + products?: DiscountProductVO[] +} +// 限时折扣相关 属性 +export interface DiscountProductVO { + spuId: number + skuId: number + discountType: number + discountPercent: number + discountPrice: number +} + +// 扩展 Sku 配置 +export type SkuExtension = Sku & { + productConfig: DiscountProductVO +} + +export interface SpuExtension extends Spu { + skus: SkuExtension[] // 重写类型 +} + +// 查询限时折扣活动列表 +export const getDiscountActivityPage = async (params) => { + return await request.get({ url: '/promotion/discount-activity/page', params }) +} + +// 查询限时折扣活动详情 +export const getDiscountActivity = async (id: number) => { + return await request.get({ url: '/promotion/discount-activity/get?id=' + id }) +} + +// 新增限时折扣活动 +export const createDiscountActivity = async (data: DiscountActivityVO) => { + return await request.post({ url: '/promotion/discount-activity/create', data }) +} + +// 修改限时折扣活动 +export const updateDiscountActivity = async (data: DiscountActivityVO) => { + return await request.put({ url: '/promotion/discount-activity/update', data }) +} + +// 关闭限时折扣活动 +export const closeDiscountActivity = async (id: number) => { + return await request.put({ url: '/promotion/discount-activity/close?id=' + id }) +} + +// 删除限时折扣活动 +export const deleteDiscountActivity = async (id: number) => { + return await request.delete({ url: '/promotion/discount-activity/delete?id=' + id }) +} diff --git a/src/api/mall/promotion/diy/page.ts b/src/api/mall/promotion/diy/page.ts new file mode 100644 index 0000000000000000000000000000000000000000..a834b2407446571cde47ebf13767d585ce4ddeca --- /dev/null +++ b/src/api/mall/promotion/diy/page.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +export interface DiyPageVO { + id?: number + templateId?: number + name: string + remark: string + previewPicUrls: string[] + property: string +} + +// 查询装修页面列表 +export const getDiyPagePage = async (params: any) => { + return await request.get({ url: `/promotion/diy-page/page`, params }) +} + +// 查询装修页面详情 +export const getDiyPage = async (id: number) => { + return await request.get({ url: `/promotion/diy-page/get?id=` + id }) +} + +// 新增装修页面 +export const createDiyPage = async (data: DiyPageVO) => { + return await request.post({ url: `/promotion/diy-page/create`, data }) +} + +// 修改装修页面 +export const updateDiyPage = async (data: DiyPageVO) => { + return await request.put({ url: `/promotion/diy-page/update`, data }) +} + +// 删除装修页面 +export const deleteDiyPage = async (id: number) => { + return await request.delete({ url: `/promotion/diy-page/delete?id=` + id }) +} + +// 获得装修页面属性 +export const getDiyPageProperty = async (id: number) => { + return await request.get({ url: `/promotion/diy-page/get-property?id=` + id }) +} + +// 更新装修页面属性 +export const updateDiyPageProperty = async (data: DiyPageVO) => { + return await request.put({ url: `/promotion/diy-page/update-property`, data }) +} diff --git a/src/api/mall/promotion/diy/template.ts b/src/api/mall/promotion/diy/template.ts new file mode 100644 index 0000000000000000000000000000000000000000..87134c95ac4087f89e5167092d8402a8239e7506 --- /dev/null +++ b/src/api/mall/promotion/diy/template.ts @@ -0,0 +1,58 @@ +import request from '@/config/axios' +import { DiyPageVO } from '@/api/mall/promotion/diy/page' + +export interface DiyTemplateVO { + id?: number + name: string + used: boolean + usedTime?: Date + remark: string + previewPicUrls: string[] + property: string +} + +export interface DiyTemplatePropertyVO extends DiyTemplateVO { + pages: DiyPageVO[] +} + +// 查询装修模板列表 +export const getDiyTemplatePage = async (params: any) => { + return await request.get({ url: `/promotion/diy-template/page`, params }) +} + +// 查询装修模板详情 +export const getDiyTemplate = async (id: number) => { + return await request.get({ url: `/promotion/diy-template/get?id=` + id }) +} + +// 新增装修模板 +export const createDiyTemplate = async (data: DiyTemplateVO) => { + return await request.post({ url: `/promotion/diy-template/create`, data }) +} + +// 修改装修模板 +export const updateDiyTemplate = async (data: DiyTemplateVO) => { + return await request.put({ url: `/promotion/diy-template/update`, data }) +} + +// 删除装修模板 +export const deleteDiyTemplate = async (id: number) => { + return await request.delete({ url: `/promotion/diy-template/delete?id=` + id }) +} + +// 使用装修模板 +export const useDiyTemplate = async (id: number) => { + return await request.put({ url: `/promotion/diy-template/use?id=` + id }) +} + +// 获得装修模板属性 +export const getDiyTemplateProperty = async (id: number) => { + return await request.get({ + url: `/promotion/diy-template/get-property?id=` + id + }) +} + +// 更新装修模板属性 +export const updateDiyTemplateProperty = async (data: DiyTemplateVO) => { + return await request.put({ url: `/promotion/diy-template/update-property`, data }) +} diff --git a/src/api/mall/promotion/reward/rewardActivity.ts b/src/api/mall/promotion/reward/rewardActivity.ts new file mode 100644 index 0000000000000000000000000000000000000000..691db4761eec85fc5e7e7b01585064a15ac77287 --- /dev/null +++ b/src/api/mall/promotion/reward/rewardActivity.ts @@ -0,0 +1,48 @@ +import request from '@/config/axios' + +export interface DiscountActivityVO { + id?: number + name?: string + startTime?: Date + endTime?: Date + remark?: string + conditionType?: number + productScope?: number + productSpuIds?: number[] + rules?: DiscountProductVO[] +} + +// 优惠规则 +export interface DiscountProductVO { + limit: number + discountPrice: number + freeDelivery: boolean + point: number + couponIds: number[] + couponCounts: number[] +} + +// 新增满减送活动 +export const createRewardActivity = async (data: DiscountActivityVO) => { + return await request.post({ url: '/promotion/reward-activity/create', data }) +} + +// 更新满减送活动 +export const updateRewardActivity = async (data: DiscountActivityVO) => { + return await request.put({ url: '/promotion/reward-activity/update', data }) +} + +// 查询满减送活动列表 +export const getRewardActivityPage = async (params) => { + return await request.get({ url: '/promotion/reward-activity/page', params }) +} + +// 查询满减送活动详情 +export const getReward = async (id: number) => { + return await request.get({ url: '/promotion/reward-activity/get?id=' + id }) +} + +// 删除限时折扣活动 +export const deleteRewardActivity = async (id: number) => { + return await request.delete({ url: '/promotion/reward-activity/delete?id=' + id }) +} diff --git a/src/api/mall/promotion/seckill/seckillActivity.ts b/src/api/mall/promotion/seckill/seckillActivity.ts index 42c1c31c36deef66d0a43a81a01307b4e16f63ee..e834641014efef1a400d8c54201ff7bfda5d1fc2 100644 --- a/src/api/mall/promotion/seckill/seckillActivity.ts +++ b/src/api/mall/promotion/seckill/seckillActivity.ts @@ -57,6 +57,11 @@ export const updateSeckillActivity = async (data: SeckillActivityVO) => { return await request.put({ url: '/promotion/seckill-activity/update', data }) } +// 关闭秒杀活动 +export const closeSeckillActivity = async (id: number) => { + return await request.put({ url: '/promotion/seckill-activity/close?id=' + id }) +} + // 删除秒杀活动 export const deleteSeckillActivity = async (id: number) => { return await request.delete({ url: '/promotion/seckill-activity/delete?id=' + id }) diff --git a/src/api/mall/statistics/common.ts b/src/api/mall/statistics/common.ts new file mode 100644 index 0000000000000000000000000000000000000000..3d964392685ab47776b0db3554823662d134e90a --- /dev/null +++ b/src/api/mall/statistics/common.ts @@ -0,0 +1,5 @@ +/** 数据对照 Response VO */ +export interface DataComparisonRespVO { + value: T + reference: T +} diff --git a/src/api/mall/statistics/member.ts b/src/api/mall/statistics/member.ts new file mode 100644 index 0000000000000000000000000000000000000000..92af031ed9448fec22c41187160388cbffbef87b --- /dev/null +++ b/src/api/mall/statistics/member.ts @@ -0,0 +1,123 @@ +import request from '@/config/axios' +import dayjs from 'dayjs' +import { DataComparisonRespVO } from '@/api/mall/statistics/common' +import { formatDate } from '@/utils/formatTime' + +/** 会员分析 Request VO */ +export interface MemberAnalyseReqVO { + times: [dayjs.ConfigType, dayjs.ConfigType] +} + +/** 会员分析 Response VO */ +export interface MemberAnalyseRespVO { + visitUserCount: number + orderUserCount: number + payUserCount: number + atv: number + comparison: DataComparisonRespVO +} + +/** 会员分析对照数据 Response VO */ +export interface MemberAnalyseComparisonRespVO { + registerUserCount: number + visitUserCount: number + rechargeUserCount: number +} + +/** 会员地区统计 Response VO */ +export interface MemberAreaStatisticsRespVO { + areaId: number + areaName: string + userCount: number + orderCreateUserCount: number + orderPayUserCount: number + orderPayPrice: number +} + +/** 会员性别统计 Response VO */ +export interface MemberSexStatisticsRespVO { + sex: number + userCount: number +} + +/** 会员统计 Response VO */ +export interface MemberSummaryRespVO { + userCount: number + rechargeUserCount: number + rechargePrice: number + expensePrice: number +} + +/** 会员终端统计 Response VO */ +export interface MemberTerminalStatisticsRespVO { + terminal: number + userCount: number +} + +/** 会员数量统计 Response VO */ +export interface MemberCountRespVO { + /** 用户访问量 */ + visitUserCount: string + /** 注册用户数量 */ + registerUserCount: number +} + +/** 会员注册数量 Response VO */ +export interface MemberRegisterCountRespVO { + date: string + count: number +} + +// 查询会员统计 +export const getMemberSummary = () => { + return request.get({ + url: '/statistics/member/summary' + }) +} + +// 查询会员分析数据 +export const getMemberAnalyse = (params: MemberAnalyseReqVO) => { + return request.get({ + url: '/statistics/member/analyse', + params: { times: [formatDate(params.times[0]), formatDate(params.times[1])] } + }) +} + +// 按照省份,查询会员统计列表 +export const getMemberAreaStatisticsList = () => { + return request.get({ + url: '/statistics/member/area-statistics-list' + }) +} + +// 按照性别,查询会员统计列表 +export const getMemberSexStatisticsList = () => { + return request.get({ + url: '/statistics/member/sex-statistics-list' + }) +} + +// 按照终端,查询会员统计列表 +export const getMemberTerminalStatisticsList = () => { + return request.get({ + url: '/statistics/member/terminal-statistics-list' + }) +} + +// 获得用户数量量对照 +export const getUserCountComparison = () => { + return request.get>({ + url: '/statistics/member/user-count-comparison' + }) +} + +// 获得会员注册数量列表 +export const getMemberRegisterCountList = ( + beginTime: dayjs.ConfigType, + endTime: dayjs.ConfigType +) => { + return request.get({ + url: '/statistics/member/register-count-list', + params: { times: [formatDate(beginTime), formatDate(endTime)] } + }) +} diff --git a/src/api/mall/statistics/pay.ts b/src/api/mall/statistics/pay.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5d14c9d264a12ad10b6748098978ea4245e640c --- /dev/null +++ b/src/api/mall/statistics/pay.ts @@ -0,0 +1,12 @@ +import request from '@/config/axios' + +/** 支付统计 */ +export interface PaySummaryRespVO { + /** 充值金额,单位分 */ + rechargePrice: number +} + +/** 获取钱包充值金额 */ +export const getWalletRechargePrice = async () => { + return await request.get({ url: `/statistics/pay/summary` }) +} diff --git a/src/api/mall/statistics/product.ts b/src/api/mall/statistics/product.ts new file mode 100644 index 0000000000000000000000000000000000000000..798a2fa8c27fdf447c581132bf4967f71d2ac700 --- /dev/null +++ b/src/api/mall/statistics/product.ts @@ -0,0 +1,52 @@ +import request from '@/config/axios' +import { DataComparisonRespVO } from '@/api/mall/statistics/common' + +export interface ProductStatisticsVO { + id: number + day: string + spuId: number + spuName: string + spuPicUrl: string + browseCount: number + browseUserCount: number + favoriteCount: number + cartCount: number + orderCount: number + orderPayCount: number + orderPayPrice: number + afterSaleCount: number + afterSaleRefundPrice: number + browseConvertPercent: number +} + +// 商品统计 API +export const ProductStatisticsApi = { + // 获得商品统计分析 + getProductStatisticsAnalyse: (params: any) => { + return request.get>({ + url: '/statistics/product/analyse', + params + }) + }, + // 获得商品状况明细 + getProductStatisticsList: (params: any) => { + return request.get({ + url: '/statistics/product/list', + params + }) + }, + // 导出获得商品状况明细 Excel + exportProductStatisticsExcel: (params: any) => { + return request.download({ + url: '/statistics/product/export-excel', + params + }) + }, + // 获得商品排行榜分页 + getProductStatisticsRankPage: async (params: any) => { + return await request.get({ + url: `/statistics/product/rank-page`, + params + }) + } +} diff --git a/src/api/mall/statistics/trade.ts b/src/api/mall/statistics/trade.ts new file mode 100644 index 0000000000000000000000000000000000000000..e59952a6a6cf1896e32437c0a516a30fba3f413c --- /dev/null +++ b/src/api/mall/statistics/trade.ts @@ -0,0 +1,119 @@ +import request from '@/config/axios' +import dayjs from 'dayjs' +import { formatDate } from '@/utils/formatTime' +import { DataComparisonRespVO } from '@/api/mall/statistics/common' + +/** 交易统计 Response VO */ +export interface TradeSummaryRespVO { + yesterdayOrderCount: number + monthOrderCount: number + yesterdayPayPrice: number + monthPayPrice: number +} + +/** 交易状况 Request VO */ +export interface TradeTrendReqVO { + times: [dayjs.ConfigType, dayjs.ConfigType] +} + +/** 交易状况统计 Response VO */ +export interface TradeTrendSummaryRespVO { + time: string + turnoverPrice: number + orderPayPrice: number + rechargePrice: number + expensePrice: number + walletPayPrice: number + brokerageSettlementPrice: number + afterSaleRefundPrice: number +} + +/** 交易订单数量 Response VO */ +export interface TradeOrderCountRespVO { + /** 待发货 */ + undelivered?: number + /** 待核销 */ + pickUp?: number + /** 退款中 */ + afterSaleApply?: number + /** 提现待审核 */ + auditingWithdraw?: number +} + +/** 交易订单统计 Response VO */ +export interface TradeOrderSummaryRespVO { + /** 支付订单商品数 */ + orderPayCount?: number + /** 总支付金额,单位:分 */ + orderPayPrice?: number +} + +/** 订单量趋势统计 Response VO */ +export interface TradeOrderTrendRespVO { + /** 日期 */ + date: string + /** 订单数量 */ + orderPayCount: number + /** 订单支付金额 */ + orderPayPrice: number +} + +// 查询交易统计 +export const getTradeStatisticsSummary = () => { + return request.get>({ + url: '/statistics/trade/summary' + }) +} + +// 获得交易状况统计 +export const getTradeStatisticsAnalyse = (params: TradeTrendReqVO) => { + return request.get>({ + url: '/statistics/trade/analyse', + params: formatDateParam(params) + }) +} + +// 获得交易状况明细 +export const getTradeStatisticsList = (params: TradeTrendReqVO) => { + return request.get({ + url: '/statistics/trade/list', + params: formatDateParam(params) + }) +} + +// 导出交易状况明细 +export const exportTradeStatisticsExcel = (params: TradeTrendReqVO) => { + return request.download({ + url: '/statistics/trade/export-excel', + params: formatDateParam(params) + }) +} + +// 获得交易订单数量 +export const getOrderCount = async () => { + return await request.get({ url: `/statistics/trade/order-count` }) +} + +// 获得交易订单数量对照 +export const getOrderComparison = async () => { + return await request.get>({ + url: `/statistics/trade/order-comparison` + }) +} + +// 获得订单量趋势统计 +export const getOrderCountTrendComparison = ( + type: number, + beginTime: dayjs.ConfigType, + endTime: dayjs.ConfigType +) => { + return request.get[]>({ + url: '/statistics/trade/order-count-trend', + params: { type, beginTime: formatDate(beginTime), endTime: formatDate(endTime) } + }) +} + +/** 时间参数需要格式化, 确保接口能识别 */ +const formatDateParam = (params: TradeTrendReqVO) => { + return { times: [formatDate(params.times[0]), formatDate(params.times[1])] } as TradeTrendReqVO +} diff --git a/src/api/mall/trade/config/index.ts b/src/api/mall/trade/config/index.ts index 3a1771d8b5fabed5f3d1515f50681353fe3d12b0..43fdbdf14bc4b6e41d45f3901181a579f098a7b6 100644 --- a/src/api/mall/trade/config/index.ts +++ b/src/api/mall/trade/config/index.ts @@ -4,13 +4,12 @@ export interface ConfigVO { brokerageEnabled: boolean brokerageEnabledCondition: number brokerageBindMode: number - brokeragePostUrls: string + brokeragePosterUrls: string brokerageFirstPercent: number brokerageSecondPercent: number brokerageWithdrawMinPrice: number - brokerageBankNames: string brokerageFrozenDays: number - brokerageWithdrawType: string + brokerageWithdrawTypes: string } // 查询交易中心配置详情 diff --git a/src/api/mall/trade/delivery/pickUpStore/index.ts b/src/api/mall/trade/delivery/pickUpStore/index.ts index 82ba66c4f1ccde49935d780b480100268addcb53..c3175021834d9ee3532827a44d874b99c9f2fc9a 100644 --- a/src/api/mall/trade/delivery/pickUpStore/index.ts +++ b/src/api/mall/trade/delivery/pickUpStore/index.ts @@ -26,7 +26,7 @@ export const getDeliveryPickUpStore = async (id: number) => { } // 查询自提门店精简列表 -export const getListAllSimple = async () => { +export const getListAllSimple = async (): Promise => { return await request.get({ url: '/trade/delivery/pick-up-store/list-all-simple' }) } diff --git a/src/api/mall/trade/order/index.ts b/src/api/mall/trade/order/index.ts index 80669c570b64ab3a076e88c1bdcf8c9aabe33a5e..364483b85ce672384dcacc45aa5defe84ba02c2c 100644 --- a/src/api/mall/trade/order/index.ts +++ b/src/api/mall/trade/order/index.ts @@ -1,6 +1,7 @@ import request from '@/config/axios' export interface OrderVO { + // ========== 订单基本信息 ========== id?: number | null // 订单编号 no?: string // 订单流水号 createTime?: Date | null // 下单时间 @@ -15,41 +16,56 @@ export interface OrderVO { cancelTime?: Date | null // 订单取消时间 cancelType?: number | null // 取消类型 remark?: string // 商家备注 + + // ========== 价格 + 支付基本信息 ========== payOrderId?: number | null // 支付订单编号 - payed?: boolean // 是否已支付 + payStatus?: boolean // 是否已支付 payTime?: Date | null // 付款时间 payChannelCode?: string // 支付渠道 totalPrice?: number | null // 商品原价(总) - orderPrice?: number | null // 订单原价(总) discountPrice?: number | null // 订单优惠(总) deliveryPrice?: number | null // 运费金额 adjustPrice?: number | null // 订单调价(总) payPrice?: number | null // 应付金额(总) + // ========== 收件 + 物流基本信息 ========== deliveryType?: number | null // 发货方式 + pickUpStoreId?: number // 自提门店编号 + pickUpVerifyCode?: string // 自提核销码 deliveryTemplateId?: number | null // 配送模板编号 - logisticsId?: number | null | null // 发货物流公司编号 + logisticsId?: number | null // 发货物流公司编号 logisticsNo?: string // 发货物流单号 - deliveryStatus?: number | null // 发货状态 deliveryTime?: Date | null // 发货时间 receiveTime?: Date | null // 收货时间 receiverName?: string // 收件人名称 receiverMobile?: string // 收件人手机 - receiverAreaId?: number | null // 收件人地区编号 receiverPostCode?: number | null // 收件人邮编 + receiverAreaId?: number | null // 收件人地区编号 + receiverAreaName?: string //收件人地区名字 receiverDetailAddress?: string // 收件人详细地址 + + // ========== 售后基本信息 ========== afterSaleStatus?: number | null // 售后状态 refundPrice?: number | null // 退款金额 + + // ========== 营销基本信息 ========== couponId?: number | null // 优惠劵编号 couponPrice?: number | null // 优惠劵减免金额 pointPrice?: number | null // 积分抵扣的金额 - receiverAreaName?: string //收件人地区名字 + vipPrice?: number | null // VIP 减免金额 + items?: OrderItemRespVO[] // 订单项列表 - // 用户信息 + // 下单用户信息 user?: { id?: number | null nickname?: string avatar?: string } + // 推广用户信息 + brokerageUser?: { + id?: number | null + nickname?: string + avatar?: string + } // 订单操作日志 logs?: OrderLogRespVO[] } @@ -92,11 +108,28 @@ export interface ProductPropertiesVO { valueName?: string // 属性值的名称 } +/** 交易订单统计 */ +export interface TradeOrderSummaryRespVO { + /** 订单数量 */ + orderCount?: number + /** 订单金额 */ + orderPayPrice?: string + /** 退款单数 */ + afterSaleCount?: number + /** 退款金额 */ + afterSalePrice?: string +} + // 查询交易订单列表 -export const getOrderPage = async (params) => { +export const getOrderPage = async (params: any) => { return await request.get({ url: `/trade/order/page`, params }) } +// 查询交易订单统计 +export const getOrderSummary = async (params: any) => { + return await request.get({ url: `/trade/order/summary`, params }) +} + // 查询交易订单详情 export const getOrder = async (id: number | null) => { return await request.get({ url: `/trade/order/get-detail?id=` + id }) @@ -114,21 +147,42 @@ export interface DeliveryVO { } // 订单发货 -export const delivery = async (data: DeliveryVO) => { +export const deliveryOrder = async (data: DeliveryVO) => { return await request.put({ url: `/trade/order/delivery`, data }) } // 订单备注 -export const updateRemark = async (data: any) => { +export const updateOrderRemark = async (data: any) => { return await request.put({ url: `/trade/order/update-remark`, data }) } // 订单调价 -export const updatePrice = async (data: any) => { +export const updateOrderPrice = async (data: any) => { return await request.put({ url: `/trade/order/update-price`, data }) } // 修改订单地址 -export const updateAddress = async (data: any) => { +export const updateOrderAddress = async (data: any) => { return await request.put({ url: `/trade/order/update-address`, data }) } + +// 订单核销 +export const pickUpOrder = async (id: number) => { + return await request.put({ url: `/trade/order/pick-up-by-id?id=${id}` }) +} + +// 订单核销 +export const pickUpOrderByVerifyCode = async (pickUpVerifyCode: string) => { + return await request.put({ + url: `/trade/order/pick-up-by-verify-code`, + params: { pickUpVerifyCode } + }) +} + +// 查询核销码对应的订单 +export const getOrderByPickUpVerifyCode = async (pickUpVerifyCode: string) => { + return await request.get({ + url: `/trade/order/get-by-pick-up-verify-code`, + params: { pickUpVerifyCode } + }) +} diff --git a/src/api/member/point/config/index.ts b/src/api/member/config/index.ts similarity index 47% rename from src/api/member/point/config/index.ts rename to src/api/member/config/index.ts index 9a3c4c48abbc34d66491b62fa3e61e21434b5186..7ddca16bb55e2459e6fa721a0d7043cdf0ee09dc 100644 --- a/src/api/member/point/config/index.ts +++ b/src/api/member/config/index.ts @@ -2,18 +2,18 @@ import request from '@/config/axios' export interface ConfigVO { id: number - tradeDeductEnable: number - tradeDeductUnitPrice: number - tradeDeductMaxPrice: number - tradeGivePoint: number + pointTradeDeductEnable: number + pointTradeDeductUnitPrice: number + pointTradeDeductMaxPrice: number + pointTradeGivePoint: number } // 查询积分设置详情 export const getConfig = async () => { - return await request.get({ url: `/member/point/config/get` }) + return await request.get({ url: `/member/config/get` }) } // 新增修改积分设置 export const saveConfig = async (data: ConfigVO) => { - return await request.put({ url: `/member/point/config/save`, data }) + return await request.put({ url: `/member/config/save`, data }) } diff --git a/src/api/member/signin/config/index.ts b/src/api/member/signin/config/index.ts index 558bdc7023b4a6466dd6d2ae9bf661c7dd6fb32a..50a7d63c67de937c206d9e44fcea39364cdcdddb 100644 --- a/src/api/member/signin/config/index.ts +++ b/src/api/member/signin/config/index.ts @@ -1,10 +1,11 @@ import request from '@/config/axios' export interface SignInConfigVO { - id: number - day: number | null - point: number | null - enable: boolean | null + id?: number + day?: number + point?: number + experience?: number + status?: number } // 查询积分签到规则列表 diff --git a/src/api/member/user/index.ts b/src/api/member/user/index.ts index 4d60988c54f83f52bda8489217547a6adb82ac93..e38206a88e36b96797ab360e74825b36495fd4ab 100644 --- a/src/api/member/user/index.ts +++ b/src/api/member/user/index.ts @@ -41,3 +41,13 @@ export const updateUser = async (data: UserVO) => { export const updateUserLevel = async (data: any) => { return await request.put({ url: `/member/user/update-level`, data }) } + +// 修改会员用户积分 +export const updateUserPoint = async (data: any) => { + return await request.put({ url: `/member/user/update-point`, data }) +} + +// 修改会员用户余额 +export const updateUserBalance = async (data: any) => { + return await request.put({ url: `/member/user/update-balance`, data }) +} diff --git a/src/api/mp/user/index.ts b/src/api/mp/user/index.ts index d954e9eb1cc352875cbe06ac1f1b346732c4cb72..b89acc7d9117453d436fd93c07208c8921cab9a3 100644 --- a/src/api/mp/user/index.ts +++ b/src/api/mp/user/index.ts @@ -26,6 +26,6 @@ export const getUserPage = (query) => { // 同步公众号粉丝 export const syncUser = (accountId) => { return request.post({ - url: '/mp/tag/sync?accountId=' + accountId + url: '/mp/user/sync?accountId=' + accountId }) } diff --git a/src/api/pay/demo/transfer/index.ts b/src/api/pay/demo/transfer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a95b0d5cf2e3494f9e23a234e40d95cd6f987ce3 --- /dev/null +++ b/src/api/pay/demo/transfer/index.ts @@ -0,0 +1,25 @@ +import request from '@/config/axios' + +export interface DemoTransferVO { + price: number + type: number + userName: string + alipayLogonId: string + openid: string +} + +// 创建示例转账单 +export function createDemoTransfer(data: DemoTransferVO) { + return request.post({ + url: '/pay/demo-transfer/create', + data: data + }) +} + +// 获得示例订单分页 +export function getDemoTransferPage(query: PageParam) { + return request.get({ + url: '/pay/demo-transfer/page', + params: query + }) +} diff --git a/src/api/pay/transfer/index.ts b/src/api/pay/transfer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7a58abf42fd2a09c65207c9ab2e5e0c807082984 --- /dev/null +++ b/src/api/pay/transfer/index.ts @@ -0,0 +1,27 @@ +import request from '@/config/axios' + +export interface TransferVO { + appId: number + channelCode: string + merchantTransferId: string + type: number + price: number + subject: string + userName: string + alipayLogonId: string + openid: string +} + +// 新增转账单 +export const createTransfer = async (data: TransferVO) => { + return await request.post({ url: `/pay/transfer/create`, data }) +} + +// 查询转账单列表 +export const getTransferPage = async (params) => { + return await request.get({ url: `/pay/transfer/page`, params }) +} + +export const getTransfer = async (id: number) => { + return await request.get({ url: '/pay/transfer/get?id=' + id }) +} diff --git a/src/api/pay/wallet/balance/index.ts b/src/api/pay/wallet/balance/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e5ab369197f7c2d4ec812e3c7f5251d14c7df2d --- /dev/null +++ b/src/api/pay/wallet/balance/index.ts @@ -0,0 +1,26 @@ +import request from '@/config/axios' + +/** 用户钱包查询参数 */ +export interface PayWalletUserReqVO { + userId: number +} +/** 钱包 VO */ +export interface WalletVO { + id: number + userId: number + userType: number + balance: number + totalExpense: number + totalRecharge: number + freezePrice: number +} + +/** 查询用户钱包详情 */ +export const getWallet = async (params: PayWalletUserReqVO) => { + return await request.get({ url: `/pay/wallet/get`, params }) +} + +// 查询会员钱包列表 +export const getWalletPage = async (params) => { + return await request.get({ url: `/pay/wallet/page`, params }) +} diff --git a/src/api/pay/wallet/rechargePackage/index.ts b/src/api/pay/wallet/rechargePackage/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e4cc9c28239cccbce4ddeeb84219467697ddda --- /dev/null +++ b/src/api/pay/wallet/rechargePackage/index.ts @@ -0,0 +1,34 @@ +import request from '@/config/axios' + +export interface WalletRechargePackageVO { + id: number + name: string + payPrice: number + bonusPrice: number + status: number +} + +// 查询套餐充值列表 +export const getWalletRechargePackagePage = async (params) => { + return await request.get({ url: '/pay/wallet-recharge-package/page', params }) +} + +// 查询套餐充值详情 +export const getWalletRechargePackage = async (id: number) => { + return await request.get({ url: '/pay/wallet-recharge-package/get?id=' + id }) +} + +// 新增套餐充值 +export const createWalletRechargePackage = async (data: WalletRechargePackageVO) => { + return await request.post({ url: '/pay/wallet-recharge-package/create', data }) +} + +// 修改套餐充值 +export const updateWalletRechargePackage = async (data: WalletRechargePackageVO) => { + return await request.put({ url: '/pay/wallet-recharge-package/update', data }) +} + +// 删除套餐充值 +export const deleteWalletRechargePackage = async (id: number) => { + return await request.delete({ url: '/pay/wallet-recharge-package/delete?id=' + id }) +} diff --git a/src/api/pay/wallet/transaction/index.ts b/src/api/pay/wallet/transaction/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3377ffaa429c6a1b91b317cfd4dcafc8c049ce64 --- /dev/null +++ b/src/api/pay/wallet/transaction/index.ts @@ -0,0 +1,14 @@ +import request from '@/config/axios' + +export interface WalletTransactionVO { + id: number + walletId: number + title: string + price: number + balance: number +} + +// 查询会员钱包流水列表 +export const getWalletTransactionPage = async (params) => { + return await request.get({ url: `/pay/wallet-transaction/page`, params }) +} diff --git a/src/api/report/ureport/index.ts b/src/api/report/ureport/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a9daea4c0260f4886324eaecf2ce1c837a7ead5 --- /dev/null +++ b/src/api/report/ureport/index.ts @@ -0,0 +1,39 @@ +import request from '@/config/axios' + +export interface UReportDataVO { + id: number + name: string + status: number + content: string + remark: string +} + +// 查询Ureport2报表分页 +export const getUReportDataPage = async (params) => { + return await request.get({ url: `/report/ureport-data/page`, params }) +} + +// 查询Ureport2报表详情 +export const getUReportData = async (id: number) => { + return await request.get({ url: `/report/ureport-data/get?id=` + id }) +} + +// 新增Ureport2报表 +export const createUReportData = async (data: UReportDataVO) => { + return await request.post({ url: `/report/ureport-data/create`, data }) +} + +// 修改Ureport2报表 +export const updateUReportData = async (data: UReportDataVO) => { + return await request.put({ url: `/report/ureport-data/update`, data }) +} + +// 删除Ureport2报表 +export const deleteUReportData = async (id: number) => { + return await request.delete({ url: `/report/ureport-data/delete?id=` + id }) +} + +// 导出Ureport2报表 Excel +export const exportUReportData = async (params) => { + return await request.download({ url: `/report/ureport-data/export-excel`, params }) +} diff --git a/src/api/system/area/index.ts b/src/api/system/area/index.ts index b7da941f65f2f2149412088ba3861d2b0125fb11..e91a4997c9e3fe9a9c49df1eaabf84faf8899faa 100644 --- a/src/api/system/area/index.ts +++ b/src/api/system/area/index.ts @@ -5,14 +5,6 @@ export const getAreaTree = async () => { return await request.get({ url: '/system/area/tree' }) } -export const getChildrenArea = async (id: number) => { - return await request.get({ url: '/system/area/get-children?id=' + id }) -} - -export const getAreaListByIds = async (ids) => { - return await request.get({ url: '/system/area/get-by-ids?ids=' + ids }) -} - // 获得 IP 对应的地区名 export const getAreaByIp = async (ip: string) => { return await request.get({ url: '/system/area/get-by-ip?ip=' + ip }) diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts index d66de3f1c7b7d184fdd925a88fa288efdc1f1b35..60b6fc73f1a1ebce4f6b0f2d60c0664ae5548417 100644 --- a/src/api/system/dept/index.ts +++ b/src/api/system/dept/index.ts @@ -19,7 +19,11 @@ export interface DeptPageReqVO { // 查询部门(精简)列表 export const listSimpleDeptApi = async () => { - return await request.get({ url: '/system/dept/list-all-simple' }) + return await request.get({ url: '/system/dept/simple-list' }) +} + +export const getSimpleDeptList = async () => { + return await request.get({ url: '/system/dept/simple-list' }) } // 查询部门列表 diff --git a/src/api/system/dict/dict.data.ts b/src/api/system/dict/dict.data.ts index fd97a2dc9c4b5fd966fe7fa054cbccb56ca9979c..5f1d29f4cdec6d309b92448eb29f424983f4832d 100644 --- a/src/api/system/dict/dict.data.ts +++ b/src/api/system/dict/dict.data.ts @@ -2,8 +2,8 @@ import request from '@/config/axios' import type { DictDataVO, DictDataPageReqVO, DictDataExportReqVO } from './types' // 查询字典数据(精简)列表 -export const listSimpleDictDataApi = () => { - return request.get({ url: '/system/dict-data/list-all-simple' }) +export const getSimpleDictDataList = () => { + return request.get({ url: '/system/dict-data/simple-list' }) } // 查询字典数据列表 @@ -30,7 +30,8 @@ export const updateDictDataApi = (data: DictDataVO) => { export const deleteDictDataApi = (id: number) => { return request.delete({ url: '/system/dict-data/delete?id=' + id }) } + // 导出字典类型数据 export const exportDictDataApi = (params: DictDataExportReqVO) => { - return request.get({ url: '/system/dict-data/export', params }) + return request.download({ url: '/system/dict-data/export', params }) } diff --git a/src/api/system/dict/dict.type.ts b/src/api/system/dict/dict.type.ts index 22e6411e748e39d44f7730f332541ae6d52c382f..03504a2e6bd810a6ea3b23c6f22531a4de562671 100644 --- a/src/api/system/dict/dict.type.ts +++ b/src/api/system/dict/dict.type.ts @@ -30,7 +30,8 @@ export const updateDictTypeApi = (data: DictTypeVO) => { export const deleteDictTypeApi = (id: number) => { return request.delete({ url: '/system/dict-type/delete?id=' + id }) } + // 导出字典类型 export const exportDictTypeApi = (params: DictTypeExportReqVO) => { - return request.get({ url: '/system/dict-type/export', params }) + return request.download({ url: '/system/dict-type/export', params }) } diff --git a/src/api/system/errorCode/index.ts b/src/api/system/errorCode/index.ts index 0e000794edd61f8195cc349f53a0c0c589f654b5..65eabd3af5ee5ce0aa3915f0aa397f19bdec9bad 100644 --- a/src/api/system/errorCode/index.ts +++ b/src/api/system/errorCode/index.ts @@ -1,10 +1,10 @@ import request from '@/config/axios' export interface ErrorCodeVO { - id: number + id: number | undefined type: number applicationName: string - code: number + code: number | undefined message: string memo: string createTime: Date diff --git a/src/api/system/loginLog/index.ts b/src/api/system/loginLog/index.ts index cadaeaf30b57cf5090296a2ef4df7f81138eacac..ca90d7c4085b59b57002d6ba5f2892062ae2d1e3 100644 --- a/src/api/system/loginLog/index.ts +++ b/src/api/system/loginLog/index.ts @@ -7,6 +7,7 @@ export interface LoginLogVO { userId: number userType: number username: string + result: number status: number userIp: string userAgent: string @@ -24,6 +25,7 @@ export interface LoginLogReqVO extends PageParam { export const getLoginLogPageApi = (params: LoginLogReqVO) => { return request.get({ url: '/system/login-log/page', params }) } + // 导出登录日志 export const exportLoginLogApi = (params: LoginLogReqVO) => { return request.download({ url: '/system/login-log/export', params }) diff --git a/src/api/system/mail/account/index.ts b/src/api/system/mail/account/index.ts index 8b662a701ce8f308be702bd86e6297b93af77a2e..1c7c79dec6df51670a384ff2634385c040332c65 100644 --- a/src/api/system/mail/account/index.ts +++ b/src/api/system/mail/account/index.ts @@ -42,5 +42,5 @@ export const deleteMailAccountApi = async (id: number) => { // 获得邮箱账号精简列表 export const getSimpleMailAccounts = async () => { - return request.get({ url: '/system/mail-account/list-all-simple' }) + return request.get({ url: '/system/mail-account/simple-list' }) } diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index 5913972ba080844ed70e85be614c548871cf155e..36f9e387c8a44218cadf9e1b1d0047ab260e5ea3 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -28,6 +28,10 @@ export const listSimpleMenusApi = () => { return request.get({ url: '/system/menu/list-all-simple' }) } +export const getSimpleMenusList = () => { + return request.get({ url: '/system/menu/simple-list' }) +} + // 查询菜单列表 export const getMenuListApi = (params: MenuPageReqVO) => { return request.get({ url: '/system/menu/list', params }) diff --git a/src/api/system/notice/index.ts b/src/api/system/notice/index.ts index cd420a29acad7d2334f227840a5dde1c9241ef5e..dbf64a3754d11dda7cd3def4aeac1ef3b1733d9d 100644 --- a/src/api/system/notice/index.ts +++ b/src/api/system/notice/index.ts @@ -40,3 +40,8 @@ export const updateNoticeApi = (data: NoticeVO) => { export const deleteNoticeApi = (id: number) => { return request.delete({ url: '/system/notice/delete?id=' + id }) } + +// 推送公告 +export const pushNoticeApi = (id: number) => { + return request.post({ url: '/system/notice/push?id=' + id }) +} diff --git a/src/api/system/notify/message/index.ts b/src/api/system/notify/message/index.ts index a42d75c2134c1d3b32b90e0a0748a43daacd8cd7..d38bf7178f985f2fcf70a158a5b6b6a36d63a332 100644 --- a/src/api/system/notify/message/index.ts +++ b/src/api/system/notify/message/index.ts @@ -13,6 +13,7 @@ export interface NotifyMessageVO { templateParams: string readStatus: boolean readTime: Date + createTime: Date } export interface NotifyMessagePageReqVO extends PageParam { diff --git a/src/api/system/notify/template/index.ts b/src/api/system/notify/template/index.ts index 66530a904a21f96e071113c7f4c36c76cf55a417..cf45b8912f111172c388cec4b64adc796c73ae7c 100644 --- a/src/api/system/notify/template/index.ts +++ b/src/api/system/notify/template/index.ts @@ -1,11 +1,12 @@ import request from '@/config/axios' export interface NotifyTemplateVO { - id: number + id?: number name: string + nickname: string code: string content: string - type: number + type?: number params: string status: number remark: string @@ -19,7 +20,7 @@ export interface NotifyTemplatePageReqVO extends PageParam { } export interface NotifySendReqVO { - userId: number + userId: number | null templateCode: string templateParams: Map } diff --git a/src/api/system/oauth2/client.ts b/src/api/system/oauth2/client.ts index 4c06386df079bc0894fb647e569f639802468cd4..d24b54c012c6629a0700a93fd7ef0b0ce8310c63 100644 --- a/src/api/system/oauth2/client.ts +++ b/src/api/system/oauth2/client.ts @@ -30,17 +30,17 @@ export const getOAuth2ClientPageApi = (params: OAuth2ClientPageReqVO) => { return request.get({ url: '/system/oauth2-client/page', params }) } -// 查询 OAuth2详情 +// 查询 OAuth2 客户端的详情 export const getOAuth2ClientApi = (id: number) => { return request.get({ url: '/system/oauth2-client/get?id=' + id }) } -// 新增 OAuth2 +// 新增 OAuth2 客户端 export const createOAuth2ClientApi = (data: OAuth2ClientVO) => { return request.post({ url: '/system/oauth2-client/create', data }) } -// 修改 OAuth2 +// 修改 OAuth2 客户端 export const updateOAuth2ClientApi = (data: OAuth2ClientVO) => { return request.put({ url: '/system/oauth2-client/update', data }) } diff --git a/src/api/system/operatelog/index.ts b/src/api/system/operatelog/index.ts index 5fd31dbaca593a99a230b951b30b6eacb6d7c445..daa8576b0def433289b1b3f955c9ddb603ce501c 100644 --- a/src/api/system/operatelog/index.ts +++ b/src/api/system/operatelog/index.ts @@ -31,6 +31,32 @@ export interface OperateLogPageReqVO extends PageParam { startTime?: Date[] } +export type OperateLogV2VO = { + id: number + userNickname: string + 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 + // 数据扩展,渲染时使用 + title: string // 操作标题(如果为空则取 name 值) + colSize: number // 变更记录行数 + contentStrList: string[] + tagsContentList: string[] +} + // 查询操作日志列表 export const getOperateLogPageApi = (params: OperateLogPageReqVO) => { return request.get({ url: '/system/operate-log/page', params }) diff --git a/src/api/system/post/index.ts b/src/api/system/post/index.ts index 9e2540f019ca545327b57de04adff99246e8c290..722194c6e2e20629cb40a5745d15a2165559e9fa 100644 --- a/src/api/system/post/index.ts +++ b/src/api/system/post/index.ts @@ -29,7 +29,7 @@ export const getPostPageApi = async (params: PostPageReqVO) => { // 获取岗位精简信息列表 export const listSimplePostsApi = async () => { - return await request.get({ url: '/system/post/list-all-simple' }) + return await request.get({ url: '/system/post/simple-list' }) } // 查询岗位详情 diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts index 0d4775559994170d89d107686e2fbeb5ff754da5..74b0ddf8a67d1b69e0c8c3304dad78359d000636 100644 --- a/src/api/system/role/index.ts +++ b/src/api/system/role/index.ts @@ -7,6 +7,8 @@ export interface RoleVO { sort: number status: number type: number + dataScope: number + dataScopeDeptIds: number[] createTime: Date } @@ -29,7 +31,7 @@ export const getRolePageApi = async (params: RolePageReqVO) => { // 查询角色(精简)列表 export const listSimpleRolesApi = async () => { - return await request.get({ url: '/system/role/list-all-simple' }) + return await request.get({ url: '/system/role/simple-list' }) } // 查询角色详情 @@ -56,3 +58,11 @@ export const updateRoleStatusApi = async (data: UpdateStatusReqVO) => { export const deleteRoleApi = async (id: number) => { return await request.delete({ url: '/system/role/delete?id=' + id }) } + +// 导出角色 +export const exportRole = (params) => { + return request.download({ + url: '/system/role/export-excel', + params + }) +} diff --git a/src/api/system/sensitiveWord/index.ts b/src/api/system/sensitiveWord/index.ts index ffda89c0314b1c2bb66d6caae0edb5fd99c3909a..ca240be7a2d680eb5157cc299c70d55eb5ddb1b7 100644 --- a/src/api/system/sensitiveWord/index.ts +++ b/src/api/system/sensitiveWord/index.ts @@ -1,4 +1,5 @@ import request from '@/config/axios' +import qs from 'qs' export interface SensitiveWordVO { id: number @@ -16,11 +17,9 @@ export interface SensitiveWordPageReqVO extends PageParam { createTime?: Date[] } -export interface SensitiveWordExportReqVO { - name?: string - tag?: string - status?: number - createTime?: Date[] +export interface SensitiveWordTestReqVO { + text: string + tag: string[] } // 查询敏感词列表 @@ -49,7 +48,7 @@ export const deleteSensitiveWordApi = (id: number) => { } // 导出敏感词 -export const exportSensitiveWordApi = (params: SensitiveWordExportReqVO) => { +export const exportSensitiveWordApi = (params: SensitiveWordPageReqVO) => { return request.download({ url: '/system/sensitive-word/export-excel', params }) } @@ -59,6 +58,8 @@ export const getSensitiveWordTagsApi = () => { } // 获得文本所包含的不合法的敏感词数组 -export const validateTextApi = (id: number) => { - return request.get({ url: '/system/sensitive-word/validate-text?' + id }) +export const validateTextApi = (query: SensitiveWordTestReqVO) => { + return request.get({ + url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' }) + }) } diff --git a/src/api/system/sms/smsChannel/index.ts b/src/api/system/sms/smsChannel/index.ts index 176d075fe105dee208210fac874ae0032f4d8458..009d85ba5544abef5b17409d7c7ef72bc7437dfc 100644 --- a/src/api/system/sms/smsChannel/index.ts +++ b/src/api/system/sms/smsChannel/index.ts @@ -26,7 +26,7 @@ export const getSmsChannelPageApi = (params: SmsChannelPageReqVO) => { // 获得短信渠道精简列表 export function getSimpleSmsChannels() { - return request.get({ url: '/system/sms-channel/list-all-simple' }) + return request.get({ url: '/system/sms-channel/simple-list' }) } // 查询短信渠道详情 diff --git a/src/api/system/sms/smsLog/index.ts b/src/api/system/sms/smsLog/index.ts index 863eabb6bc9a89d219773fef205fe24019c01dce..15dd5808ef21942c5048d7ab27feec41c506aaca 100644 --- a/src/api/system/sms/smsLog/index.ts +++ b/src/api/system/sms/smsLog/index.ts @@ -1,30 +1,29 @@ import request from '@/config/axios' export interface SmsLogVO { - id: number - channelId: number + id: number | null + channelId: number | null channelCode: string - templateId: number + templateId: number | null templateCode: string - templateType: number + templateType: number | null templateContent: string - templateParams: Map + templateParams: Map | null + apiTemplateId: string mobile: string - userId: number - userType: number - sendStatus: number - sendTime: Date - sendCode: number - sendMsg: string + userId: number | null + userType: number | null + sendStatus: number | null + sendTime: Date | null apiSendCode: string apiSendMsg: string apiRequestId: string apiSerialNo: string - receiveStatus: number - receiveTime: Date + receiveStatus: number | null + receiveTime: Date | null apiReceiveCode: string apiReceiveMsg: string - createTime: Date + createTime: Date | null } export interface SmsLogPageReqVO extends PageParam { diff --git a/src/api/system/sms/smsTemplate/index.ts b/src/api/system/sms/smsTemplate/index.ts index 0433fe3a4acd52335cdd27af629523300973f1d4..d4c03c817bb2590cb8345fadaa25de41e4cddfd7 100644 --- a/src/api/system/sms/smsTemplate/index.ts +++ b/src/api/system/sms/smsTemplate/index.ts @@ -1,18 +1,18 @@ import request from '@/config/axios' export interface SmsTemplateVO { - id: number - type: number + id?: number + type?: number status: number code: string name: string content: string remark: string apiTemplateId: string - channelId: number - channelCode: string - params: string[] - createTime: Date + channelId?: number + channelCode?: string + params?: string[] + createTime?: Date } export interface SendSmsReqVO { @@ -66,15 +66,15 @@ export const deleteSmsTemplateApi = (id: number) => { return request.delete({ url: '/system/sms-template/delete?id=' + id }) } -// 发送短信 -export const sendSmsApi = (data: SendSmsReqVO) => { - return request.post({ url: '/system/sms-template/send-sms', data }) -} - // 导出短信模板 -export const exportPostApi = (params: SmsTemplateExportReqVO) => { +export const exportSmsTemplateApi = (params: SmsTemplateExportReqVO) => { return request.download({ url: '/system/sms-template/export-excel', params }) } + +// 发送短信 +export const sendSmsApi = (data: SendSmsReqVO) => { + return request.post({ url: '/system/sms-template/send-sms', data }) +} diff --git a/src/api/system/social/client/index.ts b/src/api/system/social/client/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf13ab49f30518d39553c2256703f4fff8f5451c --- /dev/null +++ b/src/api/system/social/client/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +export interface SocialClientVO { + id: number + name: string + socialType: number + userType: number + clientId: string + clientSecret: string + agentId: string + status: number +} + +// 查询社交客户端列表 +export const getSocialClientPage = async (params) => { + return await request.get({ url: `/system/social-client/page`, params }) +} + +// 查询社交客户端详情 +export const getSocialClient = async (id: number) => { + return await request.get({ url: `/system/social-client/get?id=` + id }) +} + +// 新增社交客户端 +export const createSocialClient = async (data: SocialClientVO) => { + return await request.post({ url: `/system/social-client/create`, data }) +} + +// 修改社交客户端 +export const updateSocialClient = async (data: SocialClientVO) => { + return await request.put({ url: `/system/social-client/update`, data }) +} + +// 删除社交客户端 +export const deleteSocialClient = async (id: number) => { + return await request.delete({ url: `/system/social-client/delete?id=` + id }) +} diff --git a/src/api/system/social/user/index.ts b/src/api/system/social/user/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f11231b71abdc1e4fb32850da3a85ac30787bb2a --- /dev/null +++ b/src/api/system/social/user/index.ts @@ -0,0 +1,24 @@ +import request from '@/config/axios' + +export interface SocialUserVO { + id: number + type: number + openid: string + token: string + rawTokenInfo: string + nickname: string + avatar: string + rawUserInfo: string + code: string + state: string +} + +// 查询社交用户列表 +export const getSocialUserPage = async (params) => { + return await request.get({ url: `/system/social-user/page`, params }) +} + +// 查询社交用户详情 +export const getSocialUser = async (id: number) => { + return await request.get({ url: `/system/social-user/get?id=` + id }) +} diff --git a/src/api/system/tenantPackage/index.ts b/src/api/system/tenantPackage/index.ts index e431a9ee69bde9253714f571c7e84d61a4289f3d..9fd6593846aa800efb3cca615df940c4e2603f5a 100644 --- a/src/api/system/tenantPackage/index.ts +++ b/src/api/system/tenantPackage/index.ts @@ -45,5 +45,5 @@ export const deleteTenantPackageTypeApi = (id: number) => { } // 获取租户套餐精简信息列表 export const getTenantPackageList = () => { - return request.get({ url: '/system/tenant-package/get-simple-list' }) + return request.get({ url: '/system/tenant-package/simple-list' }) } diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index e505921d3c5e07cb10026f670c11c16683943803..b1ee18234601b3c821c172e2037f86c0fcda0113 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -37,6 +37,11 @@ export const getUserPageApi = (params: UserPageReqVO) => { return request.get({ url: '/system/user/page', params }) } +// 查询所有用户列表 +export const getAllUser = () => { + return request.get({ url: '/system/user/all' }) +} + // 查询用户详情 export const getUserApi = (id: number) => { return request.get({ url: '/system/user/get?id=' + id }) @@ -86,6 +91,10 @@ export const updateUserStatusApi = (id: number, status: number) => { } // 获取用户精简信息列表 -export const getListSimpleUsersApi = () => { - return request.get({ url: '/system/user/list-all-simple' }) +export const getListSimpleUsersApi = (): Promise => { + return request.get({ url: '/system/user/simple-list' }) +} + +export const getSimpleUserList = (): Promise => { + return request.get({ url: '/system/user/simple-list' }) } diff --git a/src/api/system/user/profile.ts b/src/api/system/user/profile.ts index e78424cc421e07479fd0b94607570d3c45fc656a..a1047c94a23c0b2a93e540c746ed5b6e67f78b79 100644 --- a/src/api/system/user/profile.ts +++ b/src/api/system/user/profile.ts @@ -1,37 +1,25 @@ import request from '@/config/axios' -export interface ProfileDept { - id: number - name: string -} -export interface ProfileRole { - id: number - name: string -} -export interface ProfilePost { - id: number - name: string -} -export interface SocialUser { - id: number - type: number - openid: string - token: string - rawTokenInfo: string - nickname: string - avatar: string - rawUserInfo: string - code: string - state: string -} export interface ProfileVO { id: number username: string nickname: string - dept: ProfileDept - roles: ProfileRole[] - posts: ProfilePost[] - socialUsers: SocialUser[] + dept: { + id: number + name: string + } + roles: { + id: number + name: string + }[] + posts: { + id: number + name: string + }[] + socialUsers: { + type: number + openid: string + }[] email: string mobile: string sex: number diff --git a/src/assets/imgs/diy/statusBar.png b/src/assets/imgs/diy/statusBar.png new file mode 100644 index 0000000000000000000000000000000000000000..b85562e4236852358c93161735671f8f0466db71 Binary files /dev/null and b/src/assets/imgs/diy/statusBar.png differ diff --git a/src/assets/map/json/china.json b/src/assets/map/json/china.json new file mode 100644 index 0000000000000000000000000000000000000000..bbc0a8322af14fc954cc2ea2d9ce9a63c65b41a0 --- /dev/null +++ b/src/assets/map/json/china.json @@ -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¿¥I†j@¢"], + ["@@…¡‰@ˆV^RqˆBbAŒnTXeRz¤Lž«³I"], + ["@@ÆEE—„kWqë @œ"], + ["@@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ģŒc†JŠ›e"], + ["@@U`Ts¿m‚"], + [ + "@@oºƋÄd–eVŽDJj£€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|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäìë|³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝlNd®²Ğ džiGʂJ™¼lr}~K¨ŸƐÌWö€™ÆŠzRš¤lêmĞL΄’@¡|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}ˆJ”¤~ƒÈT„d„™pddʾĬŠ”ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶgƊTǼƹS£¨¡ù³ŘÍ]¿Ây™ôEP xX¶¹܇O¡“gÚ¡IwÃ鑦ÅB‡Ï|ǰ…N«úmH¯‹âŸDùŽyŜžŲIÄuШDž•¸dɂ‡‚FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ȭµu¯b{ÍDěïÿȧŽuT£ġƒěŗƃĝ“Q¨fV†Ƌ•ƅn­a@‘³@šď„yýIĹÊKšŭfċŰóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠlTíb ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б´°^[ˆÀ|ĠO@ÆxO\\tŽa\\tĕtû{ġŒȧXýĪÓjùÎRb›š^ΛfK[ݏděYfíÙTyŽuUSyŌŏů@Oi½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙ¾ùƀ^juųœK­ƒUFy™—Ɲ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qáµ§š™g‘¤o^á¾ZE‡¤i`ij{n•ƒOl»ŸWÝĔįhg›F[¿¡—ßkOüš_‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{Ã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": [ + "@@Þĩ҃S‰ra}Á€yWix±Üe´lè“ßÓǏok‘ćiµVZģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘Pmc¸mQÝW•ďȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­™…EÅruµé€‘Yӎ•Ō_d›ĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs׌¥ŅxŸÊdÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° Ƭ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": [ + [ + "@@¯PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–Rë¥_ŽsgÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖ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¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYLq§IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDєOrÍd‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚ᠞ŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC£µsKCš…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×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ľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\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~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅ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£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸kH¡Š…ÊRǪÇƌbȆ¢´ä܍¢NìÉʖ¦â©Ġu¦öČ^â£Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\̀ʉÌÛ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–Ž@@s™a"], + ["@@MnNm"], + ["@@d‚c"], + ["@@eÀ‚C@b‚“‰"], + ["@@f‡…Xwkbr–Ä`qg"], + ["@@^jtW‘Q"], + ["@@~ Y]c"], + ["@@G`ĔN^_¿Z‚ÃM"], + ["@@iX¶B‹Y"], + ["@@„YƒZ"], + ["@@L_{Epf"], + ["@@^WqCT\\"], + ["@@\\[“‹§t|”¤_"], + ["@@m`n_"], + ["@@Ïxnj{q_×^Giip"], + [ + "@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅÎcPqń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRZk°IS§fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«zZfƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ÍOt“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ģÁFıĉĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EżĀdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] Â¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|Əlij¥ãn·±PmÍa‰–da‡ 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䔳PClƒFbbÍzš€wBG’ĭ€Z„Åi“»ƒlY­ċ²SgŽkÇ£—^S‰“qd¯•‹R…©éŽ£¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ÛmTŽþ¤D–²ÄufàÀ­XXȱAe„yYw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ W‹§@\\¸‹ƒ~¤‹Vp¸‰póIO¢ŠVOšŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð‡¼¤ N°ąO¥«³[ƒéǡű_°Õ\\ÚÊĝŽþâőàerR¨­JYlďQ[ ÏYëЧTGz•tnŠß¡gFkMŸāGÁ¤ia É‰™È¹`\\xs€¬dĆkNnuNUŠ–užP@‚vRY¾•–\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŒævxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĀÖŠåưÎs­l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŒM‡ehc›c”ďϝd‡©ÑW_ϗYƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ýŸqT^rme™\\Pp•ZZbƒyŸ’uybQ—efµ]UhĿDCmûvašÙNSkCwn‰cć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¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUΠlkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀ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²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷ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Š`ZŸRu¥É\\]~°ŽY`µ†Óƒ^phÁbnÀşúŽòa–ĬºTÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHr|^ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–Ŭdf先‹qm¿QûŠùއÚb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™xci‡tğ®jű¢KOķ•Coy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋĝÄ͎ī‰çÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ—¡RLčiXy‡ÅNïă¡¸iĔϑNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉ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‡"], + ["@@sfŠbU‡"], + ["@@qP\\xz[ck"], + ["@@‘Rƒ¢‚FX}°[s_"], + ["@@Cbœ\\—}"], + ["@@e|v\\la{u"], + ["@@v~u}"], + ["@@QxÂF¯}"], + ["@@¹nŒvÞs¯o"], + ["@@rSkUEj"], + ["@@bi­ZŒP"], + ["@@p[}INf"], + ["@@À¿€"], + ["@@¹dnbŒ…"], + ["@@rSŸBnR"], + ["@@g~h}"], + ["@@FlEk"], + ["@@OdPc"], + ["@@v[u\\"], + ["@@FjâL~wyoo~›sµL–\\"], + ["@@¬e¹aNˆ"], + ["@@\\nÔ¡q]L³ë\\ÿ®ŒQ֎"], + ["@@ÊA­©[¬"], + ["@@KxŒv­"], + ["@@@hlIk]"], + ["@@pW{o||j"], + ["@@Md|_mC"], + ["@@¢…X£ÏylD¼XˆtH"], + ["@@hlÜ[LykAvyfw^Ež›¤"], + ["@@fp¤Mus“R"], + ["@@®_ma~•LÁ¬šZ"], + ["@@iM„xZ"], + ["@@ZcYd"], + ["@@Z~dOSo|A¿qZv"], + ["@@@`”EN¡v"], + ["@@|–TY{"], + ["@@@n@m"], + ["@@XWkCT\\"], + ["@@ºwšZRkĕWO¢"], + ["@@™X®±Grƪ\\ÔáXq{‹"], + ["@@ůTG°ĄLHm°UC‹"], + [ + "@@¤Ž€aÜx~}dtüGæţŎíĔcŖpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒔_Bı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªˆŠÁŖHŗʼnåqûõi¨hÜ·ƒñt»¹ýv_[«¸m‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xKd¡gěŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®‚\\ßðCšh™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ}þÙ]„’¡ŒŸFK‚wsPlU[}¦Rvn`hq¬\\”nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–u†ÖZÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst" + ], + ["@@o\\V’zRZ}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`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢A|t^iĠGÀtÚs–d]ĮÐDE¶zAb àiödK¡~H¸íæAžǿYƒ“j{ď¿‘™À½W—®£ChŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mv™ˊBÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggJǧw×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰jNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏFl”g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“tHĔ~BmlRš—V_„ħTLnñH±’DžœL‘¼L˜ªl§Ťa¸ŒĚlK²€\\RòvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóZ ň¶vHrľ\\ʗJuxAT|dmÀO„‹[ÃԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆálŸwKhï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"], + ["@@@vˆPGsQ"], + ["@@‰sBz‚ddW]Q"], + ["@@SލQ“{"], + ["@@NŽVucW"], + ["@@qptBAq"], + ["@@‰’¸[mu"], + ["@@Q\\pD]_"], + ["@@jSwUadpF"], + ["@@eXª~ƒ•"], + ["@@AjvFso"], + ["@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy€°"], + ["@@IjJi"], + ["@@wJI€ˆxš«¼AoNe{M­"], + ["@@K‰±¡Óˆ”ČäeZ"], + [ + "@@k¡¹Eh~c®wBk‹UplÀ¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀEttĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶ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£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢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êv†HĢûXD®…QgėWiØPÞìºr¤dž€NĠ¢l–•ĄtZoœCƞÔºCxrpĠV®Ê{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Šs¬\\D‘ÄSfè©Hn¬…^DhÆyøJh“ØxĢĀLʈ„ƠPżċĄwȠ̦G®ǒĤäTŠÆ~ĦwŠ«|TF¡Šn€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýê‹Pó–qo슱_Êw§ÑªåƗ⼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqss¿FūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[×zkKN‘¶Õ»lčÓ{XSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’áV‡¼Ã~­…`g›ŸsÙfI›Ƌlę¹e|–~udjˆuTlXµ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"], + ["@@T‚ŒGŸy"], + ["@@K¬˜•‹U"], + ["@@WdXc"], + ["@@PtOs"], + ["@@•LnXhc"], + ["@@ppVƒu]Or"], + ["@@cdzAUa"], + ["@@udRhnCI‡"], + ["@@ˆoIƒpR„"], + [ + "@@Ľč{fzƤî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†š˜Ez„VL®öØBkŖÝĐ˹ŧ̄±ÀbÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ¾Z|†ZWyFYŸ¨Mf~C¿`€à_RÇzwƌfQnny´INoƬˆèôº|sT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£Č×GDyÕ¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„Ŗ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¶˜@«ŕŕQGƒ‹Yfa[şu“ßǩ™đš_X³ijÕčC]kbc•¥CS¯ëÍB©÷‹–³­Siˆ_}m˜YTtž³xlàcȂzÀD}ÂOQ³ÐTĨ¯†ƗòËŖ[hœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`Ƴĕg}V¡om½fa™Ço³TTj¥„tĠ—Ry”K{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠÍyqΘàQÂFewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzˑ赟^ˆKLœ—i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsŠøÀ«ì‰UMhTº¨¸ǡîS–Ô„DruÂÇZ•ÖEŽ’vPZ„žW”~؋ÐtĄE¢¦Ðy¸bŠô´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–`’Ŗ^Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlGl’™Rjsp¢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": [ + ["@@AB‚"], + ["@@lskt"], + [ + "@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|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ʧĘD†vČ_Àæ~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": [ + ["@@—n„FTs"], + ["@@ßÅÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€”ÇòAV‘‹M"], + [ + "@@©K—ƒA·³CQ±Á«³BUŠƑ¹AŠtćOw™D]ŒJiØSm¯b£‘ylƒ›X…HËѱH•«–‘C^õľA–Å§¤É¥„ïyuǙuA¢^{ÌC´­¦ŷJ£^[†“ª¿‡ĕ~•Ƈ…•N… skóā‡¹¿€ï]ă~÷O§­@—Vm¡‹Qđ¦¢Ĥ{ºjԏŽŒª¥nf´•~ÕoŸž×Ûą‹MąıuZœmZcÒ 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“È£ýhe‰dy¡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Œ„_E”zAN¦zLU`œcªx”OTu RLÄ¢dV„i`p˔vŎµªÉžF~ƒØ€d¢ºgİàw¸Áb[¦Zb¦–z½xBĖ@ªpº›šlS¸Ö\\Ĕ[N¥ˀmĎă’J\\‹ŀ`€…ňSڊĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}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ŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧ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": [ + ["@@QdˆAua"], + ["@@ƒlxDLo"], + ["@@sbhNLo"], + ["@@Ă āŸ"], + ["@@WltO[["], + ["@@Krœ]S"], + ["@@e„„I]y"], + ["@@I|„Mym"], + ["@@ƒÛ³LSŒž¼Y"], + ["@@nvºB–ëui©`¾"], + ["@@zdšÛ›Jw®"], + ["@@†°…¯"], + ["@@a yAª¸ËJIx،@€ĀHAmßV¡o•fu•o"], + ["@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹äh"], + ["@@‹¶Ý’Ì‚vmĞh­ı‡Q"], + ["@@HœŠdSjĒ¢D}war…“u«ZqadYM"], + ["@@elŒ\\LqqU"], + ["@@~rMo\\"], + ["@@f„^ƒC"], + ["@@øPªoj÷ÍÝħXČx”°Q¨ıXNv"], + ["@@gÇƳˆŽˆ”oˆŠˆ[~tly"], + ["@@E–ÆC¿‘"], + ["@@OŽP"], + [ + "@@w‹†đóg‰™ĝ—[³‹¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰ĥ‡¡«BhlmtÃPµyU¯uc“d·w_bŝcīímGOŽ|KP’ȏ‡ŹãŝIŕŭŕ@Óoo¿ē‹±ß}Ž…ŭ‚ŸIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³Aó›wXJþ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–‚ƂªFbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CöAŤ¦…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰¸@¾ªR²ĨN]´_eavSi‡vc•}p}Đ¼ƌkJœÚe thœ†_¸ ºx±ò_xN›Ë‹²‘@ƒă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƞŠV}³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀ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ñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVloޤ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’a”¦¤F³ºDÎńĀìŠCžĜº¦Ċ•~nS›|gźvZkCÆj°zVÈÁƔ]LÊFZg…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucà÷gՎuŒíÙćĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŒmcih³K›~‰µh¯e]lµ›él•E쉕E“ďs‡’mǖŧē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡y‹¦C‘ez€YŠwa™–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ¯T’bÜÈ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ðĀÒRŒšZdž™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ƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñ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ÕĢyFVvw–ˆxBèĻĒ©Ĉ“tCĢɽŠȣ¦āæ·HĽî“ôNԓ~^¤Ɗœu„œ^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ‘®Z´ğ~Sn|ªWÚ©òzPOȸ‚bð¢|‹øĞŠŒœŒQìÛÐ@Ğ™ǎRS¤Á§d…i“´ezÝúØã]Hq„kIŸþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwn‘ÆƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮ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°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§áCNęÎ[ĀÕĪgÖɪX˜øx¬½Ů¦¦[€—„NΆL€ÜUÖ´òrÙŠxR^–†J˜k„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯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Ñ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_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|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’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½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æß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¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ  ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [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͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™cc¡ÙaSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨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ÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†Ÿeƃī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ŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯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•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^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~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±ü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ž¬s„t‡”RˆÆdĠݎwܔ¸ôW¾ƮłÒ_{’Ìšû¼„jº¹¢GǪÒ¯ĘƒZ`ºŊƒecņąš~BÂgzpâēòYǠȰÌTΨÂWœ|fcŸă§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’Y¹‹W@µ÷K…ãï³ÛIcñ·VȋڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Á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€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙgBƕŀr̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|§”‡—hoĕ@E±“iYd¥OϹS|}F@¾oAO²{tfžÜ—¢Fǂ҈W²°BĤh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆY§‹@·pH€µàåVKe›pW†ftsAÅqC·¬ko«pHÆuK@oŸHĆۄķhx“e‘n›S³àǍ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‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡ĨÒ¤úSHbš‡ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñ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ĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ęĄžÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\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Ӝƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­Kq´ï¦—ºĒDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|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ǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ô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ĺSZg’rpiƼĘԛ¨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\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yû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ĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qĉ¶³ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡Ξ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ð”ļA†TUvdTŠG†º̼ŠÔ€Œ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_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚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ģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw[“mG½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠlŽ[„vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³àjĨoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öø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ŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚc±x¯oœRcfe…£’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉˆŦ¯rNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚSeîĜZczî¾i]͜™QaúÍÔiþĩȨWĢ‹ü|Ėu[qb[swP@ÅğP¿{\\‡¥A¨Ï‘Ѩj¯ŠX\\¯œMK‘pA³[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…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥îakS€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZŏ‘R§òoY×Ógc…ĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_Ȕ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ƸÁxc‡"], + ["@@©„ªƒ"], + ["@@”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´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMûƱ½~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƅġ‘œ^ÖÛbÙŽŏml½S‹êqDu[R‹ãË»†ÿw`»y‘¸_ĺę}÷`M¯ċfCVµqʼn÷Z•gg“Œ`d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëĬ„h˜xW‚}Kӈe­Xsbk”F¦›L‘ØgTkïƵNï¶}Gy“w\\oñ¡nmĈzjŸ•@™Óc£»Wă¹Ój“_m»ˆ¹·~MvÛaqœ»­‰êœ’\\ÂoVnŽÓØÍ™²«‹bq¿efE „€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEİ}zcĺƒL‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u‚•_n»_ƒ•At©Þűā§IVeëƒY}{VPÀFA¨ąB}q@|Ou—\\Fm‰QF݅Mw˜å}]•€|FmϋCaƒwŒu_p—¯sfÙgY…DHl`{QEfNysBЦzG¸rHe‚„N\\CvEsÐùÜ_·ÖĉsaQ¯€}_U‡†xÃđŠq›NH¬•Äd^ÝŰR¬ã°wećJEž·vÝ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®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"], + ["@@mŽn"], + ["@@EpFo"], + ["@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmРđhI®æÔtSHn€Eˆ„ÒrÈc"], + ["@@rMUw‡AS®€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 +} diff --git a/src/components/AppLinkInput/AppLinkSelectDialog.vue b/src/components/AppLinkInput/AppLinkSelectDialog.vue new file mode 100644 index 0000000000000000000000000000000000000000..63f19662e3788d6c6e9846ba15e01cd9e5651a8b --- /dev/null +++ b/src/components/AppLinkInput/AppLinkSelectDialog.vue @@ -0,0 +1,207 @@ + + + diff --git a/src/components/AppLinkInput/data.ts b/src/components/AppLinkInput/data.ts new file mode 100644 index 0000000000000000000000000000000000000000..1916e083df3e85e2e15dd5dac907cbbfc26712ee --- /dev/null +++ b/src/components/AppLinkInput/data.ts @@ -0,0 +1,228 @@ +// APP 链接分组 +export interface AppLinkGroup { + // 分组名称 + name: string + // 链接列表 + links: AppLink[] +} +// APP 链接 +export interface AppLink { + // 链接名称 + name: string + // 链接地址 + path: string + // 链接的类型 + type?: APP_LINK_TYPE_ENUM +} + +// APP 链接类型(需要特殊处理,例如商品详情) +export const enum APP_LINK_TYPE_ENUM { + // 拼团活动 + ACTIVITY_COMBINATION, + // 秒杀活动 + ACTIVITY_SECKILL, + // 文章详情 + ARTICLE_DETAIL, + // 优惠券详情 + COUPON_DETAIL, + // 自定义页面详情 + DIY_PAGE_DETAIL, + // 品类列表 + PRODUCT_CATEGORY_LIST, + // 商品列表 + PRODUCT_LIST, + // 商品详情 + PRODUCT_DETAIL_NORMAL, + // 拼团商品详情 + PRODUCT_DETAIL_COMBINATION, + // 秒杀商品详情 + PRODUCT_DETAIL_SECKILL +} + +// APP 链接列表(做一下持久化?) +export const APP_LINK_GROUP_LIST = [ + { + name: '商城', + links: [ + { + name: '首页', + path: '/pages/index/index' + }, + { + name: '商品分类', + path: '/pages/index/category', + type: APP_LINK_TYPE_ENUM.PRODUCT_CATEGORY_LIST + }, + { + name: '购物车', + path: '/pages/index/cart' + }, + { + name: '个人中心', + path: '/pages/index/user' + }, + { + name: '商品搜索', + path: '/pages/index/search' + }, + { + name: '自定义页面', + path: '/pages/index/page', + type: APP_LINK_TYPE_ENUM.DIY_PAGE_DETAIL + }, + { + name: '客服', + path: '/pages/chat/index' + }, + { + name: '系统设置', + path: '/pages/public/setting' + }, + { + name: '常见问题', + path: '/pages/public/faq' + } + ] + }, + { + name: '商品', + links: [ + { + name: '商品列表', + path: '/pages/goods/list', + type: APP_LINK_TYPE_ENUM.PRODUCT_LIST + }, + { + name: '商品详情', + path: '/pages/goods/index', + type: APP_LINK_TYPE_ENUM.PRODUCT_DETAIL_NORMAL + }, + { + name: '拼团商品详情', + path: '/pages/goods/groupon', + type: APP_LINK_TYPE_ENUM.PRODUCT_DETAIL_COMBINATION + }, + { + name: '秒杀商品详情', + path: '/pages/goods/seckill', + type: APP_LINK_TYPE_ENUM.PRODUCT_DETAIL_SECKILL + } + ] + }, + { + name: '营销活动', + links: [ + { + name: '拼团订单', + path: '/pages/activity/groupon/order' + }, + { + name: '营销商品', + path: '/pages/activity/index' + }, + { + name: '拼团活动', + path: '/pages/activity/groupon/list', + type: APP_LINK_TYPE_ENUM.ACTIVITY_COMBINATION + }, + { + name: '秒杀活动', + path: '/pages/activity/seckill/list', + type: APP_LINK_TYPE_ENUM.ACTIVITY_SECKILL + }, + { + name: '签到中心', + path: '/pages/app/sign' + }, + { + name: '优惠券中心', + path: '/pages/coupon/list' + }, + { + name: '优惠券详情', + path: '/pages/coupon/detail', + type: APP_LINK_TYPE_ENUM.COUPON_DETAIL + }, + { + name: '文章详情', + path: '/pages/public/richtext', + type: APP_LINK_TYPE_ENUM.ARTICLE_DETAIL + } + ] + }, + { + name: '分销商城', + links: [ + { + name: '分销中心', + path: '/pages/commission/index' + }, + { + name: '推广商品', + path: '/pages/commission/goods' + }, + { + name: '分销订单', + path: '/pages/commission/order' + }, + { + name: '我的团队', + path: '/pages/commission/team' + } + ] + }, + { + name: '支付', + links: [ + { + name: '充值余额', + path: '/pages/pay/recharge' + }, + { + name: '充值记录', + path: '/pages/pay/recharge-log' + } + ] + }, + { + name: '用户中心', + links: [ + { + name: '用户信息', + path: '/pages/user/info' + }, + { + name: '用户订单', + path: '/pages/order/list' + }, + { + name: '售后订单', + path: '/pages/order/aftersale/list' + }, + { + name: '商品收藏', + path: '/pages/user/goods-collect' + }, + { + name: '浏览记录', + path: '/pages/user/goods-log' + }, + { + name: '地址管理', + path: '/pages/user/address/list' + }, + { + name: '用户佣金', + path: '/pages/user/wallet/commission' + }, + { + name: '用户余额', + path: '/pages/user/wallet/money' + }, + { + name: '用户积分', + path: '/pages/user/wallet/score' + } + ] + } +] as AppLinkGroup[] diff --git a/src/components/AppLinkInput/index.vue b/src/components/AppLinkInput/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff71382117f2c0ac8c7c2ba3046b4552eba95a74 --- /dev/null +++ b/src/components/AppLinkInput/index.vue @@ -0,0 +1,43 @@ + + diff --git a/src/components/Card/src/CardTitle.vue b/src/components/Card/src/CardTitle.vue index 5b122f495d8c55b9a335774fe37c35d02e6ba298..76a835640a54495ab7da17190456f4b3d81a0916 100644 --- a/src/components/Card/src/CardTitle.vue +++ b/src/components/Card/src/CardTitle.vue @@ -3,7 +3,7 @@ defineComponent({ name: 'CardTitle' }) -const { title } = defineProps({ +defineProps({ title: { type: String, required: true diff --git a/src/components/ColorInput/index.vue b/src/components/ColorInput/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..63ff73cf86395a7610016b61ab1b88899efba05f --- /dev/null +++ b/src/components/ColorInput/index.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/ConfigGlobal/src/ConfigGlobal.vue b/src/components/ConfigGlobal/src/ConfigGlobal.vue index a08739674ea330cbf5c9fbeba45772802dff12d6..5bd90cf1edb1fb9a37a185660d22cac448138942 100644 --- a/src/components/ConfigGlobal/src/ConfigGlobal.vue +++ b/src/components/ConfigGlobal/src/ConfigGlobal.vue @@ -1,20 +1,19 @@ - + + + diff --git a/src/components/DiyEditor/components/ComponentContainerProperty.vue b/src/components/DiyEditor/components/ComponentContainerProperty.vue new file mode 100644 index 0000000000000000000000000000000000000000..9d0750daa4cc7ce3f9c5ed02c8470b12e7a466e8 --- /dev/null +++ b/src/components/DiyEditor/components/ComponentContainerProperty.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/components/DiyEditor/components/ComponentLibrary.vue b/src/components/DiyEditor/components/ComponentLibrary.vue new file mode 100644 index 0000000000000000000000000000000000000000..b8bd1ec38d184165b29f799208e9c98ae373ffce --- /dev/null +++ b/src/components/DiyEditor/components/ComponentLibrary.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/Carousel/config.ts b/src/components/DiyEditor/components/mobile/Carousel/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e74a51184837bef7f9861f8c51b2e0b4bb04232 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Carousel/config.ts @@ -0,0 +1,50 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 轮播图属性 */ +export interface CarouselProperty { + // 类型:默认 | 卡片 + type: 'default' | 'card' + // 指示器样式:点 | 数字 + indicator: 'dot' | 'number' + // 是否自动播放 + autoplay: boolean + // 播放间隔 + interval: number + // 轮播内容 + items: CarouselItemProperty[] + // 组件样式 + style: ComponentStyle +} +// 轮播内容属性 +export interface CarouselItemProperty { + // 类型:图片 | 视频 + type: 'img' | 'video' + // 图片链接 + imgUrl: string + // 视频链接 + videoUrl: string + // 跳转链接 + url: string +} + +// 定义组件 +export const component = { + id: 'Carousel', + name: '轮播图', + icon: 'system-uicons:carousel', + property: { + type: 'default', + indicator: 'dot', + autoplay: false, + interval: 3, + items: [ + { type: 'img', imgUrl: 'https://static.iocoder.cn/mall/banner-01.jpg', videoUrl: '' }, + { type: 'img', imgUrl: 'https://static.iocoder.cn/mall/banner-02.jpg', videoUrl: '' } + ] as CarouselItemProperty[], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/Carousel/index.vue b/src/components/DiyEditor/components/mobile/Carousel/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..360b4a496acf63bdd753b971312bca667f65441f --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Carousel/index.vue @@ -0,0 +1,43 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/Carousel/property.vue b/src/components/DiyEditor/components/mobile/Carousel/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..c3a515424af4ca905a805733821528e811864a48 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Carousel/property.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/CouponCard/component.tsx b/src/components/DiyEditor/components/mobile/CouponCard/component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..689690b0d4721340cbcca58bfd8d38710f362c8a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/CouponCard/component.tsx @@ -0,0 +1,73 @@ +import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate' +import { CouponTemplateValidityTypeEnum, PromotionDiscountTypeEnum } from '@/utils/constants' +import { floatToFixed2 } from '@/utils' +import { formatDate } from '@/utils/formatTime' +import { object } from 'vue-types' + +// 优惠值 +export const CouponDiscount = defineComponent({ + name: 'CouponDiscount', + props: { + coupon: object() + }, + setup(props) { + const coupon = props.coupon as CouponTemplateApi.CouponTemplateVO + // 折扣 + let value = coupon.discountPercent + '' + let suffix = ' 折' + // 满减 + if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) { + value = floatToFixed2(coupon.discountPrice) + suffix = ' 元' + } + return () => ( +
+ {value} + {suffix} +
+ ) + } +}) + +// 优惠描述 +export const CouponDiscountDesc = defineComponent({ + name: 'CouponDiscountDesc', + props: { + coupon: object() + }, + setup(props) { + const coupon = props.coupon as CouponTemplateApi.CouponTemplateVO + // 使用条件 + const useCondition = coupon.usePrice > 0 ? `满${floatToFixed2(coupon.usePrice)}元,` : '' + // 优惠描述 + const discountDesc = + coupon.discountType === PromotionDiscountTypeEnum.PRICE.type + ? `减${floatToFixed2(coupon.discountPrice)}元` + : `打${coupon.discountPercent}折` + return () => ( +
+ {useCondition} + {discountDesc} +
+ ) + } +}) + +// 有效期 +export const CouponValidTerm = defineComponent({ + name: 'CouponValidTerm', + props: { + coupon: object() + }, + setup(props) { + const coupon = props.coupon as CouponTemplateApi.CouponTemplateVO + const text = + coupon.validityType === CouponTemplateValidityTypeEnum.DATE.type + ? `有效期:${formatDate(coupon.validStartTime, 'YYYY-MM-DD')} 至 ${formatDate( + coupon.validEndTime, + 'YYYY-MM-DD' + )}` + : `领取后第 ${coupon.fixedStartTerm} - ${coupon.fixedEndTerm} 天内可用` + return () =>
{text}
+ } +}) diff --git a/src/components/DiyEditor/components/mobile/CouponCard/config.ts b/src/components/DiyEditor/components/mobile/CouponCard/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..304533d1ffb53daea3570d9d9b0277c2571ec9a8 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/CouponCard/config.ts @@ -0,0 +1,47 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 商品卡片属性 */ +export interface CouponCardProperty { + // 列数 + columns: number + // 背景图 + bgImg: string + // 文字颜色 + textColor: string + // 按钮样式 + button: { + // 颜色 + color: string + // 背景颜色 + bgColor: string + } + // 间距 + space: number + // 优惠券编号列表 + couponIds: number[] + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'CouponCard', + name: '优惠券', + icon: 'ep:ticket', + property: { + columns: 1, + bgImg: '', + textColor: '#E9B461', + button: { + color: '#434343', + bgColor: '' + }, + space: 0, + couponIds: [], + style: { + bgType: 'color', + bgColor: '', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/CouponCard/index.vue b/src/components/DiyEditor/components/mobile/CouponCard/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..3e2302afbd8976c23d42e19fff079ff845f33945 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/CouponCard/index.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/components/DiyEditor/components/mobile/CouponCard/property.vue b/src/components/DiyEditor/components/mobile/CouponCard/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..4f32c21ea402ce04e28f76211335475faa7471d9 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/CouponCard/property.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/Divider/config.ts b/src/components/DiyEditor/components/mobile/Divider/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b553604b9efc923b65e7f56206dfeef7821cd7d --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Divider/config.ts @@ -0,0 +1,29 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +/** 分割线属性 */ +export interface DividerProperty { + // 高度 + height: number + // 线宽 + lineWidth: number + // 边距类型 + paddingType: 'none' | 'horizontal' + // 颜色 + lineColor: string + // 类型 + borderType: 'solid' | 'dashed' | 'dotted' | 'none' +} + +// 定义组件 +export const component = { + id: 'Divider', + name: '分割线', + icon: 'tdesign:component-divider-vertical', + property: { + height: 30, + lineWidth: 1, + paddingType: 'none', + lineColor: '#dcdfe6', + borderType: 'solid' + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/Divider/index.vue b/src/components/DiyEditor/components/mobile/Divider/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f778504343b6e1635ce739ff8608c1ca9bb8b4e0 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Divider/index.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/Divider/property.vue b/src/components/DiyEditor/components/mobile/Divider/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..3d7be26dd5aeadcdceda59064003b48005c8f86b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Divider/property.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/FloatingActionButton/config.ts b/src/components/DiyEditor/components/mobile/FloatingActionButton/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fcf129f1871d113240b532596202321a8df83f2c --- /dev/null +++ b/src/components/DiyEditor/components/mobile/FloatingActionButton/config.ts @@ -0,0 +1,36 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +// 悬浮按钮属性 +export interface FloatingActionButtonProperty { + // 展开方向 + direction: 'horizontal' | 'vertical' + // 是否显示文字 + showText: boolean + // 按钮列表 + list: FloatingActionButtonItemProperty[] +} + +// 悬浮按钮项属性 +export interface FloatingActionButtonItemProperty { + // 图片地址 + imgUrl: string + // 跳转连接 + url: string + // 文字 + text: string + // 文字颜色 + textColor: string +} + +// 定义组件 +export const component = { + id: 'FloatingActionButton', + name: '悬浮按钮', + icon: 'tabler:float-right', + position: 'fixed', + property: { + direction: 'vertical', + showText: true, + list: [{ textColor: '#fff' }] + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/FloatingActionButton/index.vue b/src/components/DiyEditor/components/mobile/FloatingActionButton/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..19e42cb677d4354b824293846942cf1be8147804 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/FloatingActionButton/index.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/FloatingActionButton/property.vue b/src/components/DiyEditor/components/mobile/FloatingActionButton/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..5db08d0e01c8bb20c0a59a2d2a5fc27a4793a9ec --- /dev/null +++ b/src/components/DiyEditor/components/mobile/FloatingActionButton/property.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/controller.ts b/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7bd76224ba765bd0f553e9149e1f4b871ff91f6 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/controller.ts @@ -0,0 +1,143 @@ +import { HotZoneItemProperty } from '@/components/DiyEditor/components/mobile/HotZone/config' +import { StyleValue } from 'vue' + +// 热区的最小宽高 +export const HOT_ZONE_MIN_SIZE = 100 + +// 控制的类型 +export enum CONTROL_TYPE_ENUM { + LEFT, + TOP, + WIDTH, + HEIGHT +} + +// 定义热区的控制点 +export interface ControlDot { + position: string + types: CONTROL_TYPE_ENUM[] + style: StyleValue +} + +// 热区的8个控制点 +export const CONTROL_DOT_LIST = [ + { + position: '左上角', + types: [ + CONTROL_TYPE_ENUM.LEFT, + CONTROL_TYPE_ENUM.TOP, + CONTROL_TYPE_ENUM.WIDTH, + CONTROL_TYPE_ENUM.HEIGHT + ], + style: { left: '-5px', top: '-5px', cursor: 'nwse-resize' } + }, + { + position: '上方中间', + types: [CONTROL_TYPE_ENUM.TOP, CONTROL_TYPE_ENUM.HEIGHT], + style: { left: '50%', top: '-5px', cursor: 'n-resize', transform: 'translateX(-50%)' } + }, + { + position: '右上角', + types: [CONTROL_TYPE_ENUM.TOP, CONTROL_TYPE_ENUM.WIDTH, CONTROL_TYPE_ENUM.HEIGHT], + style: { right: '-5px', top: '-5px', cursor: 'nesw-resize' } + }, + { + position: '右侧中间', + types: [CONTROL_TYPE_ENUM.WIDTH], + style: { right: '-5px', top: '50%', cursor: 'e-resize', transform: 'translateX(-50%)' } + }, + { + position: '右下角', + types: [CONTROL_TYPE_ENUM.WIDTH, CONTROL_TYPE_ENUM.HEIGHT], + style: { right: '-5px', bottom: '-5px', cursor: 'nwse-resize' } + }, + { + position: '下方中间', + types: [CONTROL_TYPE_ENUM.HEIGHT], + style: { left: '50%', bottom: '-5px', cursor: 's-resize', transform: 'translateX(-50%)' } + }, + { + position: '左下角', + types: [CONTROL_TYPE_ENUM.LEFT, CONTROL_TYPE_ENUM.WIDTH, CONTROL_TYPE_ENUM.HEIGHT], + style: { left: '-5px', bottom: '-5px', cursor: 'nesw-resize' } + }, + { + position: '左侧中间', + types: [CONTROL_TYPE_ENUM.LEFT, CONTROL_TYPE_ENUM.WIDTH], + style: { left: '-5px', top: '50%', cursor: 'w-resize', transform: 'translateX(-50%)' } + } +] as ControlDot[] + +//region 热区的缩放 +// 热区的缩放比例 +export const HOT_ZONE_SCALE_RATE = 2 +// 缩小:缩回适合手机屏幕的大小 +export const zoomOut = (list?: HotZoneItemProperty[]) => { + return ( + list?.map((hotZone) => ({ + ...hotZone, + left: (hotZone.left /= HOT_ZONE_SCALE_RATE), + top: (hotZone.top /= HOT_ZONE_SCALE_RATE), + width: (hotZone.width /= HOT_ZONE_SCALE_RATE), + height: (hotZone.height /= HOT_ZONE_SCALE_RATE) + })) || [] + ) +} +// 放大:作用是为了方便在电脑屏幕上编辑 +export const zoomIn = (list?: HotZoneItemProperty[]) => { + return ( + list?.map((hotZone) => ({ + ...hotZone, + left: (hotZone.left *= HOT_ZONE_SCALE_RATE), + top: (hotZone.top *= HOT_ZONE_SCALE_RATE), + width: (hotZone.width *= HOT_ZONE_SCALE_RATE), + height: (hotZone.height *= HOT_ZONE_SCALE_RATE) + })) || [] + ) +} +//endregion + +/** + * 封装热区拖拽 + * + * 注:为什么不使用vueuse的useDraggable。在本场景下,其使用方式比较复杂 + * @param hotZone 热区 + * @param downEvent 鼠标按下事件 + * @param callback 回调函数 + */ +export const useDraggable = ( + hotZone: HotZoneItemProperty, + downEvent: MouseEvent, + callback: ( + left: number, + top: number, + width: number, + height: number, + moveWidth: number, + moveHeight: number + ) => void +) => { + // 阻止事件冒泡 + downEvent.stopPropagation() + + // 移动前的鼠标坐标 + const { clientX: startX, clientY: startY } = downEvent + // 移动前的热区坐标、大小 + const { left, top, width, height } = hotZone + + // 监听鼠标移动 + document.onmousemove = (e) => { + // 移动宽度 + const moveWidth = e.clientX - startX + // 移动高度 + const moveHeight = e.clientY - startY + // 移动回调 + callback(left, top, width, height, moveWidth, moveHeight) + } + + // 松开鼠标后,结束拖拽 + document.onmouseup = () => { + document.onmousemove = null + document.onmouseup = null + } +} diff --git a/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/index.vue b/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..39250572e77422e957d821ba4b08fc3f149579bb --- /dev/null +++ b/src/components/DiyEditor/components/mobile/HotZone/components/HotZoneEditDialog/index.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/HotZone/config.ts b/src/components/DiyEditor/components/mobile/HotZone/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..80ed8559c4ce1977b1782ccea817a6d6a847792b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/HotZone/config.ts @@ -0,0 +1,43 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 热区属性 */ +export interface HotZoneProperty { + // 图片地址 + imgUrl: string + // 导航菜单列表 + list: HotZoneItemProperty[] + // 组件样式 + style: ComponentStyle +} + +/** 热区项目属性 */ +export interface HotZoneItemProperty { + // 链接的名称 + name: string + // 链接 + url: string + // 宽 + width: number + // 高 + height: number + // 上 + top: number + // 左 + left: number +} + +// 定义组件 +export const component = { + id: 'HotZone', + name: '热区', + icon: 'tabler:hand-click', + property: { + imgUrl: '', + list: [] as HotZoneItemProperty[], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/HotZone/index.vue b/src/components/DiyEditor/components/mobile/HotZone/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..3a9b842edb213eef377968ec1fcc6442608f5d9a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/HotZone/index.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/HotZone/property.vue b/src/components/DiyEditor/components/mobile/HotZone/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..495cbdce4bdade93fa1ae28de221b749b58dd58b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/HotZone/property.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/ImageBar/config.ts b/src/components/DiyEditor/components/mobile/ImageBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..68edf728bf41b0764b9cae8d577f6c125c680959 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ImageBar/config.ts @@ -0,0 +1,27 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 图片展示属性 */ +export interface ImageBarProperty { + // 图片链接 + imgUrl: string + // 跳转链接 + url: string + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'ImageBar', + name: '图片展示', + icon: 'ep:picture', + property: { + imgUrl: '', + url: '', + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/ImageBar/index.vue b/src/components/DiyEditor/components/mobile/ImageBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..d9685b501a7d512e010e6c819b607e680116b65a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ImageBar/index.vue @@ -0,0 +1,24 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/ImageBar/property.vue b/src/components/DiyEditor/components/mobile/ImageBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..d8163615008441a9f1222d205d15541d29c6027a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ImageBar/property.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MagicCube/config.ts b/src/components/DiyEditor/components/mobile/MagicCube/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..5e10ab55a81294f19dcce19bba2e89f46d46a6cf --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MagicCube/config.ts @@ -0,0 +1,49 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 广告魔方属性 */ +export interface MagicCubeProperty { + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间隔 + space: number + // 导航菜单列表 + list: MagicCubeItemProperty[] + // 组件样式 + style: ComponentStyle +} + +/** 广告魔方项目属性 */ +export interface MagicCubeItemProperty { + // 图标链接 + imgUrl: string + // 链接 + url: string + // 宽 + width: number + // 高 + height: number + // 上 + top: number + // 左 + left: number +} + +// 定义组件 +export const component = { + id: 'MagicCube', + name: '广告魔方', + icon: 'bi:columns', + property: { + borderRadiusTop: 0, + borderRadiusBottom: 0, + space: 0, + list: [], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MagicCube/index.vue b/src/components/DiyEditor/components/mobile/MagicCube/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..48fb6c757228b97728187c8bc6cba858109bee66 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MagicCube/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MagicCube/property.vue b/src/components/DiyEditor/components/mobile/MagicCube/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..fe938e5b4ad1784e55c7792e3c84090b836864a2 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MagicCube/property.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/config.ts b/src/components/DiyEditor/components/mobile/MenuGrid/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f91ceb06b4a1702b464a77c492a4f2fb99d1e48 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/config.ts @@ -0,0 +1,79 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 宫格导航属性 */ +export interface MenuGridProperty { + // 列数 + column: number + // 导航菜单列表 + list: MenuGridItemProperty[] + // 组件样式 + style: ComponentStyle +} + +/** 宫格导航项目属性 */ +export interface MenuGridItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 副标题 + subtitle: string + // 副标题颜色 + subtitleColor: string + // 链接 + url: string + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标文字 + text: string + // 角标文字颜色 + textColor: string + // 角标背景颜色 + bgColor: string + } +} + +export const EMPTY_MENU_GRID_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + subtitle: '副标题', + subtitleColor: '#bbb', + badge: { + show: false, + textColor: '#fff', + bgColor: '#FF6000' + } +} as MenuGridItemProperty + +// 定义组件 +export const component = { + id: 'MenuGrid', + name: '宫格导航', + icon: 'bi:grid-3x3-gap', + property: { + column: 3, + list: [cloneDeep(EMPTY_MENU_GRID_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8, + marginLeft: 8, + marginRight: 8, + padding: 8, + paddingTop: 8, + paddingRight: 8, + paddingBottom: 8, + paddingLeft: 8, + borderRadius: 8, + borderTopLeftRadius: 8, + borderTopRightRadius: 8, + borderBottomRightRadius: 8, + borderBottomLeftRadius: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/index.vue b/src/components/DiyEditor/components/mobile/MenuGrid/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1c5ef1dc49c7e89b11924ea642bae18a9209d6ad --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuGrid/property.vue b/src/components/DiyEditor/components/mobile/MenuGrid/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..7940fd0f151bfe3845f05ee9700800a52d9dab4a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuGrid/property.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuList/config.ts b/src/components/DiyEditor/components/mobile/MenuList/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..f96fd0a1c4bfb37f7446e1496342572a7ebab1ce --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/config.ts @@ -0,0 +1,48 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 列表导航属性 */ +export interface MenuListProperty { + // 导航菜单列表 + list: MenuListItemProperty[] + // 组件样式 + style: ComponentStyle +} + +/** 列表导航项目属性 */ +export interface MenuListItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 副标题 + subtitle: string + // 副标题颜色 + subtitleColor: string + // 链接 + url: string +} + +export const EMPTY_MENU_LIST_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + subtitle: '副标题', + subtitleColor: '#bbb' +} + +// 定义组件 +export const component = { + id: 'MenuList', + name: '列表导航', + icon: 'fa-solid:list', + property: { + list: [cloneDeep(EMPTY_MENU_LIST_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuList/index.vue b/src/components/DiyEditor/components/mobile/MenuList/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..9a56fd94bf9d9a3b7ee93633e035e6e8321cdad2 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/index.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuList/property.vue b/src/components/DiyEditor/components/mobile/MenuList/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..a5fb4603d2a4094256ec84fa4708c95c623f10bc --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuList/property.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts b/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe5f4e87f8854459c42403d4548325c38f90e214 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/config.ts @@ -0,0 +1,66 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' +import { cloneDeep } from 'lodash-es' + +/** 菜单导航属性 */ +export interface MenuSwiperProperty { + // 布局: 图标+文字 | 图标 + layout: 'iconText' | 'icon' + // 行数 + row: number + // 列数 + column: number + // 导航菜单列表 + list: MenuSwiperItemProperty[] + // 组件样式 + style: ComponentStyle +} +/** 菜单导航项目属性 */ +export interface MenuSwiperItemProperty { + // 图标链接 + iconUrl: string + // 标题 + title: string + // 标题颜色 + titleColor: string + // 链接 + url: string + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标文字 + text: string + // 角标文字颜色 + textColor: string + // 角标背景颜色 + bgColor: string + } +} + +export const EMPTY_MENU_SWIPER_ITEM_PROPERTY = { + title: '标题', + titleColor: '#333', + badge: { + show: false, + textColor: '#fff', + bgColor: '#FF6000' + } +} as MenuSwiperItemProperty + +// 定义组件 +export const component = { + id: 'MenuSwiper', + name: '菜单导航', + icon: 'bi:grid-3x2-gap', + property: { + layout: 'iconText', + row: 1, + column: 3, + list: [cloneDeep(EMPTY_MENU_SWIPER_ITEM_PROPERTY)], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue b/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f8e2bbc64f51898c14527091a9eec370af11baf8 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/index.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue b/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..81266bc20f97673e729b5d5f3d0c8a2e205d9f47 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/MenuSwiper/property.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/NavigationBar/config.ts b/src/components/DiyEditor/components/mobile/NavigationBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..f722d52596b45aa5c5d12a0891f114d2793f4ee2 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NavigationBar/config.ts @@ -0,0 +1,38 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +/** 顶部导航栏属性 */ +export interface NavigationBarProperty { + // 页面标题 + title: string + // 页面描述 + description: string + // 顶部导航高度 + navBarHeight: number + // 页面背景颜色 + backgroundColor: string + // 页面背景图片 + backgroundImage: string + // 样式类型:默认 | 沉浸式 + styleType: 'default' | 'immersion' + // 常驻显示 + alwaysShow: boolean + // 是否显示返回按钮 + showGoBack: boolean +} + +// 定义组件 +export const component = { + id: 'NavigationBar', + name: '顶部导航栏', + icon: 'tabler:layout-navbar', + property: { + title: '页面标题', + description: '', + navBarHeight: 35, + backgroundColor: '#fff', + backgroundImage: '', + styleType: 'default', + alwaysShow: true, + showGoBack: true + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/NavigationBar/index.vue b/src/components/DiyEditor/components/mobile/NavigationBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f5cfff8cbd89cdc50af6eb577fa08900f47dbf97 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NavigationBar/index.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/components/DiyEditor/components/mobile/NavigationBar/property.vue b/src/components/DiyEditor/components/mobile/NavigationBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..c4ca4588fafd4efc1802167c29acc050d3fa4e08 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NavigationBar/property.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/NoticeBar/config.ts b/src/components/DiyEditor/components/mobile/NoticeBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6b0860d623f92cad8098901c118e49820fa89d7 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NoticeBar/config.ts @@ -0,0 +1,46 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 公告栏属性 */ +export interface NoticeBarProperty { + // 图标地址 + iconUrl: string + // 公告内容列表 + contents: NoticeContentProperty[] + // 背景颜色 + backgroundColor: string + // 文字颜色 + textColor: string + // 组件样式 + style: ComponentStyle +} + +/** 内容属性 */ +export interface NoticeContentProperty { + // 内容文字 + text: string + // 链接地址 + url: string +} + +// 定义组件 +export const component = { + id: 'NoticeBar', + name: '公告栏', + icon: 'ep:bell', + property: { + iconUrl: 'http://mall.yudao.iocoder.cn/static/images/xinjian.png', + contents: [ + { + text: '', + url: '' + } + ], + backgroundColor: '#fff', + textColor: '#333', + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/NoticeBar/index.vue b/src/components/DiyEditor/components/mobile/NoticeBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fce1afbb37898606a61f7a70bf34b637165735aa --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NoticeBar/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/NoticeBar/property.vue b/src/components/DiyEditor/components/mobile/NoticeBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..a505011a21a50d546f60775f7de8007324d691be --- /dev/null +++ b/src/components/DiyEditor/components/mobile/NoticeBar/property.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/PageConfig/config.ts b/src/components/DiyEditor/components/mobile/PageConfig/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8e45e45811b4d9963e66b1270f0e54369c86cd6 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PageConfig/config.ts @@ -0,0 +1,23 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +/** 页面设置属性 */ +export interface PageConfigProperty { + // 页面描述 + description: string + // 页面背景颜色 + backgroundColor: string + // 页面背景图片 + backgroundImage: string +} + +// 定义页面组件 +export const component = { + id: 'PageConfig', + name: '页面设置', + icon: 'ep:document', + property: { + description: '', + backgroundColor: '#f5f5f5', + backgroundImage: '' + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/PageConfig/property.vue b/src/components/DiyEditor/components/mobile/PageConfig/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..278bc9408aff5afe0fc47fa104f0ce8421ab2942 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PageConfig/property.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/Popover/config.ts b/src/components/DiyEditor/components/mobile/Popover/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..e81409003eb9afee21ec0f5882f0903ec7a95f14 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Popover/config.ts @@ -0,0 +1,26 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +/** 弹窗广告属性 */ +export interface PopoverProperty { + list: PopoverItemProperty[] +} + +export interface PopoverItemProperty { + // 图片地址 + imgUrl: string + // 跳转连接 + url: string + // 显示类型:仅显示一次、每次启动都会显示 + showType: 'once' | 'always' +} + +// 定义组件 +export const component = { + id: 'Popover', + name: '弹窗广告', + icon: 'carbon:popup', + position: 'fixed', + property: { + list: [{ showType: 'once' }] + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/Popover/index.vue b/src/components/DiyEditor/components/mobile/Popover/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..347599b3c9f0de927f1061321bc7ef3a92481f15 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Popover/index.vue @@ -0,0 +1,38 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/Popover/property.vue b/src/components/DiyEditor/components/mobile/Popover/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..6535e3b2c9d6611056bcc7481b34f50793aa05ec --- /dev/null +++ b/src/components/DiyEditor/components/mobile/Popover/property.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductCard/config.ts b/src/components/DiyEditor/components/mobile/ProductCard/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..735b6ba04a812813234b054722ed9ce37cb5fd84 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/config.ts @@ -0,0 +1,97 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 商品卡片属性 */ +export interface ProductCardProperty { + // 布局类型:单列大图 | 单列小图 | 双列 + layoutType: 'oneColBigImg' | 'oneColSmallImg' | 'twoCol' + // 商品字段 + fields: { + // 商品名称 + name: ProductCardFieldProperty + // 商品简介 + introduction: ProductCardFieldProperty + // 商品价格 + price: ProductCardFieldProperty + // 商品市场价 + marketPrice: ProductCardFieldProperty + // 商品销量 + salesCount: ProductCardFieldProperty + // 商品库存 + stock: ProductCardFieldProperty + } + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标图片 + imgUrl: string + } + // 按钮 + btnBuy: { + // 类型:文字 | 图片 + type: 'text' | 'img' + // 文字 + text: string + // 文字按钮:背景渐变起始颜色 + bgBeginColor: string + // 文字按钮:背景渐变结束颜色 + bgEndColor: string + // 图片按钮:图片地址 + imgUrl: string + } + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间距 + space: number + // 商品编号列表 + spuIds: number[] + // 组件样式 + style: ComponentStyle +} +// 商品字段 +export interface ProductCardFieldProperty { + // 是否显示 + show: boolean + // 颜色 + color: string +} + +// 定义组件 +export const component = { + id: 'ProductCard', + name: '商品卡片', + icon: 'fluent:text-column-two-left-24-filled', + property: { + layoutType: 'oneColBigImg', + fields: { + name: { show: true, color: '#000' }, + introduction: { show: true, color: '#999' }, + price: { show: true, color: '#ff3000' }, + marketPrice: { show: true, color: '#c4c4c4' }, + salesCount: { show: true, color: '#c4c4c4' }, + stock: { show: false, color: '#c4c4c4' } + }, + badge: { show: false, imgUrl: '' }, + btnBuy: { + type: 'text', + text: '立即购买', + // todo: @owen 根据主题色配置 + bgBeginColor: '#FF6000', + bgEndColor: '#FE832A', + imgUrl: '' + }, + borderRadiusTop: 8, + borderRadiusBottom: 8, + space: 8, + spuIds: [], + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/ProductCard/index.vue b/src/components/DiyEditor/components/mobile/ProductCard/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f05d4fa91847e2d6d327f8593e2ff90fc26b4dc8 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/index.vue @@ -0,0 +1,166 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductCard/property.vue b/src/components/DiyEditor/components/mobile/ProductCard/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..cfa5008bdaae8fd7baa2b62d96e9e0955954e7e1 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductCard/property.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductList/config.ts b/src/components/DiyEditor/components/mobile/ProductList/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f1683234bc88d27a44e47787a064ea1662cca48 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductList/config.ts @@ -0,0 +1,64 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 商品栏属性 */ +export interface ProductListProperty { + // 布局类型:双列 | 三列 | 水平滑动 + layoutType: 'twoCol' | 'threeCol' | 'horizSwiper' + // 商品字段 + fields: { + // 商品名称 + name: ProductListFieldProperty + // 商品价格 + price: ProductListFieldProperty + } + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标图片 + imgUrl: string + } + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间距 + space: number + // 商品编号列表 + spuIds: number[] + // 组件样式 + style: ComponentStyle +} +// 商品字段 +export interface ProductListFieldProperty { + // 是否显示 + show: boolean + // 颜色 + color: string +} + +// 定义组件 +export const component = { + id: 'ProductList', + name: '商品栏', + icon: 'fluent:text-column-two-24-filled', + property: { + layoutType: 'twoCol', + fields: { + name: { show: true, color: '#000' }, + price: { show: true, color: '#ff3000' } + }, + badge: { show: false, imgUrl: '' }, + borderRadiusTop: 8, + borderRadiusBottom: 8, + space: 8, + spuIds: [], + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/ProductList/index.vue b/src/components/DiyEditor/components/mobile/ProductList/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..3ba636779544eb5de76fd58f996f1393d01d9f36 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductList/index.vue @@ -0,0 +1,131 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/ProductList/property.vue b/src/components/DiyEditor/components/mobile/ProductList/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..e9cf7c0104f444822a6443710d1731c864b7913b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/ProductList/property.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionArticle/config.ts b/src/components/DiyEditor/components/mobile/PromotionArticle/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6270c2ad279a8431801972f20b5ebde442b5255 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionArticle/config.ts @@ -0,0 +1,25 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 营销文章属性 */ +export interface PromotionArticleProperty { + // 文章编号 + id: number + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'PromotionArticle', + name: '营销文章', + icon: 'ph:article-medium', + property: { + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/PromotionArticle/index.vue b/src/components/DiyEditor/components/mobile/PromotionArticle/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e003b081c4c784e39fcb2debdd5814dbf204dac4 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionArticle/index.vue @@ -0,0 +1,27 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionArticle/property.vue b/src/components/DiyEditor/components/mobile/PromotionArticle/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..c3bcb21bcb084720e901a8d8006055890c410a58 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionArticle/property.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionCombination/config.ts b/src/components/DiyEditor/components/mobile/PromotionCombination/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c7e9ff7376708b4fce2d811e826852ed51d9aea --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionCombination/config.ts @@ -0,0 +1,64 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 拼团属性 */ +export interface PromotionCombinationProperty { + // 布局类型:单列 | 三列 + layoutType: 'oneCol' | 'threeCol' + // 商品字段 + fields: { + // 商品名称 + name: PromotionCombinationFieldProperty + // 商品价格 + price: PromotionCombinationFieldProperty + } + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标图片 + imgUrl: string + } + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间距 + space: number + // 拼团活动编号 + activityId: number + // 组件样式 + style: ComponentStyle +} + +// 商品字段 +export interface PromotionCombinationFieldProperty { + // 是否显示 + show: boolean + // 颜色 + color: string +} + +// 定义组件 +export const component = { + id: 'PromotionCombination', + name: '拼团', + icon: 'mdi:account-group', + property: { + layoutType: 'oneCol', + fields: { + name: { show: true, color: '#000' }, + price: { show: true, color: '#ff3000' } + }, + badge: { show: false, imgUrl: '' }, + borderRadiusTop: 8, + borderRadiusBottom: 8, + space: 8, + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/PromotionCombination/index.vue b/src/components/DiyEditor/components/mobile/PromotionCombination/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fe6f3a83b96c8a019a6c0a30a42d81916f197ffa --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionCombination/index.vue @@ -0,0 +1,125 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionCombination/property.vue b/src/components/DiyEditor/components/mobile/PromotionCombination/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec09dc452af20c99f0c20bc54efaf4c1105776a0 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionCombination/property.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionSeckill/config.ts b/src/components/DiyEditor/components/mobile/PromotionSeckill/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..800398beebf3208f0737739cd1f98018d80a9a7e --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionSeckill/config.ts @@ -0,0 +1,64 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 秒杀属性 */ +export interface PromotionSeckillProperty { + // 布局类型:单列 | 三列 + layoutType: 'oneCol' | 'threeCol' + // 商品字段 + fields: { + // 商品名称 + name: PromotionSeckillFieldProperty + // 商品价格 + price: PromotionSeckillFieldProperty + } + // 角标 + badge: { + // 是否显示 + show: boolean + // 角标图片 + imgUrl: string + } + // 上圆角 + borderRadiusTop: number + // 下圆角 + borderRadiusBottom: number + // 间距 + space: number + // 秒杀活动编号 + activityId: number + // 组件样式 + style: ComponentStyle +} +// 商品字段 +export interface PromotionSeckillFieldProperty { + // 是否显示 + show: boolean + // 颜色 + color: string +} + +// 定义组件 +export const component = { + id: 'PromotionSeckill', + name: '秒杀', + icon: 'mdi:calendar-time', + property: { + activityId: undefined, + layoutType: 'oneCol', + fields: { + name: { show: true, color: '#000' }, + price: { show: true, color: '#ff3000' } + }, + badge: { show: false, imgUrl: '' }, + borderRadiusTop: 8, + borderRadiusBottom: 8, + space: 8, + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/PromotionSeckill/index.vue b/src/components/DiyEditor/components/mobile/PromotionSeckill/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1b4113b69b866b1eaaf231f52c803d06ae222d81 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionSeckill/index.vue @@ -0,0 +1,125 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/PromotionSeckill/property.vue b/src/components/DiyEditor/components/mobile/PromotionSeckill/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..87537822147e5981d313fbf25607109f0960abbf --- /dev/null +++ b/src/components/DiyEditor/components/mobile/PromotionSeckill/property.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/SearchBar/config.ts b/src/components/DiyEditor/components/mobile/SearchBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef47b27c48661d42029d3e25f240c3395cc1aa89 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/SearchBar/config.ts @@ -0,0 +1,43 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 搜索框属性 */ +export interface SearchProperty { + height: number // 搜索栏高度 + showScan: boolean // 显示扫一扫 + borderRadius: number // 框体样式 + placeholder: string // 占位文字 + placeholderPosition: PlaceholderPosition // 占位文字位置 + backgroundColor: string // 框体颜色 + textColor: string // 字体颜色 + hotKeywords: string[] // 热词 + style: ComponentStyle +} + +// 文字位置 +export type PlaceholderPosition = 'left' | 'center' + +// 定义组件 +export const component = { + id: 'SearchBar', + name: '搜索框', + icon: 'ep:search', + property: { + height: 28, + showScan: false, + borderRadius: 0, + placeholder: '搜索商品', + placeholderPosition: 'left', + backgroundColor: 'rgb(238, 238, 238)', + textColor: 'rgb(150, 151, 153)', + hotKeywords: [], + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8, + paddingTop: 8, + paddingRight: 8, + paddingBottom: 8, + paddingLeft: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/SearchBar/index.vue b/src/components/DiyEditor/components/mobile/SearchBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..9de261adc1f7ce12b56aa4925a42365a243cf648 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/SearchBar/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/SearchBar/property.vue b/src/components/DiyEditor/components/mobile/SearchBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..90027027d10a7d098d3771efba03e68f26889beb --- /dev/null +++ b/src/components/DiyEditor/components/mobile/SearchBar/property.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/TabBar/config.ts b/src/components/DiyEditor/components/mobile/TabBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..88d706fe47276783f15ecd4f854a1a6efe582d17 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TabBar/config.ts @@ -0,0 +1,97 @@ +import { DiyComponent } from '@/components/DiyEditor/util' + +/** 底部导航菜单属性 */ +export interface TabBarProperty { + // 选项列表 + items: TabBarItemProperty[] + // 主题 + theme: string + // 样式 + style: TabBarStyle +} + +// 选项属性 +export interface TabBarItemProperty { + // 标签文字 + text: string + // 链接 + url: string + // 默认图标链接 + iconUrl: string + // 选中的图标链接 + activeIconUrl: string +} + +// 样式 +export interface TabBarStyle { + // 背景类型 + bgType: 'color' | 'img' + // 背景颜色 + bgColor: string + // 图片链接 + bgImg: string + // 默认颜色 + color: string + // 选中的颜色 + activeColor: string +} + +// 定义组件 +export const component = { + id: 'TabBar', + name: '底部导航', + icon: 'fluent:table-bottom-row-16-filled', + property: { + theme: 'red', + style: { + bgType: 'color', + bgColor: '#fff', + color: '#282828', + activeColor: '#fc4141' + }, + items: [ + { + text: '首页', + url: '/pages/index/index', + iconUrl: 'http://mall.yudao.iocoder.cn/static/images/1-001.png', + activeIconUrl: 'http://mall.yudao.iocoder.cn/static/images/1-002.png' + }, + { + text: '分类', + url: '/pages/index/category?id=3', + iconUrl: 'http://mall.yudao.iocoder.cn/static/images/2-001.png', + activeIconUrl: 'http://mall.yudao.iocoder.cn/static/images/2-002.png' + }, + { + text: '购物车', + url: '/pages/index/cart', + iconUrl: 'http://mall.yudao.iocoder.cn/static/images/3-001.png', + activeIconUrl: 'http://mall.yudao.iocoder.cn/static/images/3-002.png' + }, + { + text: '我的', + url: '/pages/index/user', + iconUrl: 'http://mall.yudao.iocoder.cn/static/images/4-001.png', + activeIconUrl: 'http://mall.yudao.iocoder.cn/static/images/4-002.png' + } + ] + } +} as DiyComponent + +export const THEME_LIST = [ + { id: 'red', name: '中国红', icon: 'icon-park-twotone:theme', color: '#d10019' }, + { id: 'orange', name: '桔橙', icon: 'icon-park-twotone:theme', color: '#f37b1d' }, + { id: 'gold', name: '明黄', icon: 'icon-park-twotone:theme', color: '#fbbd08' }, + { id: 'green', name: '橄榄绿', icon: 'icon-park-twotone:theme', color: '#8dc63f' }, + { id: 'cyan', name: '天青', icon: 'icon-park-twotone:theme', color: '#1cbbb4' }, + { id: 'blue', name: '海蓝', icon: 'icon-park-twotone:theme', color: '#0081ff' }, + { id: 'purple', name: '姹紫', icon: 'icon-park-twotone:theme', color: '#6739b6' }, + { id: 'brightRed', name: '嫣红', icon: 'icon-park-twotone:theme', color: '#e54d42' }, + { id: 'forestGreen', name: '森绿', icon: 'icon-park-twotone:theme', color: '#39b54a' }, + { id: 'mauve', name: '木槿', icon: 'icon-park-twotone:theme', color: '#9c26b0' }, + { id: 'pink', name: '桃粉', icon: 'icon-park-twotone:theme', color: '#e03997' }, + { id: 'brown', name: '棕褐', icon: 'icon-park-twotone:theme', color: '#a5673f' }, + { id: 'grey', name: '玄灰', icon: 'icon-park-twotone:theme', color: '#8799a3' }, + { id: 'gray', name: '草灰', icon: 'icon-park-twotone:theme', color: '#aaaaaa' }, + { id: 'black', name: '墨黑', icon: 'icon-park-twotone:theme', color: '#333333' } +] diff --git a/src/components/DiyEditor/components/mobile/TabBar/index.vue b/src/components/DiyEditor/components/mobile/TabBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..44ba43c0fd5f40bc198dd19c24f1664c8a21c06a --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TabBar/index.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components/DiyEditor/components/mobile/TabBar/property.vue b/src/components/DiyEditor/components/mobile/TabBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..6ace5af35811f7ce78f861a7ecc95d3fd96fed4b --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TabBar/property.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/TitleBar/config.ts b/src/components/DiyEditor/components/mobile/TitleBar/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..d9f0672cb46326c7d18ff47e22ac7ff2c1c56d70 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TitleBar/config.ts @@ -0,0 +1,69 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 标题栏属性 */ +export interface TitleBarProperty { + // 背景图 + bgImgUrl: string + // 偏移 + marginLeft: number + // 显示位置 + textAlign: 'left' | 'center' + // 主标题 + title: string + // 副标题 + description: string + // 标题大小 + titleSize: number + // 描述大小 + descriptionSize: number + // 标题粗细 + titleWeight: number + // 描述粗细 + descriptionWeight: number + // 标题颜色 + titleColor: string + // 描述颜色 + descriptionColor: string + // 查看更多 + more: { + // 是否显示查看更多 + show: false + // 样式选择 + type: 'text' | 'icon' | 'all' + // 自定义文字 + text: string + // 链接 + url: string + } + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'TitleBar', + name: '标题栏', + icon: 'material-symbols:line-start', + property: { + title: '主标题', + description: '副标题', + titleSize: 16, + descriptionSize: 12, + titleWeight: 400, + textAlign: 'left', + descriptionWeight: 200, + titleColor: 'rgba(50, 50, 51, 10)', + descriptionColor: 'rgba(150, 151, 153, 10)', + more: { + //查看更多 + show: false, + type: 'icon', + text: '查看更多', + url: '' + }, + style: { + bgType: 'color', + bgColor: '#fff' + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/TitleBar/index.vue b/src/components/DiyEditor/components/mobile/TitleBar/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..b75d224e182480e7db0693abe65a0f957d6fb071 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TitleBar/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/components/DiyEditor/components/mobile/TitleBar/property.vue b/src/components/DiyEditor/components/mobile/TitleBar/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..4eb325970bd36d716ba7810047387ab89540df71 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/TitleBar/property.vue @@ -0,0 +1,121 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/UserCard/config.ts b/src/components/DiyEditor/components/mobile/UserCard/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..7b337761b040531c14d300eca9fbd9bb3d82aa05 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCard/config.ts @@ -0,0 +1,21 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 用户卡片属性 */ +export interface UserCardProperty { + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'UserCard', + name: '用户卡片', + icon: 'mdi:user-card-details', + property: { + style: { + bgType: 'color', + bgColor: '', + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/UserCard/index.vue b/src/components/DiyEditor/components/mobile/UserCard/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..14b447c62118f5f5689e6e7e8f9ce07896e34193 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCard/index.vue @@ -0,0 +1,29 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/UserCard/property.vue b/src/components/DiyEditor/components/mobile/UserCard/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..43dfad2ce64fa13056d8f8621ec49302fee956f6 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCard/property.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/UserCoupon/config.ts b/src/components/DiyEditor/components/mobile/UserCoupon/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..92eba9b6ead298b2ea54e30dcbfae1dc192f626d --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCoupon/config.ts @@ -0,0 +1,23 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 用户卡券属性 */ +export interface UserCouponProperty { + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'UserCoupon', + name: '用户卡券', + icon: 'ep:ticket', + property: { + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/UserCoupon/index.vue b/src/components/DiyEditor/components/mobile/UserCoupon/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..27ad310a506f4003431e8c12a1384a787a0809a2 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCoupon/index.vue @@ -0,0 +1,15 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/UserCoupon/property.vue b/src/components/DiyEditor/components/mobile/UserCoupon/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..f902e04ee281429a0d1eb8acf109db9c6c145529 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserCoupon/property.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/UserOrder/config.ts b/src/components/DiyEditor/components/mobile/UserOrder/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..f9c5a6db7399b9d5ad109c6e880e14603bf0c570 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserOrder/config.ts @@ -0,0 +1,23 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 用户订单属性 */ +export interface UserOrderProperty { + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'UserOrder', + name: '用户订单', + icon: 'ep:list', + property: { + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/UserOrder/index.vue b/src/components/DiyEditor/components/mobile/UserOrder/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..450ae5489b1f011a7a79e9da4b94279b6a6b0ef7 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserOrder/index.vue @@ -0,0 +1,13 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/UserOrder/property.vue b/src/components/DiyEditor/components/mobile/UserOrder/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..42df74104bf66a65e77a8e8e6c46e1c5462bd428 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserOrder/property.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/UserWallet/config.ts b/src/components/DiyEditor/components/mobile/UserWallet/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e0955f5e624b19ae6aba307b222ca5795b1d3a9 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserWallet/config.ts @@ -0,0 +1,23 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 用户资产属性 */ +export interface UserWalletProperty { + // 组件样式 + style: ComponentStyle +} + +// 定义组件 +export const component = { + id: 'UserWallet', + name: '用户资产', + icon: 'ep:wallet-filled', + property: { + style: { + bgType: 'color', + bgColor: '', + marginLeft: 8, + marginRight: 8, + marginBottom: 8 + } as ComponentStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/UserWallet/index.vue b/src/components/DiyEditor/components/mobile/UserWallet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0efc9371a03b694a3bd8652845e95fd7c3e659ca --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserWallet/index.vue @@ -0,0 +1,15 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/UserWallet/property.vue b/src/components/DiyEditor/components/mobile/UserWallet/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..549367e35824605f637d278323f30e9aebb39952 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/UserWallet/property.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/VideoPlayer/config.ts b/src/components/DiyEditor/components/mobile/VideoPlayer/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..02f03747ed8d41f7265ff9a6b5820bc12f5e9fa1 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/VideoPlayer/config.ts @@ -0,0 +1,37 @@ +import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util' + +/** 视频播放属性 */ +export interface VideoPlayerProperty { + // 视频链接 + videoUrl: string + // 封面链接 + posterUrl: string + // 是否自动播放 + autoplay: boolean + // 组件样式 + style: VideoPlayerStyle +} + +// 视频播放样式 +export interface VideoPlayerStyle extends ComponentStyle { + // 视频高度 + height: number +} + +// 定义组件 +export const component = { + id: 'VideoPlayer', + name: '视频播放', + icon: 'ep:video-play', + property: { + videoUrl: '', + posterUrl: '', + autoplay: false, + style: { + bgType: 'color', + bgColor: '#fff', + marginBottom: 8, + height: 300 + } as VideoPlayerStyle + } +} as DiyComponent diff --git a/src/components/DiyEditor/components/mobile/VideoPlayer/index.vue b/src/components/DiyEditor/components/mobile/VideoPlayer/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fa9a914f05f8889d3ab5ec3eb2cf410c70cc7ecd --- /dev/null +++ b/src/components/DiyEditor/components/mobile/VideoPlayer/index.vue @@ -0,0 +1,30 @@ + + + + diff --git a/src/components/DiyEditor/components/mobile/VideoPlayer/property.vue b/src/components/DiyEditor/components/mobile/VideoPlayer/property.vue new file mode 100644 index 0000000000000000000000000000000000000000..7598543b253a28d5cde03a2697c7c7936d8cdaf3 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/VideoPlayer/property.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/components/DiyEditor/components/mobile/index.ts b/src/components/DiyEditor/components/mobile/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c0dc67da8267d757747fad0eb6c2a712b203caa5 --- /dev/null +++ b/src/components/DiyEditor/components/mobile/index.ts @@ -0,0 +1,61 @@ +/* + * 组件注册 + * + * 组件规范: + * 1. 每个子目录就是一个独立的组件,每个目录包括以下三个文件: + * 2. config.ts:组件配置,必选,用于定义组件、组件默认的属性、定义属性的类型 + * 3. index.vue:组件展示,用于展示组件的渲染效果。可以不提供,如 Page(页面设置),只需要属性配置表单即可 + * 4. property.vue:组件属性表单,用于配置组件,必选, + * + * 注: + * 组件ID以config.ts中配置的id为准,与组件目录的名称无关,但还是建议组件目录的名称与组件ID保持一致 + */ + +// 导入组件界面模块 +const viewModules: Record = import.meta.glob('./*/*.vue') +// 导入配置模块 +const configModules: Record = import.meta.glob('./*/config.ts', { eager: true }) + +// 界面模块 +const components = {} +// 组件配置模块 +const componentConfigs = {} + +// 组件界面的类型 +type ViewType = 'index' | 'property' + +/** + * 注册组件的界面模块 + * + * @param componentId 组件ID + * @param configPath 配置模块的文件路径 + * @param viewType 组件界面的类型 + */ +const registerComponentViewModule = ( + componentId: string, + configPath: string, + viewType: ViewType +) => { + const viewPath = configPath.replace('config.ts', `${viewType}.vue`) + const viewModule = viewModules[viewPath] + if (viewModule) { + // 定义异步组件 + components[componentId] = defineAsyncComponent(viewModule) + } +} + +// 注册 +Object.keys(configModules).forEach((modulePath: string) => { + const component = configModules[modulePath].component + const componentId = component?.id + if (componentId) { + // 注册组件 + componentConfigs[componentId] = component + // 注册预览界面 + registerComponentViewModule(componentId, modulePath, 'index') + // 注册属性配置表单 + registerComponentViewModule(`${componentId}Property`, modulePath, 'property') + } +}) + +export { components, componentConfigs } diff --git a/src/components/DiyEditor/index.vue b/src/components/DiyEditor/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..700d32bd50321fdc24770ef241bd42718930e0e2 --- /dev/null +++ b/src/components/DiyEditor/index.vue @@ -0,0 +1,565 @@ +